从0开始学模拟挂(一)--找内存基址,包含原理

 

1、首先打开CE,在设置里面尽量使用内核模式调试器
1.jpg
2009-8-5 14:23 上传
下载附件 (65.16 KB)


2、点击左上角的电脑图标
2.jpg
2009-8-5 14:25 上传
下载附件 (30.68 KB)


3、选中游戏进程,按确定
3.jpg
2009-8-5 14:27 上传
下载附件 (29.57 KB)


4、可以看到人物的血量是220,所以输入220,点首次搜索。其他用默认
4.jpg
2009-8-5 14:37 上传
下载附件 (96.37 KB)

5、以下是搜索结果,可以看到结果很多

5.jpg
2009-8-5 14:41 上传
下载附件 (67.21 KB)

6、出门让怪砍,使你掉血,然后CE在扫描内型下拉框里选择减少的数值
6.jpg
2009-8-5 14:44 上传
下载附件 (49.32 KB)


7、搜索完发现结果很多。。。。
7.jpg
2009-8-5 14:50 上传
下载附件 (97.32 KB)


8、没事我们多搜索几次,直到出现比较少的数字为止,看现在就一个地址了
8.jpg
2009-8-5 14:50 上传
下载附件 (66.57 KB)


9、双击找到的地址,把他加入下面的方框内
9.jpg
2009-8-5 14:53 上传
下载附件 (63.44 KB)


10、修改描述为1.内存地址(表示第一次游戏内找到的内存地址),右击地址,选择“查找写入该地址的代码”
10.JPG
2009-8-5 14:57 上传
下载附件 (78.02 KB)


11、以下是结果,并且双击找到的结果
11.jpg
2009-8-5 15:00 上传
下载附件 (26.23 KB)


12、然后出现如下图片,红色内行写着 ecx+000001e0,这里ecx 代表二级基址内放的数值,1e0 代表偏移量2。方框内是CE帮我们计算好的二级基址内的数值,我们就是需要他。把这个数字记下啦。通过它寻找二级基址的位置
12.jpg
2009-8-5 15:13 上传
下载附件 (63.25 KB)


13、点新的搜索,然后输入刚刚找到的二级基址内的数值,并且勾上前面的16进制(因为这个数据是16进制),再点击首次搜索(找找看哪个地址内的数值,满足上面这个数字),得到,如下两个结果,然后双击这两个结果,把他们加入下面的方框内。并且添加注释第A次进游戏得到的可能二级基址。
13.jpg
2009-8-5 15:21 上传
下载附件 (79.22 KB)


14、二级基址只有一个,所以这两个结果只有一个是真的,(一般来说第一个是真的地址,但也不是绝对的。碰RP的话,你也可以直接用第一)所以接下来要判断哪个才是真的二级基址。刚刚说过,退到游戏选择人物画面再进游戏,一级基址不变, 二级基址不变,但是二级基址内放的数字变了,这导致这个时候血的内存地址也变了。所以下面要做的就是退到人物选择画面,再进入游戏,通过刚刚方法(1---13步骤),再找次二级基址,他应该和前一回找到的二级基址一样。

下面图中我描述为(B可能的二级基址)的东东,是我第二次搜索得到的可能二级基址
。比较下两次进游戏得到的二级基址,只有红色的地址是没变的,说明他就是二级基址。
14.jpg
2009-8-5 15:41 上传
下载附件 (94.08 KB)



15、找到二级基址后,通过上图的面板你们也发现
二级基址(10822D20 )   =   一级基址的数值()   +     偏移1()
所以现在我们要找一级基址的数值 和 偏移1.

我们说过二级基址数值只要进入正式游戏都不不会改变了,只有进入人物选择画面的时候才变,下面我们要做的就是跟踪这个二级基址,回到人物选择画面,看看是谁往这个基址内写入东东~

15.1.jpg
2009-8-5 16:01 上传
下载附件 (73.72 KB)



15.2.jpg
2009-8-5 16:01 上传
下载附件 (154.2 KB)


16、正式进入游戏后,我们发现检测到几个结果,那到底哪个才是真的呢?
我们选择红色那个,因为他有mov

16.jpg
2009-8-5 16:05 上传
下载附件 (102.91 KB)



17、双击这个红色,然后得到如下图。红色那行写着 eax+ecx*4,这里前面的eax 代表一级基址内放的数值, ecx*4 代表偏移量1。方框内是CE帮我们计算好的一级基址内的数值,我们就是需要他。把这个数字记下啦。通过它寻找一级基址的位置。同时我们发现ecx代表的是4(十六进制),4(十六进制)*4=10(十六进制)。10就是偏移1

17.jpg
2009-8-5 16:14 上传
下载附件 (128.72 KB)



18、搜索一级基址内的数值10822D10,看看哪个地址内装的是他。结果就一个

18.jpg
2009-8-5 16:18 上传
下载附件 (59.14 KB)




19、好了现在我们知道所有的东西了,红色部分是无论哪次进游戏都不变的。找到他们,现在就能进行找血的内存位置了。

一级基址(012BAB94 )
二级基址(10822D20 )  =  一级基址的数值(10822D10)   +    偏移1(10)
血内存地址(055FCE18) =  二级基址的数值(055FCC38)   +     偏移2(1e0)

 

 

 

下面我们要来检验下我们得到的是否正确,思路是:

以下红色部分代表:无论哪次进入游戏都不会变的量

基址1内放的数字=读取数据(基址1)
基址2=基址1内放的数字+偏移量1               基址2内放的数字=读取数据(基址2)
血内存地址=基址2内放的数字+偏移量2         HP值=读取数据(血内存地址)



根据以上思路,写成按键精灵的代码如下:


  1. //下一行的目的是获取游戏窗口句柄。。因为下面要用到这个参数
  2. Plugin jzs=Window.MousePoint()
  3. //定义变量
  4. VBS Dim hp base py1 py2 hpjz1 hpjz2
  5. Rem 程序开始
  6. //base,py1,py2 分别表示一级基址的门牌号,偏移1,偏移2
  7. //自己修改,下面的三个参数为你自己的,你就能直接得到你自己游戏的血量多少,请注意所有十六进制的数字前都要加上&H,这样电脑才知道你输入的数字是十六进制的,不然像第二行的py2不加&H就变成十进制的10,实际上十六进制的10代表的是十进制的16
  8. base=&H012BAB94
  9. py1=&H10
  10. py2=&H1e0
  11. //hpjz1代表 一级基址内放的数字,下一句话意思是从一级基址内的数据存入hpjz1中.顺带补充句以下所有Memory.Read32Bit得到的数据都是十六进制
  12. Plugin hpjz1=Memory.Read32Bit(jzs,base)
  13. //hpjz2代表二级基址内放的数字,hpjz1+py1意思是把基址1内装的数字+偏移1,得到基址2的门牌号,下一句话意思是,计算出基址2的门牌号,然后从二级基址内读入数据存入hpjz2中
  14. Plugin hpjz2=Memory.Read32Bit(jzs,hpjz1+py1)
  15. //hp代表。。。地球人都知道什么意思。。。hpjz2+py2意思是把基址2内装的数字+偏移2,得到HP内存位置的门牌号,下一句话意思是,计算出HP内存位置的门牌号,就从HP内存地址中读入数据存入hp中
  16. Plugin hp=Memory.Read32Bit(jzs,hpjz2+py2)
  17. //防止HP数值不是十进制表示,所以通通给我转成十进制
  18. hp=int(hp)
  19. //弹出HP是多少的信息框
  20. MessageBox hp
复制代码



接着完全关闭游戏,重新登陆,运行脚本看看读取到的血量是多少:

19.jpg

2009-8-5 16:42 上传
下载附件 (131.47 KB)





OK,说明我们找到的是正确的

 

转自:http://bbs.vrbrothers.com/viewthread.php?tid=94544

  • 3
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: 基址(base address)是指在计算机程序中存储区域的起始地址。在使用某些工具和技术进行逆向工程或调试时,基址是一项非常实用的技巧。以下是五种常见的方法来基址: 1. 静态基址:通过分析程序的源代码或反汇编结果,查程序中使用到的全局变量或函数的指针,从而基址。 2. 寄存器基址:某些程序会将内存地址暂存在CPU的寄存器中。通过跟踪程序的运行过程,可以观察并分析这些寄存器中的值,基址。 3. 引用链基址:程序中的某些数据对象可能会以链表结构进行组织。通过跟踪这些链表的指针,可以追溯到链表的头结点,从而基址。 4. 堆栈基址:在程序的堆栈(stack)中,可以通过寻栈帧(stack frame)的指针,并分析栈帧的结构,来基址。 5. 动态基址:有些程序会在运行时生成代码或修改内存布局,使得基址的位置会经常变化。通过动态分析和调试工具,可以实时捕捉和跟踪这些基址的变化,最终基址。 此外,也有一些单独基址的方法: 1. 遍历内存:通过扫描程序的内存空间,到存储有特定数值(如全局变量的初始值)的地址,作为基址的候选。 无论使用哪种方法,基址后,可以将其用于数据的读写、函数的调用以及其他与内存相关的操作,更好地理解和控制程序的行为。但需要注意的是,基址的位置可能会因为程序的更新或变化而发生变动,因此需要动态调试技术来保持基址的可追踪性。 ### 回答2: 基址是指在计算机程序中,通过一系列的技术手段,确定某个变量或内存地址的准确位置。这在软件逆向工程和调试等领域非常实用。在OD (OllyDbg) CE (Cheat Engine)这两个常用的调试和修改工具中,可以采用以下五种方法来基址: 1. 静态基址:在程序运行前,通过静态分析确定变量或内存地址的基址,然后在运行时,通过相对偏移计算出真实地址。这种方法适用于没有代码加密或混淆的程序。 2. API函数追踪:通过追踪程序中的API函数的调用,可以间接地出变量或内存地址的基址。例如,可以追踪与目标变量读写相关的函数,然后通过函数内部的计算与操作,基址的位置。 3. 数据断点:通过在程序内设置数据断点,当指定的变量或内存地址发生读写操作时,可以确定变量的所在位置。OD和CE都支持这种方法,可以实时监控变量的值和地址变化。 4. 内存搜索:通过在程序运行时,利用OD或CE的内存搜索功能,可以到指定的变量或内存地址的基址。可以通过初始值、已知偏移等条件,缩小搜索范围,然后进行逐步逼近。 5. 反汇编代码分析:通过反汇编程序的代码,结合逆向工程的技术,可以分析出变量或内存地址的相关指令和操作,从而推算出基址的位置。 此外,除了以上的五种方法外,还有一种单独基址的方法,即通过内存修改器直接对变量进行修改,然后观察变量在内存中的位置变化。这种方法适用于一些简单的游戏应用,但不适用于复杂的程序和应用。 总之,基址的方法有多种多样,可以根据具体情况选择合适的方法。在使用这些方法时,需要对程序进行详细的分析和调试,有一定的逆向工程知识和经验会更有帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值