易语言实现64位进程远程hook技术研究与实践

需积分: 31 2 下载量 121 浏览量 更新于2024-11-09 收藏 65KB ZIP 举报
资源摘要信息:"浅谈64位进程远程hook技术及64位模块导出表的一些变化,附源码-易语言" 在讨论64位进程远程hook技术时,首先需要了解hook技术的基本概念。hook技术是一种在操作系统中拦截系统、应用程序或库函数调用的技术,目的是控制执行流程、改变数据、监视活动等。在32位和64位系统中实施hook技术存在一定的区别,特别是在处理寻址能力和指令长度方面。 在32位系统中,进程的寻址能力为4字节,这意味着通过直接跳转指令(如JMP)可以达到的最大跳转范围是4GB,这通常是足够的。然而,在64位系统中,进程的寻址能力提升到了8字节,但64位汇编的直接跳转指令仅支持4字节偏移量。因此,要实现更远距离的跳转,需要借助寄存器或地址偏移量。 在实现64位远程hook时,需要在目标进程中申请内存空间来存放穿插代码和hook原代码。修改目标进程中的指令为跳转至这段内存空间。这段穿插代码需要能够把需要的寄存器信息或其他数据通过通信手段传送到调用者的回调接口。在需要修改数据时,穿插代码需要等待回调接口的返回,并将修改内容写回原位置。最后,穿插代码跳转回hook位置的下一条指令或指定位置,从而完成hook过程。 文章中提到了两种常见的64位hook跳转方法。第一种方法是使用JMP rax或者call rax指令,并通过一系列操作将目标地址压入rax寄存器。这种方法的优点是简单直观,但缺点是会干扰到寄存器的正常使用,并且占用的字节长度较长(至少12字节,加上额外操作可能会更多)。 第二种方法则是利用JMP [rip]指令,这种指令通过rip(指令指针寄存器)相对寻址来达到长距离跳转的目的。它具有代码短小(仅6字节)和不会干扰寄存器的优势。通过在模块内的其他位置找到适当的8字节空间,可以将跳转地址存储在这些位置中,然后通过rip相对寻址跳转到该位置。这种方法可以有效减少对目标进程内存的修改量,同时保持操作的简洁性。 文章中还提到了在穿插代码中处理数据传递的问题。当需要获取通用寄存器(如RAX到R15)的值时,可以使用消息传递或远线程等方法。消息传递方法涉及的汇编改写量较小,更易于实现。 在易语言的使用上,易语言对32位编译的支持较为成熟,而对于64位编译则可能遇到一些限制。针对64位进程操作,论坛中的开源模块WOW64Ext提供了基本的封装,作者在此基础上进一步封装扩展了几个功能,以支持易语言爱好者更好地操作64位模块进程。 最后,文章附带了源码"64hook v1.3.e",这可能是作者封装的模块源码,便于其他易语言爱好者理解和学习64位远程hook技术的实现。源码的存在可以降低爱好者们在实现64位远程hook时的学习门槛,加速他们掌握64位系统下的hook技术。