h_one 发表于 2013-12-16 19:37

【吾爱2013CM大赛解答】--驱动crackme---网际座山雕

本帖最后由 Chief 于 2013-12-16 21:36 编辑

【文章标题】: 吾爱2013CM大赛解答--驱动crackme---网际座山雕
【文章作者】:zxcfvasd
【作者主页】: 无
【软件名称】:mycrack.exe
【操作平台】: win xp
【工具】 OD,IDA
本人小菜一个,好像已有大大早就分析出来了,我也来凑个热闹,若有失误之处,请大大赐教~


照样od 载入 Ctrl+n 查找函数了,当然是去发现DeviceIoControl,因为这是ring3层与驱动通信的函数,并会将驱动返回数据放到,参数OutBuffer中。
00401B06   .6A 00         push 0x0                              ; /pOverlapped = NULL
00401B08   .68 60644400   push mycrack.00446460               ; |pBytesReturned = mycrack.00446460
00401B0D   .68 03010000   push 0x103                            ; |OutBufferSize = 103 (259.)
00401B12   .68 70654400   push mycrack.00446570               ; |OutBuffer = mycrack.00446570
00401B17   .68 03010000   push 0x103                            ; |InBufferSize = 103 (259.)
00401B1C   .68 68644400   push mycrack.00446468               ; |InBuffer = mycrack.00446468; "19cfa7ce41:eie<il<"(机器码跟序列号)
00401B21   .68 04202200   push 0x222004                         ; |IoControlCode = 222004
00401B26   .52            push edx                              ; |hDevice => 000000A4 (window)
00401B27   .FF15 80424300 call dword ptr ds:[<&KERNEL32.DeviceI>; \DeviceIoControl
00401B2D   .85C0          test eax,eax
00401B2F   .A3 5C644400   mov dword ptr ds:,eax
成功的来到程序的关键点了,,,现在到数据窗口OutBuffer = mycrack.00446570看看驱动的返回数据


上图可以了解到在第10位数00,返回数据被截断了,,,,在驱动中Irp->IoStatus.Information = 9;指明返回9位数
接下来将驱动中返回的数据作为密钥,对0x4438F8地址数据,size = A3解密,解密正确就会正确的执行call eax函数

00401B51   > \68 F4010000   push 0x1F4
00401B56   .6A 00         push 0x0
00401B58   .68 80674400   push mycrack.00446780
00401B5D   .E8 FEDD0100   call mycrack.0041F960               ;memset
00401B62   .83C4 0C       add esp,0xC
00401B65   .833D 60644400>cmp dword ptr ds:,0x0
00401B6C   .76 36         jbe Xmycrack.00401BA4
00401B6E   .33C9          xor ecx,ecx
00401B70   >8A99 F8384400 mov bl,byte ptr ds:   ;(最后一位22)
00401B76   .80FB E0       cmp bl,0xE0
00401B79   .73 16         jnb Xmycrack.00401B91
00401B7B   .B8 398EE338   mov eax,0x38E38E39                  ;release版本对除法的优化(幻数),
跟踪发现,已返回的数据长度9作为循环,,,edx = ecx%9;
00401B80   .F7E1          mul ecx
00401B82   .D1EA          shr edx,1
00401B84   .8D04D2      lea eax,dword ptr ds:
00401B87   .8BD1          mov edx,ecx                           ;edx = i;
00401B89   .2BD0          sub edx,eax
00401B8B   .2A9A 70654400 sub bl,byte ptr ds:   ;strcode-DeviceCode
00401B91   >8899 80674400 mov byte ptr ds:,bl
00401B97   .83C1 01       add ecx,0x1
00401B9A   .81F9 A3000000 cmp ecx,0xA3
00401BA0   .^ 7C CE         jl Xmycrack.00401B70
00401BA2   .EB 12         jmp Xmycrack.00401BB6
00401BA4   >68 70654400   push mycrack.00446570
00401BA9   .68 DC974300   push mycrack.004397DC               ;ASCII 09,"No data r"
00401BAE   .E8 01C50100   call mycrack.0041E0B4
00401BB3   .83C4 08       add esp,0x8
00401BB6   >68 F4974300   push mycrack.004397F4               ;ASCII 09,"DeviceIoC"
00401BBB   .E8 F4C40100   call mycrack.0041E0B4
00401BC0   .83C4 04       add esp,0x4
00401BC3   .803D 22684400>cmp byte ptr ds:,0x21       ;比较最后一个是否为21
这个是关键的比较.需要解密的strcode的最后一字节是22 strcode-DeviceCode = 21 此时ecx = A2 A2%9 = 0,也就是edx = 0所以可以确定,,,DeviceIoControl返回的数据第一个字节是'01',,,,,,也就得不到啥信息了,,接写来用IDA 看看驱动吧。
00401BCA   .75 21         jnz Xmycrack.00401BED
00401BCC   .B8 80674400   mov eax,mycrack.00446780
00401BD1   .C605 D8674400>mov byte ptr ds:,0xDB
00401BD8   .FFD0          call eax                              ;执行解密的机器码

下图就是响应IRP_MJDEVICE_CONTROL例程的关键代码,,,,


可以使用windbg命令 dt _IRP ,dt _IO_STACK_LOCATION 帮分析
注释中的buffer为机器码的字节,buffer为输入注册码字节,Outbuffer将计算结果给应用程序,,由应用程序的分析可以得到第一位1,
咦,坑啊接下的的几位怎么搞啊,,,,,全1?一次递增1,2,3,4,5,6,7,8,9?1,0,1,0,1,0,1,0,1?看来只有过猜了,,,,,,,,,,,,经过许久的猜测发现数字递增
逆向结果      for (int i = 0; i < 9; i++)
                {
                      szRet = inJQM+i;//inJQM数组,机器码
                }

这样就搞定了,,,,感觉被玩儿了。。



这只猪 发表于 2013-12-16 20:32

膜拜大神!!!{:301_992:}何时能达到这样的高度。。。

网际座山雕 发表于 2013-12-17 09:36


做的好,分析的非常详细。
页: [1]
查看完整版本: 【吾爱2013CM大赛解答】--驱动crackme---网际座山雕