<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Mayank Srivastava</title>
    <description>The latest articles on DEV Community by Mayank Srivastava (@mayank7924).</description>
    <link>https://dev.to/mayank7924</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3940903%2F4fd37efa-a174-43b0-85e7-8b83ad17896e.jpeg</url>
      <title>DEV Community: Mayank Srivastava</title>
      <link>https://dev.to/mayank7924</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mayank7924"/>
    <language>en</language>
    <item>
      <title>How I Beat a 16-Click Anti-Bot Ad Trap</title>
      <dc:creator>Mayank Srivastava</dc:creator>
      <pubDate>Wed, 20 May 2026 16:50:04 +0000</pubDate>
      <link>https://dev.to/mayank7924/how-i-beat-a-16-click-anti-bot-ad-trap-4o4l</link>
      <guid>https://dev.to/mayank7924/how-i-beat-a-16-click-anti-bot-ad-trap-4o4l</guid>
      <description>&lt;h3&gt;
  
  
  🎯 I Got Tired of Closing Popups. So I Reverse-Engineered the Entire Ad Stack.
&lt;/h3&gt;

&lt;p&gt;We’ve all been there.&lt;br&gt;
You open a streaming site.&lt;br&gt;&lt;br&gt;
You click play.&lt;/p&gt;

&lt;p&gt;💥 A new tab appears.&lt;/p&gt;

&lt;p&gt;You close it. Click again.&lt;/p&gt;

&lt;p&gt;💥 Another popup.&lt;/p&gt;

&lt;p&gt;Some sites are so aggressive that watching a single episode feels like defusing a bomb through &lt;strong&gt;16 consecutive popups&lt;/strong&gt; while trying not to accidentally download malware from 2007.&lt;/p&gt;

&lt;p&gt;Most people tolerate it.&lt;br&gt;
I couldn’t.&lt;/p&gt;

&lt;p&gt;As a developer, the moment software starts fighting the user this aggressively, it stops being an inconvenience and becomes a challenge.&lt;br&gt;
So I decided to break it.&lt;/p&gt;


&lt;h3&gt;
  
  
  🧪 Phase 1 — The “This Should Work” Delusion
&lt;/h3&gt;

&lt;p&gt;My first thought was simple:&lt;br&gt;
Override &lt;code&gt;window.open&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;open&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Done. Right?&lt;br&gt;
Nope.&lt;br&gt;
The site completely ignored it.&lt;br&gt;
That’s when I realized this wasn’t normal popup logic anymore.&lt;br&gt;
This was engineered hostility.&lt;/p&gt;
&lt;h3&gt;
  
  
  👻 Phase 2 — Chasing Invisible Click Traps
&lt;/h3&gt;

&lt;p&gt;I opened DevTools and started tracing the DOM during every interaction.&lt;br&gt;
Something strange kept happening.&lt;br&gt;
Inside the video player container, the final &lt;/p&gt; kept rapidly changing after every click.&lt;br&gt;
Then it clicked.&lt;br&gt;
The site was dynamically generating transparent overlay layers directly above the player.&lt;br&gt;
The actual video button wasn’t receiving my clicks.&lt;br&gt;
The invisible overlay was.&lt;br&gt;
Every physical mouse interaction got hijacked by a temporary fullscreen layer designed to trigger an ad redirect using a trusted human click.&lt;br&gt;
The sequence looked something like this:&lt;br&gt;

&lt;pre class="highlight plaintext"&gt;&lt;code&gt;flowchart TD
    A[User Click]
    B[Invisible Overlay Captures Event]
    C[Ad Redirect Triggered]
    D[Overlay Self-Deletes]
    E[New Overlay Spawned]

    A --&amp;gt; B
    B --&amp;gt; C
    C --&amp;gt; D
    D --&amp;gt; E
    E --&amp;gt; B
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;Ridiculously clever.&lt;br&gt;
Because technically I initiated the click, the browser trusted the action.&lt;br&gt;
So I escalated.&lt;/p&gt;
&lt;h3&gt;
  
  
  ⚔️ Phase 3 — Fighting Back With a Chrome Extension
&lt;/h3&gt;

&lt;p&gt;At this point, I realized manual debugging alone wasn't enough anymore.&lt;/p&gt;

&lt;p&gt;So I decided to escalate.&lt;/p&gt;

&lt;p&gt;I created a custom Chrome extension specifically for this battle.&lt;/p&gt;

&lt;p&gt;The first version was primitive — a DOM-level interceptor designed to watch the page in realtime and surgically remove the invisible overlay traps before they could hijack clicks.&lt;/p&gt;

&lt;p&gt;I used a &lt;code&gt;MutationObserver&lt;/code&gt; to monitor the page for dynamically injected elements:&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;observer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;MutationObserver&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelectorAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.suspicious-overlay&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;el&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;remove&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;observer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;observe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;childList&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;subtree&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;For a brief moment…&lt;br&gt;
…it worked.&lt;br&gt;
Then the site hit back.&lt;/p&gt;

&lt;p&gt;🤖 It was at this moment I realized I was fighting an Anti-Bot System&lt;/p&gt;

&lt;p&gt;Buried deep inside the bundled scripts was an aggressive anti-fraud service called Adscore.&lt;/p&gt;

&lt;p&gt;The behavior suddenly changed:&lt;/p&gt;

&lt;p&gt;🧹 Console logs started disappearing&lt;br&gt;
🔄 The player entered infinite click loops&lt;br&gt;
🕵️ Hardware fingerprinting routines activated&lt;br&gt;
🎮 WebGL context checks triggered&lt;br&gt;
📏 Screen dimension math got evaluated&lt;br&gt;
🧠 Browser behavior started getting profiled&lt;/p&gt;

&lt;p&gt;The site wasn’t just showing ads anymore.&lt;br&gt;
It was actively detecting interference.&lt;br&gt;
And then I realized my mistake:&lt;/p&gt;

&lt;p&gt;I was still fighting inside the webpage sandbox.&lt;/p&gt;

&lt;p&gt;That was their territory.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🧠 Phase 4 — Stop Fighting the UI. Attack the Network.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If the frontend is weaponized…&lt;br&gt;
…you stop fighting visuals.&lt;/p&gt;

&lt;p&gt;You cut the supply lines.&lt;/p&gt;

&lt;p&gt;Instead of targeting the popup elements themselves, I started tracing the network behavior behind them.&lt;br&gt;
During tiny windows before the console got wiped, I managed to capture the redirect domains responsible for the popup chains.&lt;br&gt;
That changed everything.&lt;/p&gt;

&lt;p&gt;Because once you identify the routing infrastructure the illusion collapses.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🔥 The Final Architecture&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I rebuilt the extension entirely around Chrome’s native browser APIs:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;declarativeNetRequest&lt;/li&gt;
&lt;li&gt;tabs&lt;/li&gt;
&lt;li&gt;background service workers&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;No more DOM fighting.&lt;br&gt;
No more chasing invisible overlays.&lt;br&gt;
No more playing inside their sandbox.&lt;br&gt;
The browser itself would now intercept requests before the scripts could fully execute.&lt;/p&gt;

&lt;p&gt;📦 manifest.json&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"manifest_version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Native Ad Network Guard"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Drops ad-network connections and instantly auto-closes leaked popups."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"permissions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"declarativeNetRequest"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"tabs"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"host_permissions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;all_urls&amp;gt;"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"background"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"service_worker"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"background.js"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;⚡ background.js&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Domains responsible for popup routing,&lt;/span&gt;
&lt;span class="c1"&gt;// ad redirects, tracking, and anti-user behavior.&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;BLOCKED_DOMAINS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;xadsmart.com&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;adsco.re&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;


&lt;span class="c1"&gt;// ---------------------------------------------------&lt;/span&gt;
&lt;span class="c1"&gt;// 1. Create browser-level blocking rules&lt;/span&gt;
&lt;span class="c1"&gt;// ---------------------------------------------------&lt;/span&gt;

&lt;span class="c1"&gt;// Chrome's declarativeNetRequest API works by defining&lt;/span&gt;
&lt;span class="c1"&gt;// static rule objects that the browser engine enforces&lt;/span&gt;
&lt;span class="c1"&gt;// BEFORE requests fully execute.&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;rules&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;BLOCKED_DOMAINS&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;domain&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;index&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;priority&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

    &lt;span class="c1"&gt;// Action to perform when matched.&lt;/span&gt;
    &lt;span class="c1"&gt;// In this case: completely block the request.&lt;/span&gt;
    &lt;span class="na"&gt;action&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;block&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;

    &lt;span class="c1"&gt;// Conditions that trigger the rule.&lt;/span&gt;
    &lt;span class="na"&gt;condition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Match any request containing this domain.&lt;/span&gt;
        &lt;span class="na"&gt;urlFilter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;domain&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="c1"&gt;// Types of browser resources to intercept.&lt;/span&gt;
        &lt;span class="na"&gt;resourceTypes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="c1"&gt;// Entire page navigations&lt;/span&gt;
            &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;main_frame&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="c1"&gt;// Embedded iframes&lt;/span&gt;
            &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;sub_frame&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="c1"&gt;// External JavaScript files&lt;/span&gt;
            &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;script&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="c1"&gt;// AJAX/fetch/XHR requests&lt;/span&gt;
            &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;xmlhttprequest&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
        &lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}));&lt;/span&gt;


&lt;span class="c1"&gt;// ---------------------------------------------------&lt;/span&gt;
&lt;span class="c1"&gt;// 2. Register rules when extension installs&lt;/span&gt;
&lt;span class="c1"&gt;// ---------------------------------------------------&lt;/span&gt;

&lt;span class="nx"&gt;chrome&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;runtime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onInstalled&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addListener&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="nx"&gt;chrome&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;declarativeNetRequest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;updateDynamicRules&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
        &lt;span class="c1"&gt;// Remove previously existing rules&lt;/span&gt;
        &lt;span class="c1"&gt;// to avoid duplicates during reinstalls.&lt;/span&gt;
        &lt;span class="na"&gt;removeRuleIds&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;rules&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;

        &lt;span class="c1"&gt;// Inject the new blocking rules.&lt;/span&gt;
        &lt;span class="na"&gt;addRules&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;rules&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;


&lt;span class="c1"&gt;// ---------------------------------------------------&lt;/span&gt;
&lt;span class="c1"&gt;// 3. Instant popup execution kill-switch&lt;/span&gt;
&lt;span class="c1"&gt;// ---------------------------------------------------&lt;/span&gt;

&lt;span class="c1"&gt;// Even if a popup somehow bypasses the network block,&lt;/span&gt;
&lt;span class="c1"&gt;// this listener acts as a secondary defense layer.&lt;/span&gt;
&lt;span class="c1"&gt;// It watches every tab URL update in realtime.&lt;/span&gt;

&lt;span class="nx"&gt;chrome&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tabs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onUpdated&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addListener&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;tabId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;changeInfo&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="c1"&gt;// Ignore updates that don't contain a URL.&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;changeInfo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

        &lt;span class="c1"&gt;// Normalize URL for safer comparisons.&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;changeInfo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toLowerCase&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

        &lt;span class="c1"&gt;// Check whether the tab matches&lt;/span&gt;
        &lt;span class="c1"&gt;// known popup patterns or redirect signatures.&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;shouldKill&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;

            &lt;span class="c1"&gt;// Known blocked domains&lt;/span&gt;
            &lt;span class="nx"&gt;BLOCKED_DOMAINS&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;some&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;domain&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
                &lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;domain&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;

            &lt;span class="c1"&gt;// Common ad-network query patterns&lt;/span&gt;
            &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;zoneid=&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

            &lt;span class="c1"&gt;// Aggressive redirect handler pattern&lt;/span&gt;
            &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;afu.php&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="c1"&gt;// If detected:&lt;/span&gt;
        &lt;span class="c1"&gt;// instantly terminate the tab.&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;shouldKill&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nx"&gt;chrome&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tabs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;remove&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;tabId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;&lt;strong&gt;🚀 The Result&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The transformation was surreal.&lt;br&gt;
The site still attempts the same aggressive click-hijacking flow.&lt;br&gt;
Invisible overlays still spawn.&lt;br&gt;
Scripts still try redirect chains.&lt;br&gt;
But now?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;💀 The tabs die instantly.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No chaos.&lt;br&gt;
No cleanup.&lt;br&gt;
No losing immersion every five seconds.&lt;br&gt;
Just a silent war happening underneath the browser while the video plays normally.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🧩 What This Actually Taught Me&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The interesting part wasn’t blocking ads.&lt;/p&gt;

&lt;p&gt;It was understanding how modern websites are willing to weaponize the browser itself:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Event hijacking&lt;/li&gt;
&lt;li&gt;Trusted-click exploitation&lt;/li&gt;
&lt;li&gt;Fingerprinting&lt;/li&gt;
&lt;li&gt;Anti-debugging&lt;/li&gt;
&lt;li&gt;Console wiping&lt;/li&gt;
&lt;li&gt;Behavioral analysis&lt;/li&gt;
&lt;li&gt;Redirect chaining&lt;/li&gt;
&lt;li&gt;Dynamic overlay injection&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;👨‍💻 Final Thought&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This entire project started because I got annoyed clicking “Close Tab” fifteen times.&lt;br&gt;
It ended with me reverse-engineering popup infrastructure, anti-bot systems, and browser-level request interception pipelines.&lt;br&gt;
And honestly?&lt;br&gt;
That escalation path perfectly summarizes what I enjoy most about software engineering.&lt;/p&gt;

&lt;p&gt;Tinkering.&lt;/p&gt;

&lt;p&gt;And refusing to accept that a system is “unbeatable.”&lt;/p&gt;

</description>
      <category>programming</category>
      <category>chromeextensions</category>
      <category>cybersecurity</category>
      <category>browsers</category>
    </item>
  </channel>
</rss>
