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

打开程序,输入任意值,输入错误时弹出对话框提示输入错误,并同时得知序列号形式为“xxxx-xxxx-xxxx-xxxx”,如下图:
利用OllyDbg完成序列号的逆向破解_第1张图片
由此可知该序列号破解存在一个切入点,即序列号错误时MassageBoxA的调用。因此利用OD的“设置API断点”对所有MassageBoxA设下断点,如下图:
在这里插入图片描述
运行程序,输入任意测试序列号后,成功截断。分析此时堆栈中的信息提示,如下图:
利用OllyDbg完成序列号的逆向破解_第2张图片
观察到图中最后一行提及父函数,点击该行并回车后将进入父函数,如下图:(高亮行即为回车后返回行)
利用OllyDbg完成序列号的逆向破解_第3张图片
至此,回溯到序列号验证位置。但由于该方法设置的断点信息为永久断点,且涉及断点位置很多,最主要的是,序列号的每部分验证结束后都需要进行断点的重设,因此过程较为复杂。下介绍另一种设置断点的方法并依靠该方法完成序列号的破解。
在CPU界面点击右键,选择“中文搜索引擎”中的“智能搜索”,如下图:
利用OllyDbg完成序列号的逆向破解_第4张图片
在搜索到的模块中找到序列号相关的消息提示窗口的文本信息,如下图:
在这里插入图片描述
双击进入该文本所在位置,如下图:
利用OllyDbg完成序列号的逆向破解_第5张图片
根据汇编代码分析可知,cmp用于比较输入信息和真实序列号信息,当两者不同时跳转至Demo2020.004025B1来执行序列号错误的消息提示(为何确定Demo2020.004025B1处为序列号错误的消息提示,由于下方其他部分序列号错误时,也调用了该函数,因此可以断定);正确时通过调用的外部函数来输出包含字符串“恭喜你!序列号第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进行检测,如下图:
利用OllyDbg完成序列号的逆向破解_第6张图片
同理,在第2部分开始设置断点,并分析第2部分判别结构,如下图:
利用OllyDbg完成序列号的逆向破解_第7张图片
观察到,cmp作为判断条件,由于比较对象为堆栈段中信息和数据段中信息,显然,真实序列号保存在数据段中,因此dx值即为真实序列号值;同理将1234作为测试序列输入以方便定位,测试如下图:
在这里插入图片描述
此时dx值为0004,显然该值即为真值,再看[ESP+0x14]中的信息来确定输入形式,此时ESP+0x14 = 0x0019 EFE8,[ESP+0x14] = 0x0000 1234,如下图:
在这里插入图片描述
因此可以判断,输入序列号经变换后十六进制形式与原有输入形式保持一致,因此序列号第2部分真值应为“0004”,重新设置断点并测试正确性,如下图:
利用OllyDbg完成序列号的逆向破解_第8张图片
下移断点并重新设置断点,并分析第3部分代码结构,如下图:
利用OllyDbg完成序列号的逆向破解_第9张图片
同第2部分一样,由于cmp比较数据存在位置分别为堆栈段和数据段,因此显然ax中存储的数据即为序列号第3部分的真实值;同理,输入1234作为测试值方便分析输入转换方式,如下图:
在这里插入图片描述
当运行至cmp命令时,EAX = 0000 005D,即为真值。查看ESP+0x18中的内容来确定输入转换形式,此时ESP+0x18 = 0x0019 EFEC,[ESP+0x18] = 0x0000 1234,如下图:
在这里插入图片描述
因此可以判断,输入序列号经变换后十六进制形式与原有输入形式保持一致,因此序列号第3部分真值应为“005D”,重新设置断点并测试正确性,如下图:
利用OllyDbg完成序列号的逆向破解_第10张图片
下移并重新设置断点,分析第4部分代码结构,如下图:
利用OllyDbg完成序列号的逆向破解_第11张图片
观察到,该部分测试由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时测试成功,如下图:
利用OllyDbg完成序列号的逆向破解_第12张图片
综上,Demo2020的序列号得到最终破解,为“0825-0004-005D-aFF0”。

你可能感兴趣的:(软件安全)