NDS《幻想水浒传12宫》破解纪实


  好,开始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的,有兴趣的朋友可以去看看。
  好了,到现在我们已经把解密算法也搞定啦。

Copyright 2008-2009 A.C.G All rights reserved
点击数: