1

次の x86 アセンブリ手順が与えられます。

mov     esi, offset off_A
cmp     esi, offset off_B

実行時にオフセット (2 番目のオペランド) を取得するにはどうすればよいですか? これがシナリオです: プログラム (実行時にプロセスに挿入される) は、オフセットをいくつかの独自のものに置き換えます。その結果、次のようになります。

mov     esi, offset off_X
cmp     esi, offset off_Y

このプログラムを使用すると、プラグインを作成してロードできますが、置換アドレスは公開されません。では、上記の命令が存在するアドレスから、オフセット X と Y を見つけるにはどうすればよいでしょうか?

4

3 に答える 3

1

これは何のためにあるのかよくわかりませんが…

mov esi, ...BEdword オペランドが続くようにエンコードされます。命令のアドレスを取得している場合は、mov単純に 1 バイト先にスキップして、アドレス オペランドを確認できます。off_A

cmp esi, ...81 FEdword オペランドが続くようにエンコードされるため、ここでは 2 バイトをスキップしてオペランドを表示できます。

于 2010-05-16T19:11:48.653 に答える
0

あなたが何を求めているのかわかりません。オフセットアドレスです。そのため、コードの最初の行は のアドレスoff_9F6FBCを esi に移動しています。

絶対アドレスを取得する方法(PICなどと組み合わせて)を意味する場合、これは分解時にわかりません。実行時にのみ認識され、実行ごとに変更できます

于 2010-05-14T02:29:23.390 に答える
0

MOV esi、immediate をエンコードする方法はたくさんあります。アセンブラとコンパイラに応じて、それらのいずれかが使用される場合があります。

16 進数のように、アセンブラのニーモニックを使用せずに実行した場合。そこでオフセットを特定できます。

db 0xBE; off_X: dd normal_offset
于 2010-05-18T18:24:50.050 に答える