x32游戏逆向:控件类数据定位-从小控件回溯到大控件
控件类数据查找思路和过程详讲
控件类数据定位:从小控件回溯到大控件
前言:前面的文章我们找的都是列表类数据,这一篇换一类目标——界面控件。思路是以登录界面的账号密码框作为突破口,用 CE 把输入的数字锁到一个地址上,再在 x32 中沿着指令逐层向上回溯寄存器的来源,得到当前激活小控件的基址 + 偏移;接着对该位置下写入断点,找到小控件的遍历,最后顺着同一条结构追出大控件。
1. 小控件
1.1寻找突破口
这里小控件的思路是通过对账号密码框这类小控件通过不断搜索我们输入的数值来找到突破口
我这里就说先输入五个1,搜索5,再删去一个去搜索4,剩下这几个大家可能会遇到无法筛选的情况,这个时候我们可以通过移动光标但是不改变输入的数据总数的情况来看哪些值没变化,那这个没变化的值就是我们需要的
00EB709F add dword ptr ds:[esi+1E4],ebx esi==20F33018通过CE扫到的地址我们去x32中下断,我们可以看到数据来自[esi+1E4]的位置,我们去找一下esi的来源,往上找可以发现,esi来自ecx,我们去上一层找一下ecx
返到上一层我们能够发现ecx来自esi,在内存区跳转到该位置我们可以看到这个地址+18的位置存储的就是我们所点击的小控件对应的小控件的名称,那这个位置就是我们对应的小控件了,+18对应小控件名称,这个位置我们要多多留意,后面我们会经常查看+18这个位置
往上找会发现esi来自ecx,我们返到上一层继续去找
返到上一层我们能够发现ecx来自于[esi+15c],esi == 35254700,我们继续往上找esi
注意:这里依旧是再提一下,如果你要找的数据附近有多个赋值你不确定是哪个,那你就在对应的不同位置下断点查看寄存器的对应数据值是否正确,又或者是去下对应的条件断点
往上能够发现esi来自ecx,我们在头部下端返回上一层继续找
再往上能够发现ecx来自esi,且esi来自[esp+1c],看见堆栈数据我们还是先优先看一下堆栈,发现确实不是某个call的参数又或者其他的,这个时候我们去考虑是否为一个全局变量,我们看一下有没有对这个位置的直接赋值操作
往上可以发现来自于 esi,且 esi 来自 [edi+78],我们接着去找 edi
注意:这之间也有其他的对 [esp+1c] 的赋值,这个时候我们不要对 [esp+1c] 进行下端判断是否数据来自该位置,可以看我这里的截图,我发现该位置数据来自 esi,那么 esi 位置存储的数据应该是我们前面找到的数据,也就是 esi==35254700 我们直接看 esi 的数据是否正确即可
往上找能发现edi来自ecx,我们在头部下断点返到上一层去找ecx
往上返发现没有赋值,我们继续往上返
发现ecx来自esi,继续往上找
往上能够发现,esi来自ecx,我们依旧头部下端往上返,去找ecx的来源
往上发现 ecx 来自 [esi+ecx*4+320],esi==209c04A8,ecx==0,我们接着去找 esi
注意:遇见这中类型的赋值,又或者包含自身的那种,我们为了看到右边的数据就要在该行下对应的条件断点,你像我这里下的断点就是 [esi+ecx*4+320]==353B92E8
接着往上我们能发现esi来自ecx,我们返到上一层去看ecx,发现ecx来自[esi+8],esi==10EB5798
往上发现esi来自ecx,接着往上返
往上发现ecx来自ebx,ebx来自[ebx+24],且ebx==1529788
这里我们其实就可以不追了,ebx==1529788,已经是基址了,我们从右上角寄存器的位置也能看到
1.2当前激活小控件数据总结:
当前激活小控件中激活的数据个数:基址 + 偏移
[1529788]+24]+8]+320+ecx*4]+78]+15c]+1E4]2.小控件遍历
2.1小控件遍历突破口思路
但是我们如何追到对应的小控件遍历呢?上面的回溯我们已经验证过是当前激活小控件,我们如何找到对应的小控件遍历,进而找到当前界面所有的小控件呢?
我们先看一下ce的数据内容:
从图片中我们能够看到,当我分别选择账号或者密码框的时候变化的是 35254700+15c 对应地址中的数据内容,但是35254700+15c本身指向的地址并没有变化,我们跳转到对应的 35254700 位置,找到+15c,该位置就是存储当激活小控件的位置
注意:这里我们在找对应的+15c的位置的时候其实在+4c也能看到对应的Win_Login大控件注释,这个位置我们也要注意一下,后面也会经常看到
2.2小控件数据堆栈回溯
这里其实还是我们的老思路,我们已经找到了一个小控件,已经打开了突破口,我们只需要对这个小控件下写入断点,去看看是哪个地方对这个位置写入数据的,因为既然要写入数据,那大概率能看到对应的小控件遍历
这里我们下断能够看到对应的[esi+15c]来自edi,edi = 20F33018,我们接着去找edi的来源
向上我们能够·看到edi来自[esp+c],又是数据的结构,我们去堆栈看一下,发现是一个call的第一个参数,我们翻过去继续找
往上发现还是来自edi,我们接着去找edi
向上找我们能够发现edi来自一个循环内部的[eax+4],eax==0D818DD8
这里我们可以看到edi来自[eax+4],eaux来自[esp+14],但是到这里大家不要简单的因为[esp+14]的数据就是上面的eax给的,这里其实大家也能看到一条很明显的红色跳转线,这里的数据其实是下面循环中给的,大家可以下断测试一下看一下数据的来源
有些循环我们在循环中也能很简单的分析出对应的数据来源,进而找到对应的循环外的赋值数据,但是这里的赋值相对复杂,大家自己可以私下去尝试一下,这里我们就给大家提供一个简单思路:
当我们发现一个循环我们无法找到对应的数据来源的时候,我们可以直接跳出循环去看数据来源,比如这里我们对循环外的eax下断其实就能发现,eax的值无论如何都不再发生变化,就一个数据来源,这种情况其实就是最理想的情况,我们直接跳出循环去找即可(记得标记一下这里是一个循环),这样我们就能发现eax来自[esi+250],esi=35254700
往上翻了很长我们能够发现esi来自ecx,其实到这里大家应该就有印象了,我们追的当前激活小控件对象也是这一部分内容,而且esi的数据都相同,其实再往上的结构也是一样的,这里为了照顾新手,还是给大家再演示一下
我们看到来自ecx还是老样子,去返到上一层去找ecx,发现ecx来自[edi+78],我们继续去找edi
往上找edi发现edi来自ecx,我们直接头部下端去上一层看一下
发现这一层没有赋值,我们直接继续返
发现ecx来自esi我们继续去找esi
再往上能发现esi来自ecx,我们依旧头部下端往上返
发现ecx来自[esi+ecx*4+320],我们往上去找esi
发现esi来自ecx,我们继续头部下断向上去找ecx
返到上一层我们能发现ecx来自[esi+8],esi==10EB5798,继续向上找esi
向上发现esi来自ecx,还是老样子头部下断向上找
返上去发现ecx来自ebx,且ebx为1529788(15282D8指向位置的数据就是1529788),到这我们就追到基址了
2.3小控件数据总结:
小控件,基址+偏移
[15282D8]+24]+8]+320+ecx*4]+78]+250]链表循环]
3.大控件
3.1大控件思路
首先,大家要先明白,小控件是归属于对应的大控件的,我们在追小控件的时候也发现追到某一位置对应的数据就不发生变化了,这也是因为我们找到了他们归属的对应大控件,对应大控件相同当然数据不变
通过上面的小控件总结我们也能看到,整个数据结构其实就是先找到对应的大控件对对应大控件遍历找到对应的小控件,我们看一下eax这个不变的数据的数据来源esi的数据是什么
这里我们能看到esi对应地址+4c位置数据注释就是对应的大控件名,这也是为什么前面跟大家说多留意这个位置的原因,那么接下来就简单了,我们对esi位置的数据下访问断点找来源即可
3.2大控件数据堆栈回溯
下访问段我们能够发现数据来自ebx,且ebx来自[ebx+eax],ebx==0,eax==2c410A60,且eax来自[esi+C8],esi==10888F08,我们继续去找esi
发现esi来自ecx我们接着往上找
返上去之后我们能够发现ecx来自esi,esi来自ecx,我们继续往上返
翻上去发现还是来自esi,esi又来自ecx,我们接着往上返
返上去之后我们能看到ecx来自ebp,ebp来自ecx,这两部分之间相隔有点长,这里我直接省略了,我们继续返上去找ecx
返上去能够发现ecx来自[esi+eax*4+320]
这里的这个结构大家是不是很熟悉?其实就是我们找到的当前激活的小控件的其中一个位置,再往上的结构应该是
[1529788]+24]+8]
这里前面在找小控件的时候已经给大家证明过确实是可以直接用的,这里就不多赘述了
这里需要给大家重点提到的细节是
mov ebx,dword ptr ds:[ebx+eax]这一行汇编如何表示的问题
有些朋友会考虑之前我们见到的有多个寄存器参与的一般都是[esi+eax*4+320]这种,这种很简单大家都能明白是一个数组。
那只有一个ebx我们对应的数据该如何表示呢?
其实这里我们在对应位置往上看就能看到对ebx的赋值,它还是来自于一个数组,这里给大家说一下的原因不仅是解释一下也是怕有些朋友直接想当然觉得就是一个数组,但是我们还是要明白为什么。
至于这里为什么是来自这里,我们通过单步执行也能看到对应的ebx的数据变化进行确认
3.3大控件数据总结:
那么大控件的整体结构应该是
[1529788]+24]+8]+320+eax*4]+c8]+ebx(edi4)]
总结:
本篇文章我们通过对控件类数据的查找,让大家明白了控件类数据我们得入手点在哪,我们该如何突破。控件类数据是我们关于这类游戏非常重要的一个环节,这部分数据我们很多时候都得用到,大家自己私下里也要对这类数据多多练习,比如大家可以自己尝试找一下不同大区这个控件