「伤心跳×」一共发行了两个大版本。一个是 2008 年左右期间发布的 v2.1 基础版本(右,下称为 2008 版),以及 2016 年左右发布的 v10 版本(左,下称为 2016 版)。在此期间发生了什么,无从得知。
伤心跳× (左 2008,右 2016)
该文的逆向目标如下:
- 分析出软件所使用的注册算法以及流程;
- 搞定软件的自校验;
- 如果需要,替换软件公钥。
使用到的工具
上述工具都能在爱盘或其官网获取。
基础版本(2008)
首先查壳,可以发现是魔改过的 UPX 壳:
没有脱壳就无法使用静态分析工具辅助分析,所以第一步就是要去脱壳。
※ 当然,如果想偷懒只做静态分析,可以直接启动程序并转储内存即可。
脱壳
直接使用调试器 x64dbg 启动,进入到主程序代码空间:
0082A5E0 | 60 | pushad |
0082A5E1 | BE 00207A00 | mov esi,sxtq.7A2000 |
0082A5E6 | 8DBE 00F0C5FF | lea edi,dword ptr ds:[esi-3A1000] |
0082A5EC | 57 | push edi |
0082A5ED | EB 0B | jmp sxtq.82A5FA |
因为已知是一个基于 UPX 魔改的壳,程序的原始入口通过这串代码底部的 jmp
跳转;因此往下翻直到一个长 jmp
指令:
选中后按下 F4 运行至该处,再按下 F8 跳转到程序的原入口。
然后使用 x64dbg 自带的 Scylla 进行转储 + 修复即可:
转储完成后会生成一个叫「sxtq_dump_SCY.exe
」的文件,直接双击执行能正常启动(因为有自校验失败而触发暗桩,无法正常进行游戏)。脱壳成功。
初尝试 - 试探软件注册
直接启动软件,可以看到标题提示未注册。
依次点击「帮助」→「注册」,发现是基于机器码的验证方案。
随意输入一些字符并确认,注册窗口直接关闭,无后续提示信息。
既然如此,直接搜索字符串看看:
然后搜索关键字「注册」:
00404217 mov edx,sxtq_dump_scy.533E76 "请输入电脑的思考时间(单位:毫秒),\r思考时间越长电脑水平越高。注:未注册版本设置时间无效。"
00404564 mov edx,sxtq_dump_scy.533ED3 "谢谢你注册伤心跳×,请按确定以重新启动伤心跳×使注册生效。"
00404576 mov ecx,sxtq_dump_scy.533F0E "注册"
00404628 mov edx,sxtq_dump_scy.533F23 "无法保存注册信息!!!"
可以在 00404564
找到一个注册成功后的提示文字。为了方便分析,把这个地址复制到 IDA 后查看伪代码:
inline bool is_valid_serial_char(char c) {
return (c >= '0' && c <= '9')
|| (c >= 'a' && c <= 'z')
|| (c >= 'A' && c <= 'Z')
|| (c == '#') || (c == '$');
}
int __fastcall TA_mnRegClick(Forms::TCustomForm *a1) {
// ... 省略
// 长度检测。
// 48 <= 长度 &am