Есть ли инструмент, показывающий, является ли конвенция вызова _cdecl или _stdcall или еще?Как исследовать соглашение о вызове двоичного файла PE в Windows?
0
A
ответ
0
Вызывающие условные обозначения для каждой функции - не PE-файл.
Библиотечные функции. по крайней мере, предоставленные MS, являются _stdcall
. Все остальное распространяется по другим соглашениям о вызовах, большинство из которых - _cdecl
.
Вы можете прочитать больше here.
Короткая версия:
cdecl
функции не ясно, что это аргумент из стека, позволяя аргументов переменного размера. Хорошим примером являетсяprintf()
, который может содержать различное количество аргументов.stdcall
функции очищают аргументы от самих стеков. Следовательно, аргументы с переменным размером невозможно.
Edit: добавлен пример
Пример cdecl
из the link:
push c
push b
push a
call function_name
add esp, 12 ;Stack clearing, 3 arguments take 12 bytes of space (on 32bit)
Таким образом, после function_name
возвращается, вызывающий очищает аргументы из стека.
Как судить, какое соглашение используется при разборке? – Alan