算法难度:⭐
爆破难度:⭐
信息收集
运行情况:
经典的用户名+序列号授权验证:
查壳与脱壳:
Delphi编写的32位GUI程序,无壳
查字符串:
大概看了一下,字符串里有个reg.dll,但CM文件只是单一的exe,可能存在释放文件
调试分析
对于Delphi程序,除了直接强行分析之外,还可以借助Delphi辅助分析工具:IDR(吾爱论坛上有)
因为是窗口程序,所以查窗口的相关内容:
直接查看点击Ok按钮的内容:大概就是把用户输入的用户名和序列号写入到了reg.dll文件中,也就是说这是个dll后缀的文本文件
提示语是重启软件后验证注册码,说明这是一种重启验证,在启动的时候进行校验
那么接下来查看创建窗口时的代码:
这个调用的函数:sub_0045D0F4,这应该就是一个校验函数,根据返回al的值是否为0,来进行判断跳转,这个跳转应该是关键跳了
暴力破解
修改关键跳:
然后跑起来:
算法分析
接下来看看具体校验call做了哪些事情:sub_45D0F4
首先获取参数之后,计算SN长度,SN长度需要是16个字符:
然后接下来是个循环,遍历SN每个字符,检查合法字符,这里允许的字符是0-9数字和A-F字母
然后紧接着进行一顿处理,处理用户名得到一个加密编码后的值
值通过x86dbg动态调试观察:计算的结果是8B45677A3AEBE84C
然后接下来,程序连续走了两趟相同的操作,分别是对刚刚通过用户名计算出来的结果和我们输入的SN,然后将结果进行对比,返回
这里具体生成用户名对应SN的代码过于复杂,暂时还写不出来注册机,但这里程序在分析过程中会出现SN真码明文,这里也就到此结束了,使用该SN打开程序:
总结
Delphi程序逆向练习,借助工具IDR可以很方便的识别Delphi函数,这个CM使用了经典的重启验证,让验证函数在窗口创建前进行验证,注册机较为复杂,暂时还写不出来