x86 アーキテクチャでは、データとコードがメモリまたはディスクに混在していることは誰もが知っています。しかし、どのように彼らに伝えるのですか?
この方法は紙に必要です。100% の精度は期待できません。80% で大丈夫です。いくつかのアイデアでも問題ありません:)
x86 アーキテクチャでは、データとコードがメモリまたはディスクに混在していることは誰もが知っています。しかし、どのように彼らに伝えるのですか?
この方法は紙に必要です。100% の精度は期待できません。80% で大丈夫です。いくつかのアイデアでも問題ありません:)
実行可能ファイルで一般的なコマンドを統計的に判断します。
例えば。一部のコマンドは、加算/減算などです。
未知のバイナリ シーケンスについては、マシン コードのように扱い、使用されるさまざまなコマンドの頻度を調べます (ここでは、コマンドがバイト境界で正しく開始されていると想定できます)。
無効なコマンドが使用された場合、明らかにそれはマシン コードではありません。
それ以外の場合は、使用されるコマンドの割合の頻度が通常と一致するかどうかを確認します。
また、アドレス (例: レジスタまたはメモリ/データの場所) を受け入れるコマンドを使用する場合は、それらを記録します。次に、同じ場所が近くでアクセスされているかどうかを確認します。
これは、使用頻度の降順で使用されるデータの場所を並べ替えることで実行できます。使用頻度の減少の形を見ると、通常とは多少一致します。
データ (非マシン コード) がこれらの統計テストと一致する可能性は低いです。
私がフィットと言うとき、あなたは非常にゆったりとしたフィットをチェックできることに注意してください. 統計的に相関関係がほとんどない場合を除き、通常とはかなりずれていても、おそらくコードです。
すべてのデータは有効な x86 16 ビット マシン コードですか?を参照してください。.
ndisasm -m 32 > program.dump
(もちろん、該当する場合は 16、32、または 64 を使用)cut -b29- < program.dump > program.dump2
grep -v '^$' < program.dump2 > program.asm
grep -l '^db' < program.asm > /dev/null; echo $?
0
されている場合は、すべての指示ではありません (grep
何かが見つかりました)。そうでない場合は、そうです:)