这是我转来的,看不懂啊,能看懂的帮忙破解一下啊
提到“疯狂的石头”, 大家想必会记起几年前风靡一时的那部国产喜剧. 事实上“Crazy Stone”还是一个优秀的围棋程序, 作者是法国学者Rémi Coulom, 在KGS上运行的服务器版具有5D棋力. 此程序单机版现由日本UNBALANCE公司发行, 商品名为“最強の囲碁”, 售价一万余日元. 去年年底发现程序安装文件可以从网页上下载得到, 装上后提示下载安装一个“软电池(ソフト電池, soft-denchi)”, 再后来双击打开时就直接弹出软电池“充电”界面, 要求购买注册码并输入. 当时就想动手破解之, 不过花了一天无功而返. 上周看到实验室里张楠买了不少逆向工程相关资料, 又读了点关于Windows PE的书, 再次跃跃欲试. 话说张楠也是从小向往做黑客的好同志, 两人一拍即合, 重新开工.
第一阶段是熟悉工具, 我们用IDA Pro, 集静态反汇编和动态调试于一体, 界面也很友好. IDA能够把函数一一识别并罗列出来, 这项功能对像我们这样的初学者是很有吸引力的, 但其实识别得未必精确, 可能要依靠上下文提供的信息. 这一点后面再说. 另外, 认识一些Windows API也是很有必要的. 这时我们才刚上路, 张楠对IDA熟悉一些, 我是完全没想法, 基本在误打误撞中度过, 见call就跟, 见jmp就跳, 有时通过修改寄存器改变程序流的走向企图造成奇迹, 总之走了不少弯路. 后来试着用PEiD为主程序sgo2011.exe查壳, 显示结果“Microsoft Visual C++ 6.0 [Overlay]”, 又开始犯难了, 不知这Overlay是什么东西. 读过看雪论坛上的扫盲贴, 得知原来所谓Overlay就是PE文件里一些额外的数据, 从PE头里是看不出它的存在的. 像这个sgo2011.exe, 本身大小超过800K, 但PE代码段和数据段加起来还不到200K, 这里就蹊跷了.
第二阶段取得了一个小突破. 我那会刚发现Emacs有个hexl-mode, 就用它搜索字符串. 其实这一招我们早就试过了, 由于这个程序用“软电池”做了包装, 再加上弹出窗口要么是日文要么是乱码, 所以找不出什么有价值的东西. 但搜索中意外发现sgo2011.exe包含两处MZ头和DOS Stub, 把第二处MZ头之前的内容全删去, 剩下的还是一个完整的exe文件, 大约700K. 看来这一部分就是原先所谓“overlay”的隐藏数据. 双击该文件没法运行, 用IDA看时才知道入口的start函数是空的, 没有任何有效指令. 恰好张楠也独立发现了这个问题. 讨论了一下, 一致认为原程序的前一段是软电池注册部分, 后一段才是真正的围棋程序. 这样一来问题就是如何寻找和重建围棋程序的入口点了. 我又用IDA跟了一阵子, 想从前一段程序里找到指向后一段入口点的跳转, 又想是否有某种工具能够通过扫描或者遍历找到入口点, 结果都无功而返.
第三阶段是借鉴前人的智慧并完成破解. 就在一筹莫展的当口我想起来曾经搜到过有同样采用软电池技术的游戏软件, 而且已经有人做过破解并已发布. 周末下载了其中一个叫“鬼哭街”的游戏, 对比发现其原来的主程序也是有两处MZ头和DOS Stub, 破解版将前一段程序删去, 后一段只修改了30个字节, 顿时信心大增. 与sgo2011相似, 鬼哭街在修改前入口start函数也是空的, 修改后多出call __security_init_cookie和jmp __tmainCRTStartup两条指令. 注意到IDA并未从修改前的程序中识别出这两个函数, 修改后就识别出来了, 我推测可能是因为改后有指令指向它们, 这一信息能够帮助IDA进行判断.
周一下午找到张楠商议如法炮制. 现在思路已经比较清晰了, 即从删掉前半段的sgo2011.exe中找到__security_init_cookie和__tmainCRTStartup两个函数, 再从start处进行跳转. 虽然还不确信这样一定能生效, 但觉得是一条很靠谱的路线. 寻找这两个函数的方法是从标签列表里搜索被其调用的关键函数, 例如GetStartupInfo等, 再和鬼哭街的破解版中相应函数对比看看, 若前后文类似就可大致断定. 由于call和jmp指令都接受32位的相对位置做参数, 找到这些函数的位置后再计算一下和start函数间的距离, 再从start处指过去即可. 修改二进制代码用了UltraEdit.
改完后再双击程序图标, 出现一个乱码小窗口. 这也在意料之中, 因为鬼哭街的破解版除了修改start一段外还改了一个跳转位置的字节, 我们猜测这里也应该做出相应修改. 要定位此段代码需识别出弹出窗口中的文字内容, 为此张楠试着用AppLocale指定了日文编码再启动程序, 不料这次直接打开围棋程序界面了. 张楠恍然大悟说, 此程序大概在检测系统编码设置, 若不是日文JIS编码则跳出窗口拦截. 要绕过这个窗口进入程序也不难, 但是那样菜单栏里会有乱码, 所以也就罢了.
这么一来破解工作就告一段落了, 在Windows系统中只需将sgo2011.exe修改一下并用AppLocale工具指定日文编码即可正常进入游戏. 我又试了一下在Ubuntu中用wine运行, 发现只需启用日文编码方式并安装日文字体即可使用, 如附图所示. 在命令行中需指明编码方式(env LANG=ja_JP.SJIS wine path/to/sgo2011.exe).