// 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程序设计 王艳平版相关推荐

  1. 第九章 keyhookdll windows程序设计王艳平版

    /// // KeyHookLib.h文件 // 定义函数修饰宏,方便引用本DLL工程的导出函数 #ifdef KEYHOOKLIB_EXPORTS #define KEYHOOKLIB_API __ ...

  2. 第九章 DLL windows程序设计 王艳平版

    // 09DllDemo.h文件 MY09DLLDEMO_API void ExportFunc(LPCTSTR pszContent); /// def文件 EXPORTS ExportFunc   ...

  3. 第九章 keyhook windows程序设计王艳平版

    /// // MainDir.h文件 // 07MainDir #include <afxwin.h> class CMyApp : public CWinApp { public: BO ...

  4. 第三章 同步 Windows程序设计 王艳平版

    /// // CriticalSection.cpp文件 #include <stdio.h> #include <windows.h> #include <proces ...

  5. 第三章 事件 windows程序设计 王艳平版

    /// // EventDemo.cpp文件 #include <stdio.h> #include <windows.h> #include <process.h> ...

  6. 第四章 绘图 windows程序设计 王艳平版

    /// // SineWave.cpp文件 #include <windows.h> #include <math.h> LRESULT __stdcall WndProc(H ...

  7. 第七章 目录监视 windows程序设计王艳平版

    // DirDialog.h文件 #ifndef __DIRDIALOG_H_ #define __DIRDIALOG_H_ #include <shlobj.h> class CDirD ...

  8. 第九章 DLL文件 windows程序设计 王艳平版

    // 09DllDemo.h文件 #ifdef MY09DLLDEMO_EXPORTS #define MY09DLLDEMO_API __declspec(dllexport) #else #def ...

  9. 第三章 windows程序设计 王艳平版

    /// // CountErr.cpp文件 #include <stdio.h> #include <windows.h>  #include <process.h> ...

最新文章

  1. SRE 是如何保障稳定性的
  2. 瑞丽,边陲的旖旎风情
  3. Python: 如何继承str/string?
  4. 【零基础学Java】—final关键字与四种用法(二十九)
  5. 哲理短文一则:揭示最好的成功法则
  6. c++ 14 新特性
  7. 各种安装包下载地址汇总
  8. android 百度地图 根据地址 查到其经纬度,使用百度地图api实现根据地址查询经纬度...
  9. 操作——【1.8 关于音高、时值、位置 】(二)
  10. dPCA 二面角主成分分析
  11. 学角色建模好还是场景建模?5个角度分析,教你选择最合适的
  12. [4G5G专题-97]:MAC层- 调度 - 上行调度的原理、过程与算法
  13. 02 FinalReference.referent的回收时机
  14. Python学习之路:关于列表(List)复制的那点事
  15. 争议不断的AI绘画,靠啥成为了顶流?
  16. cropper.js 实现HTML5 裁剪上传头像
  17. 数据通信网络基础,华为VRP系统(HCLA-Datacom v1.0华为认证数通笔记2)
  18. 基于wpa_supplicant库的WIFI连接功能实现--wpa_cli命令解析
  19. 智能农业大棚监控系统开发
  20. JS 设置 Cookie

热门文章

  1. 幻灯片轮播图(含自动播放和手动点击播放,代码易懂)
  2. 仿淘宝电商官网静态页面(HTML+CSS+JS)+ 常见布局解析,学会如果做是关键!
  3. .bashrc在哪里,alias妙用
  4. Gtalk基本功能完成
  5. 智能货架是零售业的必经之路,普通人入局新零售有机会
  6. vue项目中css样式如何使用data中定义的动态变量
  7. 《商用密码应用与安全性评估》第二章政策法规2.2法律法规
  8. 原创:新手快速熟悉IDEA快捷键方法:快捷键修改+背景图设置
  9. UML建模能力成为对日软件外包首要条件
  10. java批量修改指定目录下的文件名