2017-08-19 17 views
2

マイケル・シコルスキーの "Practical Malware Analysis"の例題を理解しようとしています。私が理解していない逆解体技術の例があります。共通のテクニックは、2つの条件付き命令、すなわちゼロ(JZ)のジャンプとゼロでない場合のジャンプ(JNZ)を作成することであり、一緒に考えると無条件に1つの命令(これは私にとっては明白です)です。ディスアセンブラで作成された2つの可能な結果のグラフィックがあります。x86同じターゲットで2つのジャンプ命令をアセンブルする

wrong interpretation

right interpretation

次の引用は、図1を参照:

この例では、すぐに2つの条件ジャンプ命令の次の命令は、呼び出し命令であるように思われます(呼び出し)、バイト0xE8で始まります。両方の条件ジャンプ命令が実際にあることを意味することになっている何0xE8バイト

を超えて1つのバイトを指し、なぜジャンプの場所があるので、これは、しかし、そうではありませんloc_4011C4(から+1が来る)+ 1 ?図2では、それはloc_4011C5ですか?誰かがより詳細な説明をしてくれますか?

+1

ジャンプターゲットは、コール命令の中で1バイトです。どうして?それは、おそらく難読化目的のために、プログラマがそれを書いた方法です。図2は実行される実際の命令を示す。 C4 + 1 = C5 – Jester

答えて

6

アセンブラコードのコンパイル結果は、ネイティブコード、より具体的にはバイトのシーケンスであり、このシーケンスの異なる部分が元のアセンブリの命令に対応しています。 Intel x86プロセッサはいわゆるCISC命令セットを持っています。これは基本的にバイト単位の命令長が1から12まで変化することを意味します。これは現在使用可能な命令セット拡張を考慮しないことです。提示された技術は、この事実を利用している。

全体のポイントは、潜在的ないたずらを持つ人を誤解させることです。 2番目の例のコード(pop eaxretn)は、実行したいものと実行されるものです。 しかし、我々はpop eax命令の前に偽のバイトを挿入したので、メモリ内のある場所にcallがあるかのような注意を払わずに、逆アセンブルされたコードは自動的にそのマシンコードをバイナリにはギャップがありません。

この手法は絶対確実ではありません。より洗練されたdiassemblersは著者の本当の意図を明らかにするでしょう。また、コードに侵入しようとする人がデバッグ環境でそれを実行している場合、このテクニックはもう役に立たないことにも注意してください。

関連する問題