《Windows核心编程系列》谈谈修改导入段拦截API
作者:网络转载 发布时间:[ 2012/9/7 10:02:18 ] 推荐标签:
以下代码将对MessageBox的调用进行拦截,并用我们的自定义函数MyMessageBox替代。
g_addr用于存储拦截之前MessageBox的地址
Typedef int (WINAPI *PFNMESSAGEBOX(HWND,LPSTR,LPSTR,UINT);//定义函数指针。
PFNMESSAGEBOX g_addr=(PFNMESSAGEBOX)MessageBoxA;//存储MessageBoxA的地址。
//自定义的函数。
int WINAPI MyMessage(HWND hWnd,LPSTR a,LPSTR b,UINT type)
{
return ((PFNMESSAGEBOX)g_addr)(hWnd,a,"替换后的函数!?",MB_YESNO);
}
//对 MessageBox进行拦截,用MyMessageBox进行替换。
Void ReplaceOneFunc(PCSTR ModuleName,PFNMESSAGEBOX pfnOld,PFNMESSAGEBOX pfnNew)
{
pfnOld=(PFNMESSAGEBOX)MessageBoxA;
pfnNew=(PFNMESSAGEBOX)MyMessageBox;
HMODULE hModule=GetModuleHandle(NULL);
ULONG size;
PIMAGE_IMPORT_DESCRIPTOR pImport=(PIMAGE_IMPORT_DESCRIPTOR)ImageDirectoryEntryToData
(hModule,true,IMAGE_DIRECTORY_ENTRY_IMPORT,&size);
UpdateData();
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)
{
PFNMESSAGEBOX *ppfn=(PFNMESSAGEBOX*)&(pThunk->u1.Function);
if(*ppfn==pfnOld)
{
MessageBox("找到函数!恭喜你!");
SIZE_T num;
WriteProcessMemory(GetCurrentProcess(),ppfn,&pfnNew,4,&num);
MessageBox(NULL,"现在调用的是替换后的API!","",MB_OK);
((PFNMESSAGEBOX)g_addr)(NULL,"哈哈,现在终于轮到你了","",MB_OK);
return ;
}
pThunk++;
}
pImport++;
}
MessageBox("没有找到该函数!");
}
WriteProcessMemory(GetCurrentProcess(),ppfn,&pfnNew,4,&num);
此函数用于修改内存。实现用MyMessagebox的地址替换MessageBox的地址。关于此函数的功能请参考MSDN。
((PFNMESSAGEBOX)g_addr)(NULL,"哈哈,现在终于轮到你了","",MB_OK);
此句用于调用在拦截之前MessageBox的地址。此处的调用是调用的MessageBox函数,而不是MyMessageBox函数。
至此关于修改导入段拦截API介绍完毕。
相关推荐
更新发布
功能测试和接口测试的区别
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