-
-
Riijj系列之cm12分析+注册机
-
发表于:
2013-1-29 17:06
9715
-
Riijj系列之cm12分析+注册机
工具:IDA6.1+WinDBG
系统:WinXP sp3
CM :下载 riijjcm12.rar
这个cm12还是比较有意思的,运行后程序会在系统临时目录中释放驱动文件thing.sys,
然后以服务的形式启动,应用程序只负责创建窗体接收用户输入,驱动文件通过读取应用端内存获取输入内容并进行运算,比较序号是否合法。不过驱动部分的代码经过处理会影响IDA静态反汇编分析,只能在动态调试的过程中,追踪算法。关键是在内核模式调试驱动。
先看下程序的流程
1.应用程序部分

驱动部分

根据流程图可知程序在驱动部分经过比较序号满足后会置全局标志位,这时应用端检测到标志位置位,就会通过系统地址调用系统函数MessageBox,不过这个函数地址也是由驱动传递过来的。
直接用IDA调试程序会导致系统重启,不知道是驱动部分有反调试还是系统原因。不过没关系可以用WinDBG直接在内核模式调试。
OK,现在开始:
IDA简单分析下
IDA载入cm12,启动后可以从左侧函数窗口定位到WinMain入口,双击即可如图3

在WinMain图表中浏览一遍会发现很熟悉的函数注册窗体类RegisterClassExA、创建窗体CreateWindowExA以及创建对话框CreateDialogParamA和消息循环及第二个
CreateDialogParamA。
注册窗体类紧邻下面有个call sub_40125F函数,他是释放资源并写入系统临时目录中的
如图4

2)紧邻UpdateWindow函数下call sub_4011C3函数负责,创建服务并启动接收驱动传递过来的字符串,目的是检测驱动是否正常启动。大家可以自己点进去分析很简单。
3)第二个CreateDialogParamA没有做什么操作,第二个CreateDialogParamA的回调函数创建了监听线程检测全局标志位,以及GetDlgItemTextA取对话框内容.
4)即便我们运行下cm12,从系统目录下取出thing.sys文件,用IDA打开也看不出什么信息,因为有反汇编处理,只能从导入表看到调用了那些函数而已,那么我们就从调试入手吧。
2开始调试
打开WinDBG双机模式运行,并且启动虚拟机同样以调试模式运行,(相关虚拟机设置就不介绍了,可以看这里5e0K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3S2A6i4K6u0W2j5X3q4A6k6s2g2Q4x3X3g2U0L8$3#2Q4x3V1k6K6L8%4y4G2M7$3!0T1j5h3c8Q4x3V1k6A6N6r3g2E0i4K6u0r3x3o6N6S2j5h3u0U0j5K6g2W2x3h3p5&6y4$3b7H3y4$3f1^5x3r3j5J5k6e0f1$3 )
在启动菜单中选择系统调试启动后,WinDBG会打印信息并中断如图5

直接按F5运行,稍等片刻系统启动进入桌面后,运行cm12,WinDBG不会中断下来,因为没有下断点,那么我们怎么下断呢?
因为应用端的程序流程已经很清楚了,只需要分析下驱动部分,那我们调试无符号文件的驱动文件如何下断点呢,
有两种方法:
sxe命令下断
第一sxe ld:XueTr.sys ;在入口下断
第二lmvm XueTr ;查看模块信息base地址即Start值
第三bp base+poi(poi(base+3c)+base+28) ;下断POI是取值,仔细看下会发现就是定位PE头中的AddressOfEntryPoint地址
断下后就是驱动的入口了。
IopLoadDriver函数下断
第一bp nt!IopLoadDriver+0x663
第二F11步入Call dword ptr [edi+2ch]
即是驱动入口
不过这个驱动需要用第二种方法,而不能用第一种下断,XueTr可以用第一种第二种不适用
可能是程序实现方式不同。
那好,我们关闭cm12后,切换到WinDBG窗口,点击暂停按钮暂停系统,在命令窗口输入命令bp nt!IopLoadDriver+0x663回车如图6

可以通过bl命令查看下断是否成功,成功后按F5运行程序,在虚拟机中运行cm12,这时程序停在Now Loading……窗口,看下WinDBG已经断下了,单步F11执行两次第三次进入Call dword ptr [edi+2ch]就到达了驱动入口
可以用uf命令查看下程序大致代码,只有三个call完了就退出驱动了。
kd> uf f8a8f9a0
f8a8f9a0 56 push esi
f8a8f9a1 e830000000 call f8a8f9d6 ;没做什么事情F10步过
f8a8f9a6 8b442408 mov eax,dword ptr [esp+8]
f8a8f9aa b9bef8a8f8 mov ecx,0F8A8F8BEh
f8a8f9af 50 push eax
f8a8f9b0 c740348af8a8f8 mov dword ptr [eax+34h],0F8A8F88Ah
f8a8f9b7 c74044eff8a8f8 mov dword ptr [eax+44h],0F8A8F8EFh
f8a8f9be 894840 mov dword ptr [eax+40h],ecx
f8a8f9c1 894838 mov dword ptr [eax+38h],ecx
f8a8f9c4 e82dfeffff call f8a8f7f6 ;初始化符号创建驱动设备
f8a8f9c9 8bf0 mov esi,eax
f8a8f9cb e860fbffff call f8a8f530 ;创建系统线程
f8a8f9d0 8bc6 mov eax,esi
f8a8f9d2 5e pop esi
f8a8f9d3 c20800 ret 8
kd> uf f8b87530
f8b87530 51 push ecx
f8b87531 33c0 xor eax,eax
f8b87533 50 push eax
f8b87534 68be74b8f8 push 0F8B874BEh
.....
f8b87555 ff15207bb8f8 call dword ptr ds:[0F8B87B20h]
f8b8755b a3c87bb8f8 mov dword ptr ds:[F8B87BC8h],eax
f8b87560 59 pop ecx
f8b87561 c3 ret
kd> t
nt!PsCreateSystemThread:
805c8484 8bff mov edi,edi
kd> g
Breakpoint 1 hit
f8b874be 55 push ebp
kd> uf f8b874be
f8b874be 55 push ebp
f8b874bf 8bec mov ebp,esp
.........
f8b874f1 6a64 push 64h
f8b874f3 e8c8fdffff call f8b872c0
f8b874f8 8365fc00 and dword ptr [ebp-4],0
f8b874fc e8c5feffff call f8b873c6
f8b87501 eb07 jmp f8b8750a
f8b8750a 834dfcff or dword ptr [ebp-4],0FFFFFFFFh
f8b8750e 833dc07bb8f800 cmp dword ptr ds:[0F8B87BC0h],0
f8b87515 74da je f8b874f1
........
f8b8752b c9 leave
f8b8752c c20400 ret 4
kd> uf f8b872c0
f8b872c0 55 push ebp
f8b872c1 8bec mov ebp,esp
.........
f8b872e3 ff15287bb8f8 call dword ptr ds:[0F8B87B28h]
f8b872e9 c9 leave
f8b872ea c20400 ret 4
[培训]科锐逆向工程师培训第53期2025年7月8日开班!