利用OllyDbg完成序列号的逆向破解

打开程序,输入任意值,输入错误时弹出对话框提示输入错误,并同时得知序列号形式为“xxxx-xxxx-xxxx-xxxx”,如下图:
在这里插入图片描述
由此可知该序列号破解存在一个切入点,即序列号错误时MassageBoxA的调用。因此利用OD的“设置API断点”对所有MassageBoxA设下断点,如下图:
在这里插入图片描述
运行程序,输入任意测试序列号后,成功截断。分析此时堆栈中的信息提示,如下图:
在这里插入图片描述
观察到图中最后一行提及父函数,点击该行并回车后将进入父函数,如下图:(高亮行即为回车后返回行)
在这里插入图片描述
至此,回溯到序列号验证位置。但由于该方法设置的断点信息为永久断点,且涉及断点位置很多,最主要的是,序列号的每部分验证结束后都需要进行断点的重设,因此过程较为复杂。下介绍另一种设置断点的方法并依靠该方法完成序列号的破解。
在CPU界面点击右键,选择“中文搜索引擎”中的“智能搜索”,如下图:
在这里插入图片描述
在搜索到的模块中找到序列号相关的消息提示窗口的文本信息,如下图:
在这里插入图片描述
双击进入该文本所在位置,如下图:
在这里插入图片描述
根据汇编代码分析可知,cmp用于比较输入信息和真实序列号信息,当两者不同时跳转至Demo2020.004025B1来执行序列号错误的消息提示(为何确定Demo2020.004025B1处为序列号错误的消息提示,由于下方其他部分序列号错误时,也调用了该函数,因此可以断定);正确时通过调用<jmp.&MFC42.#4224>的外部函数来输出包含字符串“恭喜你!序列号第1部分正确!”的消息提示框。
因此,在语句“mov cx, word ptr ss:[esp+0x58]”处设置断点,并运行程序,为方便分析堆栈中输入信息存放位置,有意将测试的序列号输入第1部分设置为1234。如下:
在这里插入图片描述
程序成功断下,按F7单步执行,当执行到cmp语句时,ECX = 0x0019 0825,ESP = 0x0019 EFD4,查看cmp命令中ESP+0x20处存放的数值,此时ESP+0x20 = 0x0019 EFF4,通过堆栈段查看其中内容,[ESP+0x20] = 0x0000 1234,恰好为测试输入样例,如下图:
在这里插入图片描述
因此猜测,cmp的第一个参数为输入,而输入值经变换后原有ASCII转换为数值并对应16进制位存放,而其第二个参数cx中保存的即为真实序列号即“0825”。下面重新载入程序,下移断点以保证第1部分成功的提示可以正常出现,并输入0825进行检测,如下图:
在这里插入图片描述
同理,在第2部分开始设置断点,并分析第2部分判别结构,如下图:
在这里插入图片描述
观察到,cmp作为判断条件,由于比较对象为堆栈段中信息和数据段中信息,显然,真实序列号保存在数据段中,因此dx值即为真实序列号值;同理将1234作为测试序列输入以方便定位,测试如下图:
在这里插入图片描述
此时dx值为0004,显然该值即为真值,再看[ESP+0x14]中的信息来确定输入形式,此时ESP+0x14 = 0x0019 EFE8,[ESP+0x14] = 0x0000 1234,如下图:
在这里插入图片描述
因此可以判断,输入序列号经变换后十六进制形式与原有输入形式保持一致,因此序列号第2部分真值应为“0004”,重新设置断点并测试正确性,如下图:
在这里插入图片描述
下移断点并重新设置断点,并分析第3部分代码结构,如下图:
在这里插入图片描述
同第2部分一样,由于cmp比较数据存在位置分别为堆栈段和数据段,因此显然ax中存储的数据即为序列号第3部分的真实值;同理,输入1234作为测试值方便分析输入转换方式,如下图:
在这里插入图片描述
当运行至cmp命令时,EAX = 0000 005D,即为真值。查看ESP+0x18中的内容来确定输入转换形式,此时ESP+0x18 = 0x0019 EFEC,[ESP+0x18] = 0x0000 1234,如下图:
在这里插入图片描述
因此可以判断,输入序列号经变换后十六进制形式与原有输入形式保持一致,因此序列号第3部分真值应为“005D”,重新设置断点并测试正确性,如下图:
在这里插入图片描述
下移并重新设置断点,分析第4部分代码结构,如下图:
在这里插入图片描述
观察到,该部分测试由4部分比较构成,大胆猜测,一个位置对应一个测试,继续将1234作为测试信息。查看ESP+0x30中的内容,此时ESP+0x30 = 0x0019 F004,[ESP+0x30] = 0x6F75 849B,发现和输入值没有明确联系,如下图:
在这里插入图片描述
继续产看ESP+0x44~0x46中的内容,发现[ESP+0x44] = 0x0019 F018为0x00343332,恰好对应输入1234后三位的ASCII码值,如下图:
在这里插入图片描述
根据代码分析知,该部分输入后三位对应ASCII码应为0x00304646,即输入后三位应为FF0。现仅剩第4部分第1位未知,由于未知加密方式,排查相关函数的过程较为复杂,因此采取枚举的方式进行判断,效率较高。恰好输入小写a时测试成功,如下图:
在这里插入图片描述
综上,Demo2020的序列号得到最终破解,为“0825-0004-005D-aFF0”。

  • 11
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

D-A-X

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值