第一道题是这样描述的:
这是一道破解题,运行程序后,输入序列号即可。如果成功,注册成功按钮将会由不可用变为可用。要求:
1、使这个程序能注册成功。提交注册机的可执行文件。
2、简单阐述该程序的防范手段。
第一眼看到试题,会感觉思路很明了,题目中说到了,按钮由不可用变为口可用即可,很自然的想到编程中常引用的一个API(应用程序编程接口)就是EnableWindow。这样就开始测试一下喽。
首先用PEID查一下软件是否有加壳,出题者并没有在这方面为难。软件是Microsoft Visual C+ 6.0编写的。运行一下,输入123,并没有反应…。
这样就把软件载入到Ollyice中分析一下。这里既然是调用了API函数,我们就在反汇编窗口右键一一查找当前模块中的名称(标签),在窗口中输入E,很快就发现了EnableWindow这个函数。然后就是右键选择“在每个参考上设置断点”。本想运行一下找到关键跳从而用Nop覆盖掉,结果按下F2却显示已终止。这样就可以肯定软件必定是加了校验了,这样也就理解了题目所说的“防范手段”了。
此时又按Ctrl+N在看了一遍调用的API函数,找到API函数ExitProcess。熟悉编程的童鞋会更了解这些API的应用吧,另外破解中还常常遇到结束线程的API比如ExitThre ad和TerminateThread。没有编程基础的朋友可以积累一下。
在ExitProcess这个参考上右键选查找输入函数参考,打开的对话框就有这个Crackme软件调用此API的地址,双击地址到达反汇编窗口。
其中,00401088地址处的汇编代码为mov ebp, dword ptr[<&KERNEL32.ExitProc>,//此处调用的就是kerne132.ExitProcess
这样后面就必定有调用的地方,单步跟踪。在下面代码就出现了一个跳转,位置是004010FO。跟踪到这个跳转的位置先下个断点,然后继续跟踪会发现走几步进程就会退出了。
这样我们修改通过单步调试修改004010FO右键NOP掉就可以让程序的自动退出无效了。那么,程序为什么会自动退出呢?必定是加了校验的,我们使用OD调试会发现,只要不对程序下断点或是修改代码等行为,就不会中断,后来发现程序是加的CRC32校验的。
将修改保存后,再将修改后的文件裁入到OD中,后面过程就简单了,同样的找到EnableWindow这个函数,找到参考位置下断点。(通过另-个APIGetWindowTextA也是可以找到关键部分的),找到了这个地址:
把0040128C处的跳转修改为nop代码,即可简单的爆破这个CrackMe了。总结一下,要破解这个的CrackMe只需要修改两处代码,004010FO和0040128C代码都改为90(Nop代码)就可以了。做注册机也有几种方法了。这里不用自己编写,直接用现成的注册机编写器编写吧。当然,为了锻炼大家可以尝试自行编写注册机。为了直观,我制作内存补丁作为演示,如果要直接破解可以用文件补丁的方式。比较源文件和修改后的文件就可以了。
修改方式如下:
修改地址长度原始指令修改指令
040loF0 2 7509 9090
0040128C 2 750E 9090
这样做成后就OK了,运行注册机补丁就可以了。至此,第一道题就算解决了。
第二道题是这样描述的:
1、运行附件中的TraceMe.exe
2、要求:破解出密码弹出成功对话框。提交密码。
关于这个CrackMe,有一点不能称作技巧的技巧吧,呵呵。首先运行一下程序,输入假码123,运行发现提示“fail”。查一下CM是否被加壳,结果是Microsoft Visual C++ 6.0,并没有加壳。将软件载入到OD中,用很基础的方法查看一下字符串参考。发现了一点信息。
这里有错误的提示,也有一串字符串是SOWOlOhOa020VOpOdOAO=O=.这个很自然的会想到注册码,但是试验了一下,并没有成功。然后我就在这里下普通的INT3断点。按下F2运行后输入假码123,断在这里,按F8单步走几次,同时注意堆栈和寄存器中的数据会发现123和另一个字符串经常出现“MTIz”。我们完全可以猜想123经过加密后就变为了MTIz。但是这是什么加密方法呢?
这时我关掉OD,又将软件载入到PEID中。利用Peid的插件KryptoANALyzer分析一下算法,发现软件的代码中用到了BASE64加密,(由于换了Win7系统,所以过去的Peid不能使用,就用这个修改版了)。并且分析到的地址部分正是注册码的位置。这里也就是一点小技巧吧,的确可以省去我们不少分析的时间。于是测试一下,在Base64加解密工具里加密一下123得到的正是MTIz。这样思路就明了多了,SOWOlOhOa020VOpOdOAO=O=应该是与BAS E64加密有关系的。那就拿BASE64解密一下这些字符串,却得到一串乱码。这又是怎么回事呢?继续将软件载入到OD中分析代码。
其中00401317处的代码是加了2,也就是说edi对应的地址加2,这样就跳过了第二个字符,以此类推,偶数位的字符是都会被忽略掉的。因此,先前的字符串SOWOlOhOa020VOpOdOAO-O=的有效部分应该是SWlha2VpdA==,用Base64解密一下,得到字符串“Imakeit”,测试一下,注册成功了。
其实这款CM如果把字符串SOWOlOhOa020VOpOdOAO=O=隐藏一下难度就会更大一些,另外。这串字符串中无效位都用了O,很容易让人发现秘密(虽然刚分析时没有发现这个秘密…)。但想来是出题者也是考虑到比赛的难易度,故意给出字符串让大家找到方向吧。总结一下,比赛的题目并不是很困难,还是挺典型的,大家可以从网上下载练手。有问题也可以通过博客坛向危险漫步提出,就到这里了,谢谢大家。
本文内容所提及均为本地测试或经过目标授权同意,旨在提供教育和研究信息,内容已去除关键敏感信息和代码,以防止被恶意利用。文章内提及的漏洞均已修复,作者不鼓励或支持任何形式的非法破解行为。