本帖最后由 Fid 于 2010-7-26 09:00 编辑
http://www.52pojie.cn/thread-51861-1-1.html 这是那个Crackme的链接地址(你会发现作者也是我。。)
我把Word文档也给大家留下吧。。。要上传图片。。 作者:刄閪闁閸闏乄(Fid) 前几天(大概快半个月了吧,我记性不好),我自己写了个Crackme,发到了52pojie上,可惜因为是带驱动的,一群菜菜们就放弃了,而高手又没有时间来玩这些纯练习的东东。所以一直没被破解,连个爆破的都没有!。干,于是我发了个我自己的注册文件帮助大家分析。可惜,依然无人问津。 于是,今天打算自己破了,给大家看看这中带驱动程序的破解是怎么样进行的。 因为程序算法不是很复杂,所以我就先从静态开始讲,有空以后会来讲下,如何动态爆破。 用到的工具有IDA,和OD。 //因为这篇文章是我这个Crackme作者写的,所以思维上存在了一定的跳跃性,请大家理解。 正文: 首先用OD载入Exe程序,直接运行下。 首先搜索字符串。
找到关键点的几条语句。双击You are Failed,来到关键点:
分别给00401859与00401853加入标签式注解,使之程序更易于解读。 这是程序的上半段的截图: 输入Fivedoor。 在CreateFileA函数前下断。
只要大家有一定的功底就能看出这几个jnz Fail 之上的判断是什么内容。 还是简单说明下,这两个jnz(第一个是判断文件是否存在(文件名为Reg.c+输入的用户名),第二个判断注册文件大小是否为0x80字节) 再往下。
这里只是单纯的比较读取是否顺利获得ReadFile长度是否为0x10。这是个循环,会读8次,读出所有的内容(0x10*8=0x80) 在接下来就是本文最最关键的地方了。
前面是获取设备的句柄的一个CreateFile我已经掠过了。 这里WriteFile处因为只是简单的比较写入的值,这里不会错误(程序我写的,所以我知道,其实这里也需要简单的分析下),关键是ReadFile处,才是关键,返回0x30(’0’)就失败。 为什么读取会返回1呢?大家可能在找有没有一个叫FDCrackme的文件,然后它的头部是”0000000…”所以失败了。 其实不是这样的,读取设备内容,回调用驱动设备的IRP_MJ_READ。而不是大家所想的和读取文件内容类似。(这里主要给菜菜们科普下,大鸟不要喷我。) 这里的内容只要循环8次,都不是’0’就可以了。 接下来就不可能用OD多做什么了。 接下来换IDA,载入驱动程序后。会提示你是否载入PDB文件,(我有,可惜大家没有,所以我也不载入了。不过大家还是一起选Yes吧) 科科科,这里去找DriverEntry喽。大家随便找找
当指针停在这里时就DriverEntry了,过程就不详细讲了。
注意到这里就是关键了,这里是给DriverObject的IRP处理函数赋值,这里需要去Wdm.h找寻真相。
不要急着找0x34对应的值你找了也找不到。呵呵,这里要去研究DriverObject的结构,我就跳过了,大家看大小两个关键是IRP_MJ_READ/IRP_MJ_WRITE呵呵 两者是相邻的所以分别是34h和38h,呵呵那你就错了(思路是对的,其实44h和48h)。其实真确的答案是从上到下为 DriverUnload(虽然不是IRP但也其实也能算个IRP(~.~||)) IRP_MJ_READ; IRP_MJ_WRITE; IRP_MJ_CREATE; 你都答对了吗。 呵呵那么接下来转到IRP_MJ_READ。
这是程序大致框图
爆破方法:
这里的jz改为jmp
这里nop掉就OK了。 大家修改时一定要仔细喔,出错了会蓝频的哦。 //////////////////////////////////// 当然大家想分析算法也是很简单的。 就到这吧。 |