本关是第6关的加强版,CE 6.X 教程中的4级指针比5.X的要简单些。多级指针就像玩解谜游戏一样,谜团不只一个,盒子中还有盒子。这里面是4级指针,游戏中也有比如8级指针,12级指针等等,思路都是一样的。
在这一步将解释如何使用多级指针。在第 6 步,你已经清楚 1 级指针的概念和用途,并可以利用数值的首个地址找到存放数据真正的基址。
在本关中,你将看到 4 级指针,它由第一个指针指向第二个指针,再由第二个指针指向第三个指针,由第三个指针指向第四个指针,最终指向健康值的真正基址地址。
步骤 8: 多级指针: (密码=525927)
开始的几步与在第 6 步中的操作基本相同。找出是什么访问了这个地址,然后记录下动态地址
接着我们逐级向下查找,在查找的过程中,分别记录下动态地址,以及所对应的偏移地址
最后将这些地址相加,并锁定数值为5000,点击改变指针,然后就可通关啦
1.第一步你需要按照第二关中的方法找到,动态地址,然后加入到地址栏中。

查找一级指针: 找到血量地址 0169B5F8(动态地址),然后 右键 => 查找写入

然后回到教程程序中,点击 改变数值按钮
,如下

点击详细信息

出现代码的详细信息。

这个该怎么看呢?ESI= 0169B5E0
ESI+ 18 = 0169B5F8 就是血量的地址,也就是说。想找到血量的地址就要找到ESI,注意看了图中一行字:
<b> >>>> 要查找地址的指针的可能值是 0169B5E0</b>
如果您觉得分析太麻烦,就按CE的建议来,这里面要提醒各位注意 可能
这个词,也就是说不一定全对。
第6关也提到过偏移的概念。这里面的一级偏移是 18
总结:一级偏移是 18 下一个搜索目标是 0169B5E0
查找二级指针: 下面找ESI
,勾上HEX(16进制),输入 0169B5E0 新扫描。
然后把新地址 0169B5E0 添加到地址栏,在地址上右键=>选择 查找访问的地址
。
一定要注意:这里面和上面的操作不同,第一次是查找写入的地址,这次选择的是查找访问的地址。

如果没有出现代码信息。我们就到 Tutorial 中点击一下 改变数值
按钮,之后会收集到两条指令,cmp 指令跟指针没什么关系,对我们有用的是第二条指令 mov esi,[esi]。
这里由于是 mov esi,[esi] 默认我们将其偏移地址看作是 0

不过问题来了,我们发现,这里提示的地址和上一次提示的地址是一样的,这是为什么呢?
CE 默认使用硬件断点的方式,断点只能停在指令执行之后,而这条指令正好是把 esi 原来指向的地址中的值再赋值给 esi,所以执行之后 esi 的值已经是被覆盖掉的值了,而我们想知道的恰恰是执行这条指令之前的 esi 值, esi 就是这个我们监视的地址。
所以直接搜索这个地址即可。

将 0168495C 这个地址添加到下方,然后使用 找出是什么访问了这个地址
,再来一遍。

最后得出:二级偏移是 0 ,下一个目标是 0169B5E0
查找三级指针: 接下来和查找一级指针方法相同,这里我们在弹出的框中选择第二条指令。可看到二级偏移是 14

继续查找三级指针,方法同上,这里三级指针是0c。

最后得出:三级级偏移是 0c ,下一个目标是 01684628
查找四级指针: 继续搜索01684628 这个动态地址,如下。

一定要记住:在CE中显示绿色的地址是基址,黑色的是动态地址。如果有多个绿色地址,一般情况下我们选择第一个。
这里我们已经找到了所有的地址,接下来串一下这些地址看看
00601660 + c + 14 +0 + 18
把基址(一级指针) "Tutorial-i386.exe"+1FD660 的值取出来,加上一级偏移 0C,当做地址,这是二级指针的地址,再把二级指针的值取出来,加上 14,这是三级指针的地址,依次类推。
添加并测试指针: 最后测试,指针是否生效。

添加后锁定数值为5000,然后点击例子中的改变指针按钮,看是否能通关。

多级指针要注意的地方:
1、1级指针是 查找写入,其余全是 查找访问。
2、绿色的地址是基址,黑色是动态地址。
3、添加指针时注意用模块地址。
4、指针是由基址在偏移组成的,所以在教程中我们只要找到4个偏移和1个基址就可以了。