IAT在自己的进程上挂起ExitProcess

时间:2013-02-10 13:51:03

标签: winapi hook portable-executable thunk api-hook

我想问一个关于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)进行枚举,尽管它也失败了。

ExitProcess的GetProcAddress确实在PE中返回一个指针,我试图通过loadlibrary强制加载kernel32.dll(虽然它应该自动加载),尽管结果是一样的。

可能是什么问题?

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;

非常感谢你,祝你有个美好的一天!

1 个答案:

答案 0 :(得分:0)

如果你的应用没有静态调用ExitProcess(),例如根本没有调用它(甚至不是你应用的RTL),或者它是通过GetProcAddress()动态加载的,那么它就不会出现在你的应用程序的IMPORTS表中。 IMPORTS表仅列出您的应用程序静态链接到的功能。这可能是您的代码找不到它的原因。使用PEDUMP或DependancyWalker等实用程序来确保您的应用实际上是静态链接到ExitProcess()。例如,在我的开发环境(C ++ Builder XE2)中,如果我创建一个控制台项目,则在IMPORTS表中找不到ExitProcess(),但如果我创建一个GUI项目,则会找到它。不同之处在于两种类型的项目在引擎盖下使用不同的RTL,因此当应用程序终止时,控制台RTL显然不会使用ExitProcess()