Реферат: Методы перехвата API-вызовов в Win32
{
PSTR pszModName = (PSTR)((PBYTE) hmodCaller + pImportDesc->Name);
if (lstrcmpiA(pszModName, pszCalleeModName) == 0)
{
//Нашли
if (pImportDesc->Name == 0)
return; //Ни одна функция не импортируется
//Получим адрес таблицы импорта
PIMAGE_THUNK_DATA pThunk =
(PIMAGE_THUNK_DATA)((PBYTE) hmodCaller + pImportDesc->FirstThunk);
//Переберёмвсеимпортируемыефункции
for (; pThunk->u1.Function; pThunk++)
{
PROC* ppfn = (PROC*) &pThunk->u1.Function; //Получимадресфункции
BOOL fFound = (*ppfn == pfnCurrent); //Егоищем?
if (!fFound && (*ppfn > sm_pvMaxAppAddr))
{
// Если не нашли, то поищем поглубже.
// Если мы в Win98 под отладчиком, то
// здесь может быть push с адресом нашей функции
PBYTE pbInFunc = (PBYTE) *ppfn;
if (pbInFunc[0] == cPushOpCode)
{
//Да, здесь PUSH
ppfn = (PROC*) &pbInFunc[1];
//Нашадрес?
fFound = (*ppfn == pfnCurrent);
}
}