• 标 题:看看吧! (7千字)
  • 作 者:软档[hg]
  • 时 间:2001-10-20 11:44:39
  • 链 接:http://bbs.pediy.com

关于破解ShowDep
                                            ——hg 首记
    哎!已经没有什么软件破解了!(不要误解哟,我可不是什么高手,只是我机子上没有什么可以破解的软件了,且我这破机子也没有连上网,网吧老板又不让我用软盘。哎!......)
    于是,随手拿出以前买的光盘。嘿,上边的好东西还真不少呢!我一下便看上了ShowDep(3.0 Beta)。先试试再说吧。
    好了,废话少说,开始吧!

1. 运行ShowDep
2. 用鼠标单击ShowDep菜单->“Help”, 然后再单击“About”
3. 待弹出对话框后请再单击“Register”按钮
  name:hg
  number:78787878
4. ctrl+D, 激活softIce
5. bpx hmemcpy
6. 按F5
7. 用鼠标单击“OK”按钮,这时程序被拦
8. BD *,按F12, 直到进入ShowDep的领空(好像是按26下吧)
9. 当走到 0137:00417290 call 004170B1 时按F8进入(跳过则死了!!)
            .
            .
            .
  0137:00417163  PUSH      EAX
  0137:00417164  LEA      ECX,[EBP-0108]
  0137:0041716A  PUSH      ECX
  0137:0041716B  CALL      00416A80        ;改变number格式(78787878-->0x78787878)只取末8位。
  0137:00417170  ADD      ESP,08
  0137:00417173  TEST      EAX,EAX
  0137:00417175  JZ        00417194
  0137:00417177  MOV      EDX,[EBP-0110]
  0137:0041717D  ADD      EDX,00000104
  0137:00417183  PUSH      EDX
  0137:00417184  MOV      EAX,[EBP-04]
  0137:00417187  PUSH      EAX
  0137:00417188  CALL      00416B60          ;比较核心
  0137:0041718D  ADD      ESP,08
  0137:00417190  TEST      EAX,EAX
  0137:00417192  JNZ      004171B0          ;Eax=1则跳转,注册成功,否则...
  0137:00417194  PUSH      10
  0137:00417196  PUSH      0042B958
  0137:0041719B  PUSH      0042B960
  0137:004171A0  PUSH      00
  0137:004171A2  CALL      [USER32!MessageBoxA]    ;失败窗
  0137:004171A8  OR        EAX,-01
  0137:004171AB  JMP      00417242
            .
            .
            .
10.让我们进入比较核心那个CALL去看看:
            .
            .
            .
  0137:00416B60  PUSH      EBP
  0137:00416B61  MOV      EBP,ESP
  0137:00416B63  SUB      ESP,0C
  0137:00416B66  MOV      DWORD PTR [EBP-0C],12345678    ;设为t1
  0137:00416B6D  MOV      DWORD PTR [EBP-08],23456789    ;设为t2
  0137:00416B74  MOV      DWORD PTR [EBP-04],34567890    ;设为t3
  0137:00416B7B  LEA      EAX,[EBP-0C]
  0137:00416B7E  PUSH      EAX
  0137:00416B7F  MOV      ECX,[EBP+08]
  0137:00416B82  PUSH      ECX
  0137:00416B83  CALL      [KERNEL32!lstrlen]
  0137:00416B89  PUSH      EAX
  0137:00416B8A  MOV      EDX,[EBP+08]
  0137:00416B8D  PUSH      EDX
  0137:00416B8E  CALL      00418C70                ;对name进行运算
  0137:00416B93  ADD      ESP,0C
  0137:00416B96  LEA      EAX,[EBP-0C]
  0137:00416B99  PUSH      EAX
  0137:00416B9A  PUSH      0C
  0137:00416B9C  MOV      ECX,[EBP+0C]
  0137:00416B9F  PUSH      ECX
  0137:00416BA0  CALL      00418C70                ;对number进行运算
  0137:00416BA5  ADD      ESP,0C
  0137:00416BA8  MOV      EDX,[EBP+0C]
  0137:00416BAB  MOV      EAX,[EBP-04]            ;EAX=t3'
  0137:00416BAE  CMP      EAX,[EDX+0C]            ;比较点
  0137:00416BB1  JNZ      00416BBA
  0137:00416BB3  MOV      EAX,00000001            ;EAX与[EDX+0C]相等,则置EAX为1
  0137:00416BB8  JMP      00416BBC
  0137:00416BBA  XOR      EAX,EAX                ;不相等,则置EAX为0
  0137:00416BBC  MOV      ESP,EBP
  0137:00416BBE  POP      EBP
  0137:00416BBF  RET 
                .
  要想简单的破解成为注册版,修改上面两处的任一处均可。
  但当我看到name和number运算的都是同一个Call,而且对number运算的初值还是对name运算的结果。这样的注册机我还没有写过呢!而且和我前次破的Crackme2的算法相似(name和number分别运算后比较)。Crackme2我都写了注册机,这个怎能放过?还是进去看看吧!
11.随便选了个Call进去看看他的运算过程吧
            .
            .
            .
  0137:00418CB7  MOV      EAX,[EDI]              ;t1
  0137:00418CB9  MOV      [EBP-10],EAX
  0137:00418CBC  MOV      ECX,[EDI+04]          ;t2
  0137:00418CBF  MOV      [EBP-0C],ECX
  0137:00418CC2  MOV      EDX,[EDI+08]          ;t3
  0137:00418CC5  MOV      [EBP-08],EDX
  0137:00418CC8  PUSHAD
  0137:00418CC9  CLD
  0137:00418CCA  MOV      ECX,[EBP+0C]
  0137:00418CCD  LEA      EDI,[EBP-0010]
  0137:00418CD3  MOV      ESI,[EBP+08]
  0137:00418CD6  LODSB
  0137:00418CD7  CALL      00418F10              ;进去看吧
  0137:00418CDC  LOOP      00418CD6
  0137:00418CDE  POPAD
  0137:00418CDF  MOV      EAX,[EBP+10]
  0137:00418CE2  MOV      ECX,[EBP-10]
  0137:00418CE5  MOV      EDX,[EBP-0C]
  0137:00418CE8  MOV      [EAX],ECX
  0137:00418CEA  MOV      ECX,[EBP-08]
  0137:00418CED  MOV      [EAX+04],EDX
  0137:00418CF0  MOV      [EAX+08],ECX
  0137:00418CF3  MOV      EAX,[EBP-04]
  0137:00418CF6  POP      EDI
  0137:00418CF7  POP      ESI
  0137:00418CF8  POP      EBX
  0137:00418CF9  MOV      ESP,EBP
  0137:00418CFB  POP      EBP   
            .
            .
12.进入00418CD7 CALL 00418F10
            .
            .
            .
  0137:00418F10  MOV      EBX,[EDI]              ;[EDI]=t1
  0137:00418F12  CALL      00418EE0
  0137:00418F17  MOV      [EDI],EAX
  0137:00418F19  AND      EAX,000000FF
  0137:00418F1E  ADD      EAX,[EDI+04]            ;[EDI+04]=t2
  0137:00418F21  MOV      [EDI+04],EAX
  0137:00418F24  MOV      EDX,08088405
  0137:00418F29  MUL      EDX
  0137:00418F2B  INC      EAX
  0137:00418F2C  MOV      [EDI+04],EAX
  0137:00418F2F  SHR      EAX,18
  0137:00418F32  MOV      EBX,[EDI+08]            ;[EDI+08]=t3
  0137:00418F35  CALL      00418EE0
  0137:00418F3A  MOV      [EDI+08],EAX
  0137:00418F3D  RET 
            .
  进入CALL 00418EE0
           
  0137:00418EE0  MOV      EDX,EBX
  0137:00418EE2  SHR      EDX,08
  0137:00418EE5  XOR      BL,AL
  0137:00418EE7  AND      EBX,000000FF
  0137:00418EED  MOV      EAX,[EBX*4+0042C818]    ;先得抓出这部分的数据,天啦!好多哟。
  0137:00418EF4  XOR      EAX,EDX
  0137:00418EF6  RET
           
  至此,程序已全部在此,算法也一目了然。
  但是,这有一个问题。那就是运算过程中舍去了一些值,且最后的t1,t2,t3三个值,只有t3拿出来比较(比较点处EAX值就是t3)。但我看到与t3比较的[EDX+0C]始终为0(其实我在这犯了个错误),好吧,那我就用穷举法算几个结果来分析看看吧。
  先得处理抓出的数据。(只有编程处理啦,什么?可不可以手工处理。#@$%^&~~~晕!只有交给你来哟) 
        .
        .
        .
        .
        .
        .
  哎,终于编完了。
  跑一跑,看看怎么样?天呀!怎么这么慢呀。(没办法啦,要处理256*256*256*256*8次啦,其中还有32位的乘法运算,查表运算........)
  ......ZZZzzz......zzzZZZ......   
  几个小时之后,终于完了。什么?没有结果......(对不起了,编程有个小错误,晕~~~~~~~~~~~倒)
  妈的,我改,改了再跑。
  ......zzzZZZ......zzzZZZ......
  又是几个小时。什么?还是没有结果。(晕~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~)
 
  再次分析了一下程序和数据,终于发现t3无论怎么样也不可能为0。但与t3比较的[EDX+0C]怎么会为0呢?于是我监视了[EDX+0C]所在的内存区域,发现这个区域只有在程序开始时才从注册表中读入数据。但是在没有注册成功前注册表中并不能提供任何可用数据,且在注册成功后这些数据才会添加进注册表中。
  于是,我得出结论:该软件不能被正常注册,除非Crack或直接改写(添加)注册表信息!(有没有搞错!居然有这种事情)
  于是,我试着在比较点处改写[EDX+0C]为EAX中的值,注册成功。重启ShowDep,已是注册版,Register to: hg
  再看注册表中的值,新添了"RegName","RegNumber"。
  如下:
  [HKEY_CURRENT_USER\Software\Sergey Sorokin\ShowDep\2.00]
    "RegName"="hg"
    "RegNumber"=hex:78,78,78,78,00,00,00,00,00,00,00,00,3e,f2,2d,6a
   
    RegNumber中存放的就是输入的数字(变型后的,超过八位只取最后八位),t3的值,还为t1,t2预留了空间呢。
   
   
 
    初次写文章,如有不足之处,见谅!
    如有错误或任何意见,请E-mail到hghanguang@163.com