内容来源于:易道云信息技术研究院VIP课
上一个内容:项目需求与需求拆解-CSDN博客
之前在找到过一个虚函数,每个按钮的都有一个实现机制,参考这里游戏结束过程的逆向分析
实际上找起来会不会用上不知道,接下来开始逆向分析。
首先游戏中为了保护我们的插件,做了一些int3,这个int3编译器是处理不了的,需要设置一个东西,如下方的两个图,设置异常,意思是当x96dbg出现异常之后,点击忽略上次,这样x96dbg下次遇到这个位置的异常时就不处理的就交给游戏来处理。
首先在按钮处理函数接口位置打断点,再点击游戏中的按钮,发现可以正常断下来,但我们要找的并不是这个按钮,所以这个我们不看
点击游戏自动药水设定按钮也可以正常断下来,这个我们要看,现在的eax是0x6D9A90
然后按下f7,就来到了游戏药水设定功能的函数,然后接下来要做一个测试,继续往下看
麻烦来了,点击系统按钮时也会进入到0x6D9A90函数里,按照之前理解的逻辑,0x6D9A90应该是对应自动药水设定按钮的功能,但很显然并不是,继续往下看。
它是把下图红框里的按钮都对应到了 0x6D9A90 函数上,所以 0x6D9A90 函数不是我们要找的,我们要找的函数在 0x6D9A90 函数里面,
0x6D9A90函数还是很大的,有点像一个 switch 结构,它里面是一段一段的,都是调用了不同的函数,所以想switch结构,也就是它把所有的菜单都放到了一起,每个菜单都对应一个switch的case,然后会发现ecx都是来自于固定的基址,这个没必要看,然后它调用了一个函数,这个调用的函数每个case里都不一样,然后函数调用完之后,调用了一个虚函数,edx+0x5C一般都是虚函数,也就是调用了基类的某一个函数,然后每个case的上半部分是调用的不同的函数,下半部分是调用的相同函数(只从分析上看出的,实际的值可能会导致调用不同的函数),所以现在要分析的是上半段,根据现在分析的,分析上半部分的准确率是百分之80左右。
0x6D9A90函数是一个所有按钮共用的函数所以要,跟踪一下,就是点自动药水设定按钮看看它会执行哪个case,一路f8就来到了下图位置,在0x6D9CC9位置打断点可以发现其它按钮并不会断下来
然后自动药水设定有三个相应点,所以接下来要看其它两个,会不会在 0x6D9CC9位置断下来,可以发现 0x6D9CC9 位置并不会断下来,所以接下来要往下继续找,现在要确认一下它具体是下图红框中的哪一个函数。
首先把sro_client.8687F0位置的函数第一行,改成下图的样子,然后看看自动药水设定功能还有没有,可以发现它没有了,所以 sro_client.8687F0位置是自动药水设定按钮真正干活的函数,所以call eax不需要看了,只看 sro_client.8687F0
接下来先把修改的ret恢复一下
然后把断点下到sro_client.8687F0位置如下图
然后发现它按取现按钮也会触发,所以还要往下跟
快捷键会触发
动作里的自动药水设定也会触发,也就是三个入口都会触发
接下来就对0x8687F0函数下手就可以了,接下来分析为什么按取消也会触发,分析一个函数的几个重点,首先分析它的调用约定,这个调用约定是一个类的成员函数,第二点分析有几个参数,它有一个参数,第三点是看它的返回值,看调用下图调用位置,并没有对eax做什么操作,所以认为它没有返回值一个void返回类型,ecx一般是放的this地址所以0x1256E3C的值是按钮对象
然后取消按钮入参是0,自定药水设定时的入参是1,也就是0是不显示1是显示,它这个函数也就是传递了一个true或者false,0x8687F0它就是一个显示界面和取消界面的功能,下图红框位置时取了一个byte类型这样就更确认它传入的是bool类型并不是int类型了,这时可以还原成c++代码就是 void 0x1256E3C::ShowAutoHelp(bool ShowUI);
假设没有做之前的分析,并不知道,按钮的虚函数,这样时没有切入点所有的假设没法成立,所以后面要写不利用虚函数这个东西,再去找一遍自动药水设定功能,也就是从零去找。