Будут ли аргументы функции передаваться в стек или в регистр? - PullRequest
2 голосов
/ 10 июня 2009

В настоящее время я анализирую программу, написанную на ассемблере, и собирался переместить некоторый код в сборку. У меня есть процедура, которая принимает один аргумент, но я не уверен, передан ли он в стек или регистр.

Когда я открываю свою программу в IDA Pro, первая строка процедуры:

ThreadID= dword ptr -4

Если навести курсор на объявление, появится также следующее:

ThreadID dd ?
 r db 4 dup(?)

, который, как я предполагаю, будет указывать на переменную стека?

Когда я открываю ту же программу в OllyDbg, в этом месте в стеке появляется большое значение, которое несовместимо с любым параметром, который мог быть передан, что приводит меня к мысли, что оно передается в регистре.

Кто-нибудь может указать мне правильное направление?

Ответы [ 2 ]

0 голосов
/ 30 июля 2009

Это локальная переменная наверняка. Чтобы проверить аргументы, ищите значения [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] проходит (aka __msfastcall) первые два аргумента (оцениваются слева направо), которые вписываются в ECX и EDX. Остальные аргументы выдвигаются на стек справа налево. http://en.wikipedia.org/wiki/X86_calling_conventions#fastcall

0 голосов
/ 10 июня 2009

Способ передачи аргументов в функцию зависит от соглашения о вызовах функции . Соглашение о вызовах по умолчанию зависит от языка, компилятора и архитектуры.

Я ничего не могу сказать наверняка с предоставленной вами информацией, однако вы не должны забывать, что отладчики уровня сборки, такие как OllyDbg, и дизассемблеры, такие как IDA, часто используют эвристику для обратного проектирования программы. Лучший способ изучить код, сгенерированный компилятором, - дать ему команду составлять списки сборок. Большинство компиляторов имеют возможность сделать это.

...