共有回帖数 0 个
-
首先我给出一个建议
如果你是个网虫,几年前研究过黑克技术,就会明白,如果不能做到道高一尺魔高一丈,那么随着杀毒软件技术的提升,你的应用领域就会越来越小,除非你的技术相当高,否则吃不了饭
游戏公司肯定是反对这些东西的,也许几年以后,反G技术也是突飞猛进,你的技术不到位,结果是很可能像上面那个例子
而学习编程,你应该把写软件与写游戏做为你的奋斗目标
现在给大家讲解的只是一个最简单的原理 以PVZ植物大战僵尸为例

直接修改阳光数值是可以修改的,但是有一个问题,这个地址是变动的,所以需要通过基址+偏移的手段,来获取这个变动的地址
找出当前地址后,肯定是要追踪这个地址的来源了,如何操作呢?
在CE里面,右键当前阳光地址,选择[找出是什么访问了这个地址]
然后会有如下的数据

注意红色的
esi是0BA655F0,还有一个5560,这个就是偏移了,esi+5560 正好是0BA6AB50,也就是当前阳光数量的地址
所以下一步我们需要跟踪esi的数值
我们知道了当前阳光的数量是esi+5560,下一步我们就要跟踪esi的来源,勾选上十六进制,把esi的数值复制进去,然后新扫描
注意地址,一般数据的地址都是大于004开头的,像这种0012这种数据,包括0017等小于004的,都是堆栈中的数据,直接跳过 然后从比004大的地址逐一测试,一般是前几个,因为PVZ很简单,00FE8318就是我们需要的数据,00FE8318保存的就是第一步esi+5560里面esi的数值
然后双击00FE8318这个地址,重复第一步的操作,右键是什么访问了这个地址

和第一步大同小异,00FE8318这个地址来源于esi+768,我们继续跟踪这个esi的地址,双击第一个,也就是箭头指向的指令
看到上一步的地址来源于esi+768,我们再继续跟esi 00FE7BB0这个地址是从哪里来的,还是老方法 勾选16进制,搜索地址


在CE里面点手动加入地址,然后勾选指针,在位置①那里输入基址,位置②那里输出第二个偏移,在位置③输出第三个偏移
注意一下顺序
我们找的时候
第一个偏移是5560
第二个偏移是768
最后一步是找到基址
我们输入的时候,就是从后往前,从下到上的输入


原理就是当前阳光数量的地址是变动的,通过基址和指针的原理来找到变动的地址
0BA6AB50这个地址保存了当前的阳光数量是100,这个地址是怎么来的呢?
上面的顺序大家理解可能有些费解,从下面看就好理解了
基址006a9ec0保存了0FE7BB0这个地址
地址00FE7BB0再加上768保存了0BA655F0这个地址
地址0BA655F0再加上5560又保存了0BA6AB50这个地址
而保存当前阳光数量的地址就是0BA6AB50,上面的5560和768通俗的叫法就是偏移
基址是不会变动的,偏移也不会变动,所以这样就解决了随即地址的问题
下面就该说下如何编写了,总不能每次都打开CE吧!

书写代码之前还要说下,PVZ只是很简单的游戏,很多游戏的结构肯定是不同的,有时候游戏中某个数据可能要找7,8级的指针,也就是基址加上7,8次偏移才能得到想要的数据,这样非常麻烦
并且有时候有分歧,并不是搜索出的十六进制地址都是正确的,需要一个一个测试
甚至有的游戏用这种方法根本就找不到基址,所以就得用人造指针了,这个另说,下面是代码书写

代码我直接贴图了,要么看的不清晰,代码很简单,就是用到了2个API函数,一个是读内存一个是写内存
不懂的直接百度一下就有 api的讲解的比我详细
这也是当作给大家练手,只有遇到问题了,自己解决了,才能算是学习到知识
最后说下上面注释问题
ReadProcessMemory(hpro,(void *)add_sun,&readx,4,0);
add_sun = readx + 0x768;
ReadProcessMemory(hpro,(void *)add_sun,&readx,4,0);
add_sun = readx + 0x5560;
有朋友问,为什么第二次读取的数据是一个地址而不是当前的阳光数量,这个如果你明白了基址和偏移的原理你应该就明白了,上面我讲过了,不明白再看一次,然后仔细琢磨
就是说我们的2个偏移,5560和768,并不是基址+768+5560
而是基址保存的一个地址 加上768 得到一个新地址,假设为地址1
而地址1也保存了一个地址,这个地址加上5560,又得出一个新地址,假设为地址2
而这个地址2保存的就是当前的阳光数量
如果还不理解,通过编辑框来显示每次读出后的数据,然后对比CE中的指针,这样就明白了
楼主 2015-11-19 13:37 回复
Copyright © 2010~2015 直线网 版权所有,All Rights Reserved.沪ICP备10039589号
意见反馈 |
关于直线 |
版权声明 |
会员须知