重耇する呜什でアセンブラヌプログラムを蚘述する方法バむトコヌドを難読化する別の手法

コンパむルされたバむトコヌドを分解から保護するために、オヌバヌラップする呜什でアセンブラヌプログラムを䜜成する手法を玹介したす。 この手法は、静的および動的バむトコヌド分析の䞡方に耐えるこずができたす。 この考え方は、2぀の異なるオフセットから逆アセンブルされたずきに2぀の異なる呜什チェヌン、぀たりプログラムを実行する2぀の異なる方法を生成するバむトストリヌムを遞択するこずです。 これを行うには、マルチバむトのアセンブラヌ呜什を䜿甚し、これらの呜什のバむトコヌドの可倉郚分に保護されたコヌドを隠したす。 呜什のマスキングチェヌンに埓っお停のトレむルに逆アセンブラヌを配眮するこずにより、逆アセンブラヌを欺き、目から隠された呜什のチェヌンを保護するため。













効果的な「重耇」を䜜成するための3぀の前提条件



逆アセンブラヌを欺くために、オヌバヌラップするコヌドは次の3぀の条件を満たす必芁がありたす。1マスキングチェヌンず隠しチェヌンからの呜什は、垞に互いに亀差する必芁がありたす。 互いに盞察的に敎列しおはいけたせん最初ず最埌のバむトが䞀臎しおはいけたせん。 そうしないず、隠されたコヌドの䞀郚がマスキングチェヌンに衚瀺されたす。 2䞡方のチェヌンは、もっずもらしい組み立お説明曞で構成する必芁がありたす。 そうしないず、静的解析の段階でマスキングが既に怜出されたす実行に適さないコヌドに぀たずいたため、逆アセンブラヌはコマンドポむンタヌを修正し、マスキングを公開したす。 3䞡方のチェヌンのすべおの呜什は、もっずもらしいだけでなく、正しく実行する必芁がありたすこれを防ぐため、実行しようずするずプログラムがクラッシュしたした。 そうでない堎合、動的解析䞭に、倱敗が逆の泚意を匕き付け、マスキングが明らかになりたす。







「オヌバヌラップ」アセンブラヌ呜什の手法の説明



重耇するコヌドを䜜成するプロセスを可胜な限り柔軟にするためには、可胜な限り倚くのバむトが任意の倀を取るこずができるマルチバむト呜什を遞択するだけです。 これらのマルチバむト呜什は、マスキング呜什チェヌンを構成したす。







䞊蚘の3぀の条件を満たす重耇コヌドを䜜成するずいう目暙を远求するために、各マスキング呜什をXX YY ZZずいう圢匏の䞀連のバむトず芋なしたす。







ここで、XXは呜什プレフィックスです呜什コヌドおよびその他の静的バむト-倉曎できたせん。







YYは、任意に倉曎できるバむトです原則ずしお、これらのバむトには、呜什に枡された盎接数倀が栌玍されたす;たたはメモリに栌玍されたオペランドのアドレス。 より倚くの隠された呜什が適合するように、できるだけ倚くのYYバむトが必芁です。







ZZ-これらも任意に倉曎できるバむトであり、唯䞀の違いは、ZZバむトず次のバむトXXZZ XXの組み合わせが、蚘事の冒頭で定匏化された3぀の条件を満たす有効な呜什を圢成するこずです。 理想的には、ZZは1バむトのみを占有する必芁がありたす。そのため、YYこれは本質的に最も重芁な郚分です。ここに隠されたコヌドが配眮されたすにはできるだけ倚くのバむトが必芁です。 最埌の非衚瀺呜什はZZで終了する必芁がありたす。2぀の実行チェヌンの収束点を䜜成したす。







接着手順



ZZ XXの組み合わせ-接着呜什を呌び出したす。 接着呜什は、最初に、隣接するマスキング呜什にある隠された呜什を結合するために、そしお次に、蚘事の冒頭に蚘茉された最初の必芁条件を満たすために必芁です䞡方のチェヌンの呜什は垞に互いに亀差する必芁がありたすしたがっお、垞に接着呜什2぀のマスキング呜什の亀点にありたす。







接着呜什は、隠されたコマンドのチェヌンで実行されるため、隠されたコヌドにできるだけ制限を課さないように遞択する必芁がありたす。 実行時に汎甚レゞスタヌずEFLAGSレゞスタヌが倉曎され、隠しコヌドが察応するレゞスタヌず条件付きコマンドを効果的に䜿甚できないず仮定したすたずえば、接着呜什の前に比范挔算子があり、接着呜什自䜓がEFLAGSレゞスタの倀を倉曎し、その埌条件付き遷移を行う堎合、これは、接着の指瀺が正しく機胜しないこずを瀺しおいたす。







オヌバヌラップ手法の䞊蚘の説明を次の図に瀺したす。 実行が先頭バむトXXで始たる堎合、マスクされた呜什チェヌンがアクティブになりたす。 たた、バむトYYからは、隠された呜什チェヌンがアクティブになりたす。













「マスク呜什」の圹割に適したアセンブラヌ呜什



䞀芋するず最適な呜什の䞭で最も長い呜什は、MOVの10バむトバヌゞョンで、レゞスタず32ビットアドレスで指定されたオフセットが第1オペランドずしお転送され、32ビット数が第2オペランドずしお転送されたす。 この呜什には、任意に倉曎できるほずんどのバむトが含たれおいたす最倧8個。













ただし、この呜什は劥圓なように芋えたすが理論的には正しく実行できたす、その第1オペランドは原則ずしおアクセスできないアドレスを指しおいるため、このようなMOVを実行しようずするず、プログラムは適切ではありたせん。厩壊したす。 T.O. この10バむトのMOVは、3番目の必芁条件を満たしおいたせん。䞡方のチェヌンのすべおの呜什を正しく実行する必芁がありたす。







そのため、プログラムの厩壊のリスクをもたらさない応募者のみをマスキング指瀺の圹割ずしお遞択したす。 この条件により、オヌバヌラップするコヌドの䜜成に適した呜什の範囲が倧幅に狭たりたすが、適切なものがただありたす。 以䞋は4぀です。 これらの4぀の呜什にはそれぞれ5バむトがあり、プログラムがクラッシュするリスクなしに任意に倉曎できたす。







































参考のために、ここに他のいく぀かのNOPオプションがありたす。













「接着呜什」の圹割に適したアセンブラヌ呜什



接着呜什の圹割に適した呜什のリストは、特定のマスキング呜什ごずに䞀意です。 以䞋は、9バむトのNOPを䟋ずしお䜿甚したリストです次の図に瀺すアルゎリズムによっお生成されたす。













このリストを䜜成する際、ZZが1バむトを䜿甚するオプションのみを考慮したしたそれ以倖の堎合、非衚瀺のコヌド甚のスペヌスはほずんどありたせん。 9バむトのNOPに適したスティッキヌ呜什のリストを次に瀺したす。













この指瀺リストには、副䜜甚のないものはありたせん。 それらはそれぞれ、EFLAGS、汎甚レゞスタヌ、たたはその䞡方を䞀床に倉曎したす。 このリストは、呜什の副䜜甚に応じお4぀のカテゎリに分けられたす。







最初のカテゎリには、EFLAGSレゞスタを倉曎するが、汎甚レゞスタを倉曎しない呜什が含たれたす。 このカテゎリの呜什は、EFLAGSレゞスタからの情報の評䟡に基づいお、条件付きゞャンプたたは隠された呜什のチェヌンに呜什がない堎合に䜿甚できたす。 この堎合9バむトのNOPの堎合、このカテゎリに属する​​のはTESTずCMPの2぀の呜什のみです。













以䞋は、TESTを接着呜什ずしお䜿甚する隠しコヌドの簡単な䟋です。 この䟋では、exitシステムコヌルを実行し、Linuxのすべおのバヌゞョンに察しお倀1を返したす。ニヌズに合わせおTEST呜什を正しく圢成するには、最初のNOPの最埌のバむトを0xA9に蚭定する必芁がありたす。 このバむトは、次のNOPの最初の4バむト66 0F 1F 84ず組み合わされるず、TEST EAX呜什0x841F0F66に倉わりたす。 次の2぀の図は、察応するアセンブラコヌドを瀺しおいたすマスキングチェヌンず隠しチェヌン甚。 制埡が最初のNOPの4番目のバむトに転送されるず、非衚瀺のチェヌンがアクティブになりたす。



















2番目のカテゎリには、汎甚レゞスタたたは䜿甚可胜なメモリスタックなどの倀を倉曎するが、EFLAGSレゞスタは倉曎しない呜什が含たれたす。 即倀が第2オペランドずしお指定されおいるPUSH呜什たたは任意のMOVバリアントを実行する堎合、EFLAGSレゞスタは倉曎されたせん。 T.O. 2番目のカテゎリの接着呜什は、比范呜什たずえば、TESTずEFLAGSレゞスタを評䟡する呜什の間に配眮するこずもできたす。 ただし、このカテゎリの呜什は、察応する接着呜什に衚瀺されるレゞスタの䜿甚を制限したす。 たずえば、MOV EBP、0x841F0F66が接着呜什ずしお䜿甚される堎合、EBPレゞスタを䜿甚する可胜性隠されたコヌドの残りからは倧幅に制限されたす。







3番目のカテゎリには、EFLAGSレゞスタを倉曎する呜什ず、汎甚レゞスタたたはメモリの倉曎が含たれたす。 これらの呜什には、最初の2぀のカテゎリの呜什に比べお明らかな利点はありたせん。 ただし、これらは蚘事の冒頭で定匏化された3぀の条件ず矛盟しないため、䜿甚するこずもできたす。 4番目のカテゎリには呜什が含たれ、その実装はプログラムがクラッシュしないずいう保蚌はありたせん-メモリぞの䞍正アクセスのリスクがありたす。 それらを䜿甚するこずは非垞に望たしくありたせん。 3番目の条件を満たしおいたせん。







隠されたチェヌンで䜿甚できるアセンブラヌ呜什



私たちの堎合9バむトのNOPがマスキング呜什ずしお䜿甚される堎合、隠されたチェヌンからの各呜什の長さは4バむトを超えおはなりたせんこの制限は5バむトを占めるスティッキヌ呜什には適甚されたせん。 ただし、4バむトより長いほずんどの呜什はいく぀かの短い呜什に分解できるため、これはそれほど重倧な制限ではありたせん。 以䞋は、非衚瀺のチェヌンに収たるには倧きすぎる5バむトMOVの䟋です。













ただし、この5バむトのMOVは、長さが4バむトを超えない3぀の呜什に分解できたす。













マスキングNOPをプログラム党䜓に分散させるこずによるマスキングの匷化



倚数の連続したNOPは、逆の芳点から芋るず非垞に疑わしい。 これらの疑わしいNOPに泚目するこずで、経隓豊富なリバヌス゚ンゞニアは、それらに隠されたコヌドの最䞋郚に到達できたす。 この露出を避けるために、マスクされたNOPをプログラム党䜓に散圚させるこずができたす。







この堎合の非衚瀺コヌドの正しい実行チェヌンは、無条件ゞャンプの2バむト呜什によっおサポヌトできたす。 この堎合、各NOPの最埌の2バむトは2バむトのJMPを占有したす。







このトリックにより、NOPの1぀の長いシヌケンスをいく぀かの短いシヌケンスに分割できたすたたは、それぞれ1぀のNOPを䜿甚するこずもできたす。 このような短いシヌケンスの最埌のNOPでは、ペむロヌドの3バむトのみを割り圓おるこずができたす4番目のバむトは無条件ゞャンプ呜什によっお取埗されたす。 T.O. ここでは、有効な呜什のサむズに远加の制限がありたす。 ただし、前述のように、長い呜什は短い呜什のチェヌン䞊に配眮できたす。 以䞋は、同じ5バむトのMOVの䟋で、4バむトの制限に収たるように既にレむアりトされおいたす。 ただし、このMOVを3バむトの制限に収たるように分解したす。













同じ原則に埓っおすべおの長い呜什を短い呜什に分解するず、さらにマスクするために、プログラム党䜓に散圚する単䞀のNOPのみを䜿甚できたす。 2バむトのJMP呜什は、127バむトだけ前埌にゞャンプできたす。぀たり、2぀の連続したNOP非衚瀺呜什のチェヌンに関しお連続は127バむト以内でなければなりたせん。







このトリックには、匷化されたマスキングに加えお別の重芁な利点がありたすその助けを借りお、コンパむルされたバむナリファむルの既存のNOPに隠しコヌドを配眮できたす぀たり、コンパむル埌にバむナリにペむロヌドを挿入したす。 ただし、これらの孀立したNOPが9バむトである必芁はありたせん。 たずえば、バむナリの行に耇数のシングルバむトNOPがある堎合、プログラムの機胜に違反するこずなく、それらをマルチバむトNOPに倉換できたす。 以䞋は、NOPを分散するための手法の䟋ですこのコヌドは、䞊蚘の䟋ず機胜的に同等です。













プログラム党䜓に散圚するNOPに隠されおいるこのような隠されたコヌドは、怜出するのがはるかに困難です。







泚意深い読者は、最初のNOPに最埌のバむトがないこずに気付いおいるはずです。 ただし、心配する必芁はありたせん。 これは、芁求されおいないバむトの前に無条件ゞャンプが続くためです。 T.O. コントロヌルは圌に移されるこずはありたせん。 それで、すべおが敎然ずしおいたす。







重耇するコヌドを䜜成するための手法を次に瀺したす。 健康に䜿甚しおください。 precious玢奜きな目からあなたの貎重なコヌドを隠したす。 ただし、9バむトのNOPではなく、他の呜什を採甚しおください。 リバヌサはおそらくこの蚘事も読むからです。








All Articles