- 1、本文档共35页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
API Hook
API Hook
AAPPII HHooookk 从基础讲起,新手手册。
注:本文是根据我两年前写的一个系统行为监测程序写成(参考了一些书籍和文章)。最近
在论坛上看到有不少人在问关于API Hook 的问题,便写成此文,希望能对朋友们在写API
Hook代码的时候能够有所帮助。
学习各种外挂制作技术,马上去百度搜索 魔鬼作坊 点击第一个站进入、快速成为做挂达
人。
基本原理
API Hook 是什么我就不多说了,直接进入正题。API Hook技术主要有下面的技术难点:
这种方法可以指定多个DLL,用空格隔开。这些DLL会被任何用到User32.dll的所有程序
自动加载。当User32.dll加载的时候,User32.dll的DllMain 会收到一个
DLL_PROCESS_ATTACH 通知,User32 在这个时候读取注册表项中的值,调用
LoadLibrary加载各个DLL。
显然使用这种方法要求设置注册表之后立刻重起系统,不过一般情况下这不是大问题。这种
方法的主要问题在于,只有用到User32.dll 的应用程序才会被Inject。所有的 GUI 和少部
分CUI 程序会用到User32.dll,所以如果你的API Hook 程序不打算监视CUI 程序的话,
那么可能问题并不太大。但是如果你的API Hook 程序需要监视系统中所有进程的话,这种
方法的限制将是非常致命的。
可以使用SetWindowsHookEx(WH_GETMESSAGE, …, 0) 设置全局的消息钩子,虽然
可能你的程序并不用到消息钩子,但是钩子的一个副作用是会将对应的DLL加载到所有的
GUI线程之中。类似的,只有用到GUI 的进程才会被挂接。虽然有这种限制,这种方法仍
然是最常用的挂接进程的方法。
使用CreateRemoteThread函数在目标进程中创建远程线程
这种方法可以在任意的目标进程中创建一个远程线程,远程线程中可以执行任意代码,这样
便可以做到把我们的代码Inject 到目标进程中。这种方法具有最大的灵活性,但是难度也最
高:
a) 远程线程代码必须可以自重定位
b) 要能够监视进程的启动和结束,这样才可以挂接到所有进程
这两个问题都是可以解决的,在本文中我将重点讲述如何创建远程线程和解决这两个问题。
如果你只是要挂接某个特定进程的并且情况允许你自己来创建此进程,你可以调用
CreateProcess(…, CREATE_SUSPENDED)创建子进程并暂停运行,然后修改入口代码
使之调用LoadLibrary 加载自己的DLL。该方法在不同CPU 之间显然是无法移植的。
找到API 函数在内存中的地址,改写函数头几个字节为JMP 指令跳转到自己的代码,执
行完毕再执行API 开头几个字节的内容再跳回原地址。这种方法对CPU 有较大的依赖性,
而且在多线程环境下可能出问题,当改写函数代码的时候有可能此函数正在被执行,这样做
可能导致程序出错。
修改PE 文件的IAT (Import Address Table),使之指向自己的代码,这样 EXE/DLL在调
用系统API 的时候便会调用你自己的函数
PE 文件结构和输入函数
Windows9x、Windows NT、Windows 2000/XP/2003 等操作系统中所使用的可执行文
件格式是纯32 位PE(Portable Executable)文件格式,大致如下:
文件中数据被分为不同的节(Section)。代码(.code)、初始化的数据(.idata),未初化的
数据(.bss)等被按照属性被分类放到不同的节中,每个节的属性和位置等信息用一个
IMAGE_SECTION_HEADER 结构来描述。所有的这些IMAGE_SECTION_HEADER 结构
组成一个节表(SectionTable),这个表被放在所有节数据的前面。由于数据按照属性被放
在不同的节中,那么不同用途但是属性相同的数据可能被放在同一个节中,因此PE 文件中
还使用IMAGE_DATA_DIRECTORY 数据目录结构来指明这些数据的位置。数据目录和其
他描述文件属性的数据和在一起称为PE 文件头。PE 文件头被放在节和节表的前面。PE 文
件中的数据位置使用RVA(RelativeVirtualAddress)来表示。RVA 指的是相对虚拟地址,
也就是一个偏移量。当PE 文件被装入内存中的时候,Windows 把PE 文件装入到某个特定
的位置,称为映像基址(I
您可能关注的文档
- 二年级上册语文试题 - 第八单元测试卷 含答案 人教部编版.docx
- 二年级上册语文试题 第六单元闯关卷(二) 人教部编版 (含答案).doc
- 二年级上册语文试题 - 河南省洛阳市2019-2020学年第一学期期中试卷(PDF版不含答案)人教部编版.pdf
- 二年级上册语文试题-第七单元测试卷(1) (含答案)人教部编版.docx
- 二年级上册语文试题-看图写话练习34篇 (图片版无答案)人教部编版.docx
- 六年级上册语文 单元试题-第三单元测试卷(二)人教部编版(含答案).doc
- 六年级上册语文单元检测-第三单元 人教(部编版)(PDF 含答案).pdf
- 六年级上册语文试题 - 语文园地八 人教(部编版)(含解析).docx
- 六年级上册语文试题 - 2019-2020学年综合训练(三)(有答案)人教部编版.docx
- 六年级上册语文试题 - 第三单元 单元检测题(人教部编版).doc
文档评论(0)