老软件加密狗破解全过程
这是很久以前的软件了,原来破解的时候写下了点东西,今天看到了就顺便把它发上来,由于原来只是做的简单的笔记,今天稍微补充了点,由于找不到原程序,所以也不是很完整,希望大家谅解!
下面就直接贴代码了:
0028:CE5AA885 88442405 MOV [ESP+05],AL ; 这儿.
0028:CE5AA889 66C746680100 MOV WORD PTR [ESI+68],0001
0028:CE5AA88F 8A442405 MOV AL,[ESP+05]
0028:CE5AA893 884615 MOV [ESI+15],AL
0028:CE5AA896 884614 MOV [ESI+14],AL
0028:CE5AA899 5E POP ESI
0028:CE5AA89A 83C404 ADD ESP,04
0028:CE5AA89D C3 RET
0028:CE5AA89E CC INT 3
0028:CE5AA89F CC INT 3
0028:CE5AA8A0 83EC04 SUB ESP,04
0028:CE5AA8A3 56 PUSH ESI
0028:CE5AA8A4 8B74240C MOV ESI,[ESP+0C]
0028:CE5AA8A8 56 PUSH ESI
0028:CE5AA8A9 E832000000 CALL CE5AA8E0
0028:CE5AA8AE 668B465C MOV AX,[ESI+5C]
0028:CE5AA8B2 83C404 ADD ESP,04
0028:CE5AA8B5 6689442406 MOV [ESP+06],AX
0028:CE5AA8BA 8A4658 MOV AL,[ESI+58]
0028:CE5AA8BD 243F AND AL,3F
0028:CE5AA8BF 88442405 MOV [ESP+05],AL
0028:CE5AA8C3 8A442405 MOV AL,[ESP+05]
0028:CE5AA8C7 668B542406 MOV DX,[ESP+06]
0028:CE5AA8CC EE OUT DX,AL
0028:CE5AA8CD 5E POP ESI
0028:CE5AA8CE 83C404 ADD ESP,04
0028:CE5AA8D1 C3 RET
我们是在 chat_to_dongle routine. 而且如果我们看下面的data部分,我们看到:SENTINELXXX…
这是什么啊?! 你应该知道有什么公司提供这种加狗的服务如: Hasp, Sentinel, DesKEY,
Activator/Unikey 还有许多其它的.
因此,我们可以推断碰到的是一个 SENTINEL 狗加密!我们现在在 SENTINEL.VXD 文件… 回到文章
中来,我们停在这儿:
0028:CE5AA885 88442405 MOV [ESP+05],AL ; 这里..
0028:CE5AA889 66C746680100 MOV WORD PTR [ESI+68],0001
0028:CE5AA88F 8A442405 MOV AL,[ESP+05]
0028:CE5AA893 884615 MOV [ESI+15],AL
0028:CE5AA896 884614 MOV [ESI+14],AL
我们要看是关于可执行文件的CALL,所以我们要按三四次F12,我们会在这儿:
0028:CE5B35D6 50 PUSH EAX
0028:CE5B35D7 55 PUSH EBP
0028:CE5B35D8 57 PUSH EDI
0028:CE5B35D9 E8D2FEFFFF CALL CE5B34B0 ; 我们的 call ?
0028:CE5B35DE C06C241F01 SHR BYTE PTR [ESP+1F],01 ;回到这儿.
0028:CE5B35E3 83C40C ADD ESP,0C
0028:CE5B35E6 0AD8 OR BL,AL
0028:CE5B35E8 664E DEC SI
0028:CE5B35EA 75E1 JNZ CE5B35CD
0028:CE5B35EC C0EB01 SHR BL,01
0028:CE5B35EF 6A64 PUSH 64
0028:CE5B35F1 57 PUSH EDI
0028:CE5B35F2 E8C979FFFF CALL CE5AAFC0
0028:CE5B35F7 8A44241B MOV AL,[ESP+1B]
0028:CE5B35FB 83C408 ADD ESP,08
0028:CE5B35FE 2401 AND AL,01
0028:CE5B3600 50 PUSH EAX
0028:CE5B3601 55 PUSH EBP
0028:CE5B3602 57 PUSH EDI
0028:CE5B3603 E8A8FEFFFF CALL CE5B34B0
0028:CE5B3608 83C40C ADD ESP,0C
0028:CE5B360B 0AD8 OR BL,AL
0028:CE5B360D 66BE0300 MOV SI,0003
0028:CE5B3611 6A64 PUSH 64
0028:CE5B3613 C06C241701 SHR BYTE PTR [ESP+17],01
0028:CE5B3618 57 PUSH EDI
在 CALL 中:
0028:CE5B35D6 50 PUSH EAX
0028:CE5B35D7 55 PUSH EBP
0028:CE5B35D8 57 PUSH EDI
0028:CE5B35D9 E8D2FEFFFF CALL CE5B34B0
0028:CE5B35DE C06C241F01 SHR BYTE PTR [ESP+1F],01
0028:CE5B35E3 83C40C ADD ESP,0C
0028:CE5B35E6 0AD8 OR BL,AL
0028:CE5B35E8 664E DEC SI
0028:CE5B35EA 75E1 JNZ CE5B35CD
0028:CE5B35EC C0EB01 SHR BL,01
0028:CE5B35EF 6A64 PUSH 64
0028:CE5B35F1 57 PUSH EDI
0028:CE5B35F2 E8C979FFFF CALL CE5AAFC0
0028:CE5B35F7 8A44241B MOV AL,[ESP+1B]
0028:CE5B35FB 83C408 ADD ESP,08
0028:CE5B35FE 2401 AND AL,01
0028:CE5B3600 50 PUSH EAX
0028:CE5B3601 55 PUSH EBP
0028:CE5B3602 57 PUSH EDI
0028:CE5B3603 E8A8FEFFFF CALL CE5B34B0
0028:CE5B3608 83C40C ADD ESP,0C
0028:CE5B360B 0AD8 OR BL,AL
0028:CE5B360D 66BE0300 MOV SI,0003
0028:CE5B3611 6A64 PUSH 64
0028:CE5B3613 C06C241701 SHR BYTE PTR [ESP+17],01
0028:CE5B3618 57 PUSH EDI
0028:CE5B3619 E8A279FFFF CALL CE5AAFC0
0028:CE5B361E 83C408 ADD ESP,08
0028:CE5B3621 C0EB01 SHR BL,01
0028:CE5B3624 8A442413 MOV AL,[ESP+13]
0028:CE5B3628 2401 AND AL,01
0028:CE5B362A 50 PUSH EAX
0028:CE5B362B 55 PUSH EBP
0028:CE5B362C 57 PUSH EDI
0028:CE5B362D E87EFEFFFF CALL CE5B34B0
0028:CE5B3632 C06C241F01 SHR BYTE PTR [ESP+1F],01
0028:CE5B3637 83C40C ADD ESP,0C
0028:CE5B363A 0AD8 OR BL,AL
0028:CE5B363C 664E DEC SI
0028:CE5B363E 75E1 JNZ CE5B3621
0028:CE5B3640 6A05 PUSH 05
0028:CE5B3642 80E380 AND BL,80
0028:CE5B3645 68DF000000 PUSH 000000DF
0028:CE5B364A 57 PUSH EDI
0028:CE5B364B FF5718 CALL [EDI+18]
0028:CE5B364E 83C40C ADD ESP,0C
0028:CE5B3651 B900000000 MOV ECX,00000000
0028:CE5B3656 80FB01 CMP BL,01
0028:CE5B3659 5D POP EBP
0028:CE5B365A 83D1FF ADC ECX,-01
0028:CE5B365D 5F POP EDI
0028:CE5B365E 6683E103 AND CX,03
0028:CE5B3662 5E POP ESI
0028:CE5B3663 668BC1 MOV AX,CX
0028:CE5B3666 5B POP EBX
0028:CE5B3667 83C404 ADD ESP,04
0028:CE5B366A C3 RET
Ok,看看下面的代码并不能帮助我们什么 ? 我看过几篇关于狗加密的教程.我们做
的这几步,应该是已经完成了.我想,在CALL后面,会有一个关于狗的 CMP ,如果值是
和狗相同,那么就通过,否则就会加上一个错误的旗标…… 但是,我们是不幸运的,
这里不是那么简单!的.通过和代码游戏(跟踪call,寻找一些比较的代码),我按很多
次 F12 ,但是找不到一点好东西!
BTW,我无从这该死的Sentinel的VXD中出来!按住 F12,可是什么都没有变!VDX使我
陷入困境了……我希望回到 Acad.exe 文件中!我不希望破解狗硬件,大多数的时候,
狗保护的弱点一般都是在目标本身!
我试了 BPIO -h 378 R
让我们在 I/O-port 上试试其它的断点 :
378 已经试过了
3BC 这个 ?
278 这个也是 ;o)
OK,运行软件,但是却没有拦截 ;( 我的天啊!
因为它是一个 VDX ,所以我也试了 bpx CreateFileA ,但是走不了多久……
那么,为什么不反汇编它呢?运气好说不定能找到一些在字符串中找到一些关于出错
的信息(不要做梦了,那是不可能有的!!:p)现在你能用工具中的啤酒了 ? 因为我们
要花很长时间去反汇编!!!! 那就是我为什么不用IDA的原因了! BTW, 我们的目标可
执行文件大概是 7.24 mb!好了,现在你知道为什么要花这么多时间了吧..
喝过酒后,一觉醒来.
经过这么长的时间,终于反汇编好了! 首先,保存结果!我们不希望再等那么多时间,不是
吗?如果你的电脑死机或者其它原因,你只有再等那么多时间了!再喝一次酒,呵呵!
完了吗? Ok!
我们愚蠢的想法是去找字符串,运气不佳,没有,其实是意料之中 :p 那么让我们想想!
我们怎样攻击它呢? 我们看看 Import 表吧!看看狗到底调用了什么函数 ? 我们可以找
到一个 “l33t0” API 函数!哈哈,我想会有一些好东西了, 我们来看看内核……
太太太好了 ? 我找到一些有趣的东西了:
DeviceIoControl
从没有看过,但是名称,听起来非常好,不是吗?
呵呵!去除所有的断点只在softice中输入: ‘bc *’ 和: ‘BPX DeviceIocontrol’
现在运行我们的软件! 哈哈,它拦截下来了 ? 按F12,我们跳出了dll文件来到了ACAD.exe
? 让我们和代码玩耍吧…….
先看代码, 我按F12几次直到在一个好位置.下面是来自我的winice.log 的一部分:
:bl
00) BPX KERNEL32!DeviceIoControl // Damn good ?
Break due to BPX KERNEL32!DeviceIoControl
Break due to BPX KERNEL32!DeviceIoControl
Break due to BPX KERNEL32!DeviceIoControl
Break due to BPX KERNEL32!DeviceIoControl
Break due to BPX KERNEL32!DeviceIoControl
Break due to BPX KERNEL32!DeviceIoControl
// 你在这可以看到我在找到好地方之前被拦截下来多少次
// 你用这个 bpx 的时候,你按 F5 3 次,一会有拦截下来,
// 你再按两次后停在了这儿 :
025F:0098B1AF 668B442402 MOV AX,[ESP+02] ; EAX = 一些值
025F:0098B1B4 83C404 ADD ESP,04
025F:0098B1B7 C20800 RET 0008
025F:0098B1BA 8D9B00000000 LEA EBX,[EBX+00000000]
025F:0098B1C0 33C0 XOR EAX,EAX
025F:0098B1C2 8A442408 MOV AL,[ESP+08]
025F:0098B1C6 83F801 CMP EAX,01
025F:0098B1C9 7415 JZ 0098B1E0
025F:0098B1CB 83F802 CMP EAX,02
025F:0098B1CE 7456 JZ 0098B226
025F:0098B1D0 83F803 CMP EAX,03
025F:0098B1D3 0F8497000000 JZ 0098B270
025F:0098B1D9 C20800 RET 0008
// 通过 RET 后,我们落在这儿:
025F:006ABE9A 0FBFC0 MOVSX EAX,AX ; 呵呵 ?
025F:006ABE9D 83F8FF CMP EAX,-01 ; EAX = FFFF ?!
025F:006ABEA0 7405 JZ 006ABEA7 ; 跳转到 6abea7
025F:006ABEA2 25FFFF0000 AND EAX,0000FFFF
025F:006ABEA7 5F POP EDI
025F:006ABEA8 C3 RET ; 返回 ….
// 这是最重要的部分 :
025F:006ABD94 83C404 ADD ESP,04
025F:006ABD97 85C0 TEST EAX,EAX
025F:006ABD99 7C36 JL 006ABDD1
025F:006ABD9B 8D44240C LEA EAX,[ESP+0C]
025F:006ABD9F 50 PUSH EAX
025F:006ABDA0 E8DB000000 CALL 006ABE80
025F:006ABDA5 83C404 ADD ESP,04
025F:006ABDA8 85C0 TEST EAX,EAX
025F:006ABDAA 7C25 JL 006ABDD1
025F:006ABDAC 686071A700 PUSH 00A77160
025F:006ABDB1 E8CA000000 CALL 006ABE80
025F:006ABDB6 83C404 ADD ESP,04
025F:006ABDB9 85C0 TEST EAX,EAX
025F:006ABDBB 7C14 JL 006ABDD1
025F:006ABDBD 68F470A700 PUSH 00A770F4
025F:006ABDC2 E8B9000000 CALL 006ABE80
025F:006ABDC7 83C404 ADD ESP,04
025F:006ABDCA 3DFDDC0000 CMP EAX,0000DCFD ; eax= DCFD?
025F:006ABDCF 7408 JZ 006ABDD9 ; 好! 狗
025F:006ABDD1 47 INC EDI ; 锁住了 ?
025F:006ABDD2 83FF04 CMP EDI,04
025F:006ABDD5 7EA3 JLE 006ABD7A
025F:006ABDD7 EB17 JMP 006ABDF0 ; 知道吗?
025F:006ABDD9 8B0D8871A700 MOV ECX,[00A77188] ;狗在这儿
025F:006ABDDF 6633F6 XOR SI,SI
025F:006ABDE2 A18471A700 MOV EAX,[00A77184]
025F:006ABDE7 8B1481 MOV EDX,[EAX*4+ECX]
025F:006ABDEA C70202000000 MOV DWORD PTR [EDX],00000002
025F:006ABDF0 8B0D8471A700 MOV ECX,[00A77184] ;没有狗:/
025F:006ABDF6 A18871A700 MOV EAX,[00A77188]
025F:006ABDFB 8B1488 MOV EDX,[ECX*4+EAX]
025F:006ABDFE 8D0C88 LEA ECX,[ECX*4+EAX]
025F:006ABE01 8B1D8471A700 MOV EBX,[00A77184]
025F:006ABE07 8B02 MOV EAX,[EDX]
025F:006ABE09 35A9B50000 XOR EAX,0000B5A9
025F:006ABE0E 03C3 ADD EAX,EBX
025F:006ABE10 A3A471A700 MOV [00A771A4],EAX
025F:006ABE15 8B11 MOV EDX,[ECX]
025F:006ABE17 833A00 CMP DWORD PTR [EDX],00
025F:006ABE1A 752F JNZ 006ABE4B
025F:006ABE1C E81F010000 CALL 006ABF40
025F:006ABE21 35A9B50000 XOR EAX,0000B5A9
025F:006ABE26 3D564AFFFF CMP EAX,FFFF4A56
025F:006ABE2B 741E JZ 006ABE4B
————————— 8< ———————- 截取 :p
Ok,我首先想到的是改变:
025F:006ABDCA 3DFDDC0000 CMP EAX,0000DCFD ; 是 eax= DCFD ?
025F:006ABDCF 7408 JZ 006ABDD9 ; 好的! 狗锁住了
成为:
025F:006ABDCA 3DFDDC0000 CMP EAX,0000DCFD
025F:006ABDCF EB08 JMP 006ABDD9 ;不管 EAX 了,我跳 :p
但是,EAX 的值很重要,否则是会崩溃的:( 我们也看到了很多处都调用了 EAX 寄存器
,检查了好几次哦!那么,我们只有暴力使 EAX 的值等于 DCFD 了!
你还不清除吗,新手?EAX的值为什么要等于 DCFD?你没看到:CMP EAX,0000DCFD
吗?先在大家都清楚了吧!
我们到哪去修改目标呢?想想什么时候对 AX 赋值的?我清理一下内存,整理出下面这段
代码:
025F:0098B1AF 668B442402 MOV AX,[ESP+02] ; EAX = 一些值.
025F:0098B1B4 83C404 ADD ESP,04
025F:0098B1B7 C20800 RET 0008
025F:0098B1BA 8D9B00000000 LEA EBX,[EBX+00000000]
025F:0098B1C0 33C0 XOR EAX,EAX
025F:0098B1C2 8A442408 MOV AL,[ESP+08]
025F:0098B1C6 83F801 CMP EAX,01
025F:0098B1C9 7415 JZ 0098B1E0
025F:0098B1CB 83F802 CMP EAX,02
025F:0098B1CE 7456 JZ 0098B226
025F:0098B1D0 83F803 CMP EAX,03
025F:0098B1D3 0F8497000000 JZ 0098B270
025F:0098B1D9 C20800 RET 0008
很老的软件了,我想现在网上应该是找不到了,我也没搜到,所以这篇文章有点四不像吧,整理出来也就这样子了……