外挂编写中的内存补丁

Home / Hackintosh MrLee 2016-4-8 3331

闲来就想写写东西,昔日的外挂开发技术已经很久没有派上用场了,这内存补丁还是偶当时由于调试技术太菜,不得已用的方法,不过确实挺不错,无论是做外挂还是破解软件。 游戏外挂中自动补血补蓝应该说是最最基础的功能了,所以获得当前的血蓝量是首先应该做的。第一步先搜索到血蓝存放地址,用CE吧,被怪打几下搜索,然后吃个血什么的再搜索,总之最后找到了,但这个地址当然一般是变动的,即每次启动游戏后存放地址都不一样。所以怎样锁定这个地址或使它永远存放在一个固定的地方就成了我们的目标了,OK,来看下怎么做。 用OD加载游戏,启动,然后开始找地址。我们假设本次找到的血的存放地址是:0x00550000,用OD在这个地址上下一个读或写的断点,我个人比较喜欢写断点,然后再被怪打一下或吃个血什么的,不出意外目前OD就断下了,记下断下的代码的地址,也就是OD左边的标号: 00440000 MOV [ECX+00001B],EAX //这时ECX=0x00550000-0x00001B,而EAX就是你的血量。 00440003 MOV …… 00440006 MOV …… 现在在游戏程序后面找一段空白的地方用于我们写补丁代码。假设我们找到了:0x07000000。 具体思路就是这样:让程序执行到00440000后给它一个JMP,让它跳到0x07000000,然后0x07000000处有我们写好的代码,将血量存放下来,然后再JMP回去继续运行。 好了既然是这个思想我们就先得在00440000处写一个跳转指令: 00440000 JMP 07000000 //原来这里是MOV [ECX+000001B],EAX 00440005 …… 注意这里,JMP的机器码是E9,JMP指令是占5个字节的,而原来的MOV [ECX+000001B],EAX指令只占3个字节,所以不可避免的要将00440003处的一条指令给冲掉,所以冲掉的这条指令必须在我们的补丁处给补回来。 然后再将OD转到07000000去写代码: 07000000 [ECX+000001B],EAX //这里是游戏原本的代码,得补回来 07000003 MOV DWORD PTR [07000080],EAX //这条指令是将血的值永远放到地址0x07000080中 07000008 MOV …… //这里补上00440003处冲掉的一条指令, /*在这区域你还可以做爱做的任何事~~*/ 0700000B JMP 00440006 //跳转到00440006继续原来的行程 好了,我们的工作完成了,剩余的要做的就是直接在0x07000080中去取血量了~~。 具体写代码的过程是:将OD转换的机器码编到一个数组里,用WriteProcessMemory去写内存。 回想起来这方法。。很无奈的,而且很繁琐,没办法,由于当时处于调试入门阶段,所以这个方法让我在外挂中使用了很长的一段时间,不过要命的是每次游戏一更新,无论更新多小,你都得重新做一遍这样无味的工作,因为00440000这个地方的代码变了。。。,但是这个方法确实有点万能,呵。。

本文链接:https://www.it72.com/8823.htm

推荐阅读
最新回复 (1)
返回