注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

群青学院·群X会

CROSS+CHANNEL 汉化信息的发布站!(crosschannel.cn)

 
 
 

日志

 
 

CROSS?CHANNEL复刻版汉化全教程 5/10 文本、PNG解密及加密  

2013-02-09 11:14:12|  分类: 本作汉化教程 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
 

我们团队成员wiki908在第一时间通过密码学手段将文本的加密方式分析出来了,也写了一个破文,但是由于文中有很多日文,网易没法正常显示(比如你看我们的C?C中间的加号就没法显示),百度文库又说是侵权作品。所以就不单独出日志了,这里发布一个下载链接:http://note.youdao.com/share/?id=4066cfb9920b3c8055b75519470e8688&type=note

下面这篇文章,我将从反汇编逆向的角度来解析封包的加密情况。

先来看看文本的加密情况。这次文本加密很神奇,与wiki908的分析结果不完全相同,也弥补了我们知识和经验上的一些不足,大家听我道来。

已经解决过了程序无法下断的问题,那么就可以尽情下断点了,我仍然是现在CreateFileA上下断,然后发现打开的文件都是图片之类的文件包,我索性撤除所有断点,先让程序进入主界面,然后在点击“开始游戏”之前把CreateFileA断点下上,点击按钮,成功断下了RIO.ARC,从堆栈窗口可以看到打开的文件是哪一个,发现打开了很多乱七八糟的文件,我跳过了很多ReadFileA,最终我选择了SCR.WSC这个文件,因为这个文件肯定是Script的缩写(拖出去……)……因为这个文件会指引程序去找哪个文件,所以这个文件必须解密,前面打开的乱七八糟的文件都不一定解密了。在ReadFileA断下来之后,单步走。

这里我想提示一点,想我这样调试菜菜(IDA用不好也看不懂,OD定位不好等各种菜),建议调试的时候同时开IDA和OD。当OD进入了不知道是不是应该看的部分(反汇编程序里有很多是没必要看的),你就可以通过查找OD地址在IDA的存在形态,判断是否有阅读价值。

例如:我现在运行到0x00409999了,我不知道这里是什么乱七八糟的东西,我就可以看看IDA里面这个地址显示的是什么东西,如果发现这个地址对应的是引用的外部函数,或者是灰色等不正常颜色,你就知道这里是八卦阵,来了会晕死掉的,可以在OD里按Ctrl+F9运行到这个调用的返回。

于是我就是这样,来到了一个循环(我们知道,处理文本肯定是循环,而且是小循环),在觉得像好东西的时候,我又通过查IDA的方式,确定了此部分确实是解密部分,下图是IDA环境下看到的解密部分:

CROSS?CHANNEL复刻版汉化全教程 4/10 文本、PNG解密及加密 - crosschannel - CROSS?CHANNEL爱好者汉化联盟

下图是OD环境下看到的解密部分:

CROSS?CHANNEL复刻版汉化全教程 4/10 文本、PNG解密及加密 - crosschannel - CROSS?CHANNEL爱好者汉化联盟

其实我看不懂的,通过查书,和OD反汇编窗口底部的实时状态信息,我猜到一些,下面把分析结果贴出来给大家了解了解:

00409D33 |>/mov eax,dword ptr ds:[4F88F4] ; EAX存的是DS:[4F88F4h]首字节处,类似字串指针指向

00409D38 |.|mov cl,byte ptr ds:[eax+edx]  ; 取一个字节送到CL中,访问用EAX基址 + EDX偏址

00409D3B |.|mov byte ptr ss:[esp+10],cl   ; 复制未解密字节到VAR1(SS:[ESP+10h])

00409D3F |.|mov al,byte ptr ss:[esp+10]   ; 将未解密字节送到AL中

00409D43 |.|mov cl,2                      ; 位移数赋值到CL中

00409D45 |.|ror al,cl                     ; 执行右位移2位,AL处理完毕

00409D47 |.|mov byte ptr ss:[esp+F],al    ; 将解密后的字节送到VAR2(SS:[ESP+0Fh])

00409D4B |.|mov al,byte ptr ss:[esp+F]    ; 循环复制一下,AL的值仍然是解密后的

00409D4F |.|mov ecx,dword ptr ds:[4F88F4] ; 从原文中取4字节放到ECX中,DS:[4F88F4h]文件内容

00409D55 |.|mov byte ptr ds:[ecx+edx],al  ; DS:[ECX+EXX]是内容,将解密后的内容替换原内容

00409D58 |.|mov esi,dword ptr ss:[esp+38] ; 将文件长度赋值到ESI中

00409D5C |.|inc edx                       ; 循环索引变量(也是数组索引变量)增加1

00409D5D |.|cmp edx,esi                   ; 判断循环索引变量与文件长度大小的关系

00409D5F |.\jb short CROSSCHA.00409D33    ; EDX<ESI时转移

这里我们调试发现解密指令只有一个ROR AL, CL; 并不像wiki908分析的一样(如果你看过的话),先加一些0xFF,然后右位移2位。为什么呢?我用windows自带的计算器尝试了一下(它由Ror按钮),发现了很神奇的是这个右位移是以8位为单位,尾数滚到首部填充,而我们的C、C++语言中的移位运算符是填充0的。

于是我通过查书,了解到:

1.       ROL/ROR是不含进位标志位CF的循环左/右移位,移位是8位就这八位滚动,例如:01000010b Ror 2 = 10010000b。

2.       RCL/RCR是含进位标志位CF的循环左/右移位,可以将CF的内容移入,所以可以利用它实现多字节的循环。

3.       SHL/SHR是逻辑左/右移位,大家可以自己去查查,太长了,我就不贴了。

4.       SAL/SAR是算数左/右移位,这个跟C语系的移位差不多。

所以下面放出改进后的代码(代码写法很多,下面把一个最通用的写法贴出来,也是wiki908贡献的,我在他的基础上优化了一下下效率,我原来用的是嵌入式汇编,不够通用):

1

unsigned char decrypto( unsigned char s )

2

{

3

    return s >> 2 | s << 6;

4

}

这也就说明,( s + s % 4 * 0xFF ) >> 2 等价于 Ror s, 2,微妙的数学关系。

这样,加密也可以同理,就是执行ROL的运算,这里不赘述了,贴一下代码走人。效果和wiki908用密码学知识解密出来的是一样的。

1

unsigned char crypto( unsigned char s )

2

{

3

    return s << 2 | s >> 6;

4

}

(未完待续……)

·MewX申请

  评论这张
 
阅读(1635)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018