划句号。

来源:互联网 发布:淘宝客服可在家兼职 编辑:程序博客网 时间:2024/04/25 16:48

写这个游戏修改器已经很长时间了,今天决定短事件内不进行更新了。准备开始学D3D部分。

公开这个游戏修改器的核心设计:

1、搜索内存部分:

分析进程内存块及各块属性

修改不能读取的各内存块属性为可读,读进程内存到数组

搜索数组内容——将要搜索的内容转换为BYTE数组并对照,保存得到的结果

再次搜索时读上次结果内各个地址数据并保存本次结果,直至搜索完成

2、 获取修改内存地址A的代码所在地址B(该功能使目标进程运行在调试模式下),此功能未进行扩展。

挂接调试器

设地址A所在内存(整块内存都将不可写)属性为不可写

当目标进程写内存块内任何地址时,都将引发写内存地址错误的调试事件

若出错地址为地址A,则返回出错代码地址,即更改该内存数据的代码地址B

退出调试

(以上功能在现在正在写的HOOK API这个程序中进行了修改,使得能够连续跟踪多次,虽然手头最后的版本也具备这样的功能,但不准备发布了)

3、生成配置及配置保存

在实际上是基本的内容,没有什么技术,只是自己定义了一个文件结构,连文件内部表都没有定义。

4、全局热键

这个可以参考我以前的文章,虽然现在将公开的代码已经修改了很多,能够与实际按键同步激活按键事件,并回放。但这个代码也不会公开。

 

今天再发这个HOOK API ,经过很多测试,基本没有BUG了,说一下原理:

基于上面提到的调试模式,只是稍有改动,代码实现方式很简单,一句汇编都没用。简单介绍一下:

1、分析模块对应导入导出表(该代码来自超级绿豆—VB API区版主之一的HOOK API代码,虽然在以前的VB6学习光盘上有一个类似代码,但是我参考的是绿豆的代码,做了一些删节,去掉了些不必要的代码,所以这项技术不进行详细说明)

2、挂接调试器

3、修改API入口及API函数,这里我的方法可能与很多人介绍的不同。我的代码是将原始的API函数机器码读回,在后面加一字节&H90作备份,在前面加一字节&HCC以引发INT3中断,将修改后的代码(前面加1字节&HCC的)写入原来地址(为什么可以这样做但不破坏后面的API你可以查看一下API函数,绝大多数后面都有5个以上NOP,这个我怎么就没发现有人提过呢,还是我监视短浅,这样修改的好处下面有所涉及)

4、等待调试事件——INT3中断,获取中断时CONTEXT,即入口地址处的寄存器内容等,此处即包括调用堆栈地址,读该地址内容,以4字节方式返回。继续等待调试事件即可。

因为原来的代码就在INT3后面,所以根本不用什么步进等等,直到结束HOOK API时才将原始代码写回去。这样做减少了很多中间调用,解决了目标进程大量重复调用一个API时HOOK API进程及被HOOK的进程执行速度大幅减慢问题,当然了,基于获取入口地址及函数名的方法,还有一些好处,例如不用手工去解析DLL内含有哪些函数(确实是函数,因为自定义DLL等我们一般不称为API,但确实也可以被HOOK)而后调用API获取基地址问题,也顺便不用输入有些编译器生成的奇怪的函数名了。弊端还是有的,由于基于调试模式,所以HOOK部分有一些问题,例如某些程序被调试时就自己滚回老家去了,确实是自己滚回去的这一点毋庸置疑。另外,基于我的修改方式,有些API函数被修改后,会出现问题,例如你不要用我这个程序去HOOK winlogon.exe所调用的MSGINA.dll中的WlxStartApplication函数,当你HOOK它以后,按CTRL+DEL+ALT会……,……一系列过程之后,当你撤销调试,直接重新启动了(我绝对不是让大家学坏,纯属警告,如果你要试,最好保存所有东东以后再试),顺便说一句,当入口地址在低端内存上时,一般不要用我这个程序去HOOK,可能会引起一些问题,不过有些垃圾软件你HOOK它是应该的。上面提到的WlxStartApplication函数,是在按CTRL+DEL+ALT时调用任务管理器的,也不知何年何月在网上看的一些文章都是拦截其他的一些函数,甚至一些函数名根本就不存在!都怎么想的呢,还是那句话,我才疏学浅,毕竟我是业余的VB爱好者。

就写这么多了,一会把HOOK API这个发出去,虽然手头上已经把功能扩充到可以同时HOOK某一进程内的任意个函数,但这个发布版本只能HOOK某一进程内的某一函数。有的时候真不知道我写这些技术文章干什么,不能说某些文章有水平,但某些相关内容至少是我在请教的时候没人搭理我,对论坛失去兴趣。没啥大意思。如果不幸某些文章上提的东西呛到某些高手或者是有极其微小的可能导致降低您的收入,那请您留下宝贵的一字半句,我可能就把帖子删了。

原创粉丝点击