zoukankan      html  css  js  c++  java
  • Detours 简介与简单使用

    什么是Detours

    Detours是微软开发的一个函数库,可用于捕获系统API。--百度百科
    

    利用detours可以hook到WIN32的API,原理好像是修改调用API的指令使跳转到用户的函数。(未验证)

    Detours的安装

    以vs2015为例
    下载地址:https://www.microsoft.com/ 我下载的版本是Detours Expressv3.0 Build 343 下载之后是免安装文件,解压就能玩。
    把所有的的文件拷贝到 ++VS2015/VC++ 目录下面,运行++vs2015兼容命令行工具++,进入目录++vs2015/vc/src++,执行命令nmake 就可以用了。生成的lib文件在++lib.X64++和++lib.X86++文件夹中,在项目中包含就可以了。

    Detours的使用

    首先需要制作dll,例如制作hook WriteConsoleW的dll我们需要如下几步:
    • 首先写用户的函数
    BOOL(WINAPI * OLD_WriteConsoleW)(HANDLE  hConsoleOutput, const VOID *lpBuffer, DWORD   nNumberOfCharsToWrite, LPDWORD lpNumberOfCharsWritten, LPVOID  lpReserved) = WriteConsoleW;
    
    BOOL WINAPI NEW_WriteConsoleW(HANDLE  hConsoleOutput, const VOID *lpBuffer, DWORD   nNumberOfCharsToWrite, LPDWORD lpNumberOfCharsWritten, LPVOID  lpReserved) {
    	HANDLE wPip = GetStdHandle(STD_OUTPUT_HANDLE);
    	WriteFile(wPip, lpBuffer, nNumberOfCharsToWrite*2, lpNumberOfCharsWritten, NULL);
    	return TRUE;
    }
    
    • 然后是调用detours的api写绑定和解绑函数
    void Hook() {
    	DetourRestoreAfterWith();
    	DetourTransactionBegin();
    	DetourUpdateThread(GetCurrentThread());
    	DetourAttach((PVOID *)&OLD_WriteConsoleW, NEW_WriteConsoleW);
    	DetourTransactionCommit();
    }
    
    void UnHook() {
    	DetourTransactionBegin();
    	DetourUpdateThread(GetCurrentThread());
    	DetourDetach((PVOID *)&OLD_WriteConsoleW, NEW_WriteConsoleW);
    	DetourTransactionCommit();
    }
    
    • 最后在DllMain中调用Hook()和UnHook()
    BOOL APIENTRY DllMain( HMODULE hModule,
                           DWORD  ul_reason_for_call,
                           LPVOID lpReserved
    					 )
    {
    	switch (ul_reason_for_call)
    	{
    	case DLL_PROCESS_ATTACH:
    		Hook();
    		break;
    	case DLL_THREAD_ATTACH:
    		break;
    	case DLL_THREAD_DETACH:
    		break;
    	case DLL_PROCESS_DETACH:
    		UnHook();
    		break;
    	}
    	return TRUE;
    }
    

    如果找不到DllMain请打开工程中的++dllmain.cpp++。
    一定要有一个导出函数不然之后会报错0xc000007b

    然后要将dll加载到exe中

    这儿可以自己写dll注射器,也可以调用detours的CreateProcessWithDll,我采用的方法是后者

    DetourCreateProcessWithDllA(NULL, "C:\Users\hasee\Desktop\tellnet\telnet.exe", NULL, NULL, TRUE, NORMAL_PRIORITY_CLASS|CREATE_NEW_CONSOLE, NULL, NULL, &si, pi, "D:\Visual_studio_test\VirusExcercise\Fortelnet\detoursTest3\Debug\detoursTest3.dll", NULL);
    

    前面的参数和Winodes api CreateProcess一样,倒数第二个是dll地址,最后一个写NULL就行。

    至此每当被调用程序的WriteCosoleW要被执行的时候就会先执行我们的NEW_WriteCosoleW函数。

  • 相关阅读:
    2019 ICPC Asia Nanchang Regional E Eating Plan 离散化+前缀和
    2018icpc南京/gym101981 G Pyramid 找规律
    2018icpc沈阳/gym101955 J How Much Memory Your Code Is Using? 签到
    2018icpc南京/gym101981 K Kangaroo Puzzle 随机化
    series_02
    series_01
    locust_参数化关联
    locust_关联
    locust_单接口
    截图处理
  • 原文地址:https://www.cnblogs.com/rlee063/p/8695049.html
Copyright © 2011-2022 走看看