さらに深くする必要があります:広告ブロックをバイパスするスクリプトをバイパスします







少し金曜日の投稿。 最近、私はそれをブロックする2つの拡張機能(!)を突破する広告があることに気付きました。 通常、これは非常に低品質で邪魔な広告です。 私はそれをそのように理解することに決め、おそらくこのゴミを克服しようとさえしました。 誰も気にしない-カットをお願いします(慎重に、たくさんの写真を)。



そして、何がそれを防ぎますか?



私は広告ブロックの熱烈な支持者です。 特に低品質。 特定のサイトで広告を見たくない場合、そのような広告は広告主にとってはお金であり(無駄な表示)、私にとっては無礼であり、だれにとっても利益はありません。 すぐに予約します-広告ユニットを意識的に削減するサイトがあります(たとえば、同じhabr)。 これらは、テーマ別広告を選択するサイトであり、「IPHONS FROM STOCK 70%DISCOUNT!」ではありません。



そして先日、私に優しいサイト(私の都市のニュースポータル)に、「電気技師は長い間隠れていました-電力を節約するだけでよい」というスタイルの非常に低品位の広告があります。 最初はハッキングされたと思っていましたが、このサイトの管理者が広告ブロックの上で動作する何らかのアフィリエイトプログラムに参加したことがわかりました。 そして、そのような広告はただの恥であるだけでなく、いくつかの場所でレイアウトを壊しました。 近いそれは原則の問題となっています。



試行1-バカ、または...



...「pff、はい、広告ブロックのカスタムフィルターを作成します。」 フィルタを作成し、保存し、テストします...そして、改ページが完全に行われます。 また、化粧フィルター(cssブロッキング)も機能しません。 どうして? しかし、明らかに、そのようなフィルターは「箱から出してすぐ」にはありませんでした。 後で判明したように、「マルウェア」はcでインラインであり、クロム型のブラウザでは拡張機能によるインラインスクリプトのブロックが許可されていません。 まあ、まあ...



試行2-広告ブロックを変更する



「adblock」という言葉は、長い間ジープやコピー機のような家庭用の言葉でした。 それで、実際、私はublockではなくadblockを持っています(これが広告と見なされないことを願っていますか?) したがって、まずは、問題の先頭からさまざまなブロッカーの動作をテストします。これにより、トリッキーなスクリプトから隠れ、さらにはブロックすることさえ約束されました。 実際、これは尽きませんでしたし、広告の一部は(すべてではありませんが、まだ)忍び寄っていました。



試行3-敵の目をのぞき込む



そして、いや、私はリソースの管理者を意味するものではありません:)最も興味深いものに取りかかりましょう。 私たちは、ページのソースを見て、私たちのマックを見つけることを望んで登ります。 そして...ビンゴ!







巨大な難読化されたコーディン。これは明らかにカジュアルではありません。 同様のサイトを(広告の観点から)見ます-はい、明らかにそうです。 そして、平凡なパッカーではなく、しっかりと難読化されています。



犬が埋葬されている場所を理解するために少し解凍しましょう。 モンスターをよく見ると、これは自己呼び出し関数であることがわかります。その内部には3つの主要な部分があります。大きな関数、数字のある種の配列とその小さな処理、および最初の関数の呼び出しです。 配列とその処理をコピーし、実行し、出力を確認します。







私たちの変数「a」は、1文字の単語に置き換えることができなかった単語のセット全体を格納します。 そして、最初の部分には、[42]、[69]などの形式の多くのフラグメントがあります。 難読化はそれほど難しくありませんでした。 コードの動作を保証するものではありませんが、読みやすくするための置換を行います。







すでに表示されている多かれ少なかれ読み取り可能なコード。 ビューティファイヤを通過して、コードの目的のセクションを見つけます(1つの画面に収まるように重要でないコードを削除しました)。







この感染は、特定の法人にリクエストを行い、ダンプの場合(たとえば、広告ブロックフィルターに入る)-window.stop()を呼び出し、ページ全体を中断します。 かなりトリッキーで、組み込みのadblock機能は解決できないようです。 また、chromeはインラインであるため、スクリプト全体をブロックすることはできません。



どうする?



少し考えて、この広告を純粋にブロックすることを扱うブラウザー拡張機能(別のはい、はい)を入手しました。 これまでのところ、このネットワーク専用に設計されています。他の人は知らないからです。 誰かが-フォークしたり、プルリクエストを投げたり、コメントを登録解除したい場合-フィールドを追加してアドレスを追加します。



それは次のように機能します-「検証」アドレスへのリクエストをインターセプトし、 ドングリとエレガントな松葉杖のマッチの助けを借りて5秒間保持し、この時点でページにメッセージをすばやく送信します。 ページはこのメッセージを受け取り、すぐにwindow.stopを空の関数に再定義します。 その間、マルウェアは依然として拒否され、悪意を持って微笑み、window.stopを突くなど、何もしません。 スクリプトは満足しています(彼はすべてが壊れていて、ユーザーはまだ広告ブロックを無効にしていると確信しています)、拡張機能はかなりです(私の同僚が言うように、すべてのトリッキーなお尻にはforな男性生殖器があるため)、ユーザー(つまり、私たち)は満足しています。 おそらく、この感染の開発者はすぐにこのための何かを思い付くでしょうが、これまでのところ、広告は正常にカットされています。



拡張機能はどこにもあふれませんでした。有料アカウントが必要なためです。これは概念実証であり、今日は金曜日であり、別の1000と1は意味のない言い訳です。 githubのコードです。



UPD。 コメントには質問がありました。したがって、主なものに関する論文は次のとおりです。

すべてのインラインスクリプトをブロックしない理由-多くのサイトのロジックを壊すため、適切ではありません

なぜ200を返さない(欺くため)-クロムは方法を知らないからです。 500番目、またはスキップ

すぐにwindow.stopを再定義しないでください-DOMヘッドブロックが既に存在するがajaxがまだ返っていない時間間隔に間に合わせる必要があるためです。 これは、拡張機能APIの制限です。



All Articles