Фундаментальные основы хакерства


Идентификация аргументов функций - часть 23


 

arg_C        = dword      ptr  14h

; IDA

обнаружила только один аргумент, хотя, судя по прототипу, их передается четыре.

; Почему? Очень просто – функция использовала всего один аргумент, а к остальным и

; не обращалась. Вот IDA и не смогла их восстановить!

; Кстати, что это за аргумент? Смотрим: его смещение равно 0xC. А на вершине стека то,

; что в него заталкивалось в последнюю очередь. Внизу, соответственно, наоборот.

; Постой, постой, что за чертовщина?! Выходит, dwTime

был занесен в стек в первую

; очередь?! (Мы-то, имея исходный текст, знаем, что arg_C – наверняка dwTime).

; Но ведь соглашение PASCAL диктует противоположный порядок занесения аргументов!

; Что-то здесь не так... но ведь программа работает (запустите ее, чтобы проверить)

; А в SDK написано, что CALLBACK – аналог FAR PASACAL. С FAR-ом понятно, в Win9x\NT

; все вызовы ближние, но вот как объяснить инверсию засылки аргументов?!

; Сдаетесь?(Нет, не сдавайтесь, попытайтесь найти решение сами – иначе какой интерес?)

; Тогда загляните в <windef.h> и посмотрите, как там определен тип PASCAL

;

; #elif (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED)

; #define CALLBACK    __stdcall

; #define WINAPI      __stdcall

; #define WINAPIV     __cdecl

; #define APIENTRY    WINAPI

; #define APIPRIVATE  __stdcall

; #define PASCAL      __stdcall

;

; Нет, ну кто бы мог подумать!!! Вызов, объявленный как PASCAL, на самом деле

; представляет собой stdcall! И CALLBACK – так же определен, как stdcall.

; Наконец-то все объяснилось! Теперь, если вам скажут, что CALLBACK

– это PASCAL

; вы можете усмехнуться и сказать, что еж тоже птица, правда гордая – пока не пнешь

; не полетит! (Оказывается, копания в дебрях include-файлов могут приносить пользу)

; Кстати, это извращения с перекрытием типов создают большую проблему при подключении

; к Си-проекту модулей, написанных в среде, поддерживающей PASACAL-соглашения о вызове

; функций. Поскольку в Windows PASCAL никакой не PASCAL, а stdcall – ничего работать




- Начало -  - Назад -  - Вперед -