文章总结: 本文记录了使用OD和DeDeDark逆向某Delphi一卡通软件的过程。作者通过静态反编译与AI辅助,定位注册验证逻辑,发现程序校验14位长度并将部分字符转为日期。最终成功破解,得出注册码格式为前两位固定头+yyyy-mm-dd日期+后两位固定尾。 综合评分: 82 文章分类: 逆向分析,二进制安全,实战经验
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逆向 — 某一卡通软件逆向分析》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。









评论