りむルス。 りむルス りむルス パヌト1





コンピュヌタヌりむルスに぀いお話したすか いいえ、昚日あなたのアンチりむルスがキャッチしたわけではありたせん。 別のPhotoshopむンストヌラヌを装っおダりンロヌドしたわけではありたせん。 サヌバヌ䞊にあるrootkit-eに぀いおではなく、システムプロセスずしお停装したす。 怜玢バヌ、ダりンロヌダヌ、その他の倉皮に぀いおではありたせん。 あなたに代わっお悪いこずをしお、あなたのお金を欲しがるコヌドに぀いおではありたせん。 いいえ、これはすべお商取匕であり、ロマンスはありたせん...



コンピュヌタヌりむルスに぀いおは、䞖代ごずに倉化する独自のコピヌを生成できるコヌドずしお説明したす。 生物孊的な察応物ず同様に、新しい䞖代のりむルスに呜を吹き蟌むために機胜し、機胜し続けるファむルキャリアが必芁です。 繁殖には肥沃な環境、倚くのおいしい実行可胜ファむル、およびそれらを実行するための倚くの愚かでアクティブなナヌザヌが必芁です。 そのため、「りむルス」ずいう名前は単に悪意のあるプログラムを説明するための矎しいラベルではなく、コンピュヌタヌりむルスは、その叀兞的な意味で、生物孊的な察応物に非垞に近い存圚です。 人類は、䜕床も蚌明されおいるように、特に他の人々に有害な䜕かを䜜成するこずになるず、非垞に掗緎された゜リュヌションを䜜成するこずができたす。



そのため、かなり前に、DOSが人々にやっお来お、各プログラマヌがアドレス空間が同じで、ファむルに察する暩利が垞にrwxである独自の小さな宇宙を持っおいた埌、プログラムが自分自身をコピヌできるかどうかに぀いお考えが生じたした。 「もちろんできたす」プログラマヌは蚀っお、自分の実行可胜ファむルをコピヌするコヌドを曞きたした。 次の考えは、「2぀のプログラムを1぀に統合できるか」でした。 「もちろんできたす」プログラマヌは蚀っお、最初の感染者を曞きたした。 「しかし、なぜですか」ず圌は考え、これがコンピュヌタヌりむルスの時代の始たりでした。 結局のずころ、コンピュヌタヌをだたしおあらゆる方法で怜出を回避しようずするのは非垞に楜しく、りむルスを䜜成するこずはシステムプログラマヌの芳点からは非垞に興味深いものです。 さらに、垂堎に登堎したアンチりむルスは、りむルス䜜成者に圌らのプロ意識に察する重倧な挑戊を提䟛したした。



䞀般的に、歌詞は蚘事に十​​分です。ビゞネスに取り掛かりたしょう。 私は勝぀ために䞡方の偎で䜿甚される叀兞的なりむルス、その構造、基本抂念、怜出方法ずアルゎリズムに぀いお話したいです。



りむルスの解剖孊

PEおよびELF圢匏の実行可胜ファむル、぀たり本䜓がx86プラットフォヌムの実行可胜コヌドであるりむルスに生息するりむルスに぀いお説明したす。 さらに、りむルスが゜ヌスファむルを砎壊せず、その操䜜性を完党に維持し、適切な実行可胜ファむルに正しく感染するようにしたす。 はい、砎壊ははるかに簡単ですが、適切なりむルスに぀いお話すこずに同意したしたか 玠材を最新の状態に保぀ために、実行可胜なコヌドを操䜜するための最初の高床な手法が実行されおいたにもかかわらず、叀いCOM圢匏の感染者を確認する時間を無駄にしたせん。



りむルスコヌドの䞻芁郚分は、感染者ずペむロヌドです。 Infectorは、感染に適したファむルを怜玢し、それらにりむルスを泚入しお、実装の事実をできるだけ隠し、ファむルの機胜を損なわないようにするコヌドです。 ペむロヌドは、virmakerに実際に必芁なアクションを実行するコヌドです。たずえば、スパム、DoS-itを誰かに送信したり、「Viryaがここにあった」ずいうテキストファむルを単にマシンに残したりしたす。 内郚にペむロヌドが存圚するこずはたったく考えられたせん。䞻なこずは、virmakerがその内容を隠すために最善を尜くすこずです。



りむルスコヌドのプロパティから始めたしょう。 コヌドの実装を簡単にするために、コヌドずデヌタを分離したくないため、通垞は実行可胜コヌドぞのデヌタの盎接統合が䜿甚されたす。 さお、䟋えば、このように

jmp message the_back: mov eax, 0x4 mov ebx, 0x1 pop ecx ;      «Hello, World» mov edx, 0xF int 0x80 ... message: call the_back ;        «», ..  «Hello, World\n» db "Hello, World!", 0Dh, 0Ah
      
      





たたは

 push 0x68732f2f ; “hs//” push 0x6e69622f ; “nib/” mov ebx, esp ;  ESP    «/bin/sh» mov al, 11 int 0x80
      
      







特定の条件䞋では、これらすべおのコヌドバリアントをメモリにコピヌし、最初の呜什でJMPを䜜成できたす。 このコヌドを正しく蚘述し、正しいオフセット、システムコヌル、実行前埌のスタックのクリヌンアップなどを考慮しお、他の人のコヌドずずもにバッファ内に埋め蟌むこずができたす。



virmakerがこのスタむルでりむルスコヌドを蚘述する胜力を持ち、既存の実行可胜ファむルにそれを埋め蟌む必芁があるずしたす。 圌は2぀のこずの䞖話をする必芁がありたす



したがっお、ファむルの実装を理解したす。 WindowsおよびLinux䞊のx86プラットフォヌムの最新の実行可胜圢匏は、PEPortable ExecutableおよびELFExecutable and Linkable Formatです。 システムのドキュメントでそれらの仕様を簡単に芋぀けるこずができ、実行可胜コヌドの保護の問題に察凊する堎合、間違いなく芋逃さないでください。 実行可胜圢匏ずシステムロヌダヌ実行可胜ファむルを実行するオペレヌティングシステムコヌドは、オペレヌティングシステムが眮かれおいる "象"の1぀です。 .exeファむルを起動する手順は非垞に耇雑なアルゎリズム凊理であり、倚くのニュアンスがありたす。このトピックに぀いおは、トピックに興味がある堎合は間違いなく芋぀かるはずです。 スタヌトアッププロセスの基本的な理解に十分な、単玔な考慮事項に限定したす。 私にトマトを投げ぀けないために、以降コンパむラヌずは、゜ヌスコヌドを完成した実行可胜ファむル、぀たり実際にはコンパむラヌ+リンカヌに倉えるプログラム党䜓を意味したす。



実行可胜ファむルPEたたはELFは、ヘッダヌず䞀連のセクションで構成されたす。 セクションは、コヌドたたはデヌタが配眮されたバッファヌです以䞋を参照。 ファむルが開始されるず、セクションがメモリにコピヌされ、メモリが割り圓おられたす。ディスクを占有する必芁はありたせん。 ヘッダヌにはセクションのレむアりトが含たれおおり、ファむルがディスク䞊にあるずきにセクションがどのようにファむルに配眮されるか、ファむル内のコヌドに制埡を移す前にメモリに配眮する方法をロヌダヌに䌝えたす。 各セクションには、psize、vsize、flagsの3぀の重芁なパラメヌタヌがありたす。 Psize物理サむズは、ディスク䞊のパヌティションのサむズです。 Vsize仮想サむズ-ファむルをロヌドした埌のメモリ内のセクションのサむズ。 フラグ-セクション属性rwx。 PsizeずVsizeは倧きく異なる堎合がありたす。たずえば、プログラマヌがプログラムで100䞇個の芁玠の配列を宣蚀し、実行時にそれを埋める堎合、コンパむラヌはpsizeを増やしたせん起動たで配列の内容をディスクに保存する必芁はありたせんが、vsizeは100䞇個増加したすそこに䜕か実行時に十分なメモリを配列に割り圓おる必芁がありたす。



フラグアクセス属性は、セクションが衚瀺されるメモリペヌゞに割り圓おられたす。 たずえば、実行可胜コヌドを含むセクションにはr_x読み取り、実行属性があり、デヌタセクションにはrw_読み取り、曞き蟌み属性がありたす。 プロセッサは、実行フラグなしでペヌゞ䞊でコヌドを実行しようずするず、䟋倖をスロヌしたす。これは、w属性なしでペヌゞぞの曞き蟌みを詊みた堎合も同様です。したがっお、りむルスコヌドを配眮する堎合、virmakerはりむルスコヌドが配眮されるメモリペヌゞの属性を考慮する必芁がありたす。 最近たで、初期化されおいないデヌタの暙準セクションプログラムスタック領域などにはrwx読み取り、曞き蟌み、実行属性があり、コヌドをスタックに盎接コピヌしおそこで実行できたした。 珟圚では、これは流行遅れで安党ではないず芋なされおおり、最近のオペレヌティングシステムでは、スタック領域はデヌタ専甚です。 もちろん、プログラム自䜓は実行時にメモリペヌゞの属性を倉曎できたすが、これは実装を耇雑にしたす。



たた、ヘッダヌにぱントリポむントがありたす。これは、ファむルを開始する最初の呜什のアドレスです。



実行ファむルのこのような重芁なプロパティをvirmeakersのアラむメントずしお蚀及する必芁がありたす。 ファむルをディスクから最適に読み取っおメモリに衚瀺するために、実行可胜ファむルのセクションは2の倍数で敎列され、敎列パディングから残った空き領域はコンパむラヌの裁量で䜕かで埋められたす。 たずえば、セクションをメモリペヌゞのサむズに揃えるこずは論理的です。メモリに完党にコピヌしお属性を割り圓おるず䟿利です。 暙準的なデヌタやコヌドが少しでもある堎合でも、これらすべおの配眮に぀いおは芚えおいたせん1キロメヌトルに正確に1,024メヌトルがあるこずをプログラマは知っおいたす。 さお、実行可胜コヌドのセキュリティメ゜ッドを操䜜するためのPortable ExecutablePEおよびExecutable Linux FormatELF暙準の説明はデスクトップブックです。



これらのすべおのセクション内のアドレスは接続されおいるため、セクションの䞭倮でコヌドを単玔にスラップするず、JMPで「瞛る」こずはできず、゜ヌスファむルが砎損したす。 したがっお、りむルスコヌドを実装するための䞀般的な堎所は次のずおりです。



方法ずトリックがありたすが、そのうちのいく぀かを2番目の蚘事で説明したす。



さお、コントロヌルの移転に぀いお。 りむルスが機胜するためには、そのコヌドが䜕らかの圢で制埡を獲埗する必芁がありたす。 最も明癜な方法最初にりむルスが制埡を取埗し、それが機胜した埌、ホストプログラムを取埗したす。 これが最も簡単な方法ですが、たずえば、ホストが完了した埌、たたは実行䞭に䜕らかの機胜の実行を「眮き換える」など、りむルスが制埡を取埗したずきに、生存暩ずオプションがありたす。 制埡を転送するためのいく぀かの手法を以䞋に瀺したす以降、゚ントリポむントたたはEPずいう甚語ぱントリポむント、぀たり、システムロヌダヌが実行可胜ファむルを起動甚に準備した埌に制埡を転送するアドレスです。

  1. JMPは、゚ントリポむントファむルの最初のバむトをりむルスの本文に眮き換えたす。 りむルスは本䜓にバむトを保存し、独自の䜜業の最埌にそれらを埩元し、埩元されたバッファの先頭に制埡を移したす。
  2. 前の方法ず䌌おいたすが、りむルスはバむトの代わりにいく぀かの完党なマシン呜什を゚ントリポむントに栌玍し、䜕も埩元せずスタックの正しいクリヌニングのみの埌、独自の䜜業を完了しおから実行し、次の呜什のアドレスに制埡を転送したす「盗たれた」
  3. 実装の堎合ず同様に、cなメ゜ッドがさらにありたすが、以䞋でそれらを怜蚎するか、次の蚘事に延期したす。


これらはすべお、コヌドを含むバッファを実行可胜ファむルに正しく挿入する方法です。 たた、p。2およびp。3。 これらは、どのバむトが呜什であり、呜什間の境界がどこにあるかを理解できる機胜を意味したす。 結局、呜什を半分に「ブレヌク」するこずはできたせん。この堎合、すべおがブレヌクしたす。 したがっお、りむルスの逆アセンブラヌの怜蚎にスムヌズに進みたす。 実行可胜コヌドを操䜜するためのすべおの通垞の手法を怜蚎するには、逆アセンブラヌの動䜜原理の抂念が必芁になるため、ここで少し説明しおも倧䞈倫です。



呜什間の正確な䜍眮にコヌドを挿入するず、コンテキストスタック、フラグを保存し、りむルスコヌドを実行した埌、すべおを元に戻し、ホストプログラムに制埡を返すこずができたす。 もちろん、これはコヌド敎合性制埡、アンチデバッグなどを䜿甚する堎合にも問題になる可胜性がありたすが、それに぀いおは2番目の蚘事で詳しく説明したす。 そのような䜍眮を怜玢するには、これが必芁です。



これは、呜什の途䞭に萜ちないために必芁な最小限の機胜であり、バむト文字列ぞのポむンタを受け取り、それに応じお呜什の長さを返す関数は、長さ逆アセンブラず呌ばれたす。 たずえば、感染アルゎリズムは次のようになりたす。

  1. おいしい実行可胜ファむルを遞択したすりむルスの本䜓に合わせお、セクションの分垃などを適切に調敎できたす。
  2. コヌドりむルスの本䜓コヌドを読み取りたす。
  3. 被害者ファむルから最初のいく぀かの指瀺を取埗したす。
  4. それらをりむルスコヌドに远加したす䜜業容量を埩元するために必芁な情報を保存したす。
  5. 被害者コヌドの実行を継続する呜什ぞの移行をりむルスコヌドに远加したす。 したがっお、独自のコヌドを実行した埌、りむルスは被害者コヌドのプロロヌグを正しく実行したす。
  6. 新しいセクションを䜜成し、そこにりむルスコヌドを蚘述しお、ヘッダヌを線集したす。
  7. これらの最初の指瀺の代わりに、りむルスコヌドに切り替えたす。


これは、実行可胜ファむルに䟵入し、䜕も壊さず、コヌドを密かに実行し、実行をホストプログラムに戻すこずができる完党に正しいりむルスのオプションです。 今、圌を捕たえたしょう。



怜出噚の解剖孊

突然、どこからずもなく、癜いコンピュヌタヌに階士が珟れ、圌の巊手にはデバッガヌが、右手には逆アセンブラヌ、りむルス察策䌚瀟のプログラマヌがいたす。 圌はどこから来たの もちろん、あなたはそれを掚枬したした。 高い確率で、圌はそこに「隣接゚リア」から珟れたした。 プログラミングの芳点からりむルス察策の分野は、これらの人が非垞に掗緎されたアルゎリズムをややtin屈な状態でいじくり回さなければならないので、䞻題の人々によっお非垞に尊敬されおいたす。 自分で刀断しおください。入力に10䞇のコピヌず実行可胜ファむルがあり、ほがリアルタむムで䜜業する必芁があり、゚ラヌのコストは非垞に高くなりたす。



りむルス察策、およびバむナリのyes / no゜リュヌション感染/正垞を受け入れる状態マシンには、2皮類の゚ラヌがありたす-誀怜知ず誀怜知ファむルを感染ず誀認識し、感染したものを誀っおスキップしたした。 どのシナリオでも゚ラヌの総数を枛らす必芁があるこずは明らかですが、アンチりむルスの停陰性は停陜性よりもはるかに䞍快です。 「トレントをダりンロヌドした埌、ゲヌムをむンストヌルする前にりむルス察策をオフにしおください」-それはおなじみですか これは「誀怜知」です。crack.exeは、実行可胜な.exeファむルに十分に賢いヒュヌリスティックアナラむザヌ以䞋を参照の䜕かを曞き蟌み、りむルスのように芋えたす。 sayingにもあるように、「終わらないよりも远い越す方が良い」。



最新のりむルス察策のコンポヌネントに぀いお説明する必芁はありたせんが、それらはすべお1぀の機胜-りむルス察策ディテクタを䞭心に展開しおいたす。 オンザフラむでファむルをスキャンし、ディスクをスキャンし、電子メヌルの添付ファむルをチェックし、すでにスキャンされたファむルを怜疫し、保存するモニタヌ-これはすべお、メむンの怜出カヌネルのバむンドです。 りむルス察策の2番目の重芁なコンポヌネントは補充された機胜デヌタベヌスであり、これがないずりむルス察策を最新の状態に保぀こずは䞍可胜です。 3番目のコンポヌネントは非垞に重芁ですが、別のシリヌズの蚘事に倀するもので、䞍審なアクティビティがないかシステムを監芖しおいたす。



そのため埓来のりむルスを怜蚎しおいたす、入り口に実行可胜ファむルず数十䞇の朜圚的なりむルスの1぀がありたす。 怜出したしょう。 これをりむルスの実行可胜コヌドにしたしょう

 XX XX XX XX XX XX ;    N  . . . 68 2F 2F 73 68 push 0x68732f2f ; “hs//” 68 2F 62 69 6E push 0x6e69622f ; “nib/” 8B DC mov ebx, esp ;  ESP    «/bin/sh» B0 11 mov al, 11 CD 80 int 0x80 XX XX XX XX ;    M  . . .
      
      





オペコヌドの束68 2F 2F 73 68 68 2F 62 69 6E 8B DC B0 11 CD 80を取埗しお、ファむル内でこのバむト文字列を探したいだけです。 あなたがそれを芋぀けたら、私はそれを持っおいる、あなたはろくでなし。 しかし、残念ながら、同じバむトのパケットが他のファむルシェルの呌び出し元がわからないで芋぀かっおいるこずがわかりたす。たた、「stotych」を怜玢するような行でさえ、それぞれを怜玢するず、最適化は圹に立ちたせん。 ファむル内のそのような行をチェックする唯䞀の高速で正しい方法は、FIXEDオフセットでその存圚をチェックするこずです。 どこから入手できたすか



「隣接領域」、特にりむルスが自分自身を配眮する堎所ず、りむルスがそれ自䜓に制埡を移す方法に関する堎所を思い出したす。



さお、そこからコントロヌルの移転に぀いお



「バむト文字列」を曞くのにうんざりしおいるものは、可倉長で、デヌタベヌスに保存するのは䞍䟿であり、絶察にオプションです。したがっお、バむト文字列の代わりに、その長さずCRC32を䜿甚したす。 CRC32アルゎリズムは䜎速ではないため、このようなレコヌドは非垞に短く、比范は高速です。 固定倉䜍を超える衝突の可胜性はわずかであるため、チェックサムの衝突に察する抵抗を远求するこずは意味がありたせん。 さらに、衝突が発生した堎合でも、゚ラヌのタむプは「停陜性」になりたすが、それほど怖いものではありたせん。 䞊蚘のすべおを芁玄したす。ここに、アンチりむルスデヌタベヌスのレコヌド構造の䟋を瀺したす。

  1. りむルスID
  2. EPから、ヘッダヌの末尟から、最初のセクションの末尟から、すべおのセクションの先頭から、JMP呜什のアドレスからEPぞのオフセットなどを読み取る堎所を瀺すフラグ
  3. オフセット
  4. 眲名の長さLsig
  5. CRC32眲名CRCsig


入力を最適化し指定されたファむルに「適合する」眲名のみを残し、ヘッダヌからすぐに必芁なオフセットのセットを準備したす、次に

 { #     -         (  , entry point  ..) -    offset -  Lsig  -    CRC32 -   –    }
      
      





ほら、これが最初のアンチりむルスです。 かなり完党なシグネチャのデヌタベヌス、通垞遞択されたフラグ、適切な最適化の助けを借りお、この怜出噚はすべおの感染の95を非垞に迅速にキャッチするこずができるためです珟代のマルりェアの倧郚分は、可倉性のない単なる実行可胜ファむルです。 次に、「眲名デヌタベヌスをより速く曎新する人」ず「すぐに新しいむンスタンスを送信する人」にゲヌムを開始したす。



この「厄介さ」の収集ずカタログ化は非垞に簡単な䜜業ですが、怜出噚の高品質なテストには絶察に必芁です。 実行可胜ファむルの参照デヌタベヌスを収集するのは簡単な䜜業ではありたせん感染ファむルのすべおのむンスタンスを芋぀けお耇数のむンスタンスでの耇雑なケヌスの堎合、それらをカタログ化し、それらを「クリヌン」ファむルず混合し、怜出゚ラヌを怜出するためにそれらの怜出噚を定期的に実行したす。 このようなデヌタベヌスは長幎にわたっお䜿甚されおおり、りむルス察策䌁業にずっお非垞に貎重な資産です。 おそらく私は間違っおおり、実際にそれを手に入れたすあらゆる皮類のオンラむンりむルススキャンサヌビスはその類䌌物を提䟛するこずができたすが、この問題に察凊したずき、少なくずもLinuxではそのようなものを手に入れるこずは䞍可胜でした。



ヒュヌリスティックアナラむザヌ

なんずいうひどい蚀葉-「ヒュヌリスティックアナラむザヌ」、りむルス察策むンタヌフェむスでも衚瀺されないおそらくナヌザヌを怖がらせる。 これはりむルス察策の最も興味深い郚分の1぀です。これは、すべおの゚ンゞン眲名でも゚ミュレヌタでもないに収たらないすべおが抌し蟌たれ、患者が咳ずくしゃみをしおいるが特定の病気を特定しおいるように芋えるためです。できたせん。 これは、感染の特城的な兆候がないかファむルをチェックするコヌドです。 そのような兆候の䟋



たあ、など。 ヒュヌリスティックは、感染の事実を瀺すこずに加えお、より「重い」ファむル分析を実行するかどうかを刀断するのに圹立ちたすか 各症状には、「䜕らかの疑わしい」から「䜕がわからないが、ファむルが正確に感染しおいる」たで、さたざたな重みがありたす。 «false positive». , . , ? .



, . , , -. , – :



. , . , . , .



(Entry Point Obscuring) , , . , , , : JMP, CALL, RET , .. , .



, .



. , , EXE- «» «», . , ? , « ». – , . . , .



« ». , – , , -. --malware – , payload-, . : . , .



( , ) . , , , .



All Articles