Detours準備工作:Compile Detours.lib

  • 6566
  • 0
  • 2011-10-27

Compile Detours.lib

最近想起来看了下Microsoft出的Detours Express工具。出于研究目的,于是试了下这个工具。

事实上,开始使用的时候,发现了一个问题,缺少Detours.lib。

适用版本:Detours Express 3.0(目前最新版)

首先是从http://research.microsoft.com/en-us/projects/detours/下载Detours Express 3.0,然后安装。默认安装目录为C:\Program Files\Microsoft Research\Detours Express 3.0。(x86环境)

复制Detours Express 3.0下的src文件夹和system.mak至Visual Studio目录下的VC目录中。默认VS2008目录为C:\Program Files\Microsoft Visual Studio 9.0\VC。使用VS2008命令提示符(即加载vcvarsall.bat),进入拷贝到的C:\Program Files\Microsoft Visual Studio 9.0\VC\src目录,输入namke即可。

生成的文件分别放入lib和include,主要是方便以后的使用。

然后放一个示例就好了。

#include <Windows.h>
#include <detours.h>

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

static LONG dwSlept = 0;

static VOID(WINAPI *TrueSleep)(DWORD dwMilliseconds) = Sleep;

VOID WINAPI TimedSleep(DWORD dwMilliseconds)
{
	OutputDebugString("API Hooked!");
}

int WINAPI WinMain(HINSTANCE hInstance,		// handle to current instance
				   HINSTANCE hPrevInstance,	// handle to previous instance
				   LPSTR lpCmdLine ,		// command line
				   int nCmdShow)
{
	DetourTransactionBegin();
	DetourUpdateThread(GetCurrentThread());
	DetourAttach(&(PVOID&)TrueSleep, TimedSleep);
	DetourTransactionCommit();

	Sleep(1);

	DetourTransactionBegin();
	DetourUpdateThread(GetCurrentThread());
	DetourDetach(&(PVOID&)TrueSleep, TimedSleep);
	DetourTransactionCommit();
	return 0;
}
 
// Hook前:
7C802442  mov         edi,edi 
7C802444  push        ebp  
7C802445  mov         ebp,esp 
7C802447  push        0    
7C802449  push        dword ptr [ebp+8] 
7C80244C  call        7C80239C 
7C802451  pop         ebp  
7C802452  ret         4  

// Hook后:
7C802442  jmp         TimedSleep (41103Ch) 
7C802447  push        0    
7C802449  push        dword ptr [ebp+8] 
7C80244C  call        7C80239C 
7C802451  pop         ebp  
7C802452  ret         4 

更具体的使用说明,则可以参见C:\Program Files\Microsoft Research\Detours Express 3.0下的Detours.chm。

BTW:发现一个非常奇怪的问题,仔细看了一下是示例代码的问题,即,使用示例进行withdll -d:traceapi.dll cmd.exe测试的时候,发现使用了CreateProcessWithTokenW函数,这个函数是Vista以后系统才有的,即,例子是无法在没修改的情况下在Windows XP上运行的。

BTW2:编译例子如traceapi.dll时会报错,主要是rc的参数/nologo的问题,这个需要修改mak文件解决。

 

 

------------------------------

文章的授權使用CC BY-ND2.5協議。凡是標示“轉載”的文章,均來源於網絡並儘可能標註作者。如果有侵犯您的權益,請及時聯繫刪除或者署名、授權。


Gtalk/Email: cmd4shell  [at]  gmail.com