EasyHook库的使用

导语###

EasyHook的官网,最近在做的项目中,因为要去过滤掉cmd的弹框,所以用到了这个库,
在使用的过程中,遇到了一些坑,然后也解决了一些问题,特再次记录下来,方便自己以后查阅

1.了解####

首先我查找了网上的相关资料,都查的有点晕了,但有用的就那么几个,其它的就是引用这个几个例子,这样感觉效率不高,后面我还是先参照了官网的例子,才觉得真正对easyhook有了一个全面的了解。这个经验告诉我,在资料不够详尽的前提下,官网的例子才是更加靠谱的。easyhook提供了2种方式,一种是直接调用的方式,还有一种就是远程注入(也就是常说的dll注入),

2. 实践####

按照官网给的说明,完全copy里面的例子,实现了教材里的说明,对这个的作用有了一个很直观的感受,然后参照实际的使用需求,在例子的基础上做了修改,测试了自己要做的修改,确实可行。

3. 与项目结合####

  1. 项目需求点:公司产品前端使用的是NW框架,里面用的是chrome的内核,现在要做一个功能,需要升级,但是升级后不再支持 NPAPI 类型的插件,但支持PPAPI,但是这个时候出现一个问题,加载含有flash插件页面时,CMD命令行窗口会闪一下,要做到能加载flash插件,但是CMD命令行窗口不能闪。
  2. 解决:发现是命令行参数是not sandboxed时,通过hook截掉。
  3. 集成:按照例子中的代码,进行测试,发现既然不能拦截,郁闷啊,刚开始以为是注入失败,后面加了log,才发现,注入是成功的,失败的原因是因为NW刚起来的固定有几个进程,当弹CMD框的时候,会额外起进程,而我写的注入程序只注入了NW刚起来的程序,没有抓额外的进程,所以失败了,现在问题来了,怎么获取这个会弹cmd框的子进程呢?想了好久,没有找到合适的方法,后面想着只能去改NW的源码了,唉~~~
  4. 新的希望:后面我的同事有空,他就帮我看起来了,他比较厉害,他想到可以先hook起子进程的命令,然后在给这个子进程注入,去屏蔽掉
    not sandboxed,我就没有想到。然后安装这个思路,就往下做,这里都是hook了kernel32的CreateProcess方法,因为程序区分了宽字节和窄字节,所以要hook CreateProcessA和CreateProcessW这个二个,要确认你注入的程序是64位还是32位,然后注入相应版本的dll

问题点记录:

  1. LhSetExclusiveACL和LhSetInclusiveACL的区别
    LhInstallHook与LhSetExclusiveACL/LhSetInclusiveACL必须配对出现,否则hook不会生效,我在做测试的时候,发现我配对
    使用了,但是尽然还是没效果,找了好久,后面才发现,是因为我没有搞清楚LhSetExclusiveACL和LhSetInclusiveACL,LhSetExclusiveACL是hook除了当前线程外的所有线程,而LhSetInclusiveACL是可以针对当前线程,所以如果单独起了线程去执行hook的操作,那这样必须使用LhSetExclusiveACL,如果没有起线程,直接执行hook,那必须使用LhSetInclusiveACL。
  1. EasyHook可以支持远程注入
  2. 在查看新东西的时候,官方文档很重要,先参照官方文档的例子,可以节约很多时间
  3. hook的时候要确定你注入的是64位还是32位



 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目前最好的EasyHook的完整Demo程序,包括了Hook.dll动态和Inject.exe注入程序。 Hook.dll动态封装了一套稳定的下钩子的机制,以后对函数下钩子,只需要填下数组表格就能实现了,极大的方便了今后的使用。 Inject.exe是用MFC写的界面程序,只需要在界面上输入进程ID就能正确的HOOK上相应的进程,操作起来非常的简便。 这个Demo的代码风格也非常的好,用VS2010成功稳定编译通过,非常值得下载使用。 部分代码片段摘录如下: //【Inject.exe注入程序的代码片段】 void CInjectHelperDlg::OnBnClickedButtonInjectDllProcessId() { ////////////////////////////////////////////////////////////////////////// //【得到进程ID值】 UINT nProcessID = 0; if (!GetProcessID(nProcessID)) { TRACE(_T("%s GetProcessID 失败"), __FUNCTION__); return; } ////////////////////////////////////////////////////////////////////////// //【得到DLL完整路径】 CString strPathDLL; if (!GetDllFilePath(strPathDLL)) { TRACE(_T("%s GetDllFilePath 失败"), __FUNCTION__); return; } ////////////////////////////////////////////////////////////////////////// //【注入DLL】 NTSTATUS ntStatus = RhInjectLibrary(nProcessID, 0, EASYHOOK_INJECT_DEFAULT, strPathDLL.GetBuffer(0), NULL, NULL, 0); if (!ShowStatusInfo(ntStatus)) { TRACE(_T("%s ShowStatusInfo 失败"), __FUNCTION__); return; } } //【Hook.dll动态的代码片段】 extern "C" __declspec(dllexport) void __stdcall NativeInjectionEntryPoint(REMOTE_ENTRY_INFO* InRemoteInfo) { if (!DylibMain()) { TRACE(_T("%s DylibMain 失败"), __FUNCTION__); return; } } FUNCTIONOLDNEW_FRMOSYMBOL array_stFUNCTIONOLDNEW_FRMOSYMBOL[]= { {_T("kernel32"), "CreateFileW", (void*)CreateFileW_new}, {_T("kernel32"), "CreateFileA", (void*)CreateFileA_new}, {_T("kernel32"), "ReadFile", (void*)ReadFile_new} }; BOOL HookFunctionArrayBySymbol() { /////////////////////////////////////////////////////////////// int nPos = 0; do { /////////////////////////////// FUNCTIONOLDNEW_FRMOSYMBOL* stFunctionOldNew = &g_stFUNCTIONOLDNEW_FRMOSYMBOL[nPos]; if (NULL == stFunctionOldNew->strModuleName) { break; } /////////////////////////////// if (!HookFunctionBySymbol(stFunctionOldNew->strModuleName, stFunctionOldNew->strNameFunction, stFunctionOldNew->pFunction_New)) { TRACE(_T("%s HookFunctionBySymbol 失败"), __FUNCTION__); return FALSE; } } while(++nPos); /////////////////////////////////////////////////////////////// return TRUE; } HANDLE WINAPI CreateFileW_new( PWCHAR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile ) { TRACE(_T("CreateFileW_new. lpFileName = %s"), lpFileName); return CreateFileW( lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile); }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值