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





最埌の郚分で玄束したように、バむラル゚ンゞンの怜蚎を続けおいたす。 今回は、実行可胜コヌドのポリモヌフィズムに぀いお説明したす。 コンピュヌタりむルスの倚態性ずは、新しい感染ファむルごずに新しい子孫りむルスコヌドが含たれるこずを意味したす。 玔粋に理論的には、アンチりむルスにずっおこれは本圓の悪倢を意味するでしょう。 新しい䞖代ごずにコヌドが100倉曎され、真にランダムな方法でりむルスが怜出された堎合、シグネチャ分析では怜出できたせんでした。



おそらくどこかにそのようなコヌドを実際に曞いたスヌパヌプログラマヌがいるので、それに぀いお䜕も知らないのです。 私はこれを本圓に信じおいたせん。コンピュヌタヌシステムの仕事の数孊的な正圓化に関䞎する数孊者は、そのような特定の倚型アルゎリズムが存圚しないこずを蚌明できるようです。その結果は別の特定のアルゎリズムを䜿甚しお完党に怜出できたせんでした。 しかし、私たちは単玔な人々であり、自分自身を倉曎するコヌドのアむデアに興味があり、「アルゎリズム察アルゎリズム」に照らしお、実行可胜コヌドを隠す方法ずプログラマヌの怜出方法の反察は非垞に興味深いはずです。



最初の蚘事を思い出しお少し補足したす

私は最初の蚘事から私たちのヒヌロヌを思い出したすりむルスメヌカヌずアンチりむルス䌚瀟のプログラマヌ、そしお圌らのカルマティック双子船倖保護の開発者ずクラッカヌを圌らに取り付けたす。 前者は実行可胜コヌドずそれに関する情報を隠そうずし、埌者は特性コヌドずその内郚アルゎリズムにアクセスしようずしたす。 りむルスの分野では、自動方法りむルス゚ンゞンおよびアンチりむルス怜出噚が普及しおいたす。保護の手動方法の分野ではヒンゞ付き保護の蚭定は手動で制埡されたす。補助゜フトりェアが豊富であるにもかかわらず、゜フトりェアを砎壊するプロセスも手䜜業です。



最初の蚘事の結果によれば、実行可胜ファむルに正しく感染できるりむルス぀たり、それ自䜓で動䜜し、ファむル自䜓のコヌドを正しく実行できるりむルスず、りむルスがファむル䞊の厳密に定矩された堎所にあるこずを知っおいるアンチりむルス怜出噚がありたす。特城点からある皋床の距離゚ントリポむントから、セクションの先頭から、ヘッダヌの末尟たでに、このりむルスを特城付ける䞀定のバむトセットがありたす。 たた、この蚘事が「りむルスの悪い点」に関する議論に入らないように、ペむロヌドりむルスが䜕もしないこずに同意したしょう。 そのため、問題のコヌドのアクションの性質に関するすべおの議論を陀倖し、怜出ず非衚瀺の方法に焊点を圓おるこずができたす。



最初の蚘事を思い出し、補足し続けたす。 りむルスずアンチりむルスに察抗するスキヌムは、商業プログラムをハッキングするずいう芳点から類掚しお考えるこずができたす。 感染の代わりに、実際のプログラムはここで動䜜し、実行可胜ファむルの保護を「ハング」させたす。 プログラム自䜓のコヌドを「ネタバレ」し、その回埩に必芁な情報を本䜓に隠したす。りむルスず同じトリッキヌな方法で、その䜜業のアルゎリズムを隠したす。最初にセキュリティコヌドを実行し、シリアル番号たたは詊甚期間、その埌、メむンプログラムを「修正」し、制埡を移したす。 次に、クラッカヌはアンチりむルスの圹割を果たし、内郚保護コヌドにアクセスしおアルゎリズムを芋぀けようずしたす。 圌は、コヌドの特城的な郚分を芋぀けお保存しお、平均ず同じこずをしおいるこずがわかりたした。 唯䞀の違いは、クラッカヌがすべおの元のコヌドを取り出しお、そこから実行可胜なファむルを䜜成するこずであり、averはその䞭から特城的な郚分を芋぀けお眲名を䜜成したす。



この保護を解陀する最も䞀般的な方法は、メモリ内のプログラムむメヌゞをディスクにダンプするこずです。 クラッカヌは、保護が機胜し、解読され、メむンプログラムが「修埩」され、このメむンプログラムのコヌドの䜜業むメヌゞがメモリ内にある瞬間を探しおいたす。 実際、圌は、保護されたプログラムの「叀い」゚ントリポむントである、いわゆるOEPオリゞナル゚ントリポむントでプログラムを停止する機䌚を探しおいたす。 この時点で、メモリ内のむメヌゞをディスクに保存できたす。 もちろん、それは動䜜したせんが、OEPを指すように実行可胜ファむルの゚ントリポむントを「再構成」するこずで修埩できたす。その時点でプログラムが動䜜しおいる堎合、そのようなむメヌゞは保護をスキップするだけで機胜したすさらに倚くの操䜜がありたす倖郚関数の呌び出しの埩元、プログラムが完党に埩号化されおいない堎合の耇数のダンプ、および䞀般に、これは倚数の蚘事のトピックですが、䞻な原則はそれです。 別の䞀般的な方法は、シリアル番号を生成するコヌドを芋぀けお、可胜であればそれを噛み、有効なシリアル番号keygenを生成する小さな実行可胜ファむルを䜜成するこずです。 以䞋で説明するように、同様のアクションコヌスは、りむルス察策ディテクタのこずです。



私はたた、生物孊的システムずの類䌌性を匕き出すのが奜きです。これほどあなたに負担をかけないようにしたす。 人工知胜ず人生をすぐに芋たいです。



逆アセンブラヌずデバッガヌ

実行可胜コヌドの保護範囲を怜蚎するには、圌らの仕事の基本原則を理解するこずが重芁です。 この蚘事を読んだら、おそらくこれに぀いお䜕か知っおいるでしょうが、ずにかく-少し蚱容するか、このセクションをスキップしおください。



逆アセンブラは、実行可胜ファむルたたはコヌド付き抜象バッファのいずれか、および非垞に重芁なこずずしお、逆アセンブルを開始する最初のアドレスを受け入れたす。 実行可胜ファむルの堎合、これはたずえば゚ントリポむントです。 逆アセンブラは、最初の呜什ぞのポむンタを眮いお、呜什が䜕であるか、バむト単䜍の長さ、ゞャンプ呜什かどうか、䜿甚するレゞスタ、参照するメモリ内のアドレスなどを決定したす。 呜什がゞャンプ呜什ではない堎合、逆アセンブラはポむンタを呜什の長さたで前方に移動するこずにより、次の呜什に進みたす。 無条件のJMPたたはCALLの堎合、逆アセンブラは次の呜什ポむンタをゞャンプアドレスが指す堎所に移動したす。 これが条件分岐JZ、JNAなどである堎合、逆アセンブラヌは次のアドレスを䞀床に2぀のアドレスにマヌクしたす。次の呜什のアドレスず遷移が可胜なアドレスです。 バむトの組み合わせが認識されない堎合、このブランチの逆アセンブリプロセスは停止したす。 たた、逆アセンブラヌは、どの呜什がこれを参照するかに関する情報を栌玍するこずに泚意する必芁がありたす。これにより、関数呌び出しを定矩でき、最も重芁なのは、誰がそれらを呌び出すかです。



逆アセンブラは、バむトシヌケンスを、呜什の各バむトに関する情報を栌玍する倚重接続構造のシヌケンスに倉換したす。特定のバむトがオペコヌドオペコヌドの䞀郚であるかどうか、デヌタ、アドレス、どこから遷移するかなど。 各構造には、次の構造の1぀たたは2぀ぞの参照を含めるこずができ、同時に任意の数の他の構造によっお参照されるオブゞェクトたずえば、䜕床も呌び出される最初の関数呜什にするこずができたす。 たた、スマヌトな逆アセンブラヌは、スタックポむンタヌをたどったり、次のように分解するためにそのような構造を認識しお正しくマヌクするこずができたす。mov eax、0x20056789; eaxを呌び出したす。 さらに、䞀連の呜什で特城的な機胜を認識し、手動で分解するための開始点を蚭定し、個々の呜什にコメントし、分解の結果をディスクに保存したす。 呌び出しのグラフを䜜成しお構造をマヌクする操䜜は非垞に高䟡ですが、1぀のファむルを数日間混乱させるこずができたす。 しかし、前に怜蚎したように、ファむル内のディスクで遷移が暗号化されたバッファヌに぀ながる堎合があり、この堎合、逆アセンブラヌは呜什から混乱を生成するか、停止したす。 この堎合、この暗号化されたバッファをランタむムで盎接取埗する必芁がありたす。メモリ内でオヌプンになっおいる堎合、デバッガが必芁です。



デバッガの䞻なタスクは、プログラムを最も興味深い堎所で停止するこずです。 これを行うにはいく぀かの方法がありたす。 プロセスメモリを開くこずができ、いずれかの呜什の代わりにint 3を入力したす-この堎合、この呜什を実行するプロセッサは䟋倖をスロヌし、デバッガはそれを凊理し、りィンドりを開き、元の呜什を埩元し、このメモリ領域の内容を衚瀺したす プロセッサでトレヌスフラグを有効にするず、プロセッサは各呜什でこの䟋倖をスロヌしたす。 最埌に、プロセッサにはデバッグレゞスタがあり、そこにいく぀かのアドレスを入れるこずができ、このアドレスでメモリにアクセスしたプロセッサは停止したす。 そのため、たずえば、暗号化されたバッファヌの開始アドレスにアクセスするようにブレヌクポむントを蚭定するこずにより、解読者が最初に解読を開始しおバッファヌの最初のバむトを読み取り、2回目に制埡を枡したす。 この時点で、バッファの内容をディスクに曞き蟌み、逆アセンブラをディスクに蚭定しお、そのすべおの秘密を芋぀けるこずができたす。 高床な防埡では、プログラムの完党な動䜜コヌドがメモリにあるような瞬間はありたせん。コヌドの䞀郚は必芁に応じお断片的に埩号化されたす。 これらの堎合、リバヌサヌはダンプを断片的に収集する必芁がありたす。



コヌド探玢保護

実行可胜コヌドを研究から保護するずいうトピックは、12件の蚘事に倀するため、この問題の枠組みの䞭で、いく぀かの点に぀いおのみ説明したす。 調査からの静的コヌド保護は、実行可胜コヌドを難読化し、コヌドの重芁なセクションでバッファヌを暗号化し、その埌実行時に埩号化するさたざたな方法です。 コヌドの難読化は、コヌドを難読化する特別なコンパむラヌを䜿甚しお実装でき、暗号化は、以䞋で説明するポリモヌフィック゚ンゞンコヌドの芳点からの商甚保護を含むを䜿甚しお実行できたす。



動的保護ずは、プログラムが実行䞭にデバッグされおいるかどうかを刀断し、この点で䜕らかのアクションを実行できるこずを意味したす。 たずえば、独自のコヌドでバッファヌを読み取った堎合、プログラムはそのチェックサムを参照コヌドず比范できたす。たた、デバッガヌがint 3をコヌドに挿入した堎合䞊蚘を参照、他の方法でコヌドがデバッグたたは倉曎されおいるこずを理解できたす。 しかし、おそらく、デバッグされおいるものを理解するための最も信頌性が高く移怍性の高い方法は、コヌドの特城的なセクションの実行時間を枬定するこずです。 意味は簡単です。バッファ内の呜什間の時間秒、オりムたたはプロセッササむクルが枬定され、特定のしきい倀を超える堎合、プログラムは途䞭で停止したした。 保護は、デバッグされおいるこずを認識しお、たずえば、内郚でその逆が停止する可胜性のあるブランチを無芖し、愚かには動䜜したせんが、りむルスはシステムから自身を削陀したす。 このような状況に察凊するために、リバヌサヌは簡単に再珟できる制埡された環境で動䜜したす。たずえば、BIOSパラメヌタヌたで、すべおを再珟できる仮想マシンなどです。 したがっお、りむルスたたは保護コヌドを調査する堎合、プログラムは調査の事実を非垞によく怜出し、悪いこずをするこずができるこずを芚えおおく必芁がありたす。



ポリモヌフィック゚ンゞンたたは「コヌドが小さく、゚ンゞンが匷い」

りむルス゚ンゞンに戻りたす。 DOSの開発のある時点で、圓時のメガ関連のパッカヌが倧量に出珟した埌、プログラマヌはファむルに加えお、パッケヌゞ化されたすべおのものをパックし始めたした。 「.exe」ファむルは倚くのスペヌスを占有し、そのようなファむルのかなりの郚分は、バむトグルヌプの頻床の安定した分垃を備えた実行可胜コヌドであり、おそらく正しいアルゎリズムによっお十分に圧瞮されおいたす。 したがっお、ポリモヌフィック゚ンゞンぞの最初のステップはパッカヌでした。



パッカヌの原理は非垞に簡単です。

  1. 実行可胜コヌドたずえば、コヌドセクションを含むバッファヌを䜿甚したす。
  2. それをパックしたす。
  3. アンパッカヌの䜍眮的に独立したコヌドを取埗し、パックされたコヌドでバッファヌの先頭ず末尟の正しいアドレスで補完したす。

  4. アンパッカヌの最埌にOEPアンパックされたコヌドの最初の呜什ぞの遷移を远加したす。
  5. アンパッカヌずバッファを圧瞮コヌドずずもに実行可胜ファむルに配眮したすセクションやEPのサむズを修正したす。


結果のファむルは、元のファむルよりもサむズがはるかに小さくなりたす。 100MBの容量を持぀最もクヌルな新しいハヌドドラむブが登堎した埌、これはそれほど重芁ではなくなりたしたが、パッケヌゞングは​​viremakerず保護開発者に倚くの新しい機䌚をもたらしたした。





さお、実際には、これは最初のポリモヌフィック゚ンゞンです。 おおよその感染アルゎリズムをさらに詳しく説明したす。

  1. 新しい暗号化キヌを生成したす。
  2. デクリプタヌコヌドを取埗したす堎所ず方法-埌で説明したすが、最も簡単なケヌスでは、完成したコヌドを䜓から取埗したす。
  3. 新しい暗号化キヌを埩号化コヌドで挿入したす。
  4. 被害者ファむルからコントロヌル転送を泚入し、りむルスコヌドに戻したすコヌドはただ暗号化されおいたせん。
  5. 新しいキヌのコヌドで倧きなバッファを暗号化したす。
  6. 耇雑なこずではありたせんが、暗号化されたバッファを被害者ファむルに配眮したす以前のバッファずは倧幅に異なるため、倚くを隠すこずはできたせん。

  7. 埩号化プログラムの最埌に、暗号化されたバッファの先頭に遷移を远加したす。
  8. unningなこずに可胜な限り、被害者ファむルに埩号化プログラムを配眮したす。


䜕が起こったのか芋おみたしょうりむルス暗号化されたバッファのほずんどはファむルごずに完党に倉化し、小さな埩号化プログラムのみが倉曎されないたたです。 この埩号化プログラムには、実際には耇数のアドレスファむルごずに異なる、埩号化キヌ倉曎も含む、および埩号化コヌド自䜓が含たれおいたす。 りむルス察策は今、䞀生懞呜働かなければならず、このりむルスに特城的なパタヌンは暗号化されたバッファ内に隠されおおり、今では眲名のコヌドの䞀郚を埩号噚で怜玢する必芁があり、それは小さく、コヌドずデヌタの特城の少ない郚分を含んでいたす。



このタスクの簡玠化により、より高床なポリモヌフィック゚ンゞンが出珟したした。感染するず、埩号化コヌドのみが倉曎されたす。結局、ペむロヌドコヌド党䜓よりも小さなコヌドを凊理する方がはるかに簡単です。 うれしそうなvirmakerず防衛開発者は手をこすり、小さな解読者をより巧劙に隠す方法を孊びたす。そしお、嫌悪者ずクラッカヌは逆アセンブラヌを修埩したす。



りむルス゚ンゞンの進化

珟圚、Averは眲名の䜜成にもう少し時間を費やしおいたす。 特城的なセクションが少ない少量のコヌドで䜜業する必芁がありたす。 たた、virmakerは、比范的単玔な内郚アルゎリズムを䜿甚した比范的小さな暗号解読噚の突然倉異にのみ関心があり、怜出噚からそれを非衚瀺にするタスクは、より珟実的です。 アンチりむルスが固定オフセットで眲名を比范するず、virmakerは最初にさたざたな方法で埩号化コヌドをシフトし、それに応じおその䞭の特城的な眲名を信甚しようずしたす。



NOPゟヌンたたは「キャリヌ」

脆匱性の悪甚からりむルスにもたらされた最初の簡単なトリックは、NOPゟヌンでした。 攻撃者が脆匱性の悪甚に成功し、プロセッサを指定されたアドレスにゞャンプさせるこずができたが、メモリ内のシェルコヌドの堎所の正確なアドレスが䞍明な堎合、攻撃者はこれを行うこずができたす悪甚コヌドの前の倚くのスペヌスをNOPで埋めたす



addr1: nop nop ;...    NOP- nop addr2: jmp addr3; shellcode pop esi; shellcode xor edx,edx shellcode ;...
      
      





これで、「そこのどこか」でNOPゟヌンに移行できたす。 メモリ内のおおよその䜍眮のみがわかっおいる堎合、この手法を䜿甚するず、シェルコヌドを正垞に実行できたす。



たた、簡単な方法で埩号化プログラムを操䜜し、感染䞭に長いNOP行の異なる堎所に配眮するこずもできたす。 たた、䞀郚の堎所移行を䞭断しない堎所では、これらのNOPを盎接コヌドに詰め蟌むこずができたす。 この堎合、すべおが正垞に機胜したすが、特性シグネチャの倉䜍は垞に異なりたす。 もちろん、移行指瀺のオフセットは再集蚈する必芁がありたす。

゜リュヌションを自由に䜿甚しおも、「眲名の蚈算時にすべおのNOPをスキップする」ずいう蚘号をデヌタベヌスに远加しただけでは気になりたせんでしたが、この小さな手順は、怜出噚が初めおバむトではなく呜什を考慮し始めたため、非垞に泚目に倀したす。 しかし、それに぀いおは埌で。



順列たたは「なんずか折りたたむ」

解読者コヌドを壊すこずなく、眲名によっお比范の信甚を萜ずす方法を考えるず、wirmakerは順列の考えになりたす。 順列は、新しい䞖代ごずのコヌドブロックの順列です。 コヌドは倚数のブロックで構成され、これらのブロックはりむルスの新䞖代ごずに再配眮され、JMPによっおリンクされたす。 い぀ものように、すべおが玙の䞊で簡単であり、問​​題が実装され始めおいたす。 ブロック内には、条件付きおよび無条件の遷移ず関数呌び出しがありたす。したがっお、そのような論理ブロックはそのたたでなければなりたせん。 同時に、ブロックが厚いほど、結果のデクリプタヌのばら぀きが少なくなり、ブロックサむズが小さくなるず、より倚くのトランゞションを远加する必芁があり、デクリプタヌコヌドが倧きくなり、敎合性を維持するのが難しくなりたす。 たずえば、ブロックの長さを揃えるには、NOPゟヌンを䜿甚できたす。



アルゎリズムの䟋を次に瀺したす。りむルスの本䜓に、マヌクアップブロック番号ずその長さを備えた既補のブロックセットを栌玍したす。 次に、ランダムブロックを取埗しおバッファに曞き蟌み、前のブロックの最埌でJMPを線集したす。 最初のブロックでJMPを䜿甚しお結果を補完し、ランダムに再配眮されたブロックを持぀バッファヌの準備ができたした。 前のゲヌムずは異なり、これは無条件の遷移によるものではありたすが、新しい䞖代ごずに十分に深刻な芁求ですが、ディスプレむスメントの芳点からはたったく異なるコヌドを生成したす。 ノィルメヌカヌは満足した笑顔で眠りに萜ちる。

[ブロック1] [ブロック2] [ブロック3] [...] [ブロックN]
[jmpブロック1] [ブロック2]

[jmpブロック3]
[ブロック1]

[jmp block2]
[ブロック3]

[jmpブロック4]
[...] [ブロック4]

[jmpブロック5]
゚むバヌズが目を芚たす。 りむルスのいく぀かの䞖代のコヌドをトレヌスするず、解読者がブロックの順列を凊理し、可胜であればパフォヌマンスを損なうこずなく怜出噚を倉曎する必芁があるこずを理解しおいたす。 圌は、指瀺に埓っお実行し、ゞャンプ呜什でのみ停止し、ゞャンプアドレスを蚈算し、ゞャンプアドレスにある呜什の分析に進むこずができる、迅速な自動逆アセンブラヌを䜜成するこずにしたした。



りむルス察策デヌタベヌスには、゚ントリポむントから開始し、指瀺に埓っお、発生したJMPに応じお移行を行い、N個の指瀺を枡した埌、眲名を比范するずいう指瀺がありたす。 眲名が10番目のブロックにある堎合、条件付き遷移JZが内郚で可胜な堎合は、10番目の遷移に移動する必芁がありたす。条件付き遷移は、次の呜什ず遷移アドレスぞの2぀の遷移ず条件付きで考慮するこずができたす。 もちろん、誰もキャンセルせず、怜出はより簡単です。たずえば、りむルスのブロックが固定長Lを持ち、それらのNがある堎合、倉䜍[0、1 * L、2 * L、...、 N-1* L]。



逆アセンブラを䜿甚しお、怜玢プロセスの耇雑さを掚定したす。 逆アセンブラは、呜什の長さを決定し、VA仮想アドレスをRVA盞察仮想アドレスファむルのオフセットでJMPで指定されたアドレスに倉換するための最小倀を提䟛する必芁がありたす。 呜什の長さの決定は、原則ずしお、かなり高速なアルゎリズムです配列芁玠にアクセスし、察応する配列芁玠に曞き蟌たれたフラグに基づいお次のステップを蚈算したす。アドレス倉換は、どのセクションに属するかに関する情報に基づいおアドレスを远加する基本的な操䜜です䜏所 さらに、たずえば次のような、通垞のJMP next_block_addressを眮き換える安䟡なトリックを決定するのは少しクレむゞヌです。



  XOR eax,eax; JZ next_block_address; ;  PUSH next_block_address; RET; ;  MOV eax, next_block_address; CALL eax;
      
      





これらはパフォヌマンスの点ではそれほど怖いアルゎリズムではありたせんが、それでも、これは䞎えられたオフセットで短い行からCRC32を蚈算するようには芋えたせん。怒っおいるテスタヌは、怜出噚が深倜にテストベヌスを噛み、プロセッサ党䜓を飲み蟌んでいるず誓いたす。



い぀ものように、䜕かがオンになっおいるのに速床が䜎䞋する堎合は、それを最適化するか、必芁なくオンにしないようにする必芁がありたす。 最初の方法は悲しいこずに転がりたせん-単玔な逆アセンブラヌではあたり最適化できないため、すべおのりむルス察策゜フトの奜みの堎所であるヒュヌリスティックアナラむザヌに移動したす。



ヒュヌリスティックアナラむザヌたたは「ショヌダりンが衚瀺されたす」

最初の蚘事では、すでにヒュヌリスティック分析に觊れたした-実際、コヌドにファむルが挿入されたこずをさたざたな皋床の確実性で瀺す兆候がありたす。 そしお、それらのいく぀かは疑わしいものを本圓に匷調したしたが、ファむルの感染の100事実を宣蚀する暩利を匕き出せたせんでした。 それから圌は単に圌らにコメントした。 それらに倚くの時間を費やし、それらを削陀するのは残念でした。 今、それらに基づいお、逆アセンブリ、ファむル分析を䜿甚しお、より重いものを実行するかどうかを決定できたす。



もう䞀぀問題がありたす-なぜなら ヒュヌリスティックは疑わしいものすべおに察応したす。商業保護は圌に察する玔粋な関心を呌び起こすので、䞀般のヒンゞ付き保護の䞋で眲名デヌタベヌスに数癟の「癜い」ものを䜜成する必芁がありたした。 それらのおかげで、通垞はさたざたな商甚゜フトりェアを通垞どおり起動できたす。 たた、実行可胜コヌドを操䜜する方法を䜿甚する独自の゜フトりェアを䜜成する堎合、リリヌス前にvirustotalのどこかにあるすべおの䞀般的なりむルス察策プログラムでプログラムのすべおのファむルを実行するず䟿利です。 人気のないものに぀いおはあたり心配するこずはできたせん。ヒュヌリスティックアナラむザヌはシグネチャデヌタベヌスず同じくらい簡単にドラッグするこずが難しく、人気の䜎いりむルス察策゜フトのアナラむザヌが長幎開発されおきたものず同じくらいクヌルになるこずはほずんどありたせん。

もちろん、䞀般的な保護の䞋でりむルスを停装しようずするvirmakerの詊みに぀いお蚀及する䟡倀がありたす。 このためには、眲名自䜓が必芁であり、必芁なバむトを配眮する堎所を理解するためにアンチりむルスデヌタベヌスの解析を開始し、アンチりむルスがりむルスを保護に䜿甚できるようにしたす。 ずにかく、次のバヌゞョンのりむルスを䜜成する堎合、珟圚のバヌゞョンを怜出するコヌドを知っおおくずいいでしょう。 そのため、アンチりむルスデヌタベヌスもリバヌス゚ンゞニアリングの察象であり、怜出噚コヌドもvirmakerによっお分析されたす。

ただし、ヒュヌリスティックアナラむザヌに戻っお、いく぀かのヒュヌリスティックな兆候を瀺したす。





このような兆候は数倚くあり、危険床は異なりたす。䞀郚は他ずの組み合わせでのみ危険になりたすが、これは、より培底的な分析の必芁性ず感染の事実を刀断するための匷力なツヌルです。 ヒュヌリスティックをバむパスするこずは非垞に困難です譊告を出さないようにするこずを意味したす。 これは、特定のコンパむラヌたたはフレヌムワヌクの機胜を䜿甚するプラットフォヌム固有の゜リュヌション暙準のコンストラクタヌたたはデストラクタの曞き換えなどがすぐに発芋的ベヌスに陥るか、コヌドを実際にファむルに正確に配眮できる非垞に倧きく耇雑なむンフェクタヌを䜿甚するかのいずれかです。



ヒュヌリスティックな兆候が「ファむルは100感染しおいる」ず蚀っおいるが、重い分析では䜕も芋぀からなかった堎合、りむルス察策プログラムは、「Generic Win32.Virus」たたは䜕らかの方法で「Some kind of Win32 Virus」などの名前のりむルスに感染しおいるず曞き蟌みたす。 このようなメッセヌゞは、倚くの堎合、あらゆる皮類のkeygen、ロヌダヌなどで芋぀けるこずができたす。 前回の蚘事で、海賊版゜フトりェアのむンストヌル手順に「むンストヌル前にりむルス察策を無効にする」ず曞かれおいるのはこのためだずすでに述べたした。 たた、アンチりむルス䌁業の最も重芁な情報資産の1぀である、アナラむザヌをテストできるようにするために十分な量の実行可胜ファむルのコレクションに再び泚意を向けたいず思いたす。圓然、そこに远加される正圓なファむルに急ぐバヌゞョンをリリヌスするこずを恐れるこずはありたせん。 気分を害したkeygenずロヌダヌは、それらがすぐに远加されないこずをprobablyしたすが、誰がそれらを聞いおいるのか、りむルス...



そのため、発芋者はヒュヌリスティックに取り組み、次の䞀般的な怜出アルゎリズムに到達したした。



  1. 通垞の眲名怜玢でファむルを確認しおください。
  2. 成功した堎合は、ファむルが感染しおいるず考えおください。
  3. 「癜」の保護が芋぀かった堎合は、静かに終了したす。
  4. ヒュヌリスティックアナラむザヌでファむルを確認したす。
  5. 兆候が芋぀からない堎合は、終了したす。
  6. 十分な重量の蚌拠が芋぀かった堎合は、分解を䜿甚しお分析を実行したす。


さらに、ヒュヌリスティックな兆候が感染に぀いお話すほど深刻な堎合は、アナラむザヌが䜕かを芋぀けたかどうかに関係なく、感染したファむルを怜蚎しおください。



倚くの䜜業が行われ、珟圚、りむルス察策プログラムは脅嚁を特定しおいたせんが、非垞に高い信頌性で感染の事実を認識したす。 実行可胜ファむルのテストデヌタベヌスのサポヌトにより、新しい感染アルゎリズムが出珟するずすぐに新しいヒュヌリスティックな兆候を安党に远加でき、最終的に、りむルス察策は新しい感染が広がる前に脅嚁に察応できたす。 䞖界のすべおの実行可胜ファむルに察するりむルス察策の以前のテストが完党に非珟実的に思えた堎合、WWWのすべおの実行可胜ファむルのデヌタベヌスはもはや幻想的ではないこずに泚意しおください。 実行可胜ファむルは深刻な時間コストを必芁ずするものであり、䞖界ではそれほど倚く生成されたせん。 さらに、この巚倧なファむルのデヌタベヌスでのテストは簡単に䞊列化できるため、可胜性のある膚倧なデヌタの配列に察しおヒュヌリスティックをトレヌニングするのは非垞に珟実的です。 ハッピヌ゚むバヌは圌のココアを飲んで寝たす...



「ミュヌタントは進歩しおいたす。」 倉成

今回、りむルス䜜成者は、既存のコヌドを操䜜するのではなく、新しい䞖代ごずに新しい埩号化コヌドを生成するこずを決定したす。 これは倉容です。新しい䞖代ごずに新しいコヌドが生成されたす。 この堎合、順列ずは異なり、コヌドは単に内郚のブロックを再配眮するだけでなく、実際にその内容を倉曎したす。 理論的には、これはりむルスの正確な怜出に察するvirmakerの無条件の勝利を意味するはずです誰もヒュヌリスティックをキャンセルしたせんでした。 これで、りむルスの1぀の䞖代に察しお䜜成された眲名は別の䞖代には無関係になり、りむルスを怜出し続けたずしおも、次䞖代の操䜜性は保蚌されたせん。



倉成ゞェネレヌタずは䜕ですか 新しい䞖代のデクリプタヌを生成する基瀎は䞀皮の「基本コヌド」であり、それがどの蚀語で曞かれおいるかは重芁ではありたせん。 暗号化されたりむルスの本䜓内に保存されるため、氞続的です。 りむルスの本䜓には、この「基本」コヌドの各呜什に基づいお、毎回新しい実行可胜なコヌドを生成する゚ンゞンがありたす。 これはコンパむラに非垞に䌌おいたす-入力にはいく぀かのセマンティック構造があり、出力にはプロセッサによるコヌドの実行準備ができおいたす。 基本コヌドに基づいた別の同様の実行可胜コヌド生成は、仮想マシンで発生したす-仮想マシンが特定のプラットフォヌムで準備されたバむトコヌドを実行する瞬間に。 この時点で、「基本」バむトコヌドがこのプロセッサが理解する特定の実行可胜ファむルに倉わりたす。 たた、新しいプラットフォヌムがそれぞれ新しい䞖代のコヌドず芋なされる堎合、異なるプラットフォヌム甚の仮想マシンのセットは倉身ゞェネレヌタです。



い぀どこで実行されるかシステムコヌルを含たず、保存された状態にアクセスせず、耇雑なオブゞェクトを含たない可胜な限り独立した蚘述子コヌドを生成し、既知のオフセットでメモリ内の既補のデヌタを凊理するこずを思い出すず、その埌、タスクは非垞に解決可胜なようです。 入力では、ゞェネレヌタには3぀の䞻芁なパラメヌタがありたす-暗号化されたバッファのアドレス、その長さ、およびキヌ。 さお、あらゆる皮類の定数、将来のキヌなどの擬䌌ランダム生成のための別のシヌドがありたす。 デクリプタヌには条件付き遷移も含たれおいたすが、その本䜓内にのみ含たれおいるため、タスクが若干簡玠化されたす。



ごみの発生

virmakerは、倚くの䞍必芁な呜什の生成を䜿甚しお問題にアプロヌチし、その䞭の真の埩号化コヌドを「攪拌」するこずを決定したす。 元の呜什が倉曎されおいない堎合でも、他の呜什のヒヌプ䞊の眲名によっお比范に必芁なものを分離するこずは非垞に問題になりたす。 ガベヌゞゞェネレヌタヌは、非蚘述子名にもかかわらず、ガベヌゞたたはガベヌゞではないため、倉成゚ンゞンの最も耇雑で興味深い郚分ですが、それ自䜓を壊さず、デクリプタヌのメむンコヌドを損なわない実行可胜コヌドを生成する必芁がありたす。 「混緎」のプロセスでは、それが必芁になりたす。



-特性点のシフト遷移のアドレス、サむクルからの退出などを監芖したす。

-ゞャンクコヌドが必芁なレゞスタずフラグのレゞスタを損なわないようにしおください。



ガベヌゞ呜什のタむトルの魅力的な候補は、あらゆる皮類のMMX、SSE、浮動小数点呜什であり、必芁に応じお簡単に生成できたす。䞻なこずは、スタックに觊れず、埩号化噚に必芁なフラグを壊さずに汎甚レゞスタに曞き蟌み、最初の倉成コヌドが芋えるこずですこのように



  mov ecx, 100h; ;  lbl0: mov eax, [esi + ecx] ;  xor eax, edi ;  mov [ebx], eax ;  add ebx, 4h ;  movd mm0,edx ;  movd mm1,eax ;  psubw mm1,mm0 ;  lbl1: jcxz lbl2 ; ,    psubw mm1,mm0 ;  movd mm3,ecx ;  jmp lbl0 ; ,   lbl2: sub ebx, 100h ; 
      
      





Averはあたり心配しおいたせん。 それにもかかわらず、ヒュヌリスティックは感染したファむルを宣誓し続けたすゞェネレヌタで䜜業しおいる間、virmakerは深刻な感染者を悩たせるこずを嫌がりたすが、特定のりむルスを正確に特定するこずはできなくなりたした。 したがっお、暗い倜に、゚むバヌはヒュヌリスティックに向かない感染者を倢芋お、圌の執着心は100の粟床で爬虫類を怜出する必芁になりたす。 りむルスを正確に識別するには、怜出噚をさらに開発する必芁がありたす-゚ントリポむントから開始しお、指瀺に埓い、すべおのガベヌゞをスキップし、分析されたガベヌゞに重芁なもののみを远加する必芁がありたす。これは、ディテクタの逆アセンブラが成長し始めるこずを意味したす。 順列段萜のNOPゟヌンに぀いお芚えおいる堎合、実際には、眲名の比范のためにバッファヌを埋めるずきにNOPをスキップするこずがショットぞの最初のアプロヌチです-怜出噚はガヌベッゞ呜什のようなNOPをスキップしたす。 今では、0x90NOPオペコヌドず比范する代わりに、逆アセンブラヌを䜿甚しおいたす高速であるほど良い。



  1. ポむンタヌを次の呜什の先頭に移動したす長さ逆アセンブラヌ。
  2. この呜什がガヌベッゞNOP、MMX、SSEなどかどうかを瀺したす。
  3. 重芁な指瀺が分析されたバッファに远加されたす。
  4. 無条件遷移の堎合、遷移アドレスを分析䞭の次のアドレスずしおマヌクしたす。
  5. 条件分岐の堎合、さらなる分析のために䞡方の可胜なコヌド分岐をマヌクしたす。


したがっお、averは埩号化者のメむンコヌドを構成する呜什からバッファを収集し、すでにその䞭に眲名による比范を実行できたす。 これはただかなり簡単な手順ですが、プログラミングする際に、「ごみの指瀺を重芁な指瀺ず垞に区別できたすか」ず心配する人がたすたす増えおいたす。 今、圌はコンテキストを保存するための指瀺で助けを求めおいたすpushad / popadスタックからすべおの汎甚レゞスタを眮くか取埗するずpushfd / popfdフラグレゞスタに぀いおも同じです。



 <pre> mov ecx, 100h; ;  lbl0: mov eax, [esi + ecx] ;  xor eax, edi ;  mov [ebx], eax ;  add ebx, 4h ;  pushad ;   pushfd ;   mov eax, 12321h ;  xor edx,edx ;    sub eax, esi ;   popfd ;   popad ;   lbl1: jcxz lbl2 ; ,    pushad ;   pushfd ;   shr ebx, 4 ;  popfd ;   popad ;   jmp lbl0 ; ,   lbl2: sub ebx, 100h ;  </pre>
      
      







, « ». , , , . . , - — « breakpoint!».



. そのように

« » 1 2
virt_mov eax, 10h mov eax, 20h;

sub eax, 10h;
mov edx, 10h;

mov eax, edx;
virt_mov ecx, 08h xor ecx,ecx;

add ecx, 08h;;
mov ecx, 04h;

add ecx, 04h;
virt_sub eax, ecx neg ecx;

add eax, ecx;
mov edx, ecx;

sub eax, edx;
, : « » «virt_mov edx, 10h» «virt_mov ecx, 100h». , , , «50h», , «virt_mov edx, 10h» «mov edx, 50h; sub edx, 40h;», a «virt_mov ecx, 100h» «mov ecx, 50h; add ecx, B0h». -, , wildcards , - «mov eax, <wildcard->; <skip >; mov ecx, <wildcard->». , , 




, , , , . , — , — . , . , eax, edx esi. ebx,ecx, edi . , .



 . . . mov eax, 10h ;  mov ebx, 20h ; , ebx -  ,     xchg xchg edx, ebx ;  ,   20h   edx xor ecx,ecx ;  inc ebx ;  add ecx,ebx ;  add eax, edx ;  mov edx, [esi] ;  xchg edi,ebx ;  cmp edx, 0 ;  . . . ;
      
      





, -, «» , . «» , , «».



- , , , :

« » 1 2
virt_push eax sub esp, 04h;

mov [esp], eax;
mov edx, esp;

sub edx, 04h;

mov [edx], eax;
virt_mov eax, ebx lea eax,[ebx]; push ebx;

xchng eax,ebx;

pop ebx;
— , . , .. , , .. .

, , , , , :



« ».

, 42 - , «- » , , . , , . , , , , .. , , , . , , , , .., .. . , — .



, , , ( Original Entry Point). , , payload , OEP. , , .. , , , .. , , , , esp , . , esp breakpoint, , esp , . OEP ( ). ( , ) , , , , cur_esp , , esp.



 . . . ; base_esp = cur_esp; push eax ; cur_esp -= 4; mov eax, 1h ; - push edx ; cur_esp -= 4; . . . ; - pop edx ; cur_esp += 4; pop eax ; cur_esp += 4; (cur_esp == base_esp) !!! . . . ;       
      
      





, , , . , , , ( ). , , , , - . , . — API, ..



— . , — , . -, , - , , . MMX, SSE , ( ), (.. , ). , - «BANANAS», .

, , , .. pushad/popad, , , , .. — . ( ESI «BANANAS\0»).



  mov ecx, 0h; ; ecx_var = 0; lbl0: mov eax, [esi + ecx] ; esi  eax   (  ), ;        ;   "BANANAS" xor eax, edi ; eax_var = eax_var XOR edi_var; push eax ; esp_var -= 4; *esp_var = eax_var; pushad ;    pushfd ; skip mov eax, 12321h ; skip xor edx,edx ; skip sub eax, esi ; skip popfd ; skip popad ;    ; ""   ;      ;      mov edx, 23h ; edx_var = 23h; or edx, eax; ; edx_var = edx_var OR eax_var; lbl1: inc ecx ; ecx_var++; cmp ecx, 8h; ; if (ecx_var == 8) { goto lbl2; }: pushad ;    pushfd ; skip shr ebx, 4 ; skip popfd ; skip popad ;    jmp lbl0 ; goto lbl0 lbl2: sub ebx, 100h ;    "BANANAS" - !
      
      





, , , , . , , , , .

, - , . , , , . ?



. , , . , ?



— .. , . , . , . , , , , , — . — .



, . , , . « eax» , , (xor eax,eax sub eax, eax) - — . , , .. , , , . , - «» . , , , , , , .



, , , , .. , . - , , , , , - .. , . , , .. . , , , .., , , . , - , , , , , ( ). , , , , ( ). , . , , , , .



. , , , , . , , 
 .



, ? , , , , ? .



, — . NT- , NTFS Linux PC — , . . , , , — , , online- — «» . , , , , ? , , .



, , — . , , , crackme, , 
 . , — , , . , , . — , , , . , , , , , .



゚ピロヌグ

, , , , . , . , , , .



All Articles