注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

从C开始

 
 
 

日志

 
 

Detours Api Hook 学习笔记  

2010-10-27 16:42:34|  分类: SDK编程 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

一:首先是Detours的编译

在安装DetoursExpress.msi之后,其中包括Detours源码,示例以及一个chm说明文档。将源码文件夹src拷贝到VC6.0安装文件夹下的VC98文件夹中,然后在拷贝过来的src中创建批处理文件compile.bat,内容如下:

call "C:\Program Files\Microsoft Visual Studio\VC98\Bin\vcvars32.bat"

nmake -f Makefile all

pause

运行该批处理文件之后,即可在VC98下的bin文件夹中找到detours.dll,将其拷贝到系统目录下即可在VC中利用detours进行开发。


二:例子

一个利用detours来截获MessageBox()函数,每当系统调用MessageBox()函数则记录在一个文本文档中,代码如下:

#include <windows.h>
#include "detours.h"


#pragma comment(lib, "detours.lib")

#pragma comment(lib, "detoured.lib")

// must have at lease one export function
_declspec(dllexport) void exportfunc()
{
}

// target pointer for the uninstrumented MessageBox API
int (WINAPI *SysMessageBox)(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType)
                                  = MessageBox;

// detour function that replaces the MessageBox API
int WINAPI HookMessageBox(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType)
{
  return SysMessageBox(hWnd, "HookMsg调用中...", lpCaption, uType);
}

// DLLMain function attaches and detaches the HookMessageBox detour to the
// MessageBox target function. The MessageBox target function is referred to
// through the SysMessageBox target pointer
BOOL WINAPI DllMain(HINSTANCE hInstDll, DWORD fdwReason, LPVOID lpvReserved)
{
 if (DLL_PROCESS_ATTACH == fdwReason)
  {
  DetourTransactionBegin();
  DetourUpdateThread(GetCurrentThread());
   DetourAttach(&(PVOID&)SysMessageBox, HookMessageBox);
   DetourTransactionCommit();
  }
  else if (DLL_PROCESS_DETACH == fdwReason)
  {
  DetourTransactionBegin();
   DetourUpdateThread(GetCurrentThread());
  DetourDetach(&(PVOID&)SysMessageBox, HookMessageBox);
   DetourTransactionCommit();
 }
 return TRUE;
}


三:创建一个测试程序

#include <windows.h>

#include <stdio.h>


int main(void)

{

HINSTANCE h = LoadLibrary("DetoursTest.dll");

if(h == NULL)

{

printf("加载测试dll失败!\n");

return 0;

}

MessageBox(NULL, "Test", "Test", MB_OK);

return 0;

}

Detours Api Hook 学习笔记 - Fly - y1生倾于晴
 实验Hook成功!

 

三:需要注意的问题:

1。由于字节编码造成的函数版本问题:平时我们不需要注意,因为编译器已经替我们完成了这部分工作。但是在汇编语言惜字节如今的情况下,如果有两种版本,应该明确指出。

2。detours并没有被包含在MS的SDK中,需要随程序一块打包detours.dll。

3。对于使用detours拦截API的DLL,必须有导出函数,则添加一个空函数导出即可。

 

  评论这张
 
阅读(3410)| 评论(2)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018