做为一个会一些crack的小白,偶然看到了2016 crackme比赛,于是想拿一个来练手。本以为第一题会是比较简单的,谁知一试不是那么简单,还是有很多猫腻的。不过只要仔细有耐心还是很容易找到方法;看了看坛子里其他人的分享思路都不是很细,不适合初学者,所以我打算把自己的思路分享一下,如果有不对的地方或者有更简单的办法请大神们赐教。1、跳过调试器限制 下载下来程序以后,首先打开ollydbg,启动调试,本以为一路顺着走下去就可以找到关键函数,可是发现按F9以后啥也没有,想到肯定是程序启动过程中有判断是否被调试,调试就退出。于是查看IsDebuggerPresent,并下断点;再次F9依然没有启动。 然后尝试先启动CreackMe,使用ollydbg attach上去,发现ollydbg总是自动终止在一个访问异常上没有办法继续调试。 只好用最笨的办法,首先F8依次执行,查看执行到哪个函数退出了,经过几次最终可以确定是调用了TerminateProcess退出了,就是这里 然后从这个函数倒着往上看是哪个函数调用了这个函数,很快就找到了猫腻,原来程序中使用GetProcAddress获取到函数ZwQueryInformationProcess的地址,然后通过函数指针的方式调用,所以在直接查看时看不到这个函数,既然找到了判断地方就可以修改一下,无论调试器是否存在都不退出,修改下图这个位置就好了,我是把je指令修改成了NOP(具体怎么修改自己修改吧,我就不细说了) 2、找到密码校验的函数 密码校验函数确定,我是通过对话框提示的字符串“something you lost!"找到字符串所在位置,然后再通过调用关系确定对应的处理函数,所以我没有遇到大家说的定时器反复调用的问题。 依次调试就可看出,密码中需要有字母p和b 然后一路找下去,本以为一切顺利,结果又退出了,后来仔细查看发现,有个地方会和2比较,我理解是程序中会查看某两个函数之间执行的时间,如果大于2就退出,没有仔细研究原因,直接把跳转指令改为NOP,继续执行 看到校验密码长度的地方 依次就可以看到校验字母大小写,以及第3~6位必须是15pb的校验 比较有意思的是这里,会校验第1位和第2位的和必须是63, 最后是一个比较有难度的地方,把密码的一部分拼接在123456789字符串之后,然后比较确定最后一位必须是8,这里我不细讲,有兴趣的可以研究一下(而且必须是第一次输密码到这里,如果不是第一次很难理解出这个算法)最后得出答案是1215pb8 这个题总体来说还好,只要有耐心还是可以搞的定。 3、疑问 最后我遇到一个疑问,有谁给讲一下XMM0寄存器在这里是怎么工作的吗?没有找到太多资料,第一次见这种
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!