Я хотел бы задать вопрос относительно подключения IAT к моему собственному процессу.
В настоящее время я пытаюсь подключить ExitProcess, чтобы он запускал определенную функцию перед любым вызовом ExitProcess, и я сталкиваюсь с некоторыми проблемами.
Я просматриваю PE во время выполнения, просматривая IMAGE_IMPORT_DESCRIPTOR , найдя там kernel32.dll (который является первым .dll), я просматриваю его THUNK_DATA-s по имени, пытаясь найти там ExitProcess, хотя безуспешно.
Регистрация функций, это функции, которые там находятся -
GetModuleHandleA
GetProcAddress
LoadLibraryA
GetModuleFileNameW
FreeLibrary
VirtualQuery
GetProcessHeap
HeapFree
HeapAlloc
GetSystemTimeAsFileTime
GetCurrentThreadId
GetCurrentProcessId
QueryPerformanceCounter
IsProcessorFeaturePresent
WideCharToMultiByte
MultiByteToWideChar
LoadLibraryW
lstrlenA
LoadLibraryExW
GetLastError
RaiseException
IsDebuggerPresent
DecodePointer
EncodePointer
GetModuleHandleW
Хотя ExitProcess нигде не находится внутри .
Я попытался перечислить по указателям функций вместо имен (используя thunkdata вместо originalthunkdata), хотя это также не удалось.
GetProcAddress для ExitProcess возвращает указатель в PE, и я попытался принудительно загрузить kernel32.dll (хотя он должен загружаться автоматически) с помощью loadlibrary, хотя результат тот же.
В чем может быть проблема ?
HMODULE hMod = GetModuleHandle(NULL);
PIMAGE_DOS_HEADER pImgDosHeaders = (PIMAGE_DOS_HEADER)hMod;
PIMAGE_NT_HEADERS pImgNTHeaders = (PIMAGE_NT_HEADERS)((LPBYTE)pImgDosHeaders + pImgDosHeaders->e_lfanew);
PIMAGE_IMPORT_DESCRIPTOR pImgImportDesc = (PIMAGE_IMPORT_DESCRIPTOR)((LPBYTE)pImgDosHeaders + pImgNTHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress);
UINT indx = 0;
while(strcmpi((PCHAR)((LPBYTE)pImgDosHeaders + pImgImportDesc[indx].Name), "kernel32.dll")) { ++indx; };
PIMAGE_THUNK_DATA pImgThunkData = (PIMAGE_THUNK_DATA)((LPBYTE)pImgDosHeaders +pImgImportDesc[indx].OriginalFirstThunk);
PIMAGE_IMPORT_BY_NAME pImgImportByName = NULL;
for(;pImgThunkData->u1.Function; ++pImgThunkData)
{
pImgImportByName = (PIMAGE_IMPORT_BY_NAME)((LPBYTE)pImgDosHeaders + pImgThunkData->u1.AddressOfData);
!strcmpi("ExitProcess",pImgImportByName->Name) ? cout << "ExitProcess Found" : false;
}
return true;
Большое спасибо и хорошего дня!
ExitProcess
. Точка входа никогда не возвращается. (Большинство библиотек поддержки среды выполнения позволяют какой-либо основной функции, предоставленной пользователем, возвращаться, а затем среда выполнения вызываетExitProcess
, но возвращаемая пользователем функцияmain
не является точкой входа) - person Ben Voigt   schedule 10.02.2013