好,开始F7……啊哈,和我想得一样,在几次F7之后就又看见了strb r0,[r9,r8],看来异或得到的r0就是解密后的文本数据。那么现在的目标还是追踪这个r0的来源。
注意到在eor之前,有几个ldrb指令ldrb r2,[r1,4h]等,那就去看看[r1]处是啥。
哦……原来是已经解密过的数据。注意前8个字节5458524381B4C77F不就是文件gd_textres_jpn.txrc的文件头么
看来这里就是在对它解密。OK,文本已找到,差得就是具体的解密算法。
实际上现在已经可以锁定解密的过程就是
0205157C E5D13004 ldrb r3,[r1,4h]
02051580 E5D62007 ldrb r2,[r6,7h]
02051584 E7D61005 ldrb r1,[r6,r5]
02051588 E0203092 mla r0,r2,r0,r3
0205158C E20000FF and r0,r0,0FFh
02051590 E0200001 eor r0,r0,r1
02051594 E20000FF and r0,r0,0FFh
这几句,现在的任务就是弄明白各个寄存器中数据的来源。其实在前面不用F8,而是跟进子函数,就能弄明白各个寄存器中数据的来源,但读一大堆代码比较烦人,所以我采取另外的办法。
改设断点[234CC08]!(因为前8字节是文件头,并未加密,我们关心的是8字节之后的加密数据)。中断在
这里实际上是在搬运缓冲区的数据到[r5],可以理解为载入文件到[r5]的过程。按下F9(继续运行)。中断在
在这里可以看出,r1是文本首地址指针,r5是当前解密数据的相对偏移。
再利用F8运行到eor处,
显然,r3中存放的就是文件7h处的字节,r1存放待解密字节。又搞清楚了2个寄存器^^
那么就还差r0,r4两个了。再再利用F8运行到eor处
大家发现啥了么?呵呵,条件有点少,估计很难有突破性的发现。那我们再多看几个。大家注意r0,r4的变化,以及它们与r5之间的关系。
r5=0xB r0=0x3 r4=0x2
r5=0xC r0=0x4 r4=0x0
r5=0xD r0=0x4 r4=0x1
r5=0xE r0=0x4 r4=0x2
r5=0xF r0=0x5 r4=0x0
大家看出点啥名堂了么?r5每次都+1;而r0则是r5每+3之后才+1;r4则是在0~2之间取值。还没想到啥么?那我也没辙了……公布答案吧
r0 = r5/3; //r0是r5除以3的商
r4 = r5%3; //r4是r5除以3的余数
那几个被跳过的子函数就是用来得到r0和r4的,有兴趣的朋友可以去看看。
好了,到现在我们已经把解密算法也搞定啦。


