第九章 hook windows程序设计 王艳平版
// 09HookDemo.cpp文件
#include <windows.h>
#include <stdio.h>
// 挂钩指定模块hMod对MessageBoxA的调用
BOOL SetHook(HMODULE hMod);
// 定义MessageBoxA函数原型
typedef int (WINAPI *PFNMESSAGEBOX)(HWND, LPCSTR, LPCSTR, UINT uType);
// 保存MessageBoxA函数的真实地址
PROC g_orgProc = (PROC)MessageBoxA;
void main()
{
// 调用原API函数
::MessageBox(NULL, "原函数", "09HookDemo", 0);
// 挂钩后再调用
SetHook(::GetModuleHandle(NULL));
::MessageBox(NULL, "原函数", "09HookDemo", 0);
}
// 用于替换MessageBoxA的自定义函数
int WINAPI MyMessageBoxA(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType)
{
return ((PFNMESSAGEBOX)g_orgProc)(hWnd, "新函数", "09HookDemo", uType);
}
BOOL SetHook(HMODULE hMod)
{
IMAGE_DOS_HEADER* pDosHeader = (IMAGE_DOS_HEADER*)hMod;
IMAGE_OPTIONAL_HEADER * pOptHeader =
(IMAGE_OPTIONAL_HEADER *)((BYTE*)hMod + pDosHeader->e_lfanew + 24);
IMAGE_IMPORT_DESCRIPTOR* pImportDesc = (IMAGE_IMPORT_DESCRIPTOR*)
((BYTE*)hMod + pOptHeader->DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress);
// 在导入表中查找user32.dll模块。因为MessageBoxA函数从user32.dll模块导出
while(pImportDesc->FirstThunk)
{
char* pszDllName = (char*)((BYTE*)hMod + pImportDesc->Name);
if(lstrcmpiA(pszDllName, "user32.dll") == 0)
{
break;
}
pImportDesc++;
}
if(pImportDesc->FirstThunk)
{
// 一个IMAGE_THUNK_DATA就是一个双字,它指定了一个导入函数
// 调入地址表其实是IMAGE_THUNK_DATA结构的数组,也就是DWORD数组
IMAGE_THUNK_DATA* pThunk = (IMAGE_THUNK_DATA*)
((BYTE*)hMod + pImportDesc->FirstThunk);
while(pThunk->u1.Function)
{
// lpAddr指向的内存保存了函数的地址
DWORD* lpAddr = (DWORD*)&(pThunk->u1.Function);
if(*lpAddr == (DWORD)g_orgProc)
{
// 修改IAT表项,使其指向我们自定义的函数,相当于“*lpAddr = (DWORD)MyMessageBoxA;”
DWORD* lpNewProc = (DWORD*)MyMessageBoxA;
::WriteProcessMemory(::GetCurrentProcess(),
lpAddr, &lpNewProc, sizeof(DWORD), NULL);
return TRUE;
}
pThunk++;
}
}
return FALSE;
}
第九章 hook windows程序设计 王艳平版相关推荐
- 第九章 keyhookdll windows程序设计王艳平版
/// // KeyHookLib.h文件 // 定义函数修饰宏,方便引用本DLL工程的导出函数 #ifdef KEYHOOKLIB_EXPORTS #define KEYHOOKLIB_API __ ...
- 第九章 DLL windows程序设计 王艳平版
// 09DllDemo.h文件 MY09DLLDEMO_API void ExportFunc(LPCTSTR pszContent); /// def文件 EXPORTS ExportFunc ...
- 第九章 keyhook windows程序设计王艳平版
/// // MainDir.h文件 // 07MainDir #include <afxwin.h> class CMyApp : public CWinApp { public: BO ...
- 第三章 同步 Windows程序设计 王艳平版
/// // CriticalSection.cpp文件 #include <stdio.h> #include <windows.h> #include <proces ...
- 第三章 事件 windows程序设计 王艳平版
/// // EventDemo.cpp文件 #include <stdio.h> #include <windows.h> #include <process.h> ...
- 第四章 绘图 windows程序设计 王艳平版
/// // SineWave.cpp文件 #include <windows.h> #include <math.h> LRESULT __stdcall WndProc(H ...
- 第七章 目录监视 windows程序设计王艳平版
// DirDialog.h文件 #ifndef __DIRDIALOG_H_ #define __DIRDIALOG_H_ #include <shlobj.h> class CDirD ...
- 第九章 DLL文件 windows程序设计 王艳平版
// 09DllDemo.h文件 #ifdef MY09DLLDEMO_EXPORTS #define MY09DLLDEMO_API __declspec(dllexport) #else #def ...
- 第三章 windows程序设计 王艳平版
/// // CountErr.cpp文件 #include <stdio.h> #include <windows.h> #include <process.h> ...
最新文章
- SRE 是如何保障稳定性的
- 瑞丽,边陲的旖旎风情
- Python: 如何继承str/string?
- 【零基础学Java】—final关键字与四种用法(二十九)
- 哲理短文一则:揭示最好的成功法则
- c++ 14 新特性
- 各种安装包下载地址汇总
- android 百度地图 根据地址 查到其经纬度,使用百度地图api实现根据地址查询经纬度...
- 操作——【1.8 关于音高、时值、位置 】(二)
- dPCA 二面角主成分分析
- 学角色建模好还是场景建模?5个角度分析,教你选择最合适的
- [4G5G专题-97]:MAC层- 调度 - 上行调度的原理、过程与算法
- 02 FinalReference.referent的回收时机
- Python学习之路:关于列表(List)复制的那点事
- 争议不断的AI绘画,靠啥成为了顶流?
- cropper.js 实现HTML5 裁剪上传头像
- 数据通信网络基础,华为VRP系统(HCLA-Datacom v1.0华为认证数通笔记2)
- 基于wpa_supplicant库的WIFI连接功能实现--wpa_cli命令解析
- 智能农业大棚监控系统开发
- JS 设置 Cookie