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