首页
社区
课程
招聘
[原创]picad2006update200707加密狗的爆破
发表于: 2007-9-25 21:02 9928

[原创]picad2006update200707加密狗的爆破

2007-9-25 21:02
9928

1                                              picad2006update200707加密狗的爆破
                                             ——无狗也能打狗,菜鸟笨拙破解

标 题: picad2006update200707加密狗的爆破
作 者: chinglq
时 间: 2007-09-25
链 接:  
详细信息:

【破解工具】OD v1.10汉化第二版
【破解平台】xpsp2
【破解目的】解密练习
【软件名称】PICAD2006
【原版下载】http://www.picad.com.cn/4_download.htm
【软件简介】官网上共三个文件:Picad2006 [24.5M]、Picad2006Update [1.5M]、Picad2006Update200707。依次安装。
    适合机械类专业用的国产CAD软件,保护方式是:加密狗或注册码。属于功能限制类。

1. 破解过程:
    首先用PEiD检测,无壳,是VC++6.0编的。
    依据程序启动提示,用OD装载后,来到这里:

0051869B  |. /74 24                    je      short 005186C1
0051869D  |. |6A 00                    push    0                                    ; 最远的必经之路
0051869F  |. |6A 00                    push    0
005186A1  |. |68 0080CF00              push    0CF8000
005186A6  |. |68 12270000              push    2712
005186AB  |. |8B55 F0                  mov     edx, dword ptr [ebp-10]
005186AE  |. |8B02                     mov     eax, dword ptr [edx]
005186B0  |. |8B4D F0                  mov     ecx, dword ptr [ebp-10]
005186B3  |. |FF90 C0000000            call    dword ptr [eax+C0]
005186B9  |. |85C0                     test    eax, eax
005186BB  |. |0F85 88000000            jnz     00518749                              ; 第一段
005186C1  |> \837D F0 00               cmp     dword ptr [ebp-10], 0
                --------------------------------
00518744  |.  E9 26020000              jmp     0051896F                              ; 绕道
00518749  |>  E8 4C7E0600              call    0058059A                              ; 断点   按F7追进
0051874E  |.  85C0                     test    eax, eax
00518750  |.  0F95C0                   setne   al
00518753  |.  8B4D F0                  mov     ecx, dword ptr [ebp-10]
00518756  |.  8881 C4000000            mov     byte ptr [ecx+C4], al
0051875C  |.  8B55 F0                  mov     edx, dword ptr [ebp-10]
0051875F  |.  33C0                     xor     eax, eax
00518761  |.  8A82 C4000000            mov     al, byte ptr [edx+C4]
00518767  |.  85C0                     test    eax, eax
00518769  |.  0F84 A8000000            je      00518817                              ; 最后一道防线 -->jne  00518817
0051876F  |.  6A 31                    push    31
00518771  |.  8D4D C0                  lea     ecx, dword ptr [ebp-40]
00518774  |.  E8 A75C0400              call    0055E420
00518779  |.  50                       push    eax                                   ; |Title
0051877A  |.  68 DC506000              push    006050DC                              ; |没有加密授权,无法使用存盘等功能!
0051877F  |.  8B4D F0                  mov     ecx, dword ptr [ebp-10]               ; |
00518782  |.  8B51 20                  mov     edx, dword ptr [ecx+20]               ; |
00518785  |.  52                       push    edx                                   ; |hOwner
00518786  |.  FF15 C44A5D00            call    dword ptr [<&USER32.MessageBoxA>]     ; \MessageBoxA
0051878C  |.  83F8 02                  cmp     eax, 2
0051878F  |.  0F85 82000000            jnz     00518817
00518795  |.  8B45 F0                  mov     eax, dword ptr [ebp-10]

    首先在最远的必经之路下断点,在0051869D-005186BB、00518749-00518769这两段各有一个CALL,第一次调试发现第一段的CALL没什么,

所以改断点到00518749的CALL(也只有这一个地方啦),由此追进:

0058059A  /$  55                       push    ebp
0058059B  |.  8BEC                     mov     ebp, esp
                     --------------------------------------
00580681  |.  50                       push    eax                                          ; /IniFileName
00580682  |.  6A 28                    push    28                                           ; |BufSize = 28 (40.)
00580684  |.  8D85 C4FBFFFF            lea     eax, dword ptr [ebp-43C]                     ; |
0058068A  |.  50                       push    eax                                          ; |ReturnBuffer
0058068B  |.  68 B8676200              push    006267B8                                     ; |Default = ""
00580690  |.  68 78DE6000              push    0060DE78                                     ; |Key = "HeatBeat"
00580695  |.  68 84DE6000              push    0060DE84                                     ; |Section = "RockInfo"
0058069A  |.  FF15 84315D00            call    dword ptr [<&KERNEL32.GetPrivateProfileStrin>; \GetPrivateProfileStringA
                  ---------------------------------------------
00580772  |.  50                       push    eax                                          ; /IniFileName
00580773  |.  6A 14                    push    14                                           ; |BufSize = 14 (20.)
00580775  |.  8D8D A4FBFFFF            lea     ecx, dword ptr [ebp-45C]                     ; |
0058077B  |.  51                       push    ecx                                          ; |ReturnBuffer
0058077C  |.  68 C0676200              push    006267C0                                     ; |Default = ""
00580781  |.  68 C0DE6000              push    0060DEC0                                     ; |Key = "RockType"
00580786  |.  68 CCDE6000              push    0060DECC                                     ; |Section = "RockInfo"
0058078B  |.  FF15 84315D00            call    dword ptr [<&KERNEL32.GetPrivateProfileStrin>; \GetPrivateProfileStringA
00580791  |.  C645 FC 00               mov     byte ptr [ebp-4], 0
00580795  |.  8D8D 94FBFFFF            lea     ecx, dword ptr [ebp-46C]
0058079B  |.  E8 BC000300              call    <jmp.&MFC42.#800_CString::~CString>
005807A0  |.  8D95 A4FBFFFF            lea     edx, dword ptr [ebp-45C]
005807A6  |.  52                       push    edx                                          ; /s
005807A7  |.  FF15 F43E5D00            call    dword ptr [<&MSVCRT.atol>]                   ; \atol
005807AD  |.  83C4 04                  add     esp, 4
005807B0  |.  8985 C0FBFFFF            mov     dword ptr [ebp-440], eax
005807B6  |.  8B85 C0FBFFFF            mov     eax, dword ptr [ebp-440]
005807BC  |.  8945 C8                  mov     dword ptr [ebp-38], eax
005807BF  |.  8D8D C0FBFFFF            lea     ecx, dword ptr [ebp-440]
005807C5  |.  51                       push    ecx                                          ; /Arg1
005807C6  |.  E8 F5180300              call    005B20C0                                     ; \Picad.005B20C0 ; 按F7追进
005807CB  |.  8985 BCFBFFFF            mov     dword ptr [ebp-444], eax
005807D1  |.  83BD BCFBFFFF 00         cmp     dword ptr [ebp-444], 0
005807D8  |.  0F85 89000000            jnz     00580867
                    ----------------------------------------------------------------
0058083E  |.  50                       push    eax                                          ; /FileName
0058083F  |.  8D95 C4FBFFFF            lea     edx, dword ptr [ebp-43C]                     ; |
00580845  |.  52                       push    edx                                          ; |String
00580846  |.  68 E8DE6000              push    0060DEE8                                     ; |Key = "RockType"
0058084B  |.  68 F4DE6000              push    0060DEF4                                     ; |Section = "RockInfo"
00580850  |.  FF15 B4315D00            call    dword ptr [<&KERNEL32.WritePrivateProfileStr>; \WritePrivateProfileStringA
                  -----------------------------------------------
005808FC  |.  8BE5                     mov     esp, ebp
005808FE  |.  5D                       pop     ebp
005808FF  \.  C3                       retn

    呵呵!看到了Key = "RockType"和Section = "RockInfo",还有读写配置文件呢!狗来啦!狗来啦!查仔细点,好啦,就在005807C6那里

。追进:

005B20C0  /$  6A FF                    push    -1
005B20C2  |.  68 29275D00              push    005D2729                                     ;  SE 处理程序安装
005B20C7  |.  64:A1 00000000           mov     eax, dword ptr fs:[0]
005B20CD  |.  50                       push    eax
005B20CE  |.  64:8925 00000000         mov     dword ptr fs:[0], esp
005B20D5  |.  81EC 0C040000            sub     esp, 40C
005B20DB  |.  56                       push    esi
005B20DC  |.  E8 6BE8FFFF              call    <jmp.&MFC42.#1168_AfxGetModuleState>
005B20E1  |.  8B40 04                  mov     eax, dword ptr [eax+4]
005B20E4  |.  8D4C24 0C                lea     ecx, dword ptr [esp+C]
005B20E8  |.  68 00040000              push    400                                          ; /BufSize = 400 (1024.)
005B20ED  |.  51                       push    ecx                                          ; |PathBuffer
005B20EE  |.  8B50 6C                  mov     edx, dword ptr [eax+6C]                      ; |
005B20F1  |.  52                       push    edx                                          ; |hModule
005B20F2  |.  FF15 88315D00            call    dword ptr [<&KERNEL32.GetModuleFileNameA>]   ; \GetModuleFileNameA
005B20F8  |.  8D4424 0C                lea     eax, dword ptr [esp+C]
005B20FC  |.  B9 28D86200              mov     ecx, 0062D828
005B2101  |.  50                       push    eax
005B2102  |.  E8 51E8FFFF              call    <jmp.&MFC42.#860_CString::operator=>
005B2107  |.  6A 5C                    push    5C
005B2109  |.  B9 28D86200              mov     ecx, 0062D828
005B210E  |.  E8 AFEDFFFF              call    <jmp.&MFC42.#5683_CString::ReverseFind>
005B2113  |.  40                       inc     eax
005B2114  |.  8D4C24 04                lea     ecx, dword ptr [esp+4]
005B2118  |.  50                       push    eax
005B2119  |.  6A 00                    push    0
005B211B  |.  51                       push    ecx
005B211C  |.  B9 28D86200              mov     ecx, 0062D828
005B2121  |.  E8 78EDFFFF              call    <jmp.&MFC42.#4278_CString::Mid>
005B2126  |.  50                       push    eax
005B2127  |.  B9 28D86200              mov     ecx, 0062D828
005B212C  |.  C78424 1C040000 00000000 mov     dword ptr [esp+41C], 0
005B2137  |.  E8 B0E7FFFF              call    <jmp.&MFC42.#858_CString::operator=>
005B213C  |.  83CE FF                  or      esi, FFFFFFFF
005B213F  |.  8D4C24 04                lea     ecx, dword ptr [esp+4]
005B2143  |.  89B424 18040000          mov     dword ptr [esp+418], esi
005B214A  |.  E8 0DE7FFFF              call    <jmp.&MFC42.#800_CString::~CString>
005B214F  |.  8B0D 2CD86200            mov     ecx, dword ptr [62D82C]                      ; 得到狗标记
005B2155  |.  85C9                     test    ecx, ecx
005B2157  |.  75 3F                    jnz     short 005B2198                               ; -->nop   nop
005B2159  |.  6A 04                    push    4
005B215B  |.  E8 2CE7FFFF              call    <jmp.&MFC42.#823_operator new>
005B2160  |.  83C4 04                  add     esp, 4
005B2163  |.  894424 08                mov     dword ptr [esp+8], eax
005B2167  |.  85C0                     test    eax, eax
005B2169  |.  C78424 18040000 01000000 mov     dword ptr [esp+418], 1
005B2174  |.  74 09                    je      short 005B217F
005B2176  |.  8BC8                     mov     ecx, eax
005B2178  |.  E8 33020000              call    005B23B0
005B217D  |.  EB 02                    jmp     short 005B2181
005B217F  |>  33C0                     xor     eax, eax
005B2181  |>  8BC8                     mov     ecx, eax
005B2183  |.  89B424 18040000          mov     dword ptr [esp+418], esi
005B218A  |.  85C0                     test    eax, eax
005B218C  |.  890D 2CD86200            mov     dword ptr [62D82C], ecx                      ; 写狗标记
005B2192  |.  75 04                    jnz     short 005B2198                               ; -->nop   nop
005B2194  |.  8BC6                     mov     eax, esi
005B2196  |.  EB 1A                    jmp     short 005B21B2                               ; 有狗就跳
005B2198  |>  8BB424 20040000          mov     esi, dword ptr [esp+420]
005B219F  |.  8B16                     mov     edx, dword ptr [esi]
005B21A1  |.  52                       push    edx
005B21A2  |.  E8 29020000              call    005B23D0                                     ; \Picad.005B23D0 ; 注册码比较
005B21A7  |.  33C9                     xor     ecx, ecx
005B21A9  |.  8906                     mov     dword ptr [esi], eax
005B21AB  |.  85C0                     test    eax, eax
005B21AD  |.  0F9CC1                   setl    cl
005B21B0  |.  8BC1                     mov     eax, ecx
005B21B2  |>  8B8C24 10040000          mov     ecx, dword ptr [esp+410]
005B21B9  |.  5E                       pop     esi
005B21BA  |.  64:890D 00000000         mov     dword ptr fs:[0], ecx
005B21C1  |.  81C4 18040000            add     esp, 418
005B21C7  \.  C2 0400                  retn    4

   呵呵,狗检验和注册检验都有!还必须先检查狗,有狗就不管注册。无狗才查注册,且费时较长。由于启动检验只是作以警告,功能使用时

还要另行检验,这一部分就让它跳过费时的注册检验能快速启动就行了,共改动三处跳转。重要的是发现了狗标记[62D82C],这个地方隐藏着

关键性的东西。无狗破解不可能知道正确内容,但爆破是不用管内容的。只要在调用它时,报喜不报忧就行。这样,在整个程序搜索一下,共

有六处,分为四段程序。上面有两个,下面一段有两个:

005B21D0  /$  56                        push    esi
005B21D1  |.  8B35 2CD86200             mov     esi, dword ptr [62D82C]
005B21D7  |.  85F6                      test    esi, esi
005B21D9  |.  74 10                     je      short 005B21EB
005B21DB  |.  8BCE                      mov     ecx, esi
005B21DD  |.  E8 DE010000               call    005B23C0
005B21E2  |.  56                        push    esi                                  ; /block
005B21E3  |.  E8 9EE6FFFF               call    <jmp.&MFC42.#825_operator delete>    ; \free
005B21E8  |.  83C4 04                   add     esp, 4
005B21EB  |>  C705 2CD86200 00000000    mov     dword ptr [62D82C], 0
005B21F5  |.  33C0                      xor     eax, eax
005B21F7  |.  5E                        pop     esi
005B21F8  \.  C3                        retn

    这段程序调用就赋零清空,估计是初始化时用的。可以不用理它,再看看下面两段:

005B2200   $  8B0D 2CD86200             mov     ecx, dword ptr [62D82C]
005B2206   .  85C9                      test    ecx, ecx
005B2208      75 04                     jnz     short 005B220E                   ---\  B800000000    mov   eax, 0
005B220A   .  83C8 FF                   or      eax, FFFFFFFF                    ---/
005B220D   .  C3                        retn
005B220E   >  E9 4D050000               jmp     005B2760
                 ............................
005B2760   > \8B09                      mov     ecx, dword ptr [ecx]
005B2762   .  85C9                      test    ecx, ecx
005B2764      74 05                     je      short 005B276B
005B2766   .  8B01                      mov     eax, dword ptr [ecx]
005B2768   .  FF60 0C                   jmp     dword ptr [eax+C]
005B276B   >  83C8 FF                   or      eax, FFFFFFFF
005B276E   .  C3                        retn

------------------------------------------------------------------------

005B2390  /$  8B0D 2CD86200             mov     ecx, dword ptr [62D82C]
005B2396  |.  85C9                      test    ecx, ecx
005B2398  |.  74 05                     je      short 005B239F                   ---\  E8D1030000    call  005B2770
005B239A  |.  E8 D1030000               call    005B2770                            |  B800000000    mov   eax, 0
005B239F  |>  83C8 FF                   or      eax, FFFFFFFF                    ---/
005B23A2  \.  C3                        retn

    终于来到关键地方了!这两段调用了狗标记的值,还输出成功与否的EAX值。那就动手吧,在前边就动,令EAX=0就行。改好程序试一下:

启动特快,功能限制解除,显示“您使用的是硬加密,可以不注册软件。”,哈哈哈!欣喜若狂!……慢着!嘭!弹出一个对话框:“加密锁

失效,无法使用存盘等功能!”,蒙了!难道还有暗桩?甭急,先检查检查。各项功能依然能够使用,原来是虚惊一场。这好办,打开OD先看看



0050C598  /.  55                        push    ebp
0050C599  |.  8BEC                      mov     ebp, esp
0050C59B  |.  51                        push    ecx
0050C59C  |.  894D FC                   mov     dword ptr [ebp-4], ecx
0050C59F  |.  E8 FCD90900               call    005A9FA0                             ; 好象是检测注册与否
0050C5A4  |.  833D 30D86200 00          cmp     dword ptr [62D830], 0
0050C5AB  |.  7E 33                     jle     short 0050C5E0
0050C5AD  |.  A1 EC496200               mov     eax, dword ptr [6249EC]
0050C5B2  |.  83C0 01                   add     eax, 1                               ; 记数器
0050C5B5  |.  A3 EC496200               mov     dword ptr [6249EC], eax
0050C5BA  |.  A1 30D86200               mov     eax, dword ptr [62D830]
0050C5BF  |.  D1E0                      shl     eax, 1
0050C5C1  |.  99                        cdq
0050C5C2  |.  B9 1E000000               mov     ecx, 1E
0050C5C7  |.  F7F9                      idiv    ecx
0050C5C9  |.  3905 EC496200             cmp     dword ptr [6249EC], eax
0050C5CF  |.  7C 0F                     jl      short 0050C5E0
0050C5D1  |.  E8 BA5D0A00               call    005B2390                             ; 检测狗标记
0050C5D6  |.  C705 EC496200 00000000    mov     dword ptr [6249EC], 0
0050C5E0  |>  8B55 FC                   mov     edx, dword ptr [ebp-4]
0050C5E3  |.  33C0                      xor     eax, eax
0050C5E5  |.  8A82 C4000000             mov     al, byte ptr [edx+C4]
0050C5EB  |.  85C0                      test    eax, eax
0050C5ED  |.  74 3F                     je      short 0050C62E
0050C5EF  |.  8B0D F0496200             mov     ecx, dword ptr [6249F0]
0050C5F5  |.  83C1 01                   add     ecx, 1                               ; 记数器
0050C5F8  |.  890D F0496200             mov     dword ptr [6249F0], ecx
0050C5FE  |.  833D F0496200 1E          cmp     dword ptr [6249F0], 1E
0050C605  |.  7C 27                     jl      short 0050C62E
0050C607  |.  C705 F0496200 00000000    mov     dword ptr [6249F0], 0
0050C611  |.  E8 EA5B0A00               call    005B2200                             ; 检测狗标记
0050C616  |.  85C0                      test    eax, eax
0050C618  |.  75 14                     jnz     short 0050C62E
0050C61A  |.  6A 10                     push    10
0050C61C  |.  68 A04E6000               push    00604EA0                             ;  ASCII "PICAD"
0050C621  |.  68 A84E6000               push    00604EA8                             ;  加密锁失效,无法使用存盘等功能!
0050C626  |.  8B4D FC                   mov     ecx, dword ptr [ebp-4]
0050C629  |.  E8 10450A00               call    <jmp.&MFC42.#4224_CWnd::MessageBoxA>
0050C62E  |>  8B55 08                   mov     edx, dword ptr [ebp+8]
0050C631  |.  52                        push    edx                                  ; /Arg1
0050C632  |.  8B4D FC                   mov     ecx, dword ptr [ebp-4]               ; |
0050C635  |.  E8 F60C0000               call    0050D330                             ; \Picad.0050D330
0050C63A  |.  8BE5                      mov     esp, ebp
0050C63C  |.  5D                        pop     ebp
0050C63D  \.  C2 0400                   retn    4

    先分析一下:看到两个熟悉的CALL,检测狗标记的,还有两个记数器,大概是定时检测狗的。未改动不见它出来,改后便频繁出现,莫非

检测方式不同?下好断点,调试一下。程序连续不断反复运行,果然是定时检测狗(和注册标志)的。第一个CALL就使EAX=1,以后都是入1出0

,难怪后面应付不了。为了满足入0出0,入1出1的需要,看来得重新修改那关键两段程序了。在程序中不改变EAX的值,直接让它跳到返回语句。改动如下:

005B2208 7504                    jne 005B220E          --->           ; EB03    jmp short 005B220D
                                     。。。。。。。。。。。。。。。。。。。。。。。。
005B2398 7405                    je 005B239F          --->            ; EB08    jmp short 005B23A2

再一试,大功告成,全部OK!
    好啦,抄下地址,打开UltraEdit-32改吧:

00518769      0F84 A8000000      --->   0F85 A8000000
005B2157      753F                       --->   9090
005B2192      7504                       --->   9090
005B2208      7504                       --->   EB03
005B2398      7405                       --->   EB08

2. 过程总结
    这是菜鸟学破解的处女作,不懂汇编,只知道跳转和赋值,方法粗苯至极,让行家见笑了。还请多多指教!
    确定关键CALL的方法极不正规:依据EAX值,入0出1,则不正常,需要按F7追进。望能指点正道!
    尽管不懂汇编,但有VB编程基础,查看跳转,还算凑合。菜鸟也能打狗,实乃万幸也!
    方法苯拙,让方家见笑。若能指点巧妙正规的方法,本人不胜感激!
    本文权作中秋献礼,祝大家中秋快乐!


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 7
支持
分享
最新回复 (3)
雪    币: 201
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
狗狗没弄过,纯支持
2007-9-25 21:20
0
雪    币: 207
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
又分析了一下程序,启动检测部分也可以这样改为有狗:
005B2155  |.  85C9           test    ecx, ecx                      ; -->8BC1    mov    eax, ecx
005B2157  |.  75 3F          jnz     short 005B2198                ; -->EB59    jmp    short 005B21B2
已调试成功!
2007-9-28 08:45
0
雪    币: 205
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
下了功夫啊,跟踪起来很费时
2007-9-28 12:06
0
游客
登录 | 注册 方可回帖
返回
// // 统计代码