目标程序下载地址:http://opencrackmes.crackmes.de/ope...rackmes/k4n.zip
到一些黑客站点上转转,发现那些最受欢迎、点击次数最多的文章都是一些“教菜鸟使用木马”“入侵初级教程”之类文章,而“outlook express html邮件超长字节href值缓冲溢出缺陷”“php fopen()函数易遭到crlf injection攻击”这种文章却乏人问津,尽管这或许才是真正高手所关心的。
现在看雪论坛上后一种文章逐渐增多,当然是因为大家的水平都提高了,但也给刚入门的菜鸟带来了麻烦,来了之后什么也看不懂,在高手看来不是问题的问题常常困扰新手们很长时间:为什么这里是关键跳转,那边是重要call?为什么有的call要跟进,有的call只需带过?我按照高手所写的一步步做下去成功了,可为什么要这样做呢?我想更有不少人好不容易破了一个明码比较的软件,想贴出来又怕为高手所不屑而做罢。
因此我找了一个非常简单的crackme(如果你是高手,只静态调试应该就可以搞定了
),从头到尾仔仔细细地写出了分析过程,在里面加入了些我认为应该注意的地方,希望能对刚入门的朋友有些帮助。我不是什么高手,最多算是破解得熟练一点儿了而已,也许这样才更能了解新手们的难处吧。
这里我用w32dasm作为静态反汇编的工具,各位可能有用c32asm或者其他的,基本功能其实应该差不多。
先胡乱输入用户名和注册码,点"check the serial",看看错误信息是什么(如果出现“注册码正确”的话就别在这儿看了,赶紧买彩票去
)好出来了,“this serial is *not* valid!! try again... : unregistered”。
好了运行w32dasm把它反汇编,在串式参考(string reference)中找吧,注意当字串较长时有时不能完全显示,这时只要找前面一段就行了,比如这次就是,找到"this serial is *not* valid!! try ",就是它了,双击来到引用该字串的地方。(ps:有时错误信息在代码中会不止一次出现,这时只要多次双击就能找到其他的地方。)
下面我要引用代码了(这是在w32dasm里的形式,如果你用od或si动态跟踪时形式会略有不同)。不要被这么多代码搞晕了,建议先跳过代码看我的后面的说明,再从代码中对照。
代码:
* possible reference to dialog: dialogid_0001, control_id:0066, "" | :00401085 6a66 push 00000066 ;输入用户名的文本框id :00401087 53 push ebx ;对话框句柄 * reference to: user32.getdlgitem, ord:0000h | :00401088 e8159c0000 call 0040aca2 ;得到文本框句柄 :0040108d 6a64 push 00000064 ;得到字符串的最大长度 :0040108f 8d9548ffffff lea edx, dword ptr [ebp+ffffff48] :00401095 52 push edx ;edx是存取字符串的地址 :00401096 50 push eax ;eax是上面得到的文本框句柄 * reference to: user32.getwindowtexta, ord:0000h | :00401097 e8129c0000 call 0040acae ;得到用户名,在[ebp+ffffff48] * possible reference to dialog: dialogid_0001, control_id:0068, "" | :0040109c 6a68 push 00000068 ;同样的操作,输入注册码的文本框id :0040109e 53 push ebx * reference to: user32.getdlgitem, ord:0000h | :0040109f e8fe9b0000 &