在本步骤中,你需要使用多级指针的概念来查找健康值真正的地址并修改它。多级指针就是一个指针的指针,也就是第一个指针指向第二个指针,第二个指针指向第三个指针,以此类推,最终指向你想要访问的地址。
首先,你需要按照跟第 6 步类似的方式找到健康值的地址,并分析汇编代码以查找指向健康值地址的指针。然后,你需要找到指向这个指针的指针,并按照同样的方式分析汇编指令和偏移量,找出下一个指向指针的指针。继续这个过程,直到无法进一步查找,通常是当你找到一个静态基址时,地址将以绿色标示。
如果你发现列表中那些指针地址所指向的值发生同样的变化时,那表示你可以试着将基址中的值更改为 5000,并锁定它,以便完成任务。
在这个过程中,你还可以使用 Cheat Engine 软件的代码查找和指针扫描器来加快查找的过程。然而,在某些情况下,需要更改软件的相关设置来解决一些问题。
要注意的是,在查找指针时,留意可能的代码和偏移量,将有助于更好地理解程序的代码结构和指针之间的关系。
本关步骤大体可总结为如下:
- 开始的几步与在第6步中的操作基本相同。找出是什么访问了这个地址,然后记录下动态地址
- 接着我们逐级向下查找,在查找的过程中,分别记录下动态地址,以及所对应的偏移地址
- 最后将这些地址相加,并锁定数值为5000,点击改变指针,然后就可通关
首先通过前面的知识定位到动态内存地址,并找出是什么改写了这个内存地址,这里读者需要注意mov [esi 18],eax
意味着一级偏移值是0x18
而下一个搜索地址则是ESI
寄存器中的值017FECE0
我们以十六进制模式继续搜索这个内存地址,并找出是什么访问了这个内存地址,点击改变数值,此时即可看到如下图所示的指令集;
点击查看详细信息,在该指令中可知二级偏移是0x0
而下一个内存地址则是ESI
的值也就是0178AE58
,继续新的搜索寻找这个内存地址,可看到如下图所示,三级偏移是0x14
下一个要寻找的地址是017FEC70
至此通过搜索017FEC70
我们得到了第四级偏移值0x0c
同时得到了下一个指针地址0180B400
如下图所示。
通过进一步搜素这个内存地址,最终即可获取到一个绿色的Tutorial-i386.exe 2566E0
地址,该地址则是基地址;
这里我们已经找到了所有的地址,接下来串一下这些地址即可得到当前动态地址的内存基址,
0x006566E0 0xc 0x14 0 18
把基址Tutorial-i386.exe 2566E0
的值取出来,加上一级偏移0x0C
当做地址,这是二级指针的地址,再把二级指针的值取出来,加上0x14
,这是三级指针的地址,依次类推,直到全部找到为止,最后将地址填入到手动添加地址位置,至此就完成了指针的寻找;
这里需要解释一下为什么会有基址这个东西,首先内存基址和全局变量之间存在密切关系(某些全局变量是写死在PE结构中的,而进程在载入到内存时并不是每次基地址都一致的,这就意味着要通过偏移来找到基址)。在某些编程语言和编写程序的环境中,全局变量是在内存中存储的。当程序需要访问这些全局变量时,在内存地址中需要通过内存基址来计算出其真正的地址。
例如,C语言中定义的全局变量:
代码语言:javascript复制int global_var = 42;
在内存中存储时global_var
的地址将根据内存基址进行计算。如果内存基址为0x400000
,那么global_var
的地址可能是0x400040
。程序在访问global_var
时,需要将内存基址和偏移量相加,以得出实际的地址。
此外,全局变量的值可以被不同函数或代码块访问,因此在程序调用过程中,内存基址也需要根据需要进行修改。编辑器和编译器通常会为全局变量分配内存空间,并在程序运行时分配和管理内存基址和全局变量之间的关系。
总之,内存基址和全局变量通常是在程序中起着重要作用的概念,它们是程序如何管理和访问内存的基础。对于任何需要直接访问内存的程序,理解内存基址和全局变量的概念是至关重要的。