UltraDebug

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: A C D R G Y M Z X S P
公益项目,接受捐赠
查看: 1544|回复: 0
收起左侧

[分享] 伤心跳× 2.1(2008)及 10.4(2016)注册算法+自校验分析

[复制链接]
Alanna

主题

0

回帖

UD

新手上路

UID
38
积分
32
注册时间
2022-5-15
最后登录
1970-1-1
2022-7-7 13:10:40 | 显示全部楼层 |阅读模式

「伤心跳×」一共发行了两个大版本。一个是 2008 年左右期间发布的 v2.1 基础版本(右,下称为 2008 版),以及 2016 年左右发布的 v10 版本(左,下称为 2016 版)。在此期间发生了什么,无从得知。

伤心跳× (左 2008,右 2016)
伤心跳× 2.1(2008)及 10.4(2016)注册算法+自校验分析 - Alanna_UltraDebug

该文的逆向目标如下:

  1. 分析出软件所使用的注册算法以及流程;
  2. 搞定软件的自校验;
  3. 如果需要,替换软件公钥。

使用到的工具

  • x64dbg - 调试器(插件 MultiASM + ScyllaHide
  • IDA Pro - 静态分析
  • Detect it Easy - 查壳工具
  • HxD - 十六进制编辑器

上述工具都能在爱盘或其官网获取。

基础版本(2008)

首先查壳,可以发现是魔改过的 UPX 壳:
伤心跳× 2.1(2008)及 10.4(2016)注册算法+自校验分析 - Alanna_UltraDebug

没有脱壳就无法使用静态分析工具辅助分析,所以第一步就是要去脱壳。

※ 当然,如果想偷懒只做静态分析,可以直接启动程序并转储内存即可。

脱壳

直接使用调试器 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 指令:
伤心跳× 2.1(2008)及 10.4(2016)注册算法+自校验分析 - Alanna_UltraDebug

选中后按下 F4 运行至该处,再按下 F8 跳转到程序的原入口。

然后使用 x64dbg 自带的 Scylla 进行转储 + 修复即可:
伤心跳× 2.1(2008)及 10.4(2016)注册算法+自校验分析 - Alanna_UltraDebug

转储完成后会生成一个叫「sxtq_dump_SCY.exe」的文件,直接双击执行能正常启动(因为有自校验失败而触发暗桩,无法正常进行游戏)。脱壳成功。

初尝试 - 试探软件注册

直接启动软件,可以看到标题提示未注册。

依次点击「帮助」→「注册」,发现是基于机器码的验证方案。

随意输入一些字符并确认,注册窗口直接关闭,无后续提示信息。

既然如此,直接搜索字符串看看:
伤心跳× 2.1(2008)及 10.4(2016)注册算法+自校验分析 - Alanna_UltraDebug

然后搜索关键字「注册」:

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
还有更多的精彩内容,作者设置为付费后可见
UltraDebug免责声明
✅以上内容均来自网友转发或原创,如存在侵权请发送到站方邮件9003554@qq.com处理。
✅The above content is forwarded or original by netizens. If there is infringement, please send the email to the destination 9003554@qq.com handle.
回复 打印

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|站点地图|UltraDebug ( 滇ICP备2022002049号-2 滇公网安备 53032102000034号)

GMT+8, 2025-6-16 19:05 , Processed in 0.040339 second(s), 11 queries , Redis On.

Powered by Discuz X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表