《Windows核心编程系列》谈谈修改导入段拦截API
作者:网络转载 发布时间:[ 2012/9/7 10:02:18 ] 推荐标签:
下面给出使用地址比较的方法。
HMODULE hModule=GetModuleHandle(NULL);
ULONG size;
PIMAGE_IMPORT_DESCRIPTOR pImport=(PIMAGE_IMPORT_DESCRIPTOR)ImageDirectoryEntryToData
(hModule,true,IMAGE_DIRECTORY_ENTRY_IMPORT,&size);
UpdateData();
//获得MessageBoxA的地址。
PROC pfnOld=GetProcAddress(GetModuleHandle("User32.dll"),"MessageBoxA");
while(pImport->FirstThunk)
{
char *ModuleName=(char*)((BYTE*)hModule+pImport->Name);
PIMAGE_THUNK_DATA pThunk=(PIMAGE_THUNK_DATA)((BYTE*)hModule+pImport->FirstThunk);
while(pThunk->u1.Function)
{
PROC *ppfn=(PROC*)&(pThunk->u1.Function);
if(*ppfn==pfnOld)pfnOld为要查询的函数地址。
{
MessageBox("找到给定的函数");
return ;
}
pThunk++;
}
pImport++;
}
当然以上仅仅是找到相应的函数。要用我们期望的函数代替它,还需要我们自己定义函数。
此处有一点要特别注意,当我们对某函数进行拦截时,要替换的函数必须与被替换的函数的原型完全相同。
比如此时我们要对MessageBoxA进行拦截,我们定义自己的函数的原型与MessageBoxA原型是完全一致的:
int WINAPI MyMessageBoxA(HWND hWnd,LPSTR str,LPSTR caption ,UINT type)
{
//定义函数的行为。
}
我们可以在函数中调用被拦截的函数,也可以不对拦截的函数进行调用而进行其他操作。
注意:在拦截后,原来的函数地址已经被我们自定义的函数的地址覆盖,如果之后需要调用被拦截的函数,必须在覆盖之前保存被拦截函数的地址。如果我们没有保存而直接调用,调用的只是替换后的函数。
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11