能力值:
( LV4,RANK:55 )
|
-
-
2 楼
熟悉pe结构了很好写吧,注入代码将目标进程地址空间iat中函数地址改为你的函数地址就是了。 你那个测试程序调试定位到函数地址看看是否被修改成功了
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
谢谢楼主推荐这本书,我一直想学hook,这回可解燃眉之急了,谢谢哈!!~
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
我试了下,好像没有成功呀,HOOK前后,点击测试程序中的“确定”按键,弹出的对话框的输出内容是一样的。。。
朋友,了解的话,帮我看下代码吧?
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
不客气,我也是刚学,有问题可以互相交流下!
|
能力值:
( LV7,RANK:100 )
|
-
-
6 楼
LZ贴下你的代码吧。
IAT HOOK的话,首先要枚举所有进程模块,然后修改每个模块的IAT才可以,不然挂钩不完整某些情况下会失效。你是否仅仅修改了EXE映像的IAT?
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
有代码啊,压缩包“附件”,在我最开始写的问题后面。
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
这是其中的HookApi_IAT.cpp文件的完整代码:
// HookApi_IAT.cpp:实现CHookApi_IAT类.
//
#include "stdafx.h"
#include "HookApi_IAT.h"
#include <tlhelp32.h>
#include <imagehlp.h>
#pragma comment (lib,"imagehlp.lib")
//---------------------------------------------------------------------------
CHookApi_IAT::CHookApi_IAT()
{
}
//---------------------------------------------------------------------------
CHookApi_IAT::~CHookApi_IAT()
{
}
//---------------------------------------------------------------------------
BOOL CHookApi_IAT::HookAllAPI(LPCTSTR ModuleName, PROC HookAPIAddr, PROC lpNewFunc)
{
if (ModuleName == NULL||HookAPIAddr == NULL)
return FALSE;
HANDLE hSnapshot;
MODULEENTRY32 hMod = {sizeof(hMod)};
hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,NULL);
// 取得所有模块列表中的指定的模块.
BOOL bMoreMods = Module32First(hSnapshot, &hMod);
if (bMoreMods == FALSE) return FALSE;
// 循环取得想要的模块.
for (;bMoreMods; bMoreMods = Module32Next(hSnapshot, &hMod))
{
MEMORY_BASIC_INFORMATION mbi;
// 获取本模块信息.
VirtualQuery(this,&mbi,sizeof(mbi));
// 不在自己的模块中挂钩函数.
if (hMod.hModule != (HMODULE)mbi.AllocationBase)
{
//hMod.hModule:指向当前被挂钩进程的每一个模块.
HookOneAPI( ModuleName,HookAPIAddr,
lpNewFunc,hMod.hModule);
}
}
return TRUE;
}
//---------------------------------------------------------------------------
BOOL CHookApi_IAT::HookOneAPI(PCSTR ModuleName, PROC HookAPIAddr,
PROC lpNewFunc, HMODULE hmodCaller)
{
DWORD size;
PIMAGE_IMPORT_DESCRIPTOR pImportDesc =
(PIMAGE_IMPORT_DESCRIPTOR) ImageDirectoryEntryToData(
hmodCaller,TRUE,IMAGE_DIRECTORY_ENTRY_IMPORT,&size);
if(pImportDesc == NULL) return FALSE;
for (;pImportDesc->Name;pImportDesc++)
{
LPSTR pszDllName = (LPSTR)((PBYTE)hmodCaller + pImportDesc->Name);
if(lstrcmpiA(pszDllName,ModuleName) == 0) break;
}
if(pImportDesc->Name == NULL) return FALSE;
PIMAGE_THUNK_DATA pThunk = (PIMAGE_THUNK_DATA)
((PBYTE)hmodCaller + pImportDesc->FirstThunk);//IAT
for(;pThunk->u1.Function;pThunk++)
{
PROC * ppfn= (PROC *)&pThunk->u1.Function;
m_lpOldFunc = (PROC)pThunk->u1.Function;
m_lpNewFunc =lpNewFunc;
if (*ppfn == HookAPIAddr)
{
MEMORY_BASIC_INFORMATION mbi;
ZeroMemory(&mbi, sizeof(MEMORY_BASIC_INFORMATION));
VirtualQuery(ppfn,&mbi,sizeof(MEMORY_BASIC_INFORMATION));
VirtualProtect(mbi.BaseAddress,mbi.RegionSize,
PAGE_READWRITE,&mbi.Protect);
*ppfn = *lpNewFunc;
DWORD dwOldProtect;
VirtualProtect(mbi.BaseAddress,mbi.RegionSize,
mbi.Protect,&dwOldProtect);
return TRUE;
}
}
return FALSE;
}
//---------------------------------------------------------------------------
BOOL CHookApi_IAT::HookOneAPI_OFF(PCSTR ModuleName, HMODULE hmodCaller)
{
return HookOneAPI(ModuleName, m_lpNewFunc,m_lpOldFunc,hmodCaller);
}
|