2

x86 アーキテクチャでは、データとコードがメモリまたはディスクに混在していることは誰もが知っています。しかし、どのように彼らに伝えるのですか?

この方法は紙に必要です。100% の精度は期待できません。80% で大丈夫です。いくつかのアイデアでも問題ありません:)

4

2 に答える 2

6

実行可能ファイルで一般的なコマンドを統計的に判断します。

例えば。一部のコマンドは、加算/減算などです。

未知のバイナリ シーケンスについては、マシン コードのように扱い、使用されるさまざまなコマンドの頻度を調べます (ここでは、コマンドがバイト境界で正しく開始されていると想定できます)。

無効なコマンドが使用された場合、明らかにそれはマシン コードではありません。

それ以外の場合は、使用されるコマンドの割合の頻度が通常と一致するかどうかを確認します。


また、アドレス (例: レジスタまたはメモリ/データの場所) を受け入れるコマンドを使用する場合は、それらを記録します。次に、同じ場所が近くでアクセスされているかどうかを確認します。

これは、使用頻度の降順で使用されるデータの場所を並べ替えることで実行できます。使用頻度の減少の形を見ると、通常とは多少一致します。


データ (非マシン コード) がこれらの統計テストと一致する可能性は低いです。

私がフィットと言うとき、あなたは非常にゆったりとしたフィットをチェックできることに注意してください. 統計的に相関関係がほとんどない場合を除き、通常とはかなりずれていても、おそらくコードです。

于 2012-08-19T14:55:17.673 に答える
0

すべてのデータは有効な x86 16 ビット マシン コードですか?を参照してください。.

  1. データをファイルに入れる
  2. 実行ndisasm -m 32 > program.dump(もちろん、該当する場合は 16、32、または 64 を使用)
  3. 16 進数のアドレスとマシン コードを削除します。cut -b29- < program.dump > program.dump2
  4. 上記の 64 ビットを使用した場合、大きな命令は行を分割するため、これらの空の行を削除する必要があります。grep -v '^$' < program.dump2 > program.asm
  5. (ファイルがアセンブル可能になりました)
  6. 命令だけで構成されているかどうかを判断するには、次を実行します。grep -l '^db' < program.asm > /dev/null; echo $?
  7. が表示0されている場合は、すべての指示ではありません (grep何かが見つかりました)。そうでない場合は、そうです:)
于 2013-05-02T13:00:36.477 に答える