Истории о вирусах

Соглашения о вызовах


Windows 95 написан на языках C++ (в основном) и Assembler. И, хотя

соглашения о вызовах просты для применения, Microsoft их не исполь-

зует. Все API под Wm95 используют Pascal Calling Convention. При-

мер - API, описанный в файлах справки Visual C++:

FARPROC GetProcAddress(

HMODULE hModule, // описатель DLL-модуля

LPCSTR IpszProc // имя функции

);

На первый взгляд кажется, что достаточно лишь сохранить в стеке опи-

сатель DLL-модуля (он стоит перед указателем на имя функции) и выз-

вать API. Но это не так. Параметры, согласно Pascal Calling Convention,

должны быть сохранены в стеке в обратном порядке:

push offset IpszProc

push dword ptr [hModule]

call GetProcAddress

Используя 32-битный отладчик, можно оттрассировать вызов и найти

вызов KERNEL32 для каждого конкретного случая. Это позволит полу-

чить номер функции и обойтись без необходимой для вызова таблицы

импортируемых имен.



Содержание раздела