好友
阅读权限30
听众
最后登录1970-1-1
|
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数组,机器码
}
这样就搞定了,,,,感觉被玩儿了。。
|
免费评分
-
查看全部评分
|