【吾爱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数组,机器码
}
这样就搞定了,,,,感觉被玩儿了。。
膜拜大神!!!{:301_992:}何时能达到这样的高度。。。
做的好,分析的非常详细。
页:
[1]