




已阅读5页,还剩4页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1 介绍 Api hook包括两部分:api调用的截取和api函数的重定向。通过api hook可以修改函数的参数和返回值。关于原理的详细内容参见windows核心编程第19章和第22章。2 Detours API hookDetours is a library for intercepting arbitrary Win32 binary functions on x86 machines. Interception code is applied dynamically at runtime. Detours replaces the first few instructions of the target function with an unconditional jump to the user-provided detour function. Instructions from the target function are placed in a trampoline. The address of the trampoline is placed in a target pointer. The detour function can either replace the target function, or extend its semantics by invoking the target function as a subroutine through the target pointer to the trampoline.在Detours库中,驱动detours执行的是函数 DetourAttach().LONG DetourAttach( PVOID * ppPointer, PVOID pDetour );这个函数的职责是挂接目标API,函数的第一个参数是一个指向将要被挂接函数地址的函数指针,第二个参数是指向实际运行的函数的指针,一般来说是我们定义的替代函数的地址。但是,在挂接开始之前,还有以下几件事需要完成:需要对detours进行初始化. 需要更新进行detours的线程. 这些可以调用以下函数很容的做到:DetourTransactionBegin() DetourUpdateThread(GetCurrentThread() 在这两件事做完以后,detour函数才是真正地附着到目标函数上。在此之后,调用DetourTransactionCommit()是detour函数起作用并检查函数的返回值判断是正确还是错误。2.1hook DLL中的函数在这个例子中,将要hook winsock中的函数 send()和recv().在这些函数中,我将会在真正调用send或者recv函数前,把真正说要发送或者接收的消息写到一个日志文件中去。注意:我们自定义的替代函式一定要与被hook的函数具有相同的参数和返回值。例如,send函数的定义是这样的:int send( _in SOCKET s, _in const char *buf, _in int len, _in int flags);因此,指向这个函数的指针看起来应该是这样的:int (WINAPI *pSend)(SOCKET, const char*, int, int) = send;把函数指针初始化成真正的函数地址是ok的;另外还有一种方式是把函数指针初始化为NULL,然后用函数DetourFindFunction() 指向真正的函式地址.把send() 和 recv()初始化:int (WINAPI *pSend)(SOCKET s, const char* buf, int len, int flags) = send;int WINAPI MySend(SOCKET s, const char* buf, int len, int flags);int (WINAPI *pRecv)(SOCKET s, char* buf, int len, int flags) = recv;int WINAPI MyRecv(SOCKET s, char* buf, int len, int flags);现在,需要hook的函数和重定向到的函数已经定义好了。这里使用 WINAPI 是因为这些函数是用 _stdcall 返回值的导出函数,现在开始hook:INT APIENTRY DllMain(HMODULE hDLL, DWORD Reason, LPVOID Reserved) switch(Reason) case DLL_PROCESS_ATTACH: DisableThreadLibraryCalls(hDLL); DetourTransactionBegin(); DetourUpdateThread(GetCurrentThread(); DetourAttach(&(PVOID&)pSend, MySend); if(DetourTransactionCommit() = NO_ERROR) OutputDebugString(send() detoured successfully); break; . 它基本上是用上面介绍的步骤开始和结束初始化,更新detours线程,用DetourAttach()开始hook函数,最后调用DetourTransactionCommit()函数,当调用成功时返回NO_ERROR,失败是返回一些错误码.下面是我们的函数的实现,我发送和接收的信息写入到一个日志文件中:int WINAPI MySend(SOCKET s, const char* buf, int len, int flags) fopen_s(&pSendLogFile, C:SendLog.txt, a+); fprintf(pSendLogFile, %sn, buf); fclose(pSendLogFile); return pSend(s, buf, len, flags); int WINAPI MyRecv(SOCKET s, char* buf, int len, int flags) fopen_s(&pRecvLogFile, C:RecvLog.txt, a+); fprintf(pRecvLogFile, %sn, buf); fclose(pRecvLogFile); return pRecv(s, buf, len, flags);2.2hook自定义c函数举例来说明,假如有一个函数,其原型为int RunCmd(const char* cmd);如果要hook这个函数,可以按照以下几步来做:a) include 声明这个函数的头文件b) 定义指向这个函数的函数指针,int (* RealRunCmd)(const char*) = RunCmd;c) 定义detour函数,例如: int DetourRunCmd(const char*);d) 实现detour函数,如:Int DetourRunCmd(const char* cmd) /extend the function,add what you want :) Return RealRunCme(cmd);这样就完成了hook RunCmd函数的定义,所需要的就是调用DetourAttack DetourTransactionBegin(); DetourUpdateThread(GetCurrentThread(); DetourAttach(&(PVOID&)RealRunCmd, DetourRunCmd); if(DetourTransactionCommit() = NO_ERROR) /error 2.3 hook类成员函数 Hook类成员函数通过在static函数指针来实现 还是举例说明,假如有个类定义如下:class CDatapublic: CData(void); virtual CData(void); int Run(const char* cmd);现在需要hook int CData:Run(const char*) 这个函数,可以按照以下几步:a) 声明用于hook的类class CDataHookpublic: int DetourRun(const char* cmd); static int (CDataHook:* RealRun)(const char* cmd);b) 初始化类中的static函数指针 int (CDataHook:* CDataHook:RealRun)(const char* cmd) = (int (CDataHook:*)(const char*)&CData:Run;c) 定义detour函数 int CDataHook:DetourRun(const char* cmd) /添加任意你想添加的代码 int iRet = (this-*RealRun)(cmd); return iRet;e) 调用detourAttach函数 DetourTransactionBegin(); DetourUpdateThread(GetCurrentThread(); DetourAttach(&(PVOID&)CDataHook:RealRun, (PVOID)(&(PVOID&)CDataHook:DetourRun); if(DetourTransactionCommit() = NO_ERROR) /error 2.4 DetourCreateProcessWithDll使用这个函数相当于用CREATE_SUSPENDED标志调用函数CreateProcess.新进程的主线程处于暂停状态,因此DLL能在函数被运行钱被注入。注意:被注入的DLL最少要有一个导出函数.如用testdll.dll注入到notepad.exe中:#undef UNICODE#include #include #include int main() STARTUPINFO si; PROCESS_INFORMATION pi;ZeroMemory(&si, sizeof(STARTUPINFO); ZeroMemory(&pi, sizeof(PROCESS_INFORMATION); si.cb = sizeof(STARTUPINFO); char* DirPath = new charMAX_PATH; char* DLLPath = new charMAX_PATH; /testdll.dll char* DetourPath = new charMAX_PATH; /detoured.dll GetCurrentDirectory(MAX_PATH, DirPath); sprintf_s(DLLPath, MAX_PATH, %stestdll.dll, DirPath); sprintf_s(DetourPath, MAX_PATH, %sdetoured.dll, DirPath); DetourCreateProcessWithDll(NULL, C:windowsnotepad.exe, NULL,NULL, FALSE, CREATE_DEFAULT_ERROR_MODE, NULL, NULL,&si, &pi, DetourPath, DLLPath, NULL); delete DirPath; delete DLLPath; delete DetourPath; return 0;2.5 Detouring by Address假如出现这种情况怎么办?我们需要hook的函数既不是一个标准的WIN32 API,也不是导出函数。这时我们需要吧我们的程序和被所要注入的程序同事编译,或者,把函数的地址硬编码:#undef UNICODE#include #include #include typedef void (WINAPI *pFunc)(DWORD);void WINAPI MyFunc(DWORD); pFunc FuncToDetour = (pFunc)(0x0100347C); /Set it at address to detour in /the processINT APIENTRY DllMain(HMODULE hDLL, DWORD Reason, LPVOID Reserved) switch(Reason) case DLL_PROCESS_ATTACH: DisableThreadLibraryCalls(hDLL); DetourTransactionBegin(); DetourUpdateThread(GetCurrentThread(); DetourAttach(&(PVOID&)FuncToDetour, MyFunc); DetourTransactionCommit(); break; case DLL_PROCESS_
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025草坪修剪项目政府采购与生态修复合同
- 2025叉车租赁合同协议-仓储物流设施升级改造
- 2025版商场档口租赁合同(含品牌形象维护责任)
- 2025年泰州二手房买卖合同+智能家居设备安装服务合同
- 2025版智能通风排烟系统安装与能源审计合同样本
- 2025年度智能安防系统采购意向协议书
- 2025年大学兼职教师合作开发与成果转化协议
- 2025版核能设备监造与核安全防护合同
- 2025版农业合作社股权变更与乡村振兴战略实施协议
- 2025版房地产开发企业委托反担保合同范本
- 行为金融学案例
- 万科集团财务管理制度手册207
- “李可中医药学术流派论治厥阴病”-课件
- 通用技术作品设计报告
- 城市规划原理课件(完整版)
- 锚杆支护技术规范正式版本
- 隐形眼镜经营管理制度
- 下一代互联网技术
- 皮肤知识与问题性皮肤分析(入行必看)
- 单位消防安全评估报告(模板)
- 电子加速器辐照项目可行性研究报告写作范文
评论
0/150
提交评论