1

次のようないくつかの命令をエンコードする必要があります

mov eax, edx
inc edx

対応する x86_64 オペコードに。それを簡単に達成するためのライブラリ(asmコンパイラ全体ではない)はありますか?

4

3 に答える 3

2

オープンソースのFASMまたはNASMを使用して、それらのパーサーを使用できます。

于 2013-01-07T18:34:35.773 に答える
1

すでにバイナリにコンパイルしている場合(asmまたは組み込みのasmを含むcから):

objdump -S your_binary を指定すると、各命令がそのバイナリ コードとともに一覧表示されます。

于 2013-01-07T18:41:46.457 に答える
0

簡単な命令を翻訳した直後だと仮定すると、簡単なアセンブラを書くのはそれほど大変なことではありません。私は以前にそれを行ったことがあります-おそらく、逆アセンブラーコンポーネントのほとんどのロジックとテーブルがあります(オペコードから命令名へのテーブル、レジスタ番号から名前へのテーブルなど-それを逆に使用するだけです)。必ずしもテーブルを直接逆に使用できるという意味ではありませんが、適切な方法で再配置されたテーブルの内容は、ほとんどの困難な作業をそれほど悪くはしないはずです。

難しいのは、シンボルや移転などです。しかし、「このコードのシーケンスを見つける」ためにはおそらくそれを必要としないので、それらの部分がなくてもよいと思います。また、特定の仕様に合わせてオブジェクト ファイルを生成する必要もありません。必要なのは一連のバイトだけです。

ここで、以下を見つけたい場合は、もう少しトリッキーになります。

here:
     inc eax
     jnz here
     jmp someplace_else
....
...
someplace_else:
     ....

ジャンプを相対的な位置にエンコードする必要があるため、少なくとも、最初に命令の長さを計算し、次にジャンプターゲットを実際に埋めるために、2パスのアプローチが必要になります。「someplace_else」がジャンプ自体から遠く離れている場合、それは絶対ジャンプである可能性もあります。その場合、「検索」は、それが検索している場所にどのように関連するかを理解する必要があります-そのシーケンスはアドレスごとに異なるためです.

私はアセンブラと逆アセンブラの両方を書いたことがありますが、リロケータブル アドレスと、知らない奇妙な定義を持つファイル フォーマットを扱う必要がなければ、それほど難しくはありません [フォーマットの 200 ページの定義を調べるまでは]。 ]。

于 2013-01-07T20:43:10.483 に答える