#include <windows.h>
// 定义API挂接项结构
typedef struct _HOOK_ITEM {
DWORDdwAddr ;// IAT项所在地址
DWORDdwOldValue ;// IAT项的原始函数地址
DWORDdwNewValue ;// IAT项的新函数地址
} HOOK_ITEM, *PHOOK_ITEM ;
HOOK_ITEMHookItem = {0} ;// 定义IAT项,用于保存MessageBoxA的IAT项信息
// 定义MessageBoxA函数原型
typedef int (WINAPI* PFNMessageBoxA)( HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType ) ;
// 定义重定向API的实现函数
BOOL WINAPI RedirectApi ( PCHAR pDllName, PCHAR pFunName, DWORD dwNewProc, PHOOK_ITEM pItem ) ;
// 自定义的MessageBoxA函数
// 实现对原始MessageBoxA的输入、输出参数的监控,甚至是取消调用
int WINAPI NEW_MessageBoxA( HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType )
{
// 此处可以观察/修改调用参数,甚至可以取消调用直接返回。
// ……
// 取得原函数地址
PFNMessageBoxA pfnMessageBoxA = (PFNMessageBoxA)HookItem.dwOldValue ;
// 输出测试信息,
// 如果这里直接调用MessageBoxA,就进入无限循环
pfnMessageBoxA ( hWnd, "这是API重定向过程的消息框", "测试", 0 ) ;
// 调用原函数
int ret = pfnMessageBoxA ( hWnd, lpText, lpCaption, uType ) ;
// 此处可以查看/修改调用原函数的返回值
// ……
return ret ;
}
int WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
// 重定向API
if ( !RedirectApi ( "USER32.dll", "MessageBoxA", (DWORD)NEW_MessageBoxA, &HookItem ) )
OutputDebugStringA ( "RedirectApi failed!" ) ;
else
OutputDebugStringA ( "RedirectApi success!" ) ;
MessageBoxA ( 0, "正常消息框", "测试", 0 ) ;
return 0 ;
}
// 实现重定向API
// 参数pDllName:目标API所在的DLL名称
// 参数pFunName:目标API名称
// 参数dwNewProc:自定义的函数地址
// 参数pItem:用于保存IAT项信息
BOOL WINAPI RedirectApi ( PCHAR pDllName, PCHAR pFunName, DWORD dwNewProc, PHOOK_ITEM pItem )
{
// 检查参数是否合法
if ( pDllName == NULL || pFunName == NULL || !dwNewProc || !pItem )
return FALSE ;
// 检测目标模块是否存在
charszTempDllName[256] = {0} ;
DWORDdwBaseImage = (DWORD)GetModuleHandle(NULL) ;
if ( dwBaseImage == 0 )
return FALSE ;
// 取得PE文件头信息指针
PIMAGE_DOS_HEADERpDosHeader= (PIMAGE_DOS_HEADER)dwBaseImage ;
PIMAGE_NT_HEADERSpNtHeader= (PIMAGE_NT_HEADERS)(dwBaseImage + (pDosHeader->e_lfanew)) ;
PIMAGE_OPTIONAL_HEADER32pOptionalHeader = &(pNtHeader->OptionalHeader) ;
PIMAGE_SECTION_HEADERpSectionHeader= (PIMAGE_SECTION_HEADER)((DWORD)pNtHeader + 0x18 + pNtHeader->FileHeader.SizeOfOptionalHeader ) ;
// 遍历导入表
PIMAGE_THUNK_DATA pThunk, pIAT ;
PIMAGE_IMPORT_DESCRIPTOR pIID = (PIMAGE_IMPORT_DESCRIPTOR)(dwBaseImage+pOptionalHeader->DataDirectory[1].VirtualAddress ) ;
while ( pIID->FirstThunk )
{
// 检测是否目标模块
if ( strcmp ( (PCHAR)(dwBaseImage+pIID->Name), pDllName ) )
{
pIID++ ;
continue ;
}
pIAT = (PIMAGE_THUNK_DATA)( dwBaseImage + pIID->FirstThunk ) ;
if ( pIID->OriginalFirstThunk )
pThunk = (PIMAGE_THUNK_DATA)( dwBaseImage + pIID->OriginalFirstThunk ) ;
else
pThunk = pIAT ;
// 遍历IAT
DWORDdwThunkValue = 0 ;
while ( ( dwThunkValue = *((DWORD*)pThunk) ) != 0 )
{
if ( ( dwThunkValue & IMAGE_ORDINAL_FLAG32 ) == 0 )
{
// 检测是否目标函数
if ( strcmp ( (PCHAR)(dwBaseImage+dwThunkValue+2), pFunName ) == 0 )
{
// 填充函数重定向信息
pItem->dwAddr= (DWORD)pIAT ;
pItem->dwOldValue= *((DWORD*)pIAT) ;
pItem->dwNewValue = dwNewProc;
// 修改IAT项
DWORD dwOldProtect = 0 ;
VirtualProtect ( pIAT, 4, PAGE_READWRITE, &dwOldProtect ) ;
*((DWORD*)pIAT) = dwNewProc ;
VirtualProtect ( pIAT, 4, PAGE_READWRITE, &dwOldProtect ) ;
return TRUE ;
}
}
pThunk ++ ;
pIAT ++ ;
}
pIID ++ ;
}
return FALSE ;
}
分享到:
相关推荐
VC++ HOOK Api使用大全及演示.rar
vc++ HOOK 技术 (API钩子)
利用API Hook截获CreateFile和CloseHandle达到加解密DOC文件和防拷贝的目的 visual c++调用hook API钩子截获CreateFile和CloseHandle来加密WORD文件+实现文件防拷贝
内容索引:VC/C++源码,系统相关,API VC++ HOOK Api使用大全及演示,有很多内容,全部都是Windows系统下各种HookApi的示例源码,包括网络、文件、对话框、注册表、进程等各个方面的,推荐给大家研究。
VC++ api hook 源码 带示例
HookAPI HookAPI HookAPI HookAPI
欢迎大家参加梅州技术 VC++外挂编程VIP培训班。 在接下来的一段时间将由我和大家一起学习游戏外挂的分析,制作。 课程分四个大章节 初级篇,中级篇,进阶篇,高级篇 初级篇内容:编写一个完整的,简单的外挂 C++的...
VC++ hook 挂机锁 带钩子过程dll源码
vc++ hook 键盘钩子 visual c++编写的键盘钩子hook 程序
这是一个Hook WinSocket的例子,只在原理性述如何Hook API。 直接注入就可以使用了 sdddddddddddddddd
VC实现APIHookVC实现APIHookVC实现APIHookVC实现APIHookVC实现APIHookVC实现APIHookVC实现APIHookVC实现APIHook
vc++6.0Hook(钩子)编程视频教程(附源码)!!!
API HOOK拦截指定进程发送和接收的网络数据包.zip
vc++ dll注入api hook.zip
一个HOOK键盘的实例,基于MFC,按F2键脱离钩子
非常好的Hook api实例VC++源码,对于学习hook api有很大帮助。。
API hook API hook API hook
HookAPI例子,简单明了学习如何Hook API函数
欢迎大家参加梅州技术 VC++外挂编程VIP培训班。 在接下来的一段时间将由我和大家一起学习游戏外挂的分析,制作。 课程分四个大章节 初级篇,中级篇,进阶篇,高级篇 初级篇内容:编写一个完整的,简单的外挂 C++的...
vc++ api hook dll_whhapihook.rar visual c++编写的各类钩子dll源代码