- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Windows下Hook API技术 inline hook 分类: WINDOWS ?什么叫Hook API?所谓Hook就是钩子的意思,而API是指 Windows开放给程序员的编程接口,使得在用户级别下可以对操作系统进行控制,也就是一般的应用程序都需要调用API来完成某些功能, Hook API的意思就是在这些应用程序调用真正的系统API前可以先被截获,从而进行一些处理再调用真正的API来完成功能。在讲Hook API之 前先来看一下如何Hook消息,例如Hook全局键盘消息,从而可以知道用户按了哪些键,这种Hook消息的功能可以由以下函数来完成,该函数将一个新的 Hook加入到原来的Hook链中,当某一消息到达后会依次经过它的Hook链再交给应用程序。 HHOOK SetWindowsHookEx(???? int idHook,????????????????????? //Hook类型,例如WH_KEYBOARD,WH_MOUSE???? HOOKPROC lpfn,????????????? //Hook处理过程函数的地址???? HINSTANCE hMod,?????????? //包含Hook处理过程函数的dll句柄(若在本进程可以为NULL)???? DWORD dwThreadId, ?????//要Hook的线程ID,若为0,表示全局Hook所有); ???? 这里需要提一下的就是如果是Hook全局的而不是某个特定的进程则需要将Hook过程编写为一个DLL,以便让任何程序都可以加载它来获取Hook过程函数。 ???? 而对于Hook API微软并没有提供直接的接口函数,也许它并不想让我们这样做, 不过有2种方法可以完成该功能。第一种,修改可执行文件的IAT表(即输入表),因为在该表中记录了所有调用API的函数地址,则只需将这些地址改为自己 函数的地址即可,但是这样有一个局限,因为有的程序会加壳,这样会隐藏真实的IAT表,从而使该方法失效。第二种方法是直接跳转,改变API函数的头几个 字节,使程序跳转到自己的函数,然后恢复API开头的几个字节,在调用AP完成功能后再改回来又能继续Hook了,但是这种方法也有一个问题就是同步的问 题,当然这是可以克服的,并且该方法不受程序加壳的限制。 ???? 下面将以一个Hook指定程序send函数的例子来详细描述如何Hook API,以达到监视程序发送的每个封包的目的。采用的是第二种方法,编写为一个dll。首先是一些全局声明, //本dll的handleHANDLE g_hInstance = NULL;//修改API入口为 mov eax,jmp eax是程序能跳转到自己的函数BYTE g_btNewBytes[8] = { 0xB8, 0x0, 0x0, 0x40, 0x0, 0xFF, 0xE0, 0x0 };//保存原API入口的8个字节DWORD g_dwOldBytes[2][2] = { 0x0, 0x0, 0x0, 0x0 };//钩子句柄HHOOK??? g_hOldHook = NULL;//API中send函数的地址DWORD g_pSend = 0;//事务,解决同步问题HANDLE g_hSendEvent = NULL; //自己的send函数地址,参数必须与API的send函数地址相同 int _stdcall hook_send( SOCKET s, const char *buf, int len, int flags ); //要Hook的进程和主线程ID号 DWORD g_dwProcessID = 0;DWORD g_dwThreadID = 0; ???? 从声明可以看出,我们会把API函数的首8个字节改为 mov eax,jmp eax ,使程序能够跳转,只需获取我们自己的函数 地址填充可实现跳转。而g_dwOldBytes是用来保存API开头原始的8个字节,在真正执行API函数是需要写回。还有一点, 在声明新的函数时,该例中为hook_send,除了保正参数与API的一致外,还需要声明为__stdcall类型,表示函数在退出前自己来清理堆栈, 因为这里是直接跳转到新函数处,所以必须自己清理堆栈。下面看主函数, BOOL APIENTRY DllMain( HANDLE hModule, ??????????????????????????????????? DWORD?? ul_reason_for_call, ??????????????????????????????????? LPVOID lpReserved??
有哪些信誉好的足球投注网站
文档评论(0)