CrackMe.exe的序列号破解(无错误提示弹窗)
直接双击运行CrackMe.exe后会进入到如下界面:
此时直接点击“About”按钮则会直接跳转到如下界面:
若点击“Exit”按钮则会直接关闭该程序。
在该界面上输入“Name”和“Serial”后点击“Verify”不会出现任何弹窗提醒,通过分析可知此时输入的用户名与序列号不正确。
此时删除“Serial”输入框中的信息的信息则会出现弹窗,即如下所示:
此时“Name”输入框中的信息的信息则会出现弹窗,即如下所示:
因此,可以根据对存在上述两个弹窗的汇编代码部分进行分析,从而对实现登录操作的用户名与序列号进行分析。
在OllyDBG.EXE中打开CrackMe.exe,此时汇编代码的起始地址为“004584C0”,此时在反汇编窗口右键打开菜单栏,并在其中找到“Ultra String Reference”后点击“2 Find UNICODE”,打开“Ultra String Reference”窗口,随后到达该窗口的末端,找到“Text String”栏中的“enter you name, pls”,即如下所示界面:
随后双击“enter you name, pls”即可跳转至其对应的地址,根据对上下其前后的汇编代码(地址00458160到地址00458270)进行分析可知:
(1)地址00458160到地址0045816E为函数头,其作用是通过保存寄存器状态和设置堆栈帧来为该函数或子程序创建执行环境。
(2)地址00458239到地址0045827E为函数结尾,起作用是清理堆栈及关闭该子程序的执行过程。
(3)地址00458188到地址00458234为判断用户民与序列号是否对应正确的函数主体。
针对(3)中包含的地址的汇编代码:
当程序运行时仅未输入“Name”时直接点击“Verify”按钮时则会显示“Enter you name, pls.”,其对应汇编为:
当程序运行时仅未输入“Serial”时直接点击“Verify”按钮时则会显示“Enter you serial, pls.”,其对应汇编为:
随后从地址004581D5到地址00458204的汇编则主要声明了如何根据用户名来获取相应的序列号。其汇编代码情况如下所示:
根据对上述汇编代码的分析可知:根据输入用户名在ASCII码中所对应的十进制数除以3的商即为该用户名所对应的序列号的数值。
已知所需输入的用户名为“ningjianhao”(即本人姓名全拼),上述字符在ASCII码中对应的十进制数依次为:110、105、110、103、106、105、97、110、104、97、111,将上述十进制数除以3取其商依次为:36、35、36、34、35、35、32、36、34、32、37。
至此,序列号并完不整,根据下列汇编可知:在上述所得的用户名“ningjianhao”的序列号数据前还需要加上字符串“ADCM3-”,即用户名“ningjianhao”对应的完整的序列号为“ADCM3-3635363435353632343237”
此时双击运行CrackMe.exe后,分别输入用户名“ningjianhao”和序列号“ADCM3-3635363435353632343237”,随后点击“Verify”,则会弹出弹窗“Crackme”显示“Well done Cracker,You did it!”,即如下图所示:
根据上述汇编代码及相应的分析过程可知:序列号与用户名之间存在一定的对应关系,为了能够实现C语言编写用户名与序列号之间所存在的函数关系,需要着重对地址004581D5到地址00458214的汇编代码进行分析。
根据对上述汇编代码的分析可知,在通过用户名获取序列号的后部分过程中存在一个循环函数,该循环函数部分的汇编代码如下图所示:
该循环需要直至所有的用户名的字符均转换得到了相应的十进制数后才能结束,针对该部分循环既可以通过for循环实现,也可以通过while循环实现,其具体的代码实现如下所示:
(1)for循环
(2)while循环
随后根据上述循环所对应的汇编代码后几行汇编可知,用户名对应的完整序列好还需要在上述循环所得到的用户名对应的序列号数据前加上“ADCM3-”,其对应的汇编代码如下所示:
该部分汇编在C语言程序中的实现代码为:
综合上述分析,可以编写得到如下的C语言程序,通过输入用户名进而获取到其对应的序列号,其具体的C语言代码(for循环版)如下图所示:
此时,在运行上述C语言程序所出现的弹窗中,在“Enter the name:”后输入用户名“ningjianhao”后点击回车键即可在下一行的“Enter the serial:”后显示其对应的序列号“ADCM3-3635363435353236343237”,该程序的具体运行结果如下图所示:
将程序运行所得的序列号与前面直接推导出来的序列号进行对比即可发现该C语言程序所获取到的序列号是正确的。也可以直接双击运行CrackMe.exe后使用用户名与序列号登录进行判别。
此时也表明该C语言程序即为该程序CrackMe.exe的注册机。
CrackMe.exe的版本图片如下所示: