探索windows 内核的各位都来看看---深入PE内部.....
俺由于多方面的原因,要彻底的搞清PE的格式,在查了msdn和侯老的windows 95 系统程序设计大奥秘后仍然有许多不解之处,请大家多多发言。
相信大家都知道API的截获和屏幕取词的原理都是相同的,都是截获几个内核dll如 KERNEL32.dll gdi32.dll user.dll等等。。
周天舒对次有很深的研究,他本人共享了他的winnt下的屏幕取词源代码,这里表示对他的感谢!但为何在win98下不行呢?
IMAGE_IMPORT_DESCRIPTOR和IMAGE_THUNK_DATA分别对应于DLL和函数。
它们是PE文件的输入地址表的格式,反正只要这样做就好啦:
BOOL ChangeFuncEntry(HMODULE hmodule)
{
PIMAGE_DOS_HEADER pDOSHeader;
PIMAGE_NT_HEADERS pNTHeader;
PIMAGE_IMPORT_DESCRIPTOR pImportDesc;
/*get system functions and my functions' entry*/
pSysFunc1=(DWORD)GetProcAddress(GetModuleHandle("gdi32.dll"),"TextOutA");
pMyFunc1= (DWORD)GetProcAddress(GetModuleHandle("hookdll.dll"),"MyTextOutA");
pDOSHeader=(PIMAGE_DOS_HEADER)hmodule;
if (IsBadReadPtr(hmodule, sizeof(PIMAGE_NT_HEADERS)))
return FALSE;
if (pDOSHeader->e_magic != IMAGE_DOS_SIGNATURE)
return FALSE;
pNTHeader=(PIMAGE_NT_HEADERS)((DWORD)pDOSHeader+
(DWORD)pDOSHeader->e_lfanew);
if (pNTHeader->Signature != IMAGE_NT_SIGNATURE)
return FALSE;
pImportDesc = (PIMAGE_IMPORT_DESCRIPTOR)((DWORD)hmodule+
(DWORD)pNTHeader->OptionalHeader.DataDirectory
[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress);
if (pImportDesc == (PIMAGE_IMPORT_DESCRIPTOR)pNTHeader)
return FALSE;
while (pImportDesc->Name)
{
PIMAGE_THUNK_DATA pThunk;
strcpy(buffer,(char*)((DWORD)hmodule+(DWORD)pImportDesc->Name));
CharLower(buffer);
if(strcmp(buffer,"gdi32.dll"))
{
pImportDesc++;
continue;
}
else
{
pThunk=(PIMAGE_THUNK_DATA)((DWORD)hmodule+(DWORD)pImportDesc->FirstThunk);
while (pThunk->u1.Function)
{
if ((pThunk->u1.Function) == pSysFunc1)
{
VirtualProtect((LPVOID)(&pThunk->u1.Function),
sizeof(DWORD),PAGE_EXECUTE_READWRITE, &dwProtect);
(pThunk->u1.Function)=pMyFunc1;
VirtualProtect((LPVOID)(&pThunk->u1.Function), sizeof(DWORD),dwProtect,&temp);
}
pThunk++;
}
return 1;
}
}
}
为何不行呢?PE格式在win98和winnt的内存的布局有何不同?
请各位发表意见,不要拘束!