这题考察驱动调试、驱动反调试、MD5算法穷举还有电脑性能(开玩笑的),分析算法不会费什么功夫。
本文按照实际破解顺序撰写,符合初学者的理解逻辑,尽量条理清晰,比较细致,希望耐心看,大牛略过吧!
一、静态了解目标:未加壳,OD载入主程序,迅速查看字符,发现几处有用,记录下来,养成好习惯:
//发现驱动,成功提示信息,算法侦测:MD5,大概有了分析思路——>先搞定主程序,再搞定驱动
二、释放并运行驱动
//下断点:CreateFileA
00401566 . E8 B5090000 CALL CrackMe.00401F20
// 释放驱动
//从资源释放 6144 字节驱动
//释放驱动,此处将驱动文件拷贝副本,留作分析用
//安装驱动
//此处注意 ServiceName = "vmxdrv" 后续动态分析驱动时设置断点有
//驱动加载后删除驱动文件,防止被破解者发现
三、静态分析驱动:
//首先了解一下相关知识,为了后续准确断点IRP回调函数:
//使用 IDA 很容易根据MajorFunction[i]下标查到对应IRP回调函数类型:
//找到了关键几个MajorFunction先进行简单整理,便于后续查看:
//IRP_MJ_Read 暗桩等
//IRP_MJ_Write 内核字符串变形及MD5
//IRP_MJ_Device_Control 内核反调试及其他
四、动态分析RING3主程序:
//首先OD载入主程序,搜索所有“push 0x222004”调用IRP_MJ_Device_Control处,一共两处,全部修改为“push 0x22200C”,
//简单跳过内核反调试,否则死机少不了,但可能会影响到后续算法或者留暗桩,不过并不影响RING3主程序的算法流程分析。
//下断点:GetWindowTextA,运行断下:
//一路返回 401760 这个算法程序:
//得跟进核心算法 401D50 了,很明显 WriteFile、ReadFile 与驱动沟通,将倒置后的6位小写字符给驱动加密,然后再读取出来
//读出来的结果类似MD5值,怀疑驱动里头也进行了MD5
//离开核心算法程序,回到主流程
//将截取的10位字符与内置的“888aeda4ab”进行比较,相同则成功
五、小结RING3主程序算法流程:
//显然只要再搞清楚第4步骤驱动里头在做什么就可以弄清楚算法了
六、驱动动态调试分析
//接下来该分析驱动,参考第三步静态分析的关键几个MajorFunction,开启windbg双机调试,断点:
//重新开始运行未修改过的主程序,断下IRP_MJ_Device_Control:
//参考第三节程序,“push 0x222004”对应选择分支
//IRP_MJ_Device_Control 内核反调试及其他
//跟进 call vmxdrv+0x486 (f8c00486) ,“and dword ptr [eax+0BCh],0”对DebugPort清零,反调试
//将[f8c004a9]的“83”修改为“C3”,跳过DebugPort清零反调试
//至此已经清楚 IRP_MJ_Device_Control 内核反调试手段,记得取消该断点。
//继续运行,显示出CrackMe窗口,输入“123456”,按回车,断下 IRP_MJ_Write:
//算法 (call vmxdrv+0x4b6 将倒置输入的ASCII第1位+1,第2位+1,第3位+2,第4位+3,第5位+4,第6位+5,如果是数字可理解为+112345,并取MD5)
//跟进 call vmxdrv+0x4b6
//读取输入,计算位数=6
//比较位数
//注册码[1]+1
//注册码循环+AL 此时 AL=0,1,2,3,4,5
//654321+112345=766666
//MD5准备
//MD5(“766666”)= 17f73e13bad89038392692e82d63b17d
//call vmxdrv+0x4b6 已经跟完了,我们继续运行
//断在 IRP_MJ_Read
//正确流程
//至此,驱动重要的几个MajorFunction已经分析完成,并且完成了反反调试
七、驱动算法小结
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课