Reversing.kr Writeup(26)

Adventure

也算是知道怎么能够正常调试metroapp了,plmebug.exe 是一种命令行工具,可允许你控制应用程序包的PLM状态,因此可以使用plmebug.exe禁用 PLM,这对于某些调试器来说是必需的。

通过下面这条命令我们就可以通过调试器直接附加上去进行调试,而不会像之前我做题目MetroApp的时候一会儿就会程序就自动退出了。

plmdebug /enableDebug  PID

附加上去之后,直接去主线程,通过堆栈调用先回到用户空间,然后通过寻找关键字符串,定位到了关键代码位置,关键函数sub_403890,简单看了一下:

主要是这两个地方,然后对应的v4[36]-v4[43]是随着打怪实时变化,也就是说我需要找到这8个双字随打怪数量的变化规律才行。

经过调试分析

上面这一段代码即是判定有没有命中怪物,
然后如下图:

前八个双字使我们关注的8个变化值,最后倒数第二个双字(图中的A9 AA AA AA)是剩余的怪物数量,代码计算当前击毙怪物数量既是:0xAAAAAAAA-0xAAAAAAA9,所以其实我们可以随意修改击杀怪物数量,但是没有意义,因为我们需要看懂我们关注的8个字节的逻辑。

调了俩小时,看懂了逻辑,发现主要核心还是rand,那我们先跳过逻辑部分,想办法让程序自动执行出结果,先来看看这个循环:

这个循环就是主要的命中判断循环,经过前面一堆判断(位置,子弹,命中情况)之后,满足条件则执行ja short loc_403c8e,这样就意味着命中了一个,所以这里的绕过很简单:

  • 把其中的jbe short loc_403c26全部改成jbe short loc_403c24
  • 再把ja short loc_403c8e改成jmp short loc_403c8e

这样之后,我们就实现了自动打怪,可以看到分数不断上涨,但是这种方法受限于怪物刷新机制,因为刷怪频率限制了分数上涨的速度,虽然在自动打怪得分,但是很慢,我们还需要进一步修改程序

如下所示: