PC逆向—某一卡通软件逆向分析

admin 2025-12-30 01:30:02 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文记录了使用OD和DeDeDark逆向某Delphi一卡通软件的过程。作者通过静态反编译与AI辅助,定位注册验证逻辑,发现程序校验14位长度并将部分字符转为日期。最终成功破解,得出注册码格式为前两位固定头+yyyy-mm-dd日期+后两位固定尾。 综合评分: 82 文章分类: 逆向分析,二进制安全,实战经验


cover_image

PC逆向 — 某一卡通软件逆向分析

caleb9911

逆向有你

2025年12月29日 09:08 河南

前情提要:楼主研究生上岸没开学在家,家父决定给我找点事做。正好他那边一卡通软件到期,但商家年年加价,于是尝试让我绕过商家授权。在小时候有试过逆向安卓锁机软件,但od什么的完全没用过,只能看论坛自己摸索。

使用工具:OD、DarkDe4

捣鼓之前在吾爱稍微学习了一下,拿到软件第一件事当然是查壳

没壳且语言古老,这语言我没学过啊,那就直接下一步,拖进od分析

开幕雷击啊,怎么还用的sql2000

用论坛的xp虚拟机装好环境,可以开始分析。

逛了几天论坛,看到这种注册码,很快啊,啪的一下直接进od搜索关键词

不对劲,怎么都是一个call,跳转过去发现是一大串函数,完全看不懂。也挣扎着尝试看了一下,但是发现所有字符串都会跳转道这里,最终放弃。

看了一下论坛发现还可以直接找MessageBoxA或者GetDlgItemTextA,也是尝试着搜索了一下,果然,出现一些新东西。

但仔细分析了一下,依然没能找到突破口。MessageBox仅仅接受传参显示,和注册码没什么关系,在GetDlgItemTextA打上断点也没什么作用。

到这里已经开摆了,于是暂时放下打了两天游戏,顺便逛逛论坛找下思路。

然后我看到了@yyhd 大佬的一个帖子,是查找按钮的od插件。这给我一个新的思路,为什么不从按钮入手?于是下载了大佬的插件,但是发现按钮有点多啊,怎么才能找到关键的呢?

在某天晚上看论坛的时候,发现一个delphi的逆向工具——IDR。但尝试了一下之后我发现我根本不会用,遂放弃。

于此同时我还发现了一个工具——DeDeDark。这个工具反编译出来的就好懂很多,一下就找到了注册界面和它的按钮。

看了一下反编译的代码,很快就找到了验证的部分。具体过程就不放了,分析代码的过程我用了ai辅助,通义立大功。

很容易就找到了跳转正确的函数

但是修改了之后仍然不能进入软件,会弹出:“is not a vaild date”的错误,接着分析发现在后面要降输入的注册码转成时间形式,所以不输入或者输入错误的注册码也是不行的。

到这里暂时又没头绪了,看来还是要找到正确的注册码才行。往前分析,发现程序对注册码的长度做了验证,为14位注册码,同时还有2次比较。

贴一下注册按钮的推理过程

确认按钮入口

0086E8A8   55                     push    ebp

* Reference to control edtRegCode : TEdit

|

获取文本框内容

0086E8CC   8B830C030000           mov     eax, [ebx+$030C]

* Reference to: SysUtils.Trim(AnsiString):AnsiString;overload;

验证注册码是否为空,不为空则跳转

0086E8E2   837DE800               cmp     dword ptr [ebp-$18], +$00

0086E8E6   753D                   jnz     0086E925

                                  可修改为jmp   0086EA45跳过

* Reference to: System.@LStrLen(String):Integer;

|           or: System.@DynArrayLength;

|           or: System.DynArraySize(Pointer):Integer;

|           or: Variants.DynArraySize(Pointer):Integer;

|

输入长度验证

0086E944   E85366B9FF             call    00404F9C

验证注册码是否为14位

0086E949   83F80E                 cmp     eax, +$0E(16进制14)

0086E94C   7D3D                   jnl     0086E98B

* Reference to: System.@LStrCopy;

|

第一次复制注册码

0086E99C   E85B68B9FF             call    004051FC

0086E9A1   8B45E0                 mov     eax, [ebp-$20]

* Reference to: System.@LStrCopy;

第二次复制注册码

0086E9B9   E83E68B9FF             call    004051FC

0086E9BE   8B55DC                 mov     edx, [ebp-$24]

* Reference to: System.@LStrCmp;

|

和真注册码相比较

0086E9C2   E82167B9FF             call    004050E8

不等则跳转0086EA16

0086E9C7   754D                   jnz     0086EA16

* Reference to: System.@LStrCmp;

最后一次比较

0086EA0F   E8D466B9FF             call    004050E8

相等跳转到0086EA45,我的思路是将输入为空或对比失败结果直接jmp 0086EA45。

正常来讲直接跳转就能绕过注册,但是后面有将注册码的一部分转为日期的操作,错误注册码无法提取出日期时间,导致绕过失败

0086EA14   742F                   jz      0086EA45

将注册码转换为时间,格式为yyyy-mm-dd

0086EA81   E84EF7B9FF             call    0040E1D4

结果存储在ebp-$10中

0086EA86   DD5DF0                 fstp    qword ptr [ebp-$10]

这一步解释了为什么直接jmp 0086EA45后仍然无法绕过检验,因为错误的注册码无法转为时间,卡在这里。

分析第一次比较发现只截取了前面4个字节进行比较,容易的出注册码前两位数字为77。

输入注册码772025052111后一路f8,最终在一个call里找到了转换的日期格式为yyyy-mm-dd,再次修改注册码为772025-05-2111,此时刚好位14位。最后发现,这居然是在直接在一个call里将输入的注册码与标准注册码771898-12-2180进行比较,成功找到了注册码的格式。

自此,成功解出注册码。注册码为验证码前两位+yyyy-mm-dd+验证码后两位,yyyy-mm-dd为到期时间,一共14位。任务圆满完成,找我爸要报酬去了。

·今 日 推 荐·

本文内容来自网络,如有侵权请联系删除


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:逆向有你 caleb9911《PC逆向 — 某一卡通软件逆向分析》

评论:0   参与:  0