Detours是微软开发的一个函数库,可用于捕获系统API。--百度百科
利用detours能够hook到WIN32的API,原理好像是修改调用API的指令使跳转到用户的函数。(未验证)node
以vs2015为例
下载地址:https://www.microsoft.com/ 我下载的版本是Detours Expressv3.0 Build 343 下载以后是免安装文件,解压就能玩。
把全部的的文件拷贝到 ++VS2015/VC++ 目录下面,运行++vs2015兼容命令行工具++,进入目录++vs2015/vc/src++,执行命令nmake 就能够用了。生成的lib文件在++lib.X64++和++lib.X86++文件夹中,在项目中包含就能够了。c++
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; }
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(); }
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++。
必定要有一个导出函数否则以后会报错0xc000007bapi
这儿能够本身写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函数。ui