吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3530|回复: 2
收起左侧

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

  [复制链接]
h_one 发表于 2013-12-16 19:37
CM是什么?Crackme是什么?这是什么东西?楼主发的什么?
他们都是一些公开给别人尝试破解的小程序,制作 Crackme 的人可能是程序员,想测试一下自己的软件保护技术,也可能是一位 Cracker,想挑战一下其它 Cracker 的破解实力,也可能是一些正在学习破解的人,自己编一些小程序给自己破解,KeyGenMe是要求别人做出它的 keygen (序号产生器), ReverseMe 要求别人把它的算法做出逆向分析, UnpackMe 是要求别人把它成功脱壳,本版块禁止回复非技术无关水贴。

本帖最后由 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:[0x44645C],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:[0x446460],0x0
00401B6C   .  76 36         jbe Xmycrack.00401BA4
00401B6E   .  33C9          xor ecx,ecx
00401B70   >  8A99 F8384400 mov bl,byte ptr ds:[ecx+0x4438F8]     ;  (最后一位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:[edx+edx*8]
00401B87   .  8BD1          mov edx,ecx                           ;  edx = i;
00401B89   .  2BD0          sub edx,eax
00401B8B   .  2A9A 70654400 sub bl,byte ptr ds:[edx+0x446570]     ;  strcode-DeviceCode[edx]
00401B91   >  8899 80674400 mov byte ptr ds:[ecx+0x446780],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:[0x446822],0x21       ;  比较最后一个是否为21
这个是关键的比较.需要解密的strcode的最后一字节是22 strcode-DeviceCode[edx] = 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:[0x4467D8],0xDB
00401BD8   .  FFD0          call eax                              ;  执行解密的机器码

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


可以使用windbg  命令 dt _IRP ,dt _IO_STACK_LOCATION 帮分析
注释中的buffer为机器码的字节,buffer[i+9]为输入注册码字节,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数组,机器码
                }

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



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册[Register]

x

免费评分

参与人数 1热心值 +1 收起 理由
Chief + 1 吾爱破解2013CM大赛,有你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

这只猪 发表于 2013-12-16 20:32
膜拜大神!!!何时能达到这样的高度。。。
网际座山雕 发表于 2013-12-17 09:36
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-15 15:29

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表