2

私は現在、アセンブリで作成したプログラムを分析しており、アセンブリ内でコードを移動することを考えていました。引数を1つ取るプロシージャがありますが、それがスタックに渡されるのかレジスタに渡されるのかわかりません。

IDA Proでプログラムを開くと、手順の最初の行は次のようになります。

ThreadID= dword ptr -4

宣言の上にカーソルを置くと、次のようにも表示されます。

ThreadID dd ?
 r db 4 dup(?)

スタック変数を指すと思いますか?

ただし、OllyDbgで同じプログラムを開くと、スタックのこの場所に大きな値があり、渡された可能性のあるパラメーターと矛盾するため、レジスターで渡されたと思います。

誰かが私を正しい方向に向けることができますか?

4

2 に答える 2

0

引数が関数に渡される方法は、関数の呼び出し規約によって異なります。デフォルトの呼び出し規約は、言語、コンパイラ、およびアーキテクチャによって異なります。

ご提供いただいた情報でははっきりとは言えませんが、OllyDbgのようなアセンブリレベルのデバッガーやIDAのような逆アセンブラーは、プログラムをリバースエンジニアリングするためにヒューリスティックを使用することが多いことを忘れないでください。コンパイラーによって生成されたコードを調べる最良の方法は、アセンブリー・リストを作成するようにコンパイラーに指示することです。ほとんどのコンパイラには、これを行うオプションがあります。

于 2009-06-10T16:21:00.870 に答える
0

確かにローカル変数です。引数を確認するには、[esp+XXX]の値を探します。IDAはそれらに[esp+arg_XXX]という名前を自動的に付けます。

.text:0100346A sub_100346A     proc near               ; CODE XREF: sub_100347C+44p
.text:0100346A                                         ; sub_100367A+C6p ...
.text:0100346A
.text:0100346A arg_0           = dword ptr  4
.text:0100346A
.text:0100346A                 mov     eax, [esp+arg_0]
.text:0100346E                 add     dword_1005194, eax
.text:01003474                 call    sub_1002801
.text:01003474
.text:01003479                 retn    4
.text:01003479
.text:01003479 sub_100346A     endp

また、上記のコメントで概説されているfastcall規則では、レジスタを使用して引数を渡します。MicrosoftまたはGCCコンパイラがより広く使用されているので、私はそれらに賭けます。したがって、最初にECXおよびEDXレジスタを確認してください。

MicrosoftまたはGCC[2]__fastcall [3]規則(別名__msfastcall)は、ECXおよびEDXに適合する最初の2つの引数(左から右に評価)を渡します。残りの引数は、右から左にスタックにプッシュされます。 http://en.wikipedia.org/wiki/X86_calling_conventions#fastcall

于 2009-07-30T12:48:33.727 に答える