• 标 题:转帖【梦醒时分t0db.myetang.com】翻译的:【破解Autodesk AUTOCAD 14 狗加密 】 (15千字)
  • 作 者:toye
  • 时 间:2000-10-22 20:58:51
  • 链 接:http://bbs.pediy.com

怎样破解Autodesk AUTOCAD 14 法语版的狗加密
--------------------------------------------------------------------------------

translate by 梦醒时分
yinqun2000@263.net
http://t0db.myetang.com

级别:中级-高级

所需工具:

Soft ice 3.x
你自己最喜欢的 编辑器 (我一直用 Hexworkshop)
汇编知识 (至少是基础)
Wdasm89 (并不特别需要)
大脑 (你有一个 , 是吗 ? :p )
一些啤酒 :O ( 因为破解这个软件是要很长时间的!)
一些音乐 ;)



历史:

我是很久以前破解这个软件的... ;O

它对我来说很难,而且浪费了我几天时间.最难的部分就是找到检查狗的地方而且我不是用下面我
教你的方法做的!那是一种很复杂的方法...我很蠢的破解了它,而且还常常崩溃!几天前,我完成了
另一个注册机时觉得很烦.所以,我想到除了注册机的破解.那么那个狗保护的Autocad 14?!啊!那
是狗保护!我讨厌狗,而且在这方面几乎没有什么经验...

狗保护是最贵的保护方法,这个软件的售价是$7000左右!(够开一个网吧的了)




让我们来破解它吧:)

BTW,我用好方法破解它大概用了 2 小时 (包括 反汇编: 最长的部分 :p) 这期间没有死机 ;)

1)运行软件 :)

好的.. 让我们来看看这个目标,我安装这个软件非常慢.. 该死的光盘!假设它非常快吧!安装好后,找
到安装目录.有一个 Acad.exe 的可执行文件和其它很多dll文件...我运行这个软件,跳出一个对话框:

"ERREUR FATALE : Le system de securit?verrouillage materiel..."

这是法语, 意思是:

"FATAL ERROR : security system is missing! blablabla"

好的,它就是告诉我们最重要的硬件(*狗*)丢失!哈哈哈

那么... 让我们更深层的看看 ;) 我使用softice设置了在 LPT1上最常用的断点: (BPIO -H 378 R).
我们停在了这儿:


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


'是的!就是你说过的那个地方! *SLAP*!!

呵呵,我们只要使EAX的值永远等于DCFD就行了,代码就变成:

66B8FDDC      MOV    AX,DCFD ; 你知道这是干什么,对吗? ;)
90              NOP            ; 一个 NOP 就是什么都不干!
C20800        RET    0008    ; 不变

Ok,很简单吧? BTW 当你修改的时候不要忘了把代码倒一下,比如: B8FDCD 是 CDFD,
你应该知道我是什么意思,对吗?不??

现在给你的目标打上补丁,运行试试看!

下面就是说软件破解的非常成功,我就不翻译了.
                                           
                           
原文作者:ACiD BuRN [ECLiPSE / Immortal Descendants]

-=-=-=-=-=-=-=-=-=-=-=-[EOF]-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=梦经第四期-=-=-=-=-=-=-=-