破解文库——专门收集破解教程，及一切与破解有关的资料，现有文章数千篇

【葵花宝典：t.K.C.的破解教程——中译文】 翻译：李昂


首页

中 华 电 脑 书 库
http://www.pcbookcn.com
声明：本站所制作的书籍仅供个人学习,交流,研究之用。版权归原 作者和原出版物所有。如要作其它用途请直接与版权所有者联系。


                    TUT01

由于大家的要求,我决定写windows程序的破解教程,但是这回我将教你怎样使用W32Dasm.我将不给你更
详细叙述破解的方法,但是它应该能帮助你掌握破解的技巧.当使用W32Dasm的时候,它不会给你序列号或
注册码,它只是告诉你在哪儿或怎样修改程序,以便你能输入任何注册码注册.而且,这些也是我每次破解
时都要做的,这篇入门将告诉你我是怎样一步一步做的.

 工具：
你需要以下的工具 ：(我使用这些工具,我假定你也将使用它们)
W32Dasm 8.5或高的版本,Hacker's view5.24,
Norton Commander 或 Windows Command
Turbo PASCAL7.0 TASM,和TLINK 3.0
或请求cracker们给你这些工具,它们将很乐意帮助你!:-)

 内容

1)
破解Quick View Plus 4.0的方法
    2)破解HEX Workshop2.51的方法
    3)做自己的补丁程序方法

                PART1 ：Quick View Plus 4.0

Step 1.	执行 ORDER32.EXE.

Step 2.	单击$49单用户许可(你也可单击$59),接着,ACCEPT,接着,UNLOCK BY PHONE.

Step 3.	为了得到出错信息输入任何注册码.(你应该把这信息写下来),单击cancle退出程序.

Step 4.	执行诺顿指挥官,到QVP的目录.

Step 5.	复制order.exe到order.exx(备份用)和1.exe(w32dasm用)

Step 6.	执行W32Dasm,反编译1.EXE.

Step 7.	反编译后,单击STRING DATA REFERENCE,向下找到"You have entered an incorrect
           code.Please check your entry"(你应该记得那个出错信息)双击它.

Step 8.	关上SDR窗口,你应该看到行：
    * Possible reference to String Resource ID=00041: "You have entered...
            :004049F8 6A29             push 00000029
            :004049FA FF353CCE4000     push DWORD ptr [0040CE3C]

Step 9.	现在你必须向上寻找最后的CMP,JNE,JE,TEST以及其它与比较有关的东西等等.按上箭头到你发
    现：
     :004049CD 755A             jne 00404A29
            * Possible reference to String Resource ID=00032: "You must select...
            :004049CF 6A20             push 00000020

    ...
          ...
            * Possible reference to String Resource ID=00040: "Unlock Error"

Step 10.现在你知道当你输入错误的注册码的时候它将跳入哪里执行.
        你现在看一看当你用"je"替换"jne"的时候,它是否将运行.
        确保光棒在 :004049CD 755A jne 00404A29上,你应该可以看见状态栏里有
        @Offset 00003DCDh.它是你要在order32.EXE中修补的地方.

Step 11.执行HIEW ORDER32.EXE,按F4并选反编译模式,按F5输入3DCD.你应该能看见：
    00003DCD: 755A                    jne 000003E29
        00003DCF: 6A20                    push 020
           00003DD1: FF15                    call w,[di]

Step 12.那个是你能改变字节,按F3,输入74,按F9使之更新ORDER32.EXE.退出HIEW.

Step 13.执行ORDER32.EXE输入任何注册码.Voila!你已经使QVP 4.0破解了!
    当心!你输入真正的注册码它将跳到出错信息.

Step 14.让HIEW ORDER32.EXE,按F4,选择译码,按F5和输入3DCD再一次运行.按F3——输入EB——按F9.它
    将直接跳到unlocked dialog.

                PART2 ：HEX WORKSHOP2.51

Step 1.	执行HWORKS32.EXE

Step 2.	单击帮助

Step 3.	为了得到出错信息,输入任何注册码(你应该把这信息写下来),然后退出程序.

Step 4.	执行Norton Commander,进入HW目录.

Step 5.	把HWORKS32.EXE复制到HWORKS32.EXX(备份)和1.EXE(W32Dasm用).

Step 6.	执行W32Dasm,反编译1.EXE.

Step 7.	反编译后,单击find输入"You have entered an"(你应该记得那个出错信息)——找到它
    (你在SDR窗找不到它!)

Step 8.	现在你应该看到：

     Name: DialogID_0075, # of Controls=003, Caption:"Registration Unsucce..
        001-ControlID:FFFF, Control Class:""Control Text:"You have entered an..
        002-ControlID:FFFF, Control Class:""Control Text:"Please confirm you..
Step 9.	Ok,你知道输入注册码错误时候它将使用的什么ControlID,单击find输入dalogid_0075"：

        * Possible reference to DialogID_0075
        :0041E233 6A75             push 00000075
        :0041E235 8D8D10FFFFFF     lea ecx, DWORD ptr [ebp+FF10]
Step 10.你必须在报错的对话框前面寻找最后的CMP,JNE,JE,以及其它等等比较的代码.
         :0041E145 837DEC00         cmp DWORD ptr [ebp-14], 00000000
         :0041E149 0F8479000000     je 0041E1C8
         :0041E14F 8B8DFCFEFFFF     mov ecx, DWORD ptr [ebp+FEFC]
Step 11.现在看一看当你用"jne"替换"je"的时候,它是否将运行.
         确保光棒是在 :0041E149 0F8479000000 je 0041E1C8上.看状态栏,你可以看到偏移量@Offset
         0001D549h. 这就是你要打补丁的地方.

Step 12. 回到 Norton Commander, 执行 HIEW HWorks32.exe, 按 F4 选择反编译模式 Decode mode (ASM),
      按 F5 输入1D549. 你可以看到:

         0001D549: 0F847900               je     00001D5C6   ---------- (1)
         0001D54D: 0000                   add    [bx][si],al
         0001D54F: 8B8DFCFE               mov    cx,[di][0FEFC]

Step 13. 这就是你要修改的地方,按F3,输入0F85,按F9来更新HWorks32.exe.退出 HIEW.

Step 14. 执行 HWorks32.exe , 输入任何注册码, does it work? NO?!?
         呵呵,别着急,回到 NC.拷贝HWORKS32.EXX 到 HWorks32.exe.
         (现在应该你知到为什么要有三个拷贝了).回到 W32Dasm,
         你将还在你刚才所在的地方 (0041E145).

Step 15. 按 F3 再一次查找 "dialogid_0075", 你可以找到:

         * Possible reference to DialogID_0075
         :00430ADD 6A75             push 00000075
         :00430ADF 8D8D10FFFFFF     lea ecx, DWORD ptr [ebp+FF10]

Step 16. 你必须在报错的对话框前面寻找最后的CMP,JNE,JE,以及其它等等比较的代码.按 UP直到:

         :004309EF 837DEC00         cmp DWORD ptr [ebp-14], 00000000
         :004309F3 0F8479000000     je 00430A72
         :004309F9 8B8DFCFEFFFF     mov ecx, DWORD ptr [ebp+FEFC]

Step 17. 现在看一看当你用"jne"替换"je"的时候,它是否将运行.
         (应该工作了吧) 移动光棒到 :004309F3 0F8479000000 je 00430A72.
         你可以看到偏移量 @Offset 0002FDF3h. 这就是你要打补丁的地方.

Step 18. 回到 Norton Commander, 执行 HIEW HWorks32.exe, 按 F4 选择反编译模式, 按 F5输入 2FDF3.
     你可以看到:

         0002FDF3: 0F847900               je     00001D5C6   ---------- (1)
         0002FDF7: 0000                   add    [bx][si],al
         0002FDF9: 8B8DFCFE               mov    cx,[di][0FEFC]

Step 19. 这就是你要修改的地方, 按 F3, 输入0F85,按 F9来更新HWorks32.exe.退出 HIEW.

Step 20. 执行 HWorks32.exe , 输入任意的注册码, does it work? Voila!!
         祝贺你! 你已经破解了 HEX WorkShop 2.51!

PART 3: 补丁(注册机)

Pascal源程序:

------------------------<剪切这里>-------------------------------------------
Uses Crt;

 Const A: Array[1..1] of Record {<-------- 1 byte to be patched}
                          A : Longint;
                          B : Byte;
                         End =
((A:$3DCD;B:$EB)); {<--------------- offset "3DCD" and byte "EB" to be changed}

Var Ch:Char;
    I:Byte;
    F:File;
    FN:file of byte;
    Size:longint;

Begin
 Writeln('TKC''s Little Patch');writeln('Crack for QVP 4.0 by TKC/PC ''97');
 Assign(F,'ORDER32.EXE'); {<-------------- filename to be patched}
 {$I-} Reset(F,1); {$I+}
 if Ioresult <> 0 then
    begin
    writeln('File 不 found!');
    halt(1);
    end;
 For I:=1 to 1 do {<---------------------- 1 byte to be patched}
 Begin
  Seek(F,A[I].A);
  Ch:=Char(A[I].B);
  Blockwrite(F,Ch,1);
 End;
 Writeln('File successfully patched!');
End.
------------------------<剪切这里>-------------------------------------------

汇编源程序:

------------------------<剪切这里>-------------------------------------------
DOSSEG
.MODEL SMALL
.STACK 500h
.DATA
.CODE
PatchL         EQU 6
Buffer         Db  PatchL Dup(1)
handle   dw ?
intro    db "TKC's Little Patch",0dh,0ah,"Crack for QVP 4.0 by TKC/PC '97$"
FileName db "ORDER32.EXE",0 ;<------- filename to be patched
notfound db 0dh,0ah,"File not found!$"
cracked  db 0dh,0ah,"File successfully patched. Enjoy!$"
Cant     db 0dh,0ah,"Can't write to file.$"
Done     db "File has been made.$"
String   db 0EBh,0 ;<------------- byte "EB" to be patched

START:
mov     ax,cs
mov     ds,ax
mov     dx,offset intro    ;point to the time prompt
mov     ah,9                    ;DOS: print string
int     21h
jmp openfile

openfile:
mov     ax,cs
mov     ds,ax
mov     ax,3d02h
mov     dx,offset FileName
int     21h
mov     handle,ax
cmp     ax,02h
je      filedontexist
jmp     write

filedontexist:
mov     ax,cs
mov     ds,ax
mov     dx,offset not found
mov     ah,9                    ;DOS: print string
int     21h                     ;display the time prompt
jmp exit

Write:
mov     bx,handle
mov     cx,0000h
mov     dx,3DCDh ;<------------- offset "3DCD"
mov	ax,4200h
int     21h
mov     cx,patchl
mov     dx,offset String
mov     ah,40h
mov     cx,01h
int     21h
mov     ax,cs
mov     ds,ax
mov     dx,offset cracked
mov     ah,9                    ;DOS: print string
int     21h                     ;display the time prompt
jmp Exit

Exit:
mov     ah,3eh
int     21h
mov     ax,4c00h
int     21h
END START
--------------------------<剪切这里>-----------------------------------------

最后:

这里是一些破解重要用的基本的东西:
(译者:作者所写的没有多少所以我把看雪学苑教程的一部分摘录在这里,但由于文本文件的缘故,排版有很大困难,以下详见http://toye.yeah.net看雪学苑的教程--chm格式带破解例程3.67m)

一、状态寄存器

PSW(Program Flag)程序状态字寄存器,是一个16位寄存器,由条件码标志(flag)和控制标志构成,如下所示：

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
            OF DF IF TF SF ZF 　 AF 　 PF 　 CF

条件码：
①OF(Overflow Flag)溢出标志.溢出时为1,否则置0.
②SF(Sign Flag)符号标志.结果为负时置1,否则置0.
③ZF(Zero Flag)零标志,运算结果为0时ZF位置1,否则置0.
④CF(Carry Flag)进位标志,进位时置1,否则置0.
⑤AF(Auxiliary carry Flag)辅助进位标志,记录运算时第3位(半个字节)产生的进位置.有进位时1,否则置0.
⑥PF(Parity Flag)奇偶标志.结果操作数中1的个数为偶数时置1,否则置0.

控制标志位：
⑦DF(Direction Flag)方向标志,在串处理指令中控制信息的方向.
⑧IF(Interrupt Flag)中断标志.
⑨TF(Trap Flag)陷井标志.

二、 直接标志转移

指令格式 机器码 测试条件 如...则转移
   指令格式 机器码 测试条件 如...则转移
JC  72 C=1 有进位 JNS 79 S=0 正号
JNC  73 C=0 无进位 JO 70 O=1 有溢出
JZ/JE  74 Z=1 零/等于 JNO 71 O=0 无溢出
JNZ/JNE  75 Z=0 不为零/不等于 JP/JPE 7A P=1 奇偶位为偶
JS 78 S=1 负号 JNP/IPO 7B P=0 奇偶位为奇

三、间接标志转移

指令格式 		机器码 测试格式		 如...则转移
JA/JNBE(比较无符号数)    77    C或Z=0 > 　	高于/不低于或等于
JAE/JNB(比较无符号数)    73    C=0 >=　 	高于或等于/不低于
JB/JNAE(比较无符号数)    72    C=1 < 　		低于/不高于或等于
JBE/JNA(比较无符号数)    76    C或Z=1 <=　 	低于或等于/不高于
JG/JNLE(比较带符号数)    7F    (S异或O)或Z=0 >  大于/不小于或等于
JGE/JNL(比较带符号数)    7D    S异或O=0 >=　 	大于或等于/不小于
JL/JNGE(比较带符号数)    7C    S异或O=1 < 　	小于/不大于或等于
JLE/JNG(比较带符号数)    7E    (S异或O)或Z=1 <=	小于或等于/不大于

四、无条件转移指令JMP

指令格式 		执行操作 			机器码 		说明
段内直接短转移 		Jmp short (IP)←(IP)+8位位移量 	EB	 转移范围-128到+127字节
段内直接近转移		Jmp near (IP)←(IP)+16位位移量 	E9 	转移到段内的任一位置
段内间接转移		Jmp word (IP)←(有效地址EA) 	FF
段间直接(远)转移	Jmp far (IP)←(偏移地址)(CS)←(段地址) EA
段间间接转移Jmp dword (IP)←(EA)(CS)←(EA+2)


                    TUT03

Hi!

我现在是在医院里,护士好漂亮! :-) 这一回我将教你如何破解时间限制和如何移开某一些 NAGS.我本
打算教你如何使用Soft-ICE,但是我这一次真的不能,因为我的内存太少了,不能运行SI.:-)

工具：
你需要以下的工具:(我使用这些工具,我假定你也将使用它们)
W32Dasm 8.5或高的版本,
Hacker's view5.24,FAR 1.40b
Windows Commander 3.52
或请求cracker们给你这些工具,它们将很乐意帮助你!:-)

内容:

1) a. 如何从 Horas 2.1a中去除NAGS(不用W32Dasm)
      URL: http://www.basta.com
   b. 如何破解过期 Horas 2.1a (用W32Dasm)
      URL: http://www.basta.com
2) a. 如何破解过期 WinHacker95 2.0b3 (用W32Dasm)
      URL: http://www.wedgesoftware.com
   b. 如何破解 WinHacker95 2.0b3 (输入任何的注册码)
      URL: http://www.wedgesoftware.com

            PART 1a: 从 Horas 2.1a中去除NAGS(不用W32Dasm)

Step 1. 执行 HORAS.EXE

Step 2. 现在你可以看到一个很讨厌的 NAGs screen, 你很想将它移走,是吗? :-)

Step 3. Ok, 退出程序.

Step 4. 执行 FAR, 进入 Horas 目录.

Step 5. 拷贝 HORAS.EXE 到 HORAS.EXX (for backup),执行 HIEW HORAS.EXE.

Step 6. 按 F4选HEX Mode, 现在你可看到HORAS.EXE的十六进制数据了.

Step 7. 你还记得NAGs screen说些什么吗?如"Welcome to Horas"或"Horas is a shareware
     application. You are invited to.." 等等.

Step 8. 按 F7查找,输入"welcome" (ASCII).找到没有,没有!Ok,记住PEXE32.EXE是32bit程序,
    所以它会用"00"插入字母之间,如"w e l c o m e"(中间不是空格!)

Step 9. 按F7,输入"w"(ASCII), 按 DOWN,输入"00"(HEX),
    按 UP输入"e"(ASCII), 按 DOWN,输入"00"(HEX),
    按 UP输入"l"(ASCII), 按 DOWN,输入"00"(HEX),
    按 UP输入"c"(ASCII), 按 DOWN,输入"00"(HEX),
    按 UP输入"o"(ASCII), 按 DOWN,输入"00"(HEX),
    按 UP输入"m"(ASCII), 按 DOWN,输入"00"(HEX),
    按 UP输入"e"(ASCII), 按 DOWN,输入"00"(HEX),和下面一样:

        +=[F2:Forward /F4:Full ]==============================+
        |ASCII: w e l c o m e################################ |
        |                                                     |
        |  Hex: 77 00 65 00 6C 00 63 00 6F 00 6D 00 65 ###### |
        +=====================================================|

Step 10. Ok, 按 ENTER找到数据.如下:

.000478C0:  06 00 00 00-00 00 DE 00-64 00 00 00-00 00 57 00       ?d     W
.000478D0:  65 00 6C 00-63 00 6F 00-6D 00 65 00-20 00 74 00  e l c o m e   t
.000478E0:  6F 00 20 00-25 00 73 00-00 00 08 00-4D 00 53 00  o   % s   M S
.000478F0:  20 00 53 00-61 00 6E 00-73 00 20 00-53 00 65 00    S a n s   S e
.00047900:  72 00 69 00-66 00 00 00-00 00 02 50-00 00 00 00  r i f     P
.00047910:  07 00 07 00-D0 00 30 00-84 69 FF FF-82 00 25 00    ?0 刬��?%
.00047920:  73 00 20 00-69 00 73 00-20 00 61 00-20 00 73 00  s   i s   a   s
.00047930:  68 00 61 00-72 00 65 00-77 00 61 00-72 00 65 00  h a r e w a r e
.00047940:  20 00 61 00-70 00 70 00-6C 00 69 00-63 00 61 00    a p p l i c a
.00047950:  74 00 69 00-6F 00 6E 00-2E 00 20 00-20 00 59 00  t i o n .     Y
.00047960:  6F 00 75 00-20 00 61 00-72 00 65 00-20 00 69 00  o u   a r e   i

Step 11. 看"%s is a shareware.." 前的FF FF 82这就是产生对话框的地方,记住只有4个或两个FF
    和一个82才能干这个!现在将光标移到"82"处你可以在屏幕上方看到,现在按F3将"82"改成
    "7E",看屏幕的上方,你在偏移量是 4191C.的地方. 这就是要改的地方.
     按F9更新HORAS.EXE.有人告诉我说应将"82"改成"90"而不是"7E",其实 90或7E都能起作用.

Step 12. 记住只有4个或两个FF和一个82才是用来显示对话框的.现在"82"成了"7E",它再也不能产生
     对话框了.退出HIEW,执行HORAS.EXE.

Step 13. 你还看见了NAGs screen吗?恭喜你又破解了 Horas 2.1a!!

            PART 1b: 如何破解过期 Horas 2.1a (用W32Dasm)

Step 1. 执行 HORAS.EXE

Step 2. 你可以看到它提示你已经过期的信息.(你应当抄下来)退出程序.

Step 3. 执行 FAR, 进入 Horas 目录.

Step 4. 拷贝 HORAS.EXE 到HORAS.EXX和HORAS.W32

Step 5. 执行 W32Dasm,反编译 HORAS.W32.

Step 6. 反编译后,单击 STRING DATA REFERENCE, 向下找到"The evaluation period for this product
has expired.
     Please..".(你应该记得那个出错信息)双击它.

Step 7. 关上SDR窗口,你应该看到行:

        * Possible Reference to String Resource ID=25016: "The evaluation per..

        :0040C975 68B8610000       push 000061B8
        ...

Step 8. Ok, 按上箭头到你发现:

        * Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
        |:0040C904 (C), :0040C918 (C), :0040C92D (C)
        |
        ...

Step 9. Now 按 PgUp2或 3次直到看见:

        :0040C8F7 85C0                    test eax, eax
        :0040C8F9 0F85BD000000            jne 0040C9BC
        :0040C8FF 8B4628                  mov eax, dword ptr [esi+28]
        :0040C902 85C0                    test eax, eax
        :0040C904 756B                    jne 0040C971
        :0040C906 8B17                    mov edx, dword ptr [edi]
        :0040C908 51                      push ecx
        :0040C909 8BC4                    mov eax, esp

Step 10. 看0040C904,你还记得刚才的地址吗?现在你必须向上找到最后的比较指令如: CMP,
     JNE, JE, TEST,... 看0040C8F7,这就是跳到提示过期的地方.我们试一试.确保绿色的光棒是在:
     0040C8F9 0F85BD000000 jne 0040C9BC上,你可以在状态栏里看到偏移量 @Offset 0000BCF9h.
     这就是要patch的地方.

Step 11. 回到 FAR, 执行 HIEW HORAS.EXE, 按 F4 选 Decode mode (ASM), 按 F5输入BCF9.你可以看到:

    .0000C8F9: 0F84BD000000                 je    .00000C9BC   ---------- (1)
    .0000C8FF: 8B4628                       mov    eax,[esi][00028]
    .0000C902: 85C0                         test   eax,eax

Step 12. 那就是要修改的地方, 按 F3,输入0F85, 按 F9更新HORAS.EXE.退出HIEW.

Step 13. 执行 HORAS.EXE,还报过期吗? Voila!你又破解了 Horas 2.1a!!

        PART 2a: 破解 WinHacker95 2.0b3过期 (用W32Dasm)

Step 1. 执行 WH95.EXE

Step 2. 你可以看到它提示你已经过期的信息.(你应当抄下来)退出程序.

Step 3. 执行 FAR, 进入  WH95 目录.

Step 4. 拷贝 WH95.EXE到 WH95.EXX和WH95.W32
Step 5. 执行 W32Dasm and 反编译 WH95.W32.

Step 6. 反编译后, 单击 STRING DATA REFERENCE, 向下找到"Your trial period is over!".
        (你应该记得那个出错信息)双击它.

Step 7. 关闭SDR窗口,你应该看到行:

        * Possible StringData Ref from Data Obj ->"Your trial peroid is over!"

        :00429977 6844D34400              push 0044D344
        :0042997C 8D8208020000            lea eax, dword ptr [edx+00000208]
        :00429982 50                      push eax

Step 8. Ok, 按上箭头到你发现:

        * Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
        |:004298AE (C)
        |
        ...

Step 9. Now 按 PgUp4 或 5次直到你看见:

          :004298AE 0F82A1000000            jb 00429955
          :004298B4 7517                    jne 004298CD
          :004298B6 51                      push ecx
          :004298B7 8D8208020000            lea eax, dword ptr [edx+00000208]

Step 10. 看看004298AE,你还记得刚才的地址吗?这就是跳到提示过期的地方.
         确保绿色的光棒是在 004298AE 0F82A1000000 jb 00429955上
         你可以在状态栏里看到偏移量 @Offset 00028CAEh.这就是要patch的地方.

Step 11. 回到 FAR, 执行 HIEW WH95.EXE, 按 F4选Decode mode(ASM), 按 F5输入28CAE.你可以看到:

   .000298AE: 0F82A1000000                 jb    .000029955   ---------- (1)
   .000298B4: 7517                         jne   .0000298CD   ---------- (2)
   .000298B6: 51                           push   ecx

Step 12. 那就是要修改的地方, 按 F3,输入EB0090909090,按 F9更新 WH95.EXE.那 EB00将不会让
     程序跳转而是继续执行,90909090只是填充多出的空位子.退出 HIEW.

Step 13. 执行 WH95.EXE,报过期了吗? Voila! 你又破解了 WH95 2.0b3!!

            PART 2b:如何破解 WinHacker95 2.0b3 (输入任何的注册码)

Step 1. 执行 WH95.EXE

Step 2. 输入"TKC/PC '97"作为姓名,"PC '97"作为公司名,"12345"作为注册码. 单击 Register.

Step 3. 你将看到错误信息 (你应当将它们抄下来)然后退出程序.

Step 4. 执行 FAR, 进入 WH95 目录.

Step 5. 拷贝 WH95.EXE到 WH95.EXX和WH95.W32

Step 6. 执行 W32Dasm and 反编译 WH95.W32.

Step 7. 反编译后, 单击 STRING DATA REFERENCE,向下找到"Invalid Serial Number!".
        (你应当记住的),双击它.

Step 8. 关闭SDR窗口,你可以看到:

        * Possible StringData Ref from Data Obj ->"Invalid Serial Number!"

        :00429719 68E0D24400              push 0044D2E0
        :0042971E 8D4DF0                  lea ecx, dword ptr [ebp-10]
        ...

Step 9. Ok, 现在你必须向上找到最后的比较指令如: CMP, JNE, JE, TEST,... 按 UP直到你看到:

        :004296FB 7474                    je 00429771
        :004296FD 8B4DF0                  mov ecx, dword ptr [ebp-10]
        :00429700 C7416C00000000          mov [ecx+6C], 00000000
        ...

Step 10. 现在你知道是从哪里跳到的报错窗口了将 "je"换成"jne"看看有无效果.
         确保绿色的光棒是在:004296FB 7474  je 00429771上.你可以在状态栏里看到偏移量 @Offset
         00028AFBh. 这就是要patch的地方.

Step 11. 回到 FAR, 执行 HIEW WH95.EXE, 按 F4选Decode mode
         (ASM), 按 F5输入28AFB. 可以看到:

   .000296FB: 7474                         je    .000029771   ---------- (1)
   .000296FD: 8B4DF0                       mov    ecx,[ebp][-0010]
   .00029700: C7416C00000000               mov    d,[ecx][0006C],000000000

Step 12. 要修改的就是这里, 按 F3,输入EB, 按 F9更新WH95. 退出HIEW.

Step 13. 执行 WH95.EXE, 输入任意的注册码.好了吗?没有!不要紧,继续.

Step 14. 再执行 WH95.EXE.

Step 15. 输入"TKC/PC '97"作为姓名,"PC '97"作为公司名,"12345"作为注册码. 单击 Register.

Step 16. 你将看到错误信息 (你应当将其中一个抄下来,与第一次的要不同)然后退出程序.

Step 17. 回到 W32Dasm, 单击 STRING DATA REFERENCE,向下找到"Error 1000: Invalid Serial Number!".
        (你应当记住的),双击它.

Step 18. 关闭SDR窗口,你可以看到:

       * Possible StringData Ref from Data Obj ->"Error 1000: Invalid Serial.."

       :004229C3 686CCE4400              push 0044CE6C
       :004229C8 E8C3030000              call 00422D90
       ...

Step 19. Ok, 现在你必须向上找到最后的比较指令如: CMP, JNE, JE, TEST,... 按 UP直到你看到:

        :004229BC 7424                    je 004229E2
        :004229BE 6A3B                    push 0000003B
        :004229C0 8B4DEC                  mov ecx, dword ptr [ebp-14]
        ...

Step 20. 现在你知道是从哪里跳到的报错窗口了将 "je"换成"jne"看看有无效果.确保绿色的光棒
     是在: :004229BC 7424  je 004229E2,
         你可以在状态栏里看到偏移量 @Offset 00021DBCh.这就是要patch的地方.

Step 21. 回到 FAR, 执行 HIEW WH95.EXE, 按 F4选Decode mode
         (ASM), 按 F5输入21DBC. 可以看到:

     .000229BC: 7424                         je    .0000229E2   ---------- (1)
     .000229BE: 6A3B                         push   03B
     .000229C0: 8B4DEC                       mov    ecx,[ebp][-0014]

Step 22. 要修改的就是这里, 按 F3,输入 EB, 按更新WH95.退出HIEW.

Step 23. 执行 WH95.EXE,输入任意的注册码. Voila!你又破解了 WH95 2.0b3!!

第四课见?!


                    TUT04

Hi!
继续我们的课程吧

工具：
你需要以下的工具 ：(我使用这些工具,我假定你也将使用它们)
W32Dasm 8.5或高的版本,
Hacker's view5.24,
FAR 1.40b (ftp://ftp.elf.stuba.sk/pub/pc/utilfile/far140b.exe)
或使用Windows Commander 3.50,也是不错的选择.
或请求cracker们给你这些工具,它们将很乐意帮助你!:-)

内容:

1) a. 怎样破解 System Cleaner 1.21的过期提示 (使用 W32Dasm)
      URL: http://infortech.reedcs.com
   b. 怎样忽略System Cleaner 1.21中提示无效日期的 NAG  (w/W32Dasm)
      URL: http://infortech.reedcs.com
2) 怎样去除未注册的Macro Schedular 4.3.11的功能限制 (with W32Dasm)
      URL: http://www.mjtnet.com
3) 怎样破解TrayCal 1.0 (输入任意的注册码)
      URL: http://www.spaeder.com
4) 为什么我拷贝 *.EXE到*.W32
5) Nop/PC '97的一个补丁程序的汇编源程序

            PART 1a:破解 System Cleaner 1.21的过期提示 (使用 W32Dasm)

Step 1. 执行SystemCleaner.EXE

Step 2. 现在你可以看到一个很讨厌的 NAGs screen, 你很想将它移走,是吗? :-)

Step 3. Ok, 退出程序

Step 4. 运行 WC, 进入 System Cleaner目录.

Step 5. 拷贝SystemCleaner.EXE到SystemCleaner.EXX和SystemCleaner.W32

Step 6. 运行 W32Dasm and 反编译 SystemCleaner.W32

Step 7. 反编译后, 单击 STRING DATA REFERENCE, 向下找到"The trial period has ended. Please..".
        (你应该记住的的那个错误信息), 双击它.

Step 8. 关闭 SDR 窗口, 你可以看到:

  :00464BB6 668B0DE44B4600          mov cx, word ptr [00464BE4]
  :00464BBD B202                    mov dl, 02

* Possible StringData Ref from Code Obj ->"The trial period has ended. Please "
                                        ->"register this software!"

Step 9. Ok, 按 UP 直到看到:

  :00464BA8 53                      push ebx
  :00464BA9 8BD8                    mov ebx, eax
  :00464BAB 80BB0C01000000          cmp byte ptr [ebx+0000010C], 00
  :00464BB2 741C                    je 00464BD0
  :00464BB4 6A00                    push 00000000

  * Referenced by a (U)nconditional or (C)onditional Jump at Address:
  |:00464B4F(C)

Step 10. 看Referenced Jump at 00464B4F(C), 按 PgUp 2或3次直到看到:
  :00464B4F 7065                    jo 00464BB6

         往下直到看到:
  :00464B54 64                      BYTE 064h

         如果看到 "BYTE xxxh", 忽略它!!它不是真正的跳转,它只是字符串, ok 回到
         00464BA8 .现在你可以看到一个比较指令, 464BB2,它就是过期后跳转的地方. 让我们试试.
         确保光棒是在:00464BB2 741C   je 00464BD0上,你可以在状态栏里看到偏移量 @Offset
         00063FB2h.这就是要修改的地方.

Step 11. 回到 WC, 运行 HIEW SYSTEM~1.EXE, 按 F4 选择 Decode mode
         (ASM), 按 F5输入 63FB2. 你可以看到:

  .00064BB2: 741C                         je    .000064BD0   ---------- (1)
  .00064BB4: 6A00                         push   000
  .00064BB6: 668B0DE44B4600               mov    cx,[000464BE4]

Step 12. 按 F3, 输入 EB, 按 F9更新 SYSTEM~1.EXE. 退出 HIEW.

Step 13. 运行 SystemCleaner.EXE,它还报过期吗? Voila! 你破解了它!

PART 1b: 忽略System Cleaner 1.21中提示无效日期的 NAG  (用W32Dasm)

Step 1. 运行 SystemCleaner.EXE

Step 2. 你将看到提示已经过期的信息,把它抄下来,退出程序.

Step 3. Ok, 退出.

Step 4. 运行 WC, 进入 System Cleaner目录.

Step 5. 拷贝 SystemCleaner.EXE到 SystemCleaner.EXX和SystemCleaner.W32

Step 6. 运行 W32Dasm and 反编译 SystemCleaner.W32

Step 7. 反编译后, 单击 STRING DATA REFERENCE, 向下找到"The system clock has been moved back"
        (你应该记住的的那个), 双击它.

Step 8. 关闭 SDR 窗口, 你可以看到:

  :00464E56 668B0D884E4600          mov cx, word ptr [00464E88]
  :00464E5D B201                    mov dl, 01

  * Possible StringData Ref from Code Obj ->"The system clock has been moved "
                                          ->"back. Please reset system clock "
                                          ->"correct time before re-运行ning "

Step 9. Ok, 按 UP 直到看到:

  :00464E48 53                      push ebx
  :00464E49 8BD8                    mov ebx, eax
  :00464E4B 80BB0C01000000          cmp byte ptr [ebx+0000010C], 00
  :00464E52 7421                    je 00464E75
  :00464E54 6A00                    push 00000000
  :00464E56 668B0D884E4600          mov cx, word ptr [00464E88]

Step 10. 看00464E52.它就是要害.确保光棒是在：00464E52 7421   je 00464E75上
         你可以在状态栏里看到偏移量 @Offset00064252h.它就是要修改的地方.

Step 11. 回到 WC, 运行 HIEW SYSTEM~1.EXE, 按 F4 选择 Decode mode
         (ASM), 按 F5输入 64252. 你可以看到:

  .00064E52: 7421                         jmps  .000064E75   ---------- (1)
  .00064E54: 6A00                         push   000
  .00064E56: 668B0D884E4600               mov    cx,[000464E88]

Step 12. 按 F3, 输入 EB, 按 F9更新 SYSTEM~1.EXE. 退出 HIEW.

Step 13. 运行 SystemCleaner.EXE.一切正常!!

        PART 2: 去除未注册的Macro Schedular 4.3.11的功能限制 (with W32Dasm)

Step 1. 运行 MSCHED.EXE

Step 2. 加入几个宏,它将提示你有两个的限制.
        抄下它所提示的字符串,退出程序.

Step 3. 运行 WC, 进入 MSCHED目录.

Step 4. 拷贝 MSCHED.EXE到MSCHED.EXX和MSCHED.W32

Step 5. 运行 W32Dasm and 反编译 MSCHED.W32.

Step 6. 反编译后, 单击 STRING DATA REFERENCE,向下找到"Unregistered copies of MS are
    limited to..".
        (你应该记住的的那个), 双击它.

Step 7. 关闭 SDR 窗口, 你可以看到:

  * Possible StringData Ref from Code Obj ->"Unregistered copies of Macro.."
                                          ->"have a limit of 20 lines per.."

  :00448AED B860954400              mov eax, 00449560

Step 8. Ok, 按 UP 直到看到:

  :00448ACA 7530                    jne 00448AFC
  :00448ACC 8B8370020000            mov eax, dword ptr [ebx+00000270]
  :00448AD2 8B80FC000000            mov eax, dword ptr [eax+000000FC]
  :00448AD8 8B10                    mov edx, dword ptr [eax]
  :00448ADA FF5210                  call [edx+10]
  :00448ADD 83F813                  cmp eax, 00000013
  :00448AE0 7E1A                    jle 00448AFC
  :00448AE2 6A00                    push 00000000

Step 9. 请看00448ACA和00448AE0两处.它就是给你添麻烦的跳转.让我们找出它们.却保光棒是在
    00448ACA 7530        jne 00448AFC上,你可以在状态栏里看到偏移量@Offset 00047ECAh.
    它是要修改的地方.

Step 10. 回到 WC, 运行 HIEW MSCHED.EXE, 按 F4 选择 Decode mode
         (ASM), 按 F5,输入 47ECA. 你可以看到:

  .00048ACA: 7530                         jne   .000048AFC   ---------- (1)
  .00048ACC: 8B8370020000                 mov    eax,[ebx][000000270]
  .00048AD2: 8B80FC000000                 mov    eax,[eax][0000000FC]
  .00048AD8: 8B10                         mov    edx,[eax]
  .00048ADA: FF5210                       call   d,[edx][00010]
  .00048ADD: 83F813                       cmp    eax,013
  .00048AE0: 7E1A                         jle   .000048AFC   ---------- (2)

Step 11. 按 F3, 输入 EB 然后往下到 7E1A (偏移量47EE0), 输入 EB,按F9更新MSCHED.EXE.
         退出 HIEW.

Step 12. 还没完!打开SDR 窗口,再次双击 "Unregistered copies..".

Step 13. 关闭 SDR 窗口, 你可以看到:

  * Possible StringData Ref from Code Obj ->"Unregistered copies of Macro.."
                                          ->"have a limit of 20 lines per.."

  :0044DB9E B86CDC4400              mov eax, 0044DC6C

Step 14. Ok, 按 UP 直到看到:

  :0044DB7D 752C                    jne 0044DBAB
  :0044DB7F 8B83D4090000            mov eax, dword ptr [ebx+000009D4]
  :0044DB85 8B80FC000000            mov eax, dword ptr [eax+000000FC]
  :0044DB8B 8B10                    mov edx, dword ptr [eax]
  :0044DB8D FF5210                  call [edx+10]
  :0044DB90 48                      dec eax
  :0044DB91 7E18                    jle 0044DBAB

Step 15. 注意0044DB7D和0044DB91两处.修改它们.确保绿色的光棒是在0044DB7D 752C jne 0044DBAB
         上,你可以在状态栏里看到偏移量 @Offset 0004CF7Dh.这就是要patch的地方.

Step 16. 回到 WC, 运行 HIEW MSCHED.EXE, 按 F4 选择 Decode mode
         (ASM), 按 F5,输入 4CF7D. 你可以看到:

  .0004DB7D: 752C                         jne   .00004DBAB   ---------- (1)
  .0004DB7F: 8B83D4090000                 mov    eax,[ebx][0000009D4]
  .0004DB85: 8B80FC000000                 mov    eax,[eax][0000000FC]
  .0004DB8B: 8B10                         mov    edx,[eax]
  .0004DB8D: FF5210                       call   d,[edx][00010]
  .0004DB90: 48                           dec    eax
  .0004DB91: 7E18                         jle   .00004DBAB   ---------- (2)

Step 17. 按 F3, 输入 EB,再走到7E18 (偏移量47F91), 输入EB,按 F9 更新 MSCHED.EXE.
         退出 HIEW.

Step 18. 还没完!打开SDR 窗口,再次双击 "Unregistered copies..".

Step 19. 关闭 SDR 窗口, 你可以看到:

  * Possible StringData Ref from Code Obj ->"Unregistered copies of Macro.."
                                          ->"have a limit of 20 lines per.."

  :00450D3F B8001D4500              mov eax, 00451D00

Step 20. Ok, 按 UP 直到看到:

  :00450D21 74CC                    je 00450CEF
  :00450D23 8BC7                    mov eax, edi
  :00450D25 E86635FBFF              call 00404290
  :00450D2A E8C919FBFF              call 004026F8
  :00450D2F 83FB14                  cmp ebx, 00000014
  :00450D32 7E1A                    jle 00450D4E

Step 21. 看00450D32.又是个讨厌的跳转,让我们搞定它.
         确保绿色的光棒是在00450D32 7E1A  jle 00450D4E上你可以在状态栏里看到偏移量 @Offset
         00050132h.它这就是要patch的地方.

Step 22. 回到 WC, 运行 HIEW MSCHED.EXE, 按 F4 选择 Decode mode
         (ASM), 按 F5输入 4CF7D. 你可以看到:

  .00050D32: 7E1A                         jle   .000050D4E   ---------- (4)
  .00050D34: 6A00                         push   000
  .00050D36: 668B0DF41C4500               mov    cx,[000451CF4]

Step 23. 按 F3, 输入 EB and 按F9更新 MSCHED.EXE. 退出 HIEW.

Step 24.它还没完!打开SDR 窗口双击"Unregistered copies..".

Step 25. 关闭 SDR 窗口, 你可以看到:

  * Possible StringData Ref from Code Obj ->"Unregistered copies of Macro.."
                                          ->"have a limit of 20 lines per.."

  :00452D25 B8E82F4500              mov eax, 00452FE8

Step 26. Ok, 按 UP 直到看到:

  :00452D01 7531                    jne 00452D34
  :00452D03 8B45FC                  mov eax, dword ptr [ebp-04]
  :00452D06 8B80D4090000            mov eax, dword ptr [eax+000009D4]
  :00452D0C 8B80FC000000            mov eax, dword ptr [eax+000000FC]
  :00452D12 8B10                    mov edx, dword ptr [eax]
  :00452D14 FF5210                  call [edx+10]
  :00452D17 48                      dec eax
  :00452D18 7E1A                    jle 00452D34

Step 27. 注意00452D01和00452D18两处.修改它们.确保绿色的光棒是在00452D01 7531 jne  00452D34
     上,你可以在状态栏里看到偏移量 @Offset 00052101h.这就是要patch的地方.

Step 28. 回到 WC, 运行 HIEW MSCHED.EXE, 按 F4 选择 Decode mode
         (ASM), 按 F5,输入 52101. 你可以看到:

  .00052D01: 7531                         jne   .000052D34   ---------- (1)
  .00052D03: 8B45FC                       mov    eax,[ebp][-0004]
  .00052D06: 8B80D4090000                 mov    eax,[eax][0000009D4]
  .00052D0C: 8B80FC000000                 mov    eax,[eax][0000000FC]
  .00052D12: 8B10                         mov    edx,[eax]
  .00052D14: FF5210                       call   d,[edx][00010]
  .00052D17: 48                           dec    eax
  .00052D18: 7E1A                         jle   .000052D34   ---------- (2)

Step 29. 按 F3, 输入 EB向下到7E1A (偏移量52118), 输入EB,按F9更新MSCHED.EXE.
         退出 HIEW.

Step 30. 最后, 运行 MSCHED.EXE试试多加几个宏,怎么样.yeah,你搞定了!!

            PART 3: crack TrayCal 1.0 (输入任意的注册码)

Step 1. 运行 TRAYCAL.EXE

Step 2. 输入你的名字和注册码,你可以看到提示注册码错误的信息. (把它抄下来)退出程序.

Step 3. Ok, 退出.

Step 4. 运行 WC, 进入 TrayCal目录.

Step 5. 拷贝 TRAYCAL.EXE到TRAYCAL.EXX和TRAYCAL.W32

Step 6. 运行 W32Dasm and 反编译 TRAYCAL.W32

Step 7. 反编译后, 单击 STRING DATA REFERENCE, 向下找到"Sorry, invalid registration
     code..". (你应该记住的的那个), 双击它.

Step 8. 关闭 SDR 窗口, 你可以看到:

  :0043FD30 7E1A                    jle 0043FD4C
  :0043FD32 6A00                    push 00000000
  * Possible StringData Ref from Code Obj ->"Software\Spaeder"

  :0043FE3A 8B0DDC194400            mov ecx, dword ptr [004419DC]
  :0043FD34 668B0DE4FF4300          mov cx, word ptr [0043FFE4]
  :0043FD3B 33D2                    xor edx, edx

  * Possible StringData Ref from Code Obj ->"Sorry, invalid registration code."

         看0043FD30,当你输入了错误的注册码时它就跳转.
         让我们试试.确保绿色的光棒是在0043FD30 7E1A   jle 0043FD4C上
         你可以在状态栏里看到偏移量 @Offset 0003F130h.它就是要修改的地方.

Step 9. 回到 WC, 运行 HIEW TRAYCAL.EXE, 按 F4 选择 Decode mode
        (ASM), 按 F5输入 3F130. 你可以看到:

  .0003FD30: 7E1A                         jle   .00003FD4C   ---------- (1)
  .0003FD32: 6A00                         push   000
  .0003FD34: 668B0DE4FF4300               mov    cx,[00043FFE4]
  .0003FD3B: 33D2                         xor    edx,edx

Step 10. 按 F3, 输入 EB, 按 F9 更新 TRAYCAL.EXE. 退出 HIEW.

Step 11. 运行 TRAYCAL.EXE, 怎样?没好!它还比较了注册表!

Step 12. 回到 W32Dasm, 单击 "Sorry, invalid registration.."

Step 13. 关闭 SDR 窗口, 你可以看到:

  * Referenced by a (U)nconditional or (C)onditional Jump at Address:
  |:0043FE34(C)
  |
  :0043FF1B 6A00                    push 00000000
  :0043FF1D 668B0DE4FF4300          mov cx, word ptr [0043FFE4]
  :0043FF24 33D2                    xor edx, edx

  * Possible StringData Ref from Code Obj ->"Sorry, invalid registration code."

         Do you see above that Referenced Jump at Address? : 0043FE34(C)
         Now 按 PgUp key 2 or 3 times 直到看到:

  :0043FE34 0F85E1000000            jne 0043FF1B
Step 14. 看0043FE34那里,我们知道它在加入新的注册数据到注册表里之前又作了比较.let's try.
         确保绿色的光棒是在0043FE34 0F85E1000000 jne 0043FF1B
         上你可以在状态栏里看到偏移量 @Offset 0003F234h.它就是要patch的地方.

Step 15. 回到 WC, 运行 HIEW TRAYCAL.EXE, 按 F4 选择 Decode mode
         (ASM), 按 F5输入 3F234. 你可以看到:

  .0003FE34: 0F85E1000000                 jne   .00003FF1B   ---------- (1)
  .0003FE3A: 8B0DDC194400                 mov    ecx,[0004419DC]
  .0003FE40: B201                         mov    dl,001
  .0003FE42: A128D84300                   mov    eax,[00043D828]

Step 16. 按 F3, 输入 0F84, 按 F9更新 TRAYCAL.EXE. 退出 HIEW.

Step 17. 运行 TRAYCAL.EXE, 好了吗?yeah,你将它注册了!!

            PART 4: 为什么我拷贝 *.EXE到*.W32

我知道有些朋友想知道为什么我拷贝 *.EXE到*.W32.很简单当修改后的程序不能用时,我就拷贝 *.EXX回*.
EXE files.
且当我反编译时文件已被W32Dasm打开不能再修改, 所以让W32Dasm使用*.W32.. 还有记住反编译后当退出时
保存一下反
编译结果下次就可以直接调用工程文件了.

            PART 5: Nop/PC '97的patch源程序(译者注：好像这程序被打乱了,我也没办法
改)

-------------------------------<剪切这里>-------------------------------------

;_______________________________________________________________

MainTitle       db 0Dh,0Ah
                db ' 圻哌哌哌咣?苒哌哌哌咣?圻哌哌哌咣?,0Dh,0Ah
                db ' ?        ??        ??        ?,0Dh,0Ah
                db ' ?   ?   ??   ?   ??   ?   ?,0Dh,0Ah
                db ' ?   ?   ??   ?   ??       苒',0Dh,0Ah
                db ' ?   ?   ??   ?   ??  圻哌哌 ',0Dh,0Ah
                db ' ?   ?   ??        ??  ?proudly',0Dh,0Ah
                db ' 圮苘苒苘苘?咣苘苘苘苒?圮苘?presents',0Dh,0Ah
                db ' 苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘?,0Dh,0Ah
                db '圻                                   咣',0Dh,0Ah
                db '?             PROG NAME              ?,0Dh,0Ah
                db '?          REMOVE CD-CHECK           ?,0Dh,0Ah
                db '?              BY  NOP               ?,0Dh,0Ah
                db '圮                                   苒',0Dh,0Ah
                db ' 哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌?',0Dh,0Ah
                db 0Dh,0Ah,'$'

error           db ' ?ERROR: Hm... problem with file ? ',0Dh,0Ah,'$'

filename        db 'FILE.EXE',0

done            db ' ?Enjoy !'         , 0Dh,0Ah,'$'

BytesToWrite    db 0EBh

                end    start
-------------------------------<剪切这里>-------------------------------------

;_______________________________________________________________
;
; Patcher by Nop [Pc] - SourceCode 100% free
;
;   use with A86:
;       A86 CrkNop.asm
;
;   use with TASM:
;       tasm CrkNop.asm
;       tlink /t CrkNop.obj
;
; Greetz all members of the Scene
;_______________________________________________________________

.MODEL TINY
.CODE
.286
ORG 100h

start:
                mov     ah, 9               ; ?Show Title ?
                mov     dx, offset MainTitle
        int     21h

                mov     ax, 3D02h           ; ?Open File ?
                mov     dx, offset filename
        int     21h
        jnb     Ok

                mov     ah, 9               ; ?File Not Found ?

                mov     dx, offset error
        int     21h

                mov     ax, 4C01h           ; ?退出 with error ?

                int     21h
;_______________________________________________________________
Ok:

                mov     bx, ax              ; ?Move pointer ?

                mov     ax, 4200h
                mov     cx, 0               ; segment
                mov     dx, 565             ; offset
                int     21h

                mov     ax, 4000h           ; ?Write values ?

                mov     cx, 1            ; number of bytes write
                mov     dx, offset BytesToWrite
                int     21h

                mov     ax, 3E00h           ; ?关闭 file ?

                int     21h

                mov     ah, 9               ; ?Show msg ?

                mov     dx, offset done
                int     21h

                mov     ax, 4C00h           ; ?All Done And 退出 ?

                int     21h


                    TUT05

Hi ya!

Ok,在这篇教程里我将教你怎样和注册表打交道,怎样去处运行时间限制. :-)

工具:

你需要以下的工具 ：(我使用这些工具,我假定你也将使用它们)

W32Dasm 8.9或更高版本(www.expage.com/page/w32dasm)
Hacker's View 5.66 (E-mail: sen@suslikov.kemerovo.su)
FAR 1.50b (ftp://ftp.elf.stuba.sk/pub/pc/utilfile/far150b.exe)
或Windows Commander 3.50 (http://www.ghisler.com)

或请求cracker们给你这些工具,它们将很乐意帮助你!:-)

CONTENTS:

1) 怎样用注册表注册TrayCal 1.0
      URL: http://www.spaeder.com
2) 怎样注册CopyPaste 1.20
      URL: http://www.wz.com/scriptsoftware
3) 怎样去处Radio Destiny 0.2的时限
      URL: http://www.destiny-software.com/destiny
4) tKC/PC '98 patch的pascal源程序

            PART 1: 注册TrayCal 1.0

Step 1. 运行 TRAYCAL.EXE

Step 2. 你可以看到你还有15天可以试用.右键单击TC, 单击Register. 输入你的名字和注册码. 它提示
    Invalid registration code.

Step 3. Ok, 退出程序.

Step 4. 运行 WC, 进入 TrayCall目录.

Step 5. 拷贝TRAYCAL.EXE到TRAYCAL.W32

Step 6. 运行W32Dasm,反编译TRAYCAL.W32

Step 7. 反编译后, 单击 STRING DATA REFERENCE, 向下找到 "Sorry, invalid registration code.".
        (你应该记住的的那个错误信息), 双击它.

Step 8. 关闭 SDR 窗口, 你可以看到:

  * Possible StringData Ref from Code Obj ->"Sorry, invalid registration code."

  :0043FD3D A1E8194400              mov eax, dword ptr [004419E8]
  :0043FD42 E88D02FFFF              call 0042FFD4

Step 9. Ok,让我们看看当输错注册码时将发生什么. 按 PgDn3或4次直到看到:

  * Possible StringData Ref from Code Obj ->"Software\Spaeder"
                                    |
  :0043FE3A 8B0DDC194400            mov ecx, dword ptr [004419DC]
  :0043FE40 B201                    mov dl, 01
  :0043FE42 A128D84300              mov eax, dword ptr [0043D828]
  :0043FE47 E880E1FFFF              call 0043DFCC
  :0043FE4C A3FC274400              mov dword ptr [004427FC], eax
  :0043FE51 C605C819440001          mov byte ptr [004419C8], 01
  :0043FE58 A0C8194400              mov al, byte ptr [004419C8]
  :0043FE5D 50                      push eax

  * Possible StringData Ref from Code Obj ->"EnhancedSystemDate"
                                    |
  :0043FE5E B920004400              mov ecx, 00440020

  * Possible StringData Ref from Code Obj ->"TrayCal"
                                    |
  :0043FE63 8B15D8194400            mov edx, dword ptr [004419D8]
  :0043FE69 A1FC274400              mov eax, dword ptr [004427FC]
  :0043FE6E E8ADE5FFFF              call 0043E420
  :0043FE73 6A01                    push 00000001

  * Possible StringData Ref from Code Obj ->"RegistrationStatus"

Step 10. 你看见"RegistrationStatus"了吗?让我们运行REGEDIT看看HKCU\Software\Spaeder\TrayCal:

      EnhancedSystemDate="0"
      RegistrationStatus="0"

        它是什么意思?你应该可以猜到吧 :-) Ok,让我们修改它.都填"1".如下:

      EnhancedSystemDate="1"
      RegistrationStatus="1"

Step 11. 运行 TRAYCAL.EXE. 右键单击 TC,单击 About. Wow,它被注册了,容易吗?

Step 12. 你也可以导出HKCU\Software\Spaeder\TrayCal到TC.REG:

  REGEDIT4

  [HKEY_CURRENT_USER\Software\Spaeder\TrayCal]
  "RegistrationStatus"="1"
  "EnhancedSystemDate"="1"

Step 13. 在没注册的机子上运行它,也可以注册.它就成了注册机了.

            PART 2: 注册CopyPaste 1.20

Step 1. 运行 CopyPaste.EXE

Step 2. 输入密码注册它. *boom* Wrong password - no register.

Step 3. Ok, 退出程序.

Step 4. 运行 WC, 进入 CopyPaste目录.

Step 5. 拷贝 CopyPaste.EXE到CopyPaste.EXX和CopyPaste.W32

Step 6. 运行 W32Dasm反编译 CopyPaste.W32

Step 7. 反编译后, 单击 STRING DATA REFERENCE, look down for the
        string "Wrong password - no register..".
        (你应该记住的的那个错误信息), 双击它.

Step 8. 关闭 SDR 窗口, 你可以看到:

  * Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
  |:00403427(C), :00403438(C)

  :0040346F 8D442430                lea eax, dword ptr [esp+30]
  :00403473 68FF000000              push 000000FF
  :00403478 50                      push eax
  :00403479 8B0D1C664100            mov ecx, dword ptr [0041661C]

  * Possible Reference String Resource ID=00014: "Wrong password - no reg.."

Step 9. Did you see Referenced Jump? (403427 and 403438) Ok, 按 PgUp key
        直到看到:

  :00403427 7446                    je 0040346F
  :00403429 8D442410                lea eax, dword ptr [esp+10]
  :0040342D 50                      push eax
  :0040342E E81D400000              call 00407450
  :00403433 83C404                  add esp, 00000004
  :00403436 85C0                    test eax, eax
  :00403438 7435                    je 0040346F
  :0040343A 8D442430                lea eax, dword ptr [esp+30]
  :0040343E 68FF000000              push 000000FF
  :00403443 50                      push eax
  :00403444 8B0D1C664100            mov ecx, dword ptr [0041661C]

  * Possible Reference String Resource ID=00013: "Thank you for regist..."

Step 10. 注意00403427,它就是讨厌的地方. Let's see. 确保光棒是在:00403427 7446   je 0040346F
         上,你可以在状态栏里看到偏移量 @Offset 00002827h.这就是要修改的地方.

Step 11. 回到 WC, 运行 HIEW CopyPA~1.EXE, 按 F4 选择 Decode mode
         (ASM), 按 F5输入 2827. 你可以看到:

  00002827: 7446                         je     00000286F   ---------- (1)
  00002829: 8D442410                     lea    eax,[esp][00010]
  0000282D: 50                           push   eax
  0000282E: E81D400000                   call   000006850   ---------- (2)
  00002833: 83C404                       add    esp,004
  00002836: 85C0                         test   eax,eax
  00002838: 7435                         je     00000286F   ---------- (3)

Step 12. 按 F3, 输入9090再到7435 (偏移量2838), 输入 9090,按F9更新
         CopyPA~1.EXE. 退出 HIEW.

Step 13. 运行 CopyPaster.EXE,好了!

            PART 3: 去处Radio Destiny 0.2的时限

Step 1. 运行 RADIO.EXE

Step 2. 弹出This version has expired. 退出程序

Step 3. 运行 WC, 进入 RADIO目录.

Step 4. 拷贝 RADIO.EXE到RADIO.EXX和RADIO.W32

Step 5. 运行 W32Dasm and 反编译 RADIO.W32.

Step 6. 反编译后, 单击 STRING DATA REFERENCE,向下找到"This version has expired.".
        Hmm, 没找到,怎么办? W32Dasm不能很好的工作于16bit程序上. Grrrr.. Ok, let's try..

Step 7. 不要退出W32Dasm.. 运行 HIEW RADIO.EXE. 按 F4到HEX Mode, 按F7.
    查找"This version has exp" 终于找到了!记住偏移量 6A26

Step 8. 回到 W32Dasm, 按 PgDn直到偏移量为"00006A26h"

Step 9. Wow, 我们得到了:

  :0001.63A6 54686973207665727369   DB "This versi"
  :0001.63B0 6F6E2068617320657870   DB "on has exp"
  :0001.63BA 697265642E00           DB "ired.",0

        按 PgUp3或4次.无论如何,当看到 "BYTE xxxxh"时忽略它们!!

Step 10. Hmm, 你看见了什么? Call USER.MESSAGEBOX!!
         :0001.630A 9AC75B0000             call USER.MESSAGEBOX
         现在我们知道了当过期时它将呼出messagebox.

         按 UP key 直到看到:

  :0001.62F1 7C21                   jl 6314
  :0001.62F3 7F05                   jg 62FA
  :0001.62F5 3DB40B                 cmp ax, 0BB4
  :0001.62F8 761A                   jbe 6314

Step 11. 看0001.62F1,它就是关键的跳转.Let's see. 确保绿色的光棒是在 0001.62F1上.
         你可以在状态栏里看到@Offset 00006971h.它就是要修改的地方.

Step 12. 回到 WC, 运行 HIEW RADIO.EXE, 按 F4 选择 Decode mode
         (ASM), 按 F5输入 6971. 你可以看到:

  00006971: 7C21                         jl     000006994
  00006973: 7F05                         jg     00000697A
  00006975: 3DB40B                       cmp    ax,00BB4
  00006978: 761A                         jbe    000006994

Step 13. 按 F3, 输入 EB,按F9 更新 RADIO.EXE. 退出 HIEW.

Step 14. Ok, 运行 RADIO.EXE *boom*,它运行正常! :-)

PART 4: PASCAL源程序by tKC/PC '98

-------------------------------<剪切这里>-------------------------------------

Uses Crt;

 Const A: Array[1..4] of Record {<-------- 4 bytes be patched}
                          A : Longint;
                          B : Byte;
                         End =
((A:$2827;B:$90), {<--------------- offset "2827" and byte "90" be changed}
(A:$2828;B:$90), {<--------------- offset "2828" and byte "90" be changed}
(A:$2838;B:$90), {<--------------- offset "2838" and byte "90" be changed}
(A:$2839;B:$90)); {<--------------- offset "2839" and byte "90" be changed}

Var Ch:Char;
    I:Byte;
    F:File;
    FN:file of byte;
    Size:longint;

Begin
 Writeln('Little Patch');writeln('Crack for CopyPaste 1.20 by tKC/PC ''98');
 Assign(F,'CopyPA~1.EXE'); {<-------------- filename be patched}
 {$I-} Reset(F,1); {$I+}
 If IOResult <> 0 then
    begin
    writeln('File not found!');
    halt(1);
    end;
 For I:=1 4 do {<---------------------- 4 bytes be patched}
 Begin
  Seek(F,A[I].A);
  Ch:=Char(A[I].B);
  Blockwrite(F,Ch,1);
 End;
 Writeln('File successfully patched!');
End.

-------------------------------<剪切这里>-------------------------------------


                    TUT06

Hi ya!

好久没有给你们上课了!
又多了些新学生哦.

这一课我将教你的W32Dasm一切. 对不起,这回还是没有SoftIce和IDA,但我买了一个新电脑*superPC!!*
下一回我一定教你softice. :-)

内容:

1) 怎样注册DocSweep 3.0
   使用注册表而不修改程序.

   URL: http://www.spaeder.com

2) 怎样注册Cover Your Tracks 2.0
   使用INI文件而不修改程序.
   URL: http://www.geocities.com/SiliconValley/Vista/5610/

3) 怎样去处Quake 2 3.10的cd检测
   就是做硬盘版.
   URL: http://www.idsoftware.com

4) 怎样注册Tray RUN 2.0.1
   修改程序后让你通过,但重启后仍然没有注册,怎样搞定它?大多数共享软件用这种卑鄙手段.
   (不知它们爹娘怎么教它们的:-))
   URL: http://www.mjtnet.com

5) Pascal源程序(tKC/PC '98 )
   需要Turbo Pascal 7.0编译.

工具:

你需要以下的工具 ：(我使用这些工具,我假定你也将使用它们)

W32Dasm 8.9 - http://www.fortunecity.com/bally/waterford/18/w32dsm89.zip

Hacker's View 5.66 - ftp://ftp.cdrom.com/.27/sac/utilprog/hiew566.zip

FAR 1.50b - ftp://rwntug.quarta.msk.ru/WinUtil/Rar/far150b.exe
或Windows Commander 3.50 Beta 7 - http://www.ghisler.com

或请求cracker们给你这些工具,它们将很乐意帮助你!:-)

顺便说一句:你可以在 http://cracking.home.ml.org 找到其它一些工具,如softice和ida

下节课你可别告诉我你没有它们! :-)

            PART 1: 怎样注册DocSweep 3.0

Step 1. 运行 DOCSWEEP.EXE

Step 2. 它告诉你还有30天就到期了. 右键单击DS,单击 Reg Number. 输入你的名字和注册码. 它弹出
    Invalid registration code.

Step 3. Ok, 退出程序.

Step 4. 运行 WC, 进入 DocSweep目录.

Step 5. 拷贝 DOCSWEEP.EXE到 DOCSWEEP.W32

Step 6. 运行 W32Dasm,反编译 DOCSWEEP.W32

Step 7. 反编译后, 单击 STRING DATA REFERENCE, 向下找到: "Invalid registration code."
    双击它.

Step 8. 关闭 SDR 窗口, 你可以看到:

  * Possible StringData Ref from Code Obj ->"Invalid registration code."
                                                              <---- bad boy

  :0043578D A138784300              mov eax, dword ptr [00437838]
  :00435792 E89952FFFF              call 0042AA30

Step 9. Ok,让我们看看当输入错误的注册码时将发生什么. 按 PgUp1或2次直到看到:

  :004356E1 0F859B000000            jne 00435782  <---- if invalid code,
                                                        gobad boy

  * Possible StringData Ref from Code Obj ->"Software\Spaeder"

  :004356E7 8B0D34784300            mov ecx, dword ptr [00437834]
  :004356ED B201                    mov dl, 01

  :004356EF B86C394300              mov eax, 0043396C
  :004356F4 E8CFE8FFFF              call 00433FC8
  :004356F9 A398864300              mov dword ptr [00438698], eax
  :004356FE C6059C86430001          mov byte ptr [0043869C], 01  <---- good boy
  :00435705 A09C864300              mov al, byte ptr [0043869C]
  :0043570A 50                      push eax

  * Possible StringData Ref from Code Obj ->"Enhanced Hard Drive"

Step 10. 看到了吗??运行 REGEDIT,看

         HKCU\Software\Spaeder\DocSweep:

  SectorsPerPartition="178"  <---- 剩余天数

         Hmm,让我们加入:

  Enhanced Hard Drive="1"
  SectorsPerPartition="178"

Step 11. 运行 DOCSWEEP.EXE. 右键单击 DS,单击 About. WoW,它被注册了.

Step 12. 还有另外一种方法注册DocSweep.就是输入任意的注册码都能注册.

         将Enhanced Hard Drive由"1"改成"0",在4356E1处将JNE改成JE.运行 DS,
         输入你的名字和注册码. *boom*注册了!

            PART 2: 怎样注册Cover Your Tracks 2.0

Step 1. 运行 CYT.EXE

Step 2. 现在你可以看到要你注册的NAG screen. 单击 Register,输入你的名字和注册码. 它弹出
    Sorry invalid code.

Step 3. Ok, 退出程序.

Step 4. 运行 WC, 进入 CYT目录.

Step 5. 拷贝 CYT.EXE到 CYT.W32

Step 6. 运行 W32Dasm,反编译 CYT.W32

Step 7. 反编译后, 单击 STRING DATA REFERENCE, 向下找到: "Invalid code."
     Hmm, 没有.怎么办?找 "Registered". 单击它两次.

Step 8. 关闭 SDR 窗口, 你可以看到:

  * Possible StringData Ref from Code Obj ->"Registered"  <---- good boy

  :0043E7A1 BA6CE84300              mov edx, 0043E86C
  :0043E7A6 E841E6FDFF              call 0041CDEC

Step 9. Ok, 让我们看看它是干什么的. 按 PgUp1或2次直到看到:

  * Possible StringData Ref from Code Obj ->"C:\窗口s\system\system.cyt"

  :0043E743 BA34E84300              mov edx, 0043E834
  :0043E748 8B08                    mov ecx, dword ptr [eax]
  ....
  ....

  * Possible StringData Ref from Code Obj ->"true"  <---- good boy

  :0043E769 BA5CE84300              mov edx, 0043E85C
  :0043E76E E85153FCFF              call 00403AC4
  :0043E773 7418                    je 0043E78D  <---- if not gobad boy

  ....
  ....

  * Referenced by a (U)nconditional or (C)onditional Jump at Address:
  |:0043E773(C)

  :0043E78D C605EC27440001          mov byte ptr [004427EC], 01
  :0043E794 A1001C4400              mov eax, dword ptr [00441C00]
  :0043E799 8B00                    mov eax, dword ptr [eax]
  :0043E79B 8B8020020000            mov eax, dword ptr [eax+00000220]

  * Possible StringData Ref from Code Obj ->"Registered"  <---- good boy

Step 10. Do you see what I see??"C:\窗口s\system\system.cyt"是什么?

         让我们看看C:\窗口s\system\system.cyt,内容如下:

  6
  false

Step 11. Hmm, ok试着将"false"改成"true". 保存它,运行 CYT.EXE

         WOW,它被注册了!!它是我所见过的最愚蠢的程序.

            PART 3: 怎样破解Quake 2 3.10的cd检测

Step 1. 运行 QUAKE2.EXE

Step 2. 你可以看到它要你插光盘. Ok,没问题,
        把"You must have the Quake2 CD in the drive play"抄下来.

Step 3. Ok, 退出程序.

Step 4. 运行 WC, 进入 Quake2目录.

Step 5. 拷贝 QUAKE2.EXE到QUAKE2.EXX和QUAKE2.W32

Step 6. 运行 W32Dasm,反编译 QUAKE2.W32

Step 7. 反编译后, 单击 STRING DATA REFERENCE, 向下找到:"You must have the Quake2 CD in..".
     (你应该记住的的那个错误信息),双击它.

Step 8. 关闭 SDR 窗口, 你可以看到:

  * Referenced by a CALL at Address:

  |:00429038   <---- 那是什么?
    ~~~~~~~~
  :0042D4F0 E83BFFFFFF              call 0042D430
  :0042D4F5 803800                  cmp byte ptr [eax], 00
  :0042D4F8 750F                    jne 0042D509  <---- bad boy!

  * Possible StringData Ref from Data Obj ->"You must have the Quake2 CD in "
                                          ->"the drive play."

Step 9. Ok, 让我们找出什么调用了这个过程. Hmm, 往上看,它在429038这里被调用了!

        单击GoCode Location 按钮,输入 429038.

Step 10. 我们得到了什么?如下:

  :00429034 85C0                    test eax, eax
  :00429036 7505                    jne 0042903D  <---- 如果不相等则跳转
  :00429038 E8B3440000              call 0042D4F0  <---- bad boy!

  * Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
  |:00428FE5(U), :00428FF5(C), :00429019(U), :00429036(C)

  :0042903D E84E710000              call 00430190  <---- good boy!

Step 11. Ok, 让我们把429036的75(jne)改成EB(jmp).确保绿色的光棒是在00429036 7505
       jne 0042903D上,你可以在状态栏里看到偏移量@Offset 00028436h.
       就是要修改的地方.

Step 12. 回到 WC, 运行 HIEW QUAKE2.EXE, 按 F4 选择 Decode mode
         (ASM), 按 F5,输入 28436. 你可以看到:

  00028436: 7505                         jne    00002843D   ---------- (1)

  00028438: E8B3440000                   call   00002C8F0   ---------- (2)
  0002843D: E84E710000                   call   00002F590   ---------- (3)
  00028442: 8B0DEC0F4700                 mov    ecx,[000470FEC]
  00028448: A388104700                   mov    [000471088],eax

Step 13. 按 F3, 输入 EB,按 F9更新 QUAKE2.EXE. 退出 HIEW.

Step 14. 运行 QUAKE2.EXE, yeah,你做出了它的硬盘版了!!

            PART 4: 怎样注册TRAYRUN 2.0.1

Step 1. 运行 TRAYRUN.EXE

Step 2. 单击 Register,,输入你的名字和任意的注册码. *boom* 失败了.
    (当然不然我还写什么教程:( )

Step 3. Ok, 退出程序.

Step 4. 运行 WC, 进入 TRAYRUN目录.

Step 5. 拷贝 TRAYRUN.EXE到TRAYRUN.EXX和TRAYRUN.W32

Step 6. 运行 W32Dasm,反编译 TRAYRUN.W32

Step 7. 反编译后, 单击 STRING DATA REFERENCE, 向下找到:"Registration Failed".
     (你应该记住的的那个错误信息), 双击它.

Step 8. 关闭 SDR 窗口, 你可以看到:

  * Possible StringData Ref from Code Obj ->"RegC"  <----这个是什么?

  :0042E6C0 BAACE74200              mov edx, 0042E7AC
  :0042E6C5 8BC6                    mov eax, esi

  ....
  ....

  * Referenced by a (U)nconditional or (C)onditional Jump at Address:
  |:0042E64C(C)

  * Possible StringData Ref from Code Obj ->"Registration Failed."<---- bad boy

  :0042E6F6 B8BCE74200              mov eax, 0042E7BC

Step 9. 你看见了吗?跳转! Ok,单击GoCode Location,输入: 42E64C,你会找到:

  :0042E64C 0F85A4000000            jne 0042E6F6  <---- 如果不相等则跳到bad boy

  * Possible StringData Ref from Code Obj ->"Registration Succesful."
                                                           <---- good boy

  :0042E652 B848E74200              mov eax, 0042E748

Step 10. 哈,让我们来玩玩!确保绿色的光棒是在0042E64C  0F85A4000000上
        你可以在状态栏里看到偏移量@Offset 0002DA4Ch.
        它就是要修改的地方.

Step 11. 回到 WC, 运行 HIEW TRAYRUN.EXE, 按 F4 选择 Decode mode
         (ASM), 按 F5,输入 2DA4C. 你可以看到:

  0002DA4C: 0F85A4000000                 jne    00002DAF6   ---------- (2)
  0002DA52: B848E74200                   mov    eax,00042E748
  0002DA57: E87CBBFFFF                   call   0000295D8   ---------- (3)
  0002DA5C: B201                         mov    dl,001
  0002DA5E: B870304200                   mov    eax,000423070
  0002DA63: E8BC4AFFFF                   call   000022524   ---------- (4)

Step 12. 按 F3, 输入 0F84,按F9更新TRAYRUN.EXE.退出 HIEW.

Step 13. 运行 TRAYRUN.EXE. 输入你的名字和任意的注册码, 它将告诉你已经注册了,对吗?

         单击 About,你可以看到你的名字.

Step 14. 现在退出 TRAYRUN,再运行它. Hmm,怎么又变成没有注册的了?
         原来它还检测了注册表里面的信息,在HKCU\Software\MJTNET\TRAYRUN\Settings.

Step 15. 回到 W32Dasm,打开SDR 窗口,向下找: "RegC" (还记得吗在前面看到过)
XX,拷贝 TRAYRUN.EXE到TRAYRUN.W32,我们已经修改了一部分. 现在, 双击两次"RegC".

Step 16. 关闭 SDR 窗口, 你可以看到s:

  * Possible StringData Ref from Code Obj ->"RegC"

  :004309EC BA9C0B4300              mov edx, 00430B9C
  :004309F1 8BC3                    mov eax, ebx
  ....
  ....
  :00430A0C 833DD426430000          cmp dword ptr [004326D4], 00000000
                                                          <---- regcode!
  :00430A13 750D                    jne 00430A22
  :00430A15 833DD826430000          cmp dword ptr [004326D8], 00000000

  :00430A1C 0F84E0000000            je 00430B02  <---- if not, jump bad boy

  * Referenced by a (U)nconditional or (C)onditional Jump at Address:
  |:00430A13(C)

  :00430A22 A194264300              mov eax, dword ptr [00432694]

Step 17. 这回一定要看仔细点. Hmm, 430A1C离430B02太远了,你认为这个是你要找的跳转吗?
     我可不.看430B02:

  :00430B02 A1A0264300              mov eax, dword ptr [004326A0]

  :00430B07 E86C04FFFF              call 00420F78
  ....
  ....
  ....
  :00430B26 E8C928FDFF              call 004033F4
  :00430B2B C3                      ret

         正如你所看到的430B02和430B2B紧挨着(它的功能是在call 004033f4前往回跳),应该不是.
         这种情况下我经常做的就是找到 RET前最后的一个跳转.

Step 18. 现在我们往下看,到了:

  :00430ADC 740C                    je 00430AEA<---- 如果相等则跳转
  :00430ADE A1A0264300              mov eax, dword ptr [004326A0]
  :00430AE3 E89004FFFF              call 00420F78
  :00430AE8 EB22                    jmp 00430B0C <---- 无条件跳转
  * Referenced by a (U)nconditional or (C)onditional Jump at Address:
  |:00430ADC(C)

  :00430AEA A19C264300              mov eax, dword ptr [0043269C]
  :00430AEF 8B80E0010000            mov eax, dword ptr [eax+000001E0]
  :00430AF5 8B15D4264300            mov edx, dword ptr [004326D4]
                                                          <---- regcode!

        430ADC就是要修改的地方!确保绿色光棒是在00430ADC 740C上,这里的偏移量是@Offset
        0002FEDCh.这就是要修改的地方.

Step 19. 回到 WC, 运行 HIEW TRAYRUN.EXE, 按 F4 选择 Decode mode
         (ASM), 按 F5,输入 2FEDC. 你可以看到:

  0002FEDC: 740C                         je     00002FEEA   ---------- (1)
  0002FEDE: A1A0264300                   mov    eax,[0004326A0]
  0002FEE3: E89004FFFF                   call   000020378   ---------- (2)
  0002FEE8: EB22                         jmps   00002FF0C   ---------- (3)
  0002FEEA: A19C264300                   mov    eax,[00043269C]

         按 F3, 输入 EB,按 F9更新 TRAYRUN.EXE. 退出 HIEW.

Step 20. 运行 TRAYRUN.EXE.. 没有NAG了, 单击 About. WOW,它被注册了:-)

            PART 5: quake的补丁Pascal 源程序(tKC/PC '98)

Uses Crt;

 Const A: Array[1..1] of Record {<-------- 1 bytes be patched}
  A : Longint;
  B : Byte;
  End = ((A:$28436;B:$EB)); {<-----offset "28436",byte "EB" be changed}

Var Ch:Char;
    I:Byte;
    F:File;
    FN:file of byte;
    Size:longint;

Begin
 Writeln('Little Patch');
 writeln('Crack for Quake 2 3.10 by tKC/PC ''98');
 Assign(F,'QUAKE2.EXE'); {<-------------- filename be patched}

 {$I-} Reset(F,1); {$I+}
 If IOResult <> 0 then
    begin
    writeln('File not found!');
    halt(1);
 For I:=1 to 1 do {<---------------------- 4 bytes be patched}
 Begin
  Seek(F,A[I].A);
  Ch:=Char(A[I].B);
  Blockwrite(F,Ch,1);
 End;
 Writeln('File successfully patched!');
End.


                    TUT07

欢迎来到第7课!

废话少说,我们继续上课.

这节课我将教你更多的W32Dasm,SoftIce的东东.
多谢我的新电脑了! :-)

内容:

1) 怎样去除Balls of Steel 1.1的CD检测
   使用W32Dasm.
   URL: http://www.pinfllwizards.com/bosdownload.html

2) 怎样去除NeverForget 1.00的NAG和30天限制
   使用W32Dasm.
   URL: http://www.neverforget.com/trial.html

3) 怎样注册Phone Plus 2.00
   使用SoftIce.

   URL: http://www.aros.net/~impulse

4) 怎样注册WinPatch 1.0.06
   使用SoftIce.
   URL: http://www.artistry.com/products/winpatch/wp.exe

5) 小结

工具:

你需要以下的工具 ：(我使用这些工具,我假定你也将使用它们)

W32Dasm 8.9 - http://www.fortunecity.com/bally/waterford/18/w32dsm89.zip

Hacker's View 5.66 - ftp://ftp.cdrom.com/.27/sac/utilprog/hiew566.zip

FAR 1.50b - ftp://rwntug.quarta.msk.ru/WinUtil/Rar/far150b.exe
或Windows Commander 3.50 Beta 7 - http://www.ghisler.com

或请求cracker们给你这些工具,它们将很乐意帮助你!:-)

下节课一定要把这些工具带齐噢!!

            PART 1: 怎样去除Balls of Steel 1.1的CD检测

Step 1.运行BOS.EXE

Step 2. 你可以看到它要你插光盘. Ok,把它抄下来.

        ("Please insert the Balls of Steel CD,click...")

Step 3. Ok, 退出程序.

Step 4.运行WC, 进入 BOS目录.

Step 5. 拷贝 BOS.EXE到BOS.EXX,拷贝 BOS.EXE到BOS.W32

Step 6.运行W32Dasm,反编译 BOS.W32

Step 7. 反编译后, 单击 STRING DATA REFERENCE, 向下找到:  "Please insert the Balls of Steel.."
    (你应该记住的那个错误信息),双击它.

Step 8. 关闭 SDR 窗口, 你可以看到:

  :00439882 B9F4984300              mov ecx, 004398F4

* Possible StringData Ref from Code Obj ->"Please insert the Balls of Steel "

Step 9. Ok, 让我们看看是什么调用了这段程序. Hmm,我们应该回到这段程序的开头.

Step 10. 按 PgUp2或3次,我们看到:

* Referenced by a CALL at Address:
|:004399D5   <--- 这是什么?

:004397A4 55                      push ebp
:004397A5 8BEC                    mov ebp, esp

Step 11. Ok, 让我们找出什么调用了这段程序.往上看,在4399D5那里!
     单击 Goto Code Location按钮,输入4399D5.

Step 12. Ah! 我们找到它了:

:004399D5 E8CAFDFFFF              call 004397A4

Step 13. Hmm, 我们来废了它,看看会有什么发生.确保光棒是在004399D5 E8CAFDFFFF   call 004397A4
     上,你可以在状态栏里看到偏移量 @Offset 00038DD5h.它就是要修改的地方.

Step 14. 回到 WC,运行HIEW BOS.EXE, 按 F4 to 选择 Decode mode (ASM),
     按 F5,输入 38DD5. 你可以看到:

00038DD5: E8CAFDFFFF                   call   000038BA4   ---------- (1)

00038DDA: E8D1FBFFFF                   call   0000389B0   ---------- (2)
00038DDF: 8B0B                         mov    ecx,[ebx]
00038DD5: E8CAFDFFFF                   call   000038BA4   ---------- (1)
00038DDA: E8D1FBFFFF                   call   0000389B0   ---------- (2)
00038DDF: 8B0B                         mov    ecx,[ebx]

Step 15. 按 F3, 输入 9090909090,
         按 F9 to 更新 BOS.EXE. 退出 HIEW.

Step 16.运行BOS.EXE,怎么样? yeah!!

            PART 2: 怎样 去除NeverForget 1.00的NAG和30天限制.

Step 1.运行NeverForget.EXE

Step 2. 你会看到NAG screen,非常讨厌对吗? Ok,抄下它. ("Demo version 1.00 installed on..")

Step 3. Ok, 退出程序.

Step 4.运行WC, 进入 NeverForget目录.

Step 5. 拷贝 NeverForget.EXE到NeverForget.EXX和NeverForget.W32

Step 6.运行W32Dasm,反编译 NeverForget.W32

Step 7. 反编译后, 单击 STRING DATA REFERENCE, 向下找到: "Demo version "
     (你应该记住的的那个错误信息),双击它.

Step 8. 关闭 SDR 窗口, 你可以看到:

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00408D55(C)   <--- 这是什么?

Step 9. Ok, 让我们看看是什么调用了这段程序.往上看,在 408D55! 单击 Goto Code Location按钮,
        输入 408D55.

Step 10. 现在我们找到了:

:00408D55 0F84F30B0000            je 0040994E
:00408D5B 53                      push ebx
:00408D5C 53                      push ebx

Step 11. Ok, 如果我们往下看,我们可以看到下面还有一个时间检测程序 ("Will expire soon")
     如果忽略这个跳转, 我们要跳转到哪里呢?让我们好好看看:

:00408E2B 53                      push ebx

Step 12. 这是应该时限检测的最后了. 让我们看看如果我们跳到这里会发生什么.却保光棒是在
         00408E2B 53   push ebx 上,你可以在状态栏里看到偏移量  @Offset 0000822Bh.
         记住它.回到408D55那里,这里的偏移量应该是8155h,对吗?

Step 13. Ok, 回到 WC,运行HIEW NEVERF~1.EXE, 按 F4 to 选择 Decode mode (ASM),按 F5,输
     入 8155. 你可以看到:

00008155: 0F84F30B0000                 je     000008D4E   ---------- (1)
0000815B: 53                           push   ebx

Step 14. 按 F3,接着TAB, 输入"jmp 822B",然后按 ESC.你可以看到:

00008155: E9D1000000                   jmp    00000822B

Step 15. 现在你可以按F9更新 NEVERF~1.EXE. 再退出 HIEW.

Step 16.运行NeverForget.EXE. *boom* 没有NAG了,也没有时限!Congratulations!!

            PART 3: 怎样注册Phone Plus 2.00

Step 1.运行Phone.EXE

Step 2. 你可以看到NAG screen,它很讨厌,对吗? Ok,没问题,
        单击 "enter Registration Code.."

Step 3. 按 CTRL-D呼出Softice.

Step 4. 输入BPX GETWindowTEXTA,按 F5回到PhonePlus.

Step 5. 输入名字："tKC/PC '98",注册码："12345", 单击 OK.

Step 6. 现在它被Softice拦截下来了,输入D EAX,现在你可以在数据窗口中看到"12345".

Step 7. Hmm,在按 F5回到程序,又被拦了下来,输入D EAX, 这回你可以看到数据窗口中有"tKC/PC '98"

Step 8. 按 F11走出函数.你看见寄存器窗口中有EAX=0000000A(十六进制)?它就是我们输入
    的名字的长度(试试输入"? A",你可以得到"10"的结果,也就是说我们输入了一个长度为
    10的字符串作为名字)

Step 9. 现在我们知道我们到了正确的地点了.按 F10直到你看见:

015F:7C69D80F  POP EDI

Step 10. 输入D ECX,你可以看见你输入的名字出现在数据窗口内.再按F10直到:

015F:0040EC61  CALL 0040ECBA

Step 11. 如果你继续按,就会出现注册码错误的提示窗口.所以它是出错前最后一个call.
         我们应该进入这个call. 按 F8进入call.

Step 12. 进入后,按F10直到:

015F:7C681D37  MOV ESI,ECX

Step 13. 现在输入D EAX,你能看到什么? *我们的注册码1P3201795*

Step 14. 输入BD*,按 F5回到PhonePlus.

Step 15. 输入 "1P3201795" *boom* 注册了!!

            PART 4: 怎样注册WinPatch 1.0.06

Step 1.运行WinPatch.EXE

Step 2. 你可以看见NAG screen,一个讨厌的东西. Ok,单击 "Enter Registration Code.."

Step 3. 按 CTRL-D进入Softice.

Step 4. 输入BPX GETWindowTEXTA,按 F5回到WinPatch.

Step 5. 输入 "The Keyboard Caper","12345"和"Phrozen Crew '98"分别作为名字,序列号和组织,
        然后单击OK.

Step 6. Softice拦了下来,输入D EAX,你可以在数据窗口中看到我们的名字.

Step 7. 按 F5,输入D EAX,这回是"12345"出现了.

Step 8. 再按F5,输入D EAX 我们的组织.(有几个栏目要输入就按几次F5)

Step 9. 按 F11走出函数. 你看见EAX=00000010了吗?这回不要我解释了吧.

Step 10. 现在按 F10直到:

015F:0040F2A1  PUSH EDX
015F:0040F2A2  PUSH EAX
015F:0040F2A3  CALL 00416B50
               """""""""""""
Step 11. 经过你自己的实验,你可以知道这是报错前的最后一个call.我们来试试,输入D EAX,正确的注册
    码就出来了

Step 12. 下BD*,按F5回到WinPatch.

Step 13. 输入"D&L-1121-1941-3638" *boom* 注册了!!

            PART 5: 小结

Softice一加载,在你重启之前你就没办法让它退出.要检查Softice是否已经加载, 按Softice的hot key ^D
(ctrl+D).如果加载了,就会出现softice的界面.要回到windows,下命令X (退出)或G(运行)或F5.

帮助按F1或下H.
单步跟踪使用T或F8.
单步执行使用P或F10.
设断点, 使用BPX <function>. 如：BPX GET窗口TEXTA 或 BPX GETDLGITEMTEXTA.
看断点设置,使用BL.
清除断点,BC,所有的都清除为bc*,只清除一个bc <在bl中看到的序号>.
激活断点,用BE0或BE*(*代表所有).
关闭断点,用BD0或BD* .
走出函数,用F11.
下一课我将教你有关softice更多的东西.


                    TUT08

欢迎来到第8课!

这节课我将教你更多的W32Dasm,SoftIce的东东.

内容:

1) 怎样解密CaptureEze97 6.0
   使用SoftIce.
   URL: http://www.screencapture.com/c97setup.exe

2) 怎样注册 MPEG Player 1.76
   使用SoftIce.
   URL: ftp://ftp.simtel.net/pub/simtelnet/win95/mmedia/mpegp176.zip

3) 怎样注册 WinXFiles 2.8
   使用SoftIce & W32Dasm.

   URL: http://www.pepsoft.com/wxf32_28.zip

4) 怎样注册 CD-R Diagnostic 0.1.1.3
   使用SoftIce.

5) SoftIce的技巧

工具:

你需要以下的工具 ：(我使用这些工具,我假定你也将使用它们)

W32Dasm 8.9 - http://www.fortunecity.com/bally/waterford/18/w32dsm89.zip

Hacker's View 5.66 - ftp://ftp.cdrom.com/.27/sac/utilprog/hiew566.zip

FAR 1.50b - ftp://rwntug.quarta.msk.ru/WinUtil/Rar/far150b.exe
或Windows Commander 3.50 Beta 7 - http://www.ghisler.com

或请求cracker们给你这些工具,它们将很乐意帮助你!:-)

            PART 1: 怎样 unlock CaptureEze97 6.0

BTW: 程序解密后,它仍然是试用版,只是去除了时限.

Step 1. 运行 CAPEZE97.EXE

Step 2. 你可以看见45剩余. Ok,没问题, 单击Purchase按钮. 依次输入"tKC","PC '98","12345"

Step 3. 按 CTRL-D进入Softice.

Step 4.输入 BPX GETWINDOWTEXTA,按F5回到CAPEZE.

Step 5. 单击 OK,Softice拦了下来, 按 F5.

Step 6. 你可以按F11如果你愿意,但它将很费时,所以最好的办法就是再按一次F5,然后F11.

Step 7. 出现了公司长度.eax＝00000006

Step 8. 按 F10直到看到:

    015F:00633FC1  LEA EAX,[EBP-14]   <---假密码
    015F:00633FC4  LEA ECX,[EBP-28]   <---真密码
    015F:00633FC7  PUSH EAX
    015F:00633FC8  PUSH ECX

Step 9. 输入 D EAX.可以看见"12345".

Step 10.输入 D ECX.可以看见真的注册码.

Step 11.输入 BD*,按 F5回到CAPEZE.

Step 12. 输入 "4422028906994041" *解密了*

Step 13. 如果你不想注册, 你可以按F10直到看到:

  015F:00634034  LEA EAX,[EBP-14]
  015F:00634037  LEA ECX,[EBP-28]
  015F:0063403A  PUSH EAX
  015F:0063403B  PUSH ECX

Step 14.输入 D ECX,你可以看到恢复试用期的密码.它也有用.

            PART 2: 怎样注册 MPEG Player 1.76

Step 1. 运行 MPEGP32.EXE

Step 2. 你可以看到NAG screen,非常讨厌.Ok,没问题, 单击 About/Registration.

Step 3. 输入 "tKC/PC '98","12345".

Step 4. 按 CTRL-D进入Softice.

Step 5.输入 GETDLGITEMTEXTA,按 F5回到MPEGP32.

Step 6. 单击Register,Softice拦下, 按 F5.

Step 7. 按 F11.你可以看见EAX=00000005.我们注册码的长度.

Step 8. Ok, 现在可以看到:

015F:0040A161  PUSH 00449140
015F:0040A166  PUSH 0043CCC0

Step 9.输入 D 449140,看到data window中有 "12345". 输入D 43CCC0可以看到我们的名字.

Step 10. Ok, 按 F10直到:

015F:0040A16B  CALL 0040E6D0

Step 11. 我们要进入这个call.原因应该不用说了吧.Ok, 按 F8进入.

Step 12. 按F10直到:

015F:0040E75D  MOV ESI,[ESP+0C]
015F:0040E761  MOV EDI,[ESP+10]
015F:0040E765  LEA EDX,[ESP+0C]

Step 13. 我们得到了什么?我们可以看见ESI=13EE3B42,EDI=BE096ACF. Ok, 按 F10直到:

  015F:0040E79F  LEA EAX,[ESP+0000010C]
  015F:0040E7A6  MOV DL,[EAX]

Step 14.输入 D EAX,在data window中是什么? *注册码*

Step 15.输入 BD*,按 F5回到MPEGP32.

Step 16. 输入 "13ee3b42-be096acf" *boom* 注册啦!!

            PART 3: 怎样注册 WinXFiles 2.8

BTW: 这个程序是用Delphi编译的,有时它它使用它们自己的处理机制.所以我们要用W32Dasm,Softice深入虎穴.

Step 1. 运行 WXFILES.EXE

Step 2. 单击Register, 输入 "tKC/PC '98","12345".

Step 3. 按 CTRL-D进入Softice,输入 BPX GETWINDOWTEXTA,也可以是BPX GETDLGITEMTEXTA.

Step 4. 按 F5回到WXFILES,单击 OK.

Step 5. Hmm,没拦下来. Delphi好像不喜欢那些GETxxxxxxx函数..Ok,没什么大不了的,使用W32Dasm
       ,反编译 WXFILES.EXE.

Step 6. 反编译后, 单击 STRING DATA REFERENCE, 向下找到: "Invalid Registration Password",双击它.

Step 7. 关闭 SDR 窗口, 你可以看到:

:00482A1A 668B0DAC2A4800          mov cx, word ptr [00482AAC]
:00482A21 B202                    mov dl, 02

* Possible StringData Ref from Code Obj ->"Invalid Registration Password."

Step 8. 按PgUp,可以看到:

:00482990 8D95D4FBFFFF            lea edx, dword ptr [ebp+FFFFFBD4]
:00482996 8B45FC                  mov eax, dword ptr [ebp-04]
---
---
---
:004829C8 754E                    jne 00482A18  <---如果错误则跳转
:004829CA 8B45FC                  mov eax, dword ptr [ebp-04]

Step 9. Ok,我们有了它的地址(482990),我们可以用Softice了.
        关闭 W32Dasm.

Step 10. 回到 WXFILES, 输入姓名和注册码.先别单击OK.

Step 11. 按 CTRL-D进入Softice,输入 BPX SHOWWindow,按 F5,单击 OK.

Step 12. *boom* 拦下了. Ok,输入 G 482990 (不用按 F5!)
         你将回到WXFILES. 输入code,单击 OK.

Step 13. *boom* 又拦下了

Step 14. Now输入 BD*,按 F10直到:

015F:004829AB  LEA EAX,[EBP+FFFFFBD8]

Step 15.输入 D EAX,可以看见"12345".

Step 16. 按 F10 直到:

015F:004829C2  POP EAX

Step 17. 输入 D EDX,好东西出来了!

Step 18. 按 F5回到WXFILES.

Step 19. 输入 MCGBVPFMWBAMYXQ *boom* Registered!!

            PART 4: 怎样注册 CD-R Diagnostic 0.1.1.3

Step 1. 运行 CDRDIAG.EXE

Step 2. 你可以看见NAG screen.单击 Help/Registration.

Step 3. 输入 "tKC/PC '98","12345".

Step 4. 按 CTRL-D进入Softice.

Step 5.输入 GETDLGITEMTEXTA,按 F5回到CDRDIAG.

Step 6. 单击 OK,你将回到Softice中.

Step 7. 按 F11走出这个函数. 你看见EAX=00000005了吗?它是密码的长度.

Step 8. Ok, 现在我们可以看到:

015F:00408AC0  MOV DL,[0041B640]

Step 9. 输入 D 41B640,可以看到"12345"

Step 10. Ok, 现在按 F10直到:

015F:00408B26  ADD ESP,04

Step 11. 你应该可以看到EAX=0000204C.

Step 12. 输入 ? EAX,得到:

0000204C  0000008268  " L"

Step 13. 我们看到了什么? 8268是4位的数字.作者并不是我们想像的那么聪明.如果你仔细看,它
         需要8位数字.它取出"8268"的第1,2位加在"8268"的前面,我们就得到了六位的数字,然后它
         取出"828268"的第1,2位加在"828268"的前面,我们就得到了八位的数字. 例如:
   1)
     Digits:  1 2 3 4
     Code:    8 2 6 8
   2)
     Digits:  1 2 3 4 5 6
     Code:    8 2 8 2 6 8
   3)
     Digits:  1 2 3 4 5 6 7 8
     Code:    8 2 8 2 8 2 6 8

Step 14. 所以我们的吉利数字应该是82828268. 试试看,输入 BD*,按 F5回到 CDRDIAG.

Step 15. 输入 "82828268" *boom* Registered!!

            PART 5: Softice的技巧

怎样设断?

一般处理
bpx hmemcpy
bpx MessageBox
bpx MessageBoxExA
bpx MessageBeep
bpx SendMessage

bpx GetDlgItemText
bpx GetDlgItemInt
bpx GetWindowText
bpx GetWindowWord
bpx GetWindowInt
bpx DialogBoxParamA
bpx CreateWindow
bpx CreateWindowEx
bpx ShowWindow
bpx UpdateWindow
bmsg xxxx wm_move(xxxx为窗口句柄)
bmsg xxxx wm_gettext
bmsg xxxx wm_command
bmsg xxxx wm_activate

时间相关
bpint 21 if ah==2A (DOS)
bpx GetLocalTime
bpx GetFileTime
bpx GetSystemtime

CD-ROM 或 磁盘相关
bpint 13 if ah==2 (DOS)
bpint 13 if ah==3 (DOS)
bpint 13 if ah==4 (DOS)
bpx GetFileAttributesA
bpx GetFileSize
bpx GetDriveType
bpx GetLastError
bpx ReadFile
bpio -h (Your CD-ROM Port Address) R

软件狗相关
bpio -h 278 R
bpio -h 378 R

键盘输入相关
bpint 16 if ah==0 (DOS)
bpint 21 if ah==0xA (DOS)

文件访问相关
bpint 21 if ah==3dh (DOS)
bpint 31 if ah==3fh (DOS)
bpint 21 if ah==3dh (DOS)
bpx ReadFile
bpx WriteFile
bpx CreateFile
bpx SetFilePointer
bpx GetSystemDirectory

INI 初始化文件相关
bpx GetPrivateProfileString
bpx GetPrivateProfileInt
bpx WritePrivateProfileString
bpx WritePrivateProfileInt

注册表相关
bpx RegCreateKey
bpx RegDeleteKey
bpx RegQueryValue
bpx RegCloseKey
bpx RegOpenKey

注册标志相关
bpx cs:eip if EAX==0

内存标准相关
bpmb cs:eip rw if 0x30:0x45AA==0

显示相关
bpx 0x30:0x45AA do "d 0x30:0x44BB"
bpx CS:0x66CC do "? EAX"


                    TUT09

欢迎来到第9课!

   Tutor Part 1 - 怎样得到WinAmp 2.01的注册码
                  使用SoftIce

   Tutor Part 2 - 怎样得到WinNavigator 1.0的注册码
                  使用SoftIce,W32Dasm

   Tutor Part 3 - 怎样得到WinBoost 98 1.1的注册码
                  使用SoftIce,W32Dasm

   Tutor Part 4 - 怎样注册File Mag-Net 1.10
                  使用SoftIce, W32Dasm,HIEW

工具:

你需要以下的工具 ：(我使用这些工具,我假定你也将使用它们)

W32Dasm 8.9 - http://www.fortunecity.com/bally/waterford/18/w32dsm89.zip

Hacker's View 5.66 - ftp://ftp.cdrom.com/.27/sac/utilprog/hiew566.zip

FAR 1.50b - ftp://rwntug.quarta.msk.ru/WinUtil/Rar/far150b.exe
或Windows Commander 3.50 Beta 7 - http://www.ghisler.com

               PART 1: 怎样得到WinAmp 2.01的注册码

   Step 1.运行WINAMP.EXE

   Step 2. 右键单击 WinAmp, 选择 Shareware, 单击enter Registration Info.
          输入 "tKC/PC '98", "123456". 但现在还不能单击 OK按钮.

   Step 3. Ok,按 CTRL-D进入Softice.

   Step 4.输入 BPX GETDLGITEMTEXTA,按 F5回到WinAMP.

   Step 5. 按 BackSpace, 删除一个"6" .. *boom* 被拦下了!

   Step 6. 你可以按 F11走出去.

   Step 7. 你看见EAX=0000000A了吗?输入 ? EAX,你可以看见:

           0000000A  0000000010  <--- 名字有十个字节

   Step 8. 按 F10 直到看到:

           0177:00403AD1  MOV ESI, EAX  <--- 假注册码

   Step 9. 输入 ? EAX,如下:

           00003039  0000012345  "09"

          它是假的.

   Step 10. 按 F10直到看到:

            0177:00403AD6  PUSH EAX  <--- 名字

   Step 11.输入 D EAX.名字出现在上方了.

   Step 12. 按 F10直到看到:

            0177:00403ADC  ADD ESP, 04

            寄存器窗口里有:

            EAX=04EC9715 .. 嗯,它是什么?

   Step 13.输入 ? EAX,看到:

            04EC9715  0082614037  "鞐"

            Kewl,它就是注册码!

   Step 14.输入 BC*,按 F5回到WinAmp.

   Step 15. 输入 "82614037" *registered!*

               PART 2: 怎样得到WinNavigator 1.0的注册码

   Step 1.运行WN.EXE

   Step 2. 单击 Register, 输入 "tKC/PC '98","12345".

   Step 3. 按 CTRL-D进入Softice.

   Step 4.输入 BPX GETWINDOWTEXTA,按 F5回到WinNavigator.

   Step 5. 单击 OK .. *boom*Softice拦截了.

   Step 6. 按 F11走出这个函数.

   Step 7. Hmm, 我并不认为我们来对了地方.因为WN是用Delphi写的.

   Step 8. Ok,没关系,输入 BC*,按 F5. 退出WN,
           打开W32Dasm,反编译 WN.EXE.

   Step 9. 反编译后, 单击 STRING DATA REFERENCE,向下找到:

           "Wrong registration number",双击它.

   Step 10. 关闭 SDR 窗口, 你可以看到:

* Possible StringData Ref from Code Obj ->"Wrong registration number"

   :004A79CF B8047B4A00              mov eax, 004A7B04
   ...
   ...
   ...
* Possible StringData Ref from Code Obj ->"The registration successfully"

   Step 11. Now 按 PgUp直到:

   :004A7996 E8EDC3F5FF              call 00403D88

   Step 12. 这就是我们要在SoftIce中利用的地址.
            关闭 W32Dasm. 回到WN,运行它,按step 2输入.

   Step 13. CTRL-D进入SoftIce.输入 BPX SHOWWindow,然后F5.
            单击 OK .. *boom* 拦截了.

   Step 14.输入 G 4A7996  <--- 这就是我们刚得到的地址
            *boom* 又回到了WN. 再单击 OK,. *boom* 又拦下了!

   Step 15. 你看见EAX=0151C89C了吗?输入 D EAX,可以看见我们的名字.
           终于来对地方了.

   Step 16. 按 F10直到看到:

            0177:004A79C5  MOV EAX, [EBP-04]

            现在可看到:

            EDX=0151C8C8 ..

   Step 17. 输入 D EDX,"12345"出现了..原来还是假的

   Step 18. 按 F10直到看到:

            0177:004A79C8  CALL 00403E98

            现在可看到:

            EAX=0151C8B4 .. hmm,这是什么?

   Step 19.输入 D EAX,来了!!*

   Step 20.输入 BC*,按 F5回到WN.

   Step 21. 输入 "4459953" *registered!*

   PART 3: 怎样得到WinBoost 98 1.1的注册码

   Step 1.运行WB98.EXE

   Step 2. 单击 Register, 输入 "tKC/PC '98","12345".

   Step 3. 单击 OK. 没反应?

   Step 4. Ok, 没关系. 退出WB98,打开W32Dasm反编译 WB98.EXE.

   Step 5. 反编译后, 单击 STRING DATA REFERENCE,向下找到:

           "WinBoost 98 has been registered",双击它.

   Step 6. 关闭 SDR 窗口, 你可以看到:

* Possible StringData Ref from Code Obj ->"WinBoost 98 has been registered"

   :004AE069 B844E34A00              mov eax, 004AE344

   Step 7. Now 按直到:

   :004AE019 8B45F4                  mov eax, dword ptr [ebp-0C]

   Step 8. 这就是要在SoftIce中用的地址.
           关闭 W32Dasm. 回到WB98,运行它,按Step 2输入.

   Step 9. CTRL-D进入SoftIce.输入 BPX SHOWWindow,然后F5.
           单击 ORDER FORM .. *boom*SoftIce拦下了.

   Step 10.输入 G 4AE019  <--- 刚才得到的地址
          *boom* 回到了WB98. 单击 ORDER LATER,单击 OK. *boom*又拦下了!

   Step 11. 按 F10 直到看到:

            0177:004AE01C  MOV EDX, [EBP-10]

            看看寄存器窗口:

            EAX=0904054 .. hmm, 它是�!!�?

   Step 12.输入 D EAX,"12345"出现了..一个假的

   Step 13. 按 F10直到看到:

            0177:004AE01F  CALL 00403D74

            看看寄存器窗口:

            EDX=091BF7C .. hmm ?

   Step 14. 输入 D EDX,看到了什么?
            *注册码!!*

   Step 15. 输入 BC*,按回到WB98.

   Step 16. 输入 "375782918" *registered!*

               PART 4: 怎样注册File Mag-Net 1.10

   Step 1.运行FMAGNET.EXE

   Step 2. 输入 "tKC/PC '98","12345".

   Step 3. Sorry, wrong Registration ID or KEY. Kewl, let's go!

   Step 4. 退出FMAGNET, 拷贝 FMAGNET.EXE到FMAGNET.EXX和FMAGNET.W32.
          打开W32Dasm,反编译FMAGNET.W32.

   Step 5. 反编译后, 单击 STRING DATA REFERENCE,向下找到:

           "Sorry, wrong Registration ID or",双击它.

   Step 6. 关闭 SDR 窗口, 你可以看到:

* Possible StringData Ref from Data Obj ->"Sorry, wrong Registration ID or"

   :0040276A 68B4A04100              push 0041A0B4

   Step 7. 按 PgUp直到看到:

   :00402763 6A10                    push 00000010

   Step 8. 这就是我们要在FMAGNET.EXE中修改的地方.
           偏移量是1B63,关闭 W32Dasm.

   Step 9.运行HIEW FMAGNET.EXE, 按 F4 to 选择 Decode Mode (ASM),
           按 F5,输入 1B63. 可以看:

   00001B63: 6A10                         push      010
   00001B65: 68D8A04100                   push      00041A0D8
   00001B6A: 68B4A04100                   push      00041A0B4

   Step 10. 这里push的就是错误信息.我并不准备告诉你细节,如果你用SoftIce,你可以找到名字/注册码
            所储存的寄存器.

   Step 11. Ok, 按 F3编辑FMAGNET.EXE,输入以下:

   00001B63: 8B6C2410                     mov       ebp,[esp][00010]
   00001B67: 8B74241C                     mov       esi,[esp][0001C]
   00001B6B: 8BC5                         mov       eax,ebp
   00001B6D: 8BDE                         mov       ebx,esi
   00001B6F: 50                           push      eax
   00001B70: 53                           push      ebx

   Step 12. 按 F9 to 更新 FMAGNET.EXE,退出 HIEW.运行FMAGNET,输入名字和注册码,
          单击 Register.

   Step 13. 死机了!*&^%&&%$&我们来修正它.

   Step 14. 打开W32Dasm, 单击 Imported Functions, 向下找到:

            "MSVCRT.exit",双击它.

   Step 15. 关闭 ImpFn 窗口, 你可以看到:

   :0041236A FF15E4C04100            Call dword ptr [0041C0E4]

            Ah, 这就是秀完名字和注册码后退出FMAGNET的call!偏移量是1176A.
             关闭 W32Dasm.

   Step 16. 运行HIEW FMAGNET.EXE, 按 F4选择 Decode Mode (ASM),
            按 F5,输入 1B63. 这就是要修改的地方.
            按 F3,来到 1B76, 输入 "E8EFFB0000", 按 F9更新 FMAGNET.EXE.

   Step 17.它应该如下:

   00001B63: 8B6C2410                     mov       ebp,[esp][00010]
   00001B67: 8B74241C                     mov       esi,[esp][0001C]
   00001B6B: 8BC5                         mov       eax,ebp
   00001B6D: 8BDE                         mov       ebx,esi
   00001B6F: 50                           push      eax
   00001B70: 53                           push      ebx
   00001B71: E830F10000                   call      000010CA6 ------ (1)
   00001B76: E8EFFB0000                   call      00001176A ------ (2)

   Step 18. 退出 HIEW,运行FMAGNET. 输入名字和注册码*boom*一切正常!

   Step 19. 现在你应该知道keygen是如何工作的了.


                    TUT10

欢迎来到第10课!

   Tutor Part 1 - 怎样去除Age of Empires的CD-Check
                  使用SoftIce,HIEW

   Tutor Part 2 - 怎样得到Easy CD-DA Extractor 3.0的序列号
                  使用SoftIce

   Tutor Part 3 - 怎样得到MP3 to EXE 1.01的序列号
                  使用SoftIce,W32Dasm

   Tutor Part 4 - 怎样得到Visual Day Planner 6.1的序列号
                  使用SmartCheck

   工具:

   你需要以下的工具 ：(我使用这些工具,我假定你也将使用它们)

   W32Dasm 8.9 - http://www.fortunecity.com/bally/waterford/18/w32dsm89.zip

   Hacker's View 5.66 - ftp://ftp.cdrom.com/.27/sac/utilprog/hiew566.zip

   FAR 1.50b - ftp://rwntug.quarta.msk.ru/WinUtil/Rar/far150b.exe
   或Windows Commander 3.50 Beta 7 - http://www.ghisler.com

   SmartCheck 6.0

   Are you ready?!

   OK! ;)

                PART 1: 怎样破解Age of Empires

    工具:
      SoftIce 3.24
      HIEW 5.92

    一般的我们只需W32Dasm就可以破解cd－check,但这回不同.事实上用softice也很容易.当然你也可以使
用W32Dasm,
    如果你要这样作我会给你些提示. Microsoft并不是使用的平常的文本对话框而是图形的所以你W32Dasm
在中找不到它
    提示你的字符串.

    Ok..let's start.

    1. 使用SoftICE前,你要先修改WINICE.DAT一下.在exp＝USER32, GDI32, KERNEL32
       前面把分号去掉. 这时SoftICE才会拦截到某些api函数.
    2. 重启后,运行SoftICE,用Symbol Loader 载入EMPIRES.EXE
    3. Load它. (Modules->load),忽略错误信息.
    4. Soft-ICE弹出.在GetDriveTypeA上设断(返回值eax=5就是CDROM,eax=3就是HDD): bpx
getdrivetypea
        最末尾的'a'意味着是32-Bit程序. 而Getdrivetype是工作于16-Bit程序之上.
    5. 按F5回到.如果SoftICE又弹出 - 别管它.一直按到主菜单出现.
    6. 现在你到了主菜单- 点'Single Player'.
    7. 一进入 Soft-ICE就拦下了.按F11.
    8. 现在你在好地方了,在调用GetDriveTypeA地方的下面!.向周围看看.([CONTROL-(],[CONTROL-(])
    9. 可以看到:

    :004D65F6 FF1554267000   Call [Kernel32!GetDriveTypeA]         -> 调用
    :004D65FC 83F805         cmp eax, 00000005                     -> 把返回值于5比较
    :004D65FF 7404           je 004D6605                           -> 是cdrom,跳到 ...
    :004D6601 33C0           xor eax, eax                          -> 不是 则eax=0 ..
    :004D6603 EB53           jmp 004D6658                          -> ...,返回.
    :004D6605 8D84241C010000 lea eax, dword ptr [esp+0000011C]     -> volume-check ...
    :004D660C 6800010000     push 00000100
    :004D6611 8D4C241C       lea ecx, dword ptr [esp+1C]
    :004D6615 50             push eax
    :004D6616 8D54241C       lea edx, dword ptr [esp+1C]
    :004D661A 51             push ecx
    :004D661B 8D44241C       lea eax, dword ptr [esp+1C]
    :004D661F 52             push edx
    :004D6620 8D4C242C       lea ecx, dword ptr [esp+2C]
    :004D6624 50             push eax
    :004D6625 6800010000     push 00000100
    :004D662A 51             push ecx
    :004D662B 57             push edi
    :004D662C FF1558267000   Call [Kernel32!GetVolumeInformationA] -> 调用
    :004D6632 85C0           test eax, eax                         -> 是CD-ROM在里面吗 ?
    :004D6634 B800000000     mov eax, 00000000                     -> eax=0
    :004D6639 741D           je 004D6658                           -> 不是 ! 返回eax=0 !
    :004D663B 8B460C         mov eax, dword ptr [esi+0C]
    :004D663E 8D4C241C       lea ecx, dword ptr [esp+1C]           -> ecx = CD-ROM 卷标
    :004D6642 05FD020000     add eax, 000002FD                     -> eax = 卷标 (AOE)
    :004D6647 50             push eax
    :004D6648 51             push ecx
    :004D6649 E802D60500     call 00533C50                         -> 有趣的东西 ...
    :004D664E 83C408         add esp, 00000008
    :004D6651 83F801         cmp eax, 00000001                   -> 如果eax=1设置register
flags
    :004D6654 1BC0           sbb eax, eax                          -> eax=eax-(eax+c)
    :004D6656 F7D8           neg eax                               -> '去补' eax
    :004D6658 5D             pop ebp
    :004D6659 5F             pop edi
    :004D665A 5E             pop esi
    :004D665B 5B             pop ebx
    :004D665C 81C40C020000   add esp, 0000020C
    :004D6662 C20400         ret 0004                              -> ...,返回

    你可以按F10一句一句执行,按F8进入call.

    :00533C50 55             push ebp
    :00533C51 8BEC           mov ebp, esp
    :00533C53 57             push edi
    :00533C54 56             push esi
    :00533C55 53             push ebx
    :00533C56 8B750C         mov esi, dword ptr [ebp+0C]
    :00533C59 8B7D08         mov edi, dword ptr [ebp+08]
    :00533C5C 8D05D08E5600   lea eax, dword ptr [00568ED0]
    :00533C62 83780800       cmp dword ptr [eax+08], 00000000
    :00533C66 753B           jne 00533CA3
    :00533C68 B0FF           mov al, FF
    :00533C6A 8BC0           mov eax, eax
    ...
    :00533CC6 E845070000     call 00534410
    :00533CCB 83C404         add esp, 00000004
    :00533CCE 38C3           cmp bl, al
    :00533CD0 74DA           je 00533CAC
    :00533CD2 1BC0           sbb eax, eax
    :00533CD4 83D8FF         sbb eax, FFFFFFFF
    :00533CD7 5B             pop ebx
    :00533CD8 5E             pop esi
    :00533CD9 5F             pop edi
    :00533CDA C9             leave
    :00533CDB C3             ret

    以上的这个功能是非常复杂的.你不必知道它是干什么的... ;-)
    无论如何,如果你一步一步执行了几次, 改变一些变量模,标志,你就会得出结论,eax的值 (从call中返
回时)既可以是
     0, FFFFFFFF也可以是1.(如果你插入错误的cd-它就返回1或FFFFFFFF).

    我们可以设想,0代表插入了正确的cd,... 试试看!
    输入: r eax=0 ,按 [CONTROL-D]回到Aoe.搞定了!

    如果你还不明白为什么它会工作,继续往下看...如果你知道或不关心,就直接跳到crack部分去.

    Okay,你想成为一名cracker...我们假设, 你没有改变任何东西(且插入了错误的CD),那么就会返回eax=
1.
    让我们再看看返回后的这段代码 :

    :004D664E 83C408         add esp, 00000008
    :004D6651 83F801         cmp eax, 00000001                     -> 如果eax=1 . 设置Z ;
                                          或 C如果 eax=0
    :004D6654 1BC0           sbb eax, eax                          -> eax=1-1 => eax=0
    :004D6656 F7D8           neg eax                               -> '去补' eax => eax=0
    :004D6658 5D             pop ebp
    :004D6659 5F             pop edi
    :004D665A 5E             pop esi
    :004D665B 5B             pop ebx
    :004D665C 81C40C020000   add esp, 0000020C
    :004D6662 C20400         ret 0004                              -> ...,返回

    所以整个函数返回eax=0如果CD错误...Hmmm....
    通常,当看着一个简单的保护, 你可以发现eax=0意味着错误,eax=1意味着正确.
    让我们看看当返回eax=0时将发生什么 ....

    :004D6651 83F801         cmp eax, 00000001                     -> 如果eax=1 ... (设置C=1)
    :004D6654 1BC0           sbb eax, eax                          -> eax=eax-(eax+c) => eax=0
-1=FFFFFFFF
    :004D6656 F7D8           neg eax                               -> '去补' eax => eax=1

    看起来这象另外一个保护 ...现在你基本上有两条路来破解:

    你可以在函数中设置eax=1,或在call中设置eax=0.

    我来解释怎样做:

    1. 最简单的是抄下一大串的十六进制代码,来定位.(如:8D05D08E560083780800 -
       这是从533C5C到533C62的)
       你也可以在SoftICE中读出偏移量 .
    2. 运行(HIEW EMPIRES.EXE), 按 [F4],然后[F2].
    3. 查找刚抄下的十六进制串([F7]).
    4. 切换到汇编模([F4],[F3]) - 你会在call的后面一点点.
    5. 进入mov esi,[ebp][0000C](它将被覆盖,但没关系)
    6. 按 [F3]接着[TAB]
    7. 现在输入'mov eax,0h',你应该记得为什么.这个命令的十六进制码应该是: B800000000
       现在它应该跳到call的末尾了 -输入 jmp xxxxxx' ,xxxxxx代表call的末尾地址.在我们这,它是
533CD7.
    8. 按 [ESC]退出, [F9]保存它,退出HIEW,运行游戏...
    9.它工作了!!!!

                PART 2: 怎样得到Easy CD-DA Extractor 3.0 beta的注册码

   唔, 这回我们要进攻的程序叫做:Easy CD-DA Extractor 3.0 beta [build 340]
                    (http://www.saunalahti.fi/~poiko/cdda3)

    我打赌你知道这是干什么的.抓音轨的!

    下面你只需SoftICE 3.24.听起来很cool?:)

    1. 打开程序.."enter registration code...."
       按那个按钮. 输入名字和随便的注册码.
       (如: BuLLeT / 22446688)
    2. 现在是时候运行那个伟大的调试工具了. 按 CTRL+D.
       现在我们需要设一个断点.试 bpx GETWINDOWTEXTA / GetDlgItemTextA
       按 F5,单击 OK. 没有拦下.
    3. 再来试试万能的 BPX HMEMCPY  (非常有用)
       按 CTRL+D回到SoftIce. 你可能想清除刚设的断点,用BC* = 清除所有的断点).
       输入: BPX HMEMCPY,按 F5. 单击 OK.
    4. BZZZZzzzz....BOOM.拦下了.但是没来对地方,对吗?屏幕底下是USER32(我们在系统的动态连接库内).
    Hmm..让我们到正确的地方去. 按 F10大概148次(破解可不是轻松差事).直到:

               XOR EDX,EDX                 <- 令EDX=0
               MOV [EBP-04],EDX            <-
               LEA EDX, [EBP-04]           <- 让EBP-04=EDX
               INC DWORD PTR [EBP-18]      <- 加一
               MOV EAX, [EBX+000001E0]     <- stuff=EAX
               CALL 0045C978               <-
               LEA ECX, [EBP-04]           <- 这应该是你呆的地方

    5. Ok..现在我们在LEA ECX, [EBP-04].如果你严格按我说的做那么你应该可以在屏幕的右上角看到:

                              SS: 0079EA48=009D5254

       我不会详细讲它
       So..下一步?难道不明显吗?
    6. 输入 'D 009D5254'. 看见了什么?你的名字和..嗯?那时什么? 好像个code.
       这是数据窗口的片段:

                                    BuLLeT...........
                                    ........EZCDDAX3-
                                    711189DC-A7964775
                                    -396.............

       难道不太简单了吗?

    7. 抄下它,下bc*. 按 F5回到CD-DA,输入刚抄下来的.
       (Name:BuLLeT  /  Code:EZCDDAX3-711189DC-A7964775-396)
    8. YIIIIHAAAAAAAAAAAA. 再没有 NAG了,也没有:"You can only select multible tracks....."

                 PART 3: 怎样得到MP3 to EXE 1.01的注册码
                   http://software.webset.de/buschjost/mp3eng.htm

   Step 1.运行MP3TOEXE

   Step 2. 单击 Register, 输入 "The Keyboard Caper", "tKC","12345".

   Step 3. 单击 OK. Wrong code.. Hmm它是用Delphi写成的! *duh* ;)

   Step 4. Ok,没关系.退出MP3TOEXE,打开W32Dasm,反编译 MP3TOEXE.EXE.

   Step 5. 反编译后, 单击 STRING DATA REFERENCE,向下找到:

           "The Registrationinformation is wrong. Try again?",双击它.

  Step 6. 关闭 SDR 窗口, 你可以看到:

* Possible StringData Ref from Code Obj ->"The Registrationinformation is "
                                        ->"wrong. Try again?"

   :0045468B BA4C4B4500              mov edx, 00454B4C

   Step 7. 现在按 PgUp直到:

   :0045459A 8D55F8                  lea edx, dword ptr [ebp-08]

   Step 8. 这个地址我们将在SoftIce中用到.
           关闭 W32Dasm. 回到MP3TOEXE,运行它,单击 Register按钮.

   Step 9. CTRL-D进入SoftIce.输入 BPX SHOWWINDOW,然后F5.
           单击 enter RegistrationCode .. *boom* SoftIce拦截了.

   Step 10.输入 G 45459A  <--- 刚得到的
            *boom*回到了MP3TOEXE.按Step 2重新输入,然后单击 OK. 又被拦截了.

   Step 11.在0177:0045459A, 你可以看到寄存器窗口SS: 0071ED7C=00C4E1CC,
           输入 D C4E1CC,我们得到了刚输入的名字. Kewl,向下走直到:

            0177:004545AE  PUSH EAX

   Step 12.输入 D EAX,你可以看见"12345"在数据窗口..
            Kewl, 我们的假注册码!

   Step 13. 按 F10直到看到:

            0177:004545E7  POP EAX

            现在你在寄存器窗口可以看到:

            EDX=00C4E1CC .. hmm,它是什么?

   Step 14.输入 D EDX,得到了什么?
            *注册码!!*

   Step 15.输入 BC*,按 F5回到MP3TOEXE.

   Step 16. 输入 "032C8CD850E55270" *registered!*

                 PART 4: 怎样破解Visual Day Planner 6.1
                   ftp://www.inklineglobal.net/win32/2day61.zip

   Step 1.运行VDP.EXE, 单击 enter Reg. Code.

   Step 2. 输入 "The Keyboard Caper", "The Cracker","12345".

   Step 3. Wrong Registration Code! Kewl, let's go!

   Step 4. 退出VDP.运行SmartCheck. (以下用SC代)

   Step 5. 单击 Program/Settings. 在Error Detection中,所有的都选.
           在Reporting中,除Report MouseMove events外所有的都选上.
           回到Error Detection, 单击 Advanced, 前4个应该选中,其它的不打钩.

   Step 6. 单击 OK 确定. Ok, let's go!

   Step 7. 在SC中,打开VDP.EXE,运行它!

   Step 8. 别紧张!!如果你得到API故障或任何错误,只要单击 ACKNOWLEDGE.
           不要单击 SUPpress!! 否则它将停止显示错误!
           现在,继续单击Acknowledge直到VDP出现.

   Step 9. Ok,现在单击 Register/enter Reg. Code.
           重新输入 "The Keyboard Caper", "The Cracker","12345".

   Step 10. 单击 OK, 你可以看见注册码错误的窗口.来到SC, 在Program Results 窗口,
            你可以看到: + mnuCode_click below, 单击 + 展开. 向下走直到看到
            + RegcodeForm.Show,展开它.

   Step 11. 继续往下直到看到 + btnOK_click, 展开它. 来到SECOND LCase$,
            在右边的窗口 (debug info) 可以看到:

            String string = 0058A3D0
                   "12345"
   Step 12. Ok,它是你输入的注册码.来到LCase$.. hmm.. 这里有很多的
           LCase$,都是注册码!因此随便挑一个,比如: 3882D927-9Y78-29699

   Step 13. Ok, 输入注册码.. Ahhhh 现在它认可了注册码! Kewl,你破解了第一个vb5程序!

   Step 14. 作为练习,我建议你反注册VDP,重新破解它一次它,直到你弄懂为止.
           打开REGEDIT,来到:

            HKEY_CLASSES_ROOT\.isl\Code,删除这个键值, 按 F5更新. 关闭 REGEDIT.

   Step 15. 现在你可以重新破解VDP.


                    TUT11

   欢迎来到第11课!

   你需要以下的工具 ：（我使用这些工具，我假定你也将使用它们）

   SoftIce 3.24
   W32Dasm 8.93
   Hacker's View 6.00
   SmartCheck 6.0
   Windows Commander 3.52

   Are you ready?!

   OK! ;)

                PART 1: 怎样使用Softice得到Sex Machine v1.2.0的注册码

    这回我们进攻的程序叫做:

                                    Sex Machine v1.2.0
                           (http://www.techsono.com/sexmachine)

   它是个VB5程序，所以你需要一些基本的VB破解知识.

    首先你要修改一下 WINICE.DAT，加入:

                            EXP=<drive:>\<dir>\MSVBVM50.DLL
                            (一般为c:\windows\system\msvbvm50.dll)

    这使得SoftICE能认识VB程序. 重启,准备开始.

    1) 运行程序，观察. 出现一个NAG: UNREGISTERED
       Hmm..我们不希望它说这个, 单击 "Go Away"，选择"enter Registration Key". 单击"Yes, i
agree..."
       Ok.

    2) 输入名字和注册码 (Name:BuLLeT / Serial: 22446688)
       按 CTRL+D，设断于: GETWINDOWTEXTA/GetDlgItemTextA. 按 F5，单击 OK.
       可没有拦下,只见"Wrong....".也许是时候告诉你vb5程序不用这些函数.

       当破解VB程序时你应该设其它的断点 BPX.比如:
       __vbastrcomp  /  multibytetowidechar  /  __vbastri4(注意都是两个下划线)
       事实上我们可以同时使用它们,只是跟踪时要长一些,但是我可不希望那样.于是..

    3) 清除所有的BPX (=BC*)，输入: BPX __VBASTRCOMP
       按 F5，单击 OK. *BANG* SoftIce拦下了 :-/
       现在让我们开始吧.那是什么?TONYTOP出现了几次.哪来的?经过一番调查，发现TONYTOP
       破解了1.0版. 所以被列入了程序的黑名单 :)
       (我希望下一个版本的黑名单中没有我...hehe)

    4) 使用F10一直走..走啊走啊.大概140次后 :) (估计的误差范围±9999999). 一直走直到看到:

            MOV EAX, 00000001
            ADD ESP, 0C
            ADD AX, SI
            JO 0042E588
            MOV ESI, EAX
            JMP 0042E45D
            IMUL EDI, EDI, 40
            JO 0042E588
            PUSH EDI
            CALL [MSVBVM50!__VbaStrI4]
            MOV EDX, EAX                   <---------- 你停的地方!

    5) Ok..现在你在'MOV EDX, EAX'，你没有一点线索了. Well...当你跟进CALL
       时有许多寄存器改变了.让我们看看其中的一些.从EAX开始.输入 'D EAX' Hmm..一个数字..
       (我这是: 33280) 照常理它应该是: '33280' 可是它是'3 3 2 8 0'.怎么来的?
       这是因为VB使用multibytetowidechar.一个转化数据到wide char的函数/功能.
       没关系只是在每个字符后加了00(HEX).

    6) 清除所有的断点(=BC*). 按 F5，输入正确的注册码.
       *BOOM*...registered...:)

    我希望这教了你一点点破解VB程序的知识.

            PART 2: 怎样使用SmartCheck得到PowerAIM v1.3.7的注册码

    Ok..我再一次给你们一个教程来提高你们的技能
    这回要破解的是:

                                    PowerAIM v1.3.7
                                   (AOL的add-on)

    我们将使用SmartCheck破解它.你不需要任何的汇编知识.只要跟着教程走就行了.

    让我们开始吧 (oh..记住你的SCREEN NAME -它在后面有用)

    1) 运行SmartCheck (=SC)，打开PWRAIM.EXE
      运行它，按 'acknowledge'几次. (直到它停止加载).

    2) 按 'Register',随便输入一个注册码.

    3) 单击 'OK'.

    4) 回到SC，进入以下的部分:

               DoEvents/Timer1_Timer/btn_lickReg.Do.lick/RaiseEvent/
               btn_enter.Reg.Do.click/DoEvents/btn_OK_lick/

       这里你可以看到:

               Double(x.xxxxx+xxx) --> Long (xxxxxxx)
                      |---------|            |-----|
                           |                    |
               Your code + some stuff  | Your code - stuff

    5) 单击它，观察Debug 窗口 (右边的).
       你可以看到:

               Double       x.xxxxxx+xxx
               Long         xxxxxxx         <--------
                                                |
                猜猜这是什么?    ----

        注册码!!!!!!!!!!!!!!!!!!!!

                (我这里: SCREEN NAME: BuLLeT  /  Reg-Key: 6011810)

               希望你喜欢破解VB5程序.我可是非常喜欢:=)

            PART 3: 怎样使用W32Dasm破解Stone's Connect Control v1.4.1

    我又给了你一个机会来学习破解.
    这回要破解的是:

                            Stone's Connect Control v1.4.1
                             (http://www.image.dk/~stone)

    这个程序对私人用户是免费的.

    我们将使用W32Dasm，HIEW. So...ready to go? OK!

    1) 运行程序...你看见了它吗? "IKKE REGISTRERET"...计下来...

    2) 运行W32Dasm，反编译 CONNCTRL.EXE

    3) 选择 SDR (=String Data Reference)，寻找那个字符串.
       双击它，关闭SDR 窗口.你可以看到:

       * Referenced by a (U)nconditional ar (C)onditional Jump at Address:
       0041408E(C) ------这里

       004140C0 B848614100          MOV EAX, 00416148

       *Possible StringData Ref from Code Obj -> "[IKKE-REGISTRERET!!!]"

       004140C5 BA24414100          MOV EDX, 00414124

       ......

    4) 看见了吗?  -> 0041408E.....看看它的地址. 向上到:

       * Referenced by a (U)nconditional ar (C)onditional Jump at Address:
       00414088(U)

       0041408C 84DB                TEST BL, BL
       0041408E 7430                JE 004140C0
       .
       .
       .
    5) So..向上直到看到:

       * Referenced by a (U)nconditional ar (C)onditional Jump at Address:
       00414064(C)

       00414086 33DB                XOR EBX, EBX
       00414088 EB02                JMP 0041408C

       .
       .
       .

    6) 继续直到看到:

       00414079 8B1540614100        MOV EDX, DWORD PTR [00416140]

       * Reference To: VCL20.System.@LStrCmp@51F89FF7, Ord: 0000h

       0041407F E8BCD0FEFF          CALL 00401140
       00414084 7504                JNE 0041408A

       Hmm....一个CALL紧接着又是一个JNE (=不相等则跳转)....

    7) 我们可以从这里推断出什么?在CALL中某些东西被进行了运算.
       如果CALL的结果不相等它就会跳转. Cool!
       这就意味着我们可以修改一些东西....但是改什么呢?
       试试..把JNE改成JE

    8) 注意偏移量@Offset 00013479h ,执行HIEW CONNCTRL.EXE

    9) 按F4进入 Decode mode.

   10) 按F5，输入偏移量

   11) 按 F3编辑，输入75 (=JE)

   12) 按 F9更新,再退出.

   13) 你觉得好了吗?错了!!在你在About Box看到你的名字之前 ,你要告诉程序在那里得到名字.
       所以进入注册表看看

   14) 运行REGEDIT.EXE，进入[HKEY_CURRENT_USER\Software\Stone's Software\ConnectControl\Start]

       加入:

       "RegNavn"="BuLLeT"           (任意)
       "RegNr"="S12345"             (必须以'S'开头)

       退出REGEDIT,运行CONNCTRL.EXE.怎么样 ??

                PART 4: 怎样使用W32Dasm破解Stone's WebWriter 2 v2.1.1

        目标:

                              Stone's WebWriter 2 v2.1.1
                             (http://www.image.dk/~stone)

    这个程序对私人用户是免费的.

    我们将使用W32Dasm，HIEW. So...ready to go? OK!

    1) 运行程序...你看见了它吗? "IKKE REGISTRERET"...计下来...

    2) 运行W32Dasm，反编译 WEBWRITE.EXE

    3) 选择 SDR (=String Data Reference)，查找它....没有!! 怎么办?? 找到: "p". D双击它直到看到
       偏移量是:为止0006D8B1     -   关闭 the SDR 窗口.你应该可以看到:

       * Referenced by a (U)nconditional ar (C)onditional Jump at Address:
       0046E494(U)

       0046E498 84DB                TEST BL, BL
       0046E49A 7440                JE 0046E4DC

       .......

       * Reference To: VCL30.System.LoadResString@02614E1B, Ord: 0000h

       .......

       *Possible StringData Ref from Code Obj -> "p"

       0046E4B1 8B159DE4700         MOV EDX, DWORD POTR [0047DE94]
       0046E4B7 FF7482FC            PUSH [EDX+4*EAX-04]

       .......

    4) 看见CALL了吗?  -> 0046E494.....向上直到:

       * Referenced by a (U)nconditional ar (C)onditional Jump at Address:
       0046E470(C)

       0046E492 33DB                XOR EBX, EBX
       0046E494 EB02                JMP 0046E498

    5) 继续直到看到:

       00414079 8B1540614100        MOV EDX, DWORD PTR [0047F418]

       * Reference To: VCL30.System.@LStrCmp@51F89FF7, Ord: 0000h

       0046E48B E8302DF9FF          CALL 004011C0
       0046E490 7404                JE 0046E496

       Hmm....CALL后紧跟JE (=相等则跳转)

    6) 这意味着什么?CALL中有一系列的运算.如果 CALL的结果相等它就跳转. Cool!
       试试将JE改成JNE

    7) 注意偏移量 --> @Offset 0006D890h   运行HIEW WEBWRITE.EXE

    8) 按F4进入 Decode mode.

    9)按 F5，输入偏移量

    10)按 F3编辑，输入75 (=JNE)

    11)按 F9更新,再退出

    12)你觉得好了吗?错了!!在你在About Box看到你的名字之前 ,你要告诉程序在那里得到名字.
       所以进入注册表看看

    13)运行REGEDIT.EXE，进入[HKEY_CURRENT_USER\Software\Stone's Software\WebWriter\Start]

       加入:

       "RegNavn"="BuLLeT"           (任意)
       "RegNr"="S12345"             (必须以'S'开头)

       退出REGEDIT,运行WEBWRITE.EXE.怎么样 ??

            PART 5: 怎样使用SmartCheck得到GameLaunch 3D v1.00.0020的注册码

    目标:                           Game Launch 3D v1.00.0020
                    ftp://ftp.cdrom.com/pub/planetquake/gamelaunch/gamelaunch100.exe

    1. 运行程序(当然先运行SmartCheck) ..  输入任意的名字.全配置好后,到Help, Register
Gamelaunch,
       注册一次.来到sc,trim$上面的数字就可能是我们的注册码?屏幕上有一个比较象(xxxx-xxxx-xxxx-
xxxx格式)

    7. 输入它注册(499F-q563-Te7Z-eD8Z.)

                PART 6: 怎样做UnInstall Manager v2.5的注册机

   工具
    -Softice 3.2+
    -Uninstall manager v2.5
    -Turbo Pascal 7
    -大脑

    -介绍-
    Ok, 这一部分将告诉你怎样制作注册码生成器(keygen).. 这是个非常简单的例子.
    这可能是我见过的最简单的保护措施了!

    Ok, install，运行.点菜单里的register按钮. 输入假注册码.我用:
    name: Fluxphrozen
    code: 121212

    ok进入softice (Control-D),设置一个 bpx于44FD57(译者:奇怪作者没提到这个地址从哪里来的)
    softice将拦下它.. 你就可以看到程序的核心.

    Ok, 在这个程序的开始 EDI包含了很多的字母(.
    注意,程序来到这点之前,
    :0044FD89        mov eax, dword ptr [ebp-08]       <-| 检查它
    :0044FD8C        call 00407408                     <-|
    :0044FD91        cmp ebx, eax                      <-比较真假
                                                         ebx= 真  eax= 假

    现在制作keygenerator.源代码如下:

    ===源代码开端===

    program umkeymaker;

    var
     name:string;           {声明变量}
     secondc:integer;
     total:integer;
     pos,z:integer;

    begin
     writeln('Uninstall Manager v2.5 Keygen');   {写屏}
     writeln('Flu[X]/PC98');
     writeln('7/06/98');
     writeln(' ');
     write('输入 Name :');
     readln(name);                        {读键盘的输入}
     Write('Registration Key : ');

     total:=0;                            {初始化变量}
     secondc:=0;
     pos:=1;

     while pos <= length(name) do         {名字小写化}
      begin
      z:= ord(name[pos]);
      secondc:=ord(name[pos]);
       if ord(name[pos]) <= 90 then
        begin
         if ord(name[pos]) >= 65 then
          begin
           name[pos]:= char(ord(name[pos]) + 32);
          end;
        end;
       pos:=pos+1;
     end;

     secondc:=0;
     pos:=1;                              {计数器复位}

     while pos <= length(name) do         {ascii值相加}
      begin
        if ord(name[pos]) <> $20 then      {检测是否有空格}
        begin
         secondc := secondc + ord(name[pos]);
        end;
       pos := pos +1;
      end;

     total := secondc XOR $89;            {与89 hex进行异或}
     secondc:= total;                     {赋值}
     total := secondc XOR $33;            {与33 hex进行异或}

     writeln(total);                      {输出结果}

    end.

    ===源代码结束===


                    TUT12

欢迎来到第12课!

   你需要以下的工具 ：（我使用这些工具,我假定你也将使用它们）

   SoftIce 3.24
   W32Dasm 8.93
   Hacker's View 6.00
   SmartCheck 6.0
   TASM 5.00
   Windows Commander 3.53

   Are you ready?!

   OK! ;)

            PART 1: 怎样去除Microsoft Combat Simulator 98的CD Check

怎样去除Microsoft Combat Simulator 98的CD Check
      (一个非常容易的cd check)
-------------------------------------------

Part 1: 开头...
------------------------

我希望你知道怎样使用W32dasm和怎样使用十六进制编辑器修改exe.
完全安装游戏.然后不插入光盘运行它.它会告诉你要插入光盘.没关系 - 运行W32dasm反编译
COMBATFS.EXE.

Part 2: cd-check...
-----------------------

单击 String Data References 查找你看到的错误信息.
找到了吗? Ok 单击它.你可以看见:

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401D4E(C)
|
:00401D9E 8B15E8C84100            mov edx, dword ptr [0041C8E8]

* Reference To: USER32.LoadStringA, Ord:0183h
                                  |
:00401DA4 8B35E81A4200            mov esi, dword ptr [00421AE8]
:00401DAA 6804010000              push 00000104
:00401DAF 68C0084200              push 004208C0

* Possible Reference to String Resource ID=01500: "Bitte legen Sie die Microsoft
                                                 ?Combat Flight Simulator-CD ei"

:00401DB4 68DC050000              push 000005DC
:00401DB9 52                      push edx
:00401DBA FFD6                    call esi
:00401DBC 8B0DE8C84100            mov ecx, dword ptr [0041C8E8]
:00401DC2 8D8424A4000000          lea eax, dword ptr [esp+000000A4]
:00401DC9 6804010000              push 00000104
:00401DCE 50                      push eax

现在再次双击那个字符串.又会卷屏到另一个地方.看看.Hmm,看起来很奇怪.看看那些跳转.没什么有意
思的.回到第一次去的地方.看见"recerence to USER32.LoadStringA"了吗??我认为应该不要解释它是
干什么的吧.大多数时候真正的references后面都跟着messageboxa,showwindow或与字符串有关的函数,
如lstrcpy和loadstringa.所以让我们更进一步.双击错误信息看看第二个是不是真正的reference -不
是,回到第一个地方.Ok, 现在我们要观察整个函数.首先,它对注册表动了手脚.看见 "InstalledFrom"
了吗?这应该是我们的光驱.接着,有两个出错信息(一个对话框的标题和内容). 接着,一大堆汇编码.别
管它们.最后有一个call  USER32.MessageBoxIndirectA.这是个不寻常的函数.call后面有两个cmp,每
个后面都跟着je.看看它是干什么的...yes,它是检查按钮是否被按下的.第一个cmp检查cancel按钮.如
果你将je改成jmp,如果没有光盘插入了它就会关闭游戏.第二个跳回,看看cd是否在光盘里.这两个跳转
后应该是:

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00401E23(C), :00401E2D(C), :00401E48(C)
|
:00401E62 8B0DE8C84100            mov ecx, dword ptr [0041C8E8]
:00401E68 51                      push ecx
:00401E69 E8F2F2FFFF              call 00401160
:00401E6E 85C0                    test eax, eax
:00401E70 750B                    jne 00401E7D
:00401E72 5F                      pop edi
:00401E73 5E                      pop esi
:00401E74 5D                      pop ebp
:00401E75 5B                      pop ebx
:00401E76 81C498010000            add esp, 00000198
:00401E7C C3                      ret

看起来象是要退出给好人设计的函数:-)(好人是指插入了cd的人).但是我们是坏人, ...

Part 3: 破解...
--------------------

OK,如果你看了上面的代码,也许你认为的最容易的就是nop掉最后的两个je.但是,你想一想.你nop掉了
按钮的检测,但是每次运行它还是会弹出对话框.当然你按一下它就会继续运行下去,但是就没有更好的
吗?你也可以试着nop掉call USER32.MessageBoxIndirectA,但是这是在nop掉一个指向dll的call.你可
以试试,它就会...试试,你就会知道的.好的,看看这段代码的最后一部分. 有三种不同的跳转到它.所以
最容易的就是:到第一个跳转处,让它变为无条件跳转.

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401E60(C)
|
:00401E13 8A0DC0FF4100            mov cl, byte ptr [0041FFC0]
:00401E19 51                      push ecx
:00401E1A E801FDFFFF              call 00401B20
:00401E1F 8BF0                    mov esi, eax
:00401E21 3BF5                    cmp esi, ebp
:00401E23 753D                    jne 00401E62  <----这里...
:00401E25 B341                    mov bl, 41
:00401E27 885C241C                mov byte ptr [esp+1C], bl

只需把0x00401E23的0x75改成0xEB.即jmp 00401E62.
yeah,ok now

Part 4: 结束...
---------------------

结束

                PART 2: 怎样破解DigiSignature v3.0
             http://www.simtel.net/pub/simtelnet/win95/security/sign30.zip
                            by Bisoux

等级 : 菜鸟
工具 :Winice ver 3.xx
      DigiSignature v3.0
      URL:http://www.simtel.net/pub/simtelnet/win95/security/sign30.zip
      一个人脑

介绍
------------
这个程序几乎没有安全措施,一个小小的修改就能注册.我不是一个破解高手,但它却没有花费我多少时
间.

1.Doing the patch.
------------------

ok 运行程序... 出现NAG,让我们来注册 , 单击register 出现对话框.输入你的名字和任意的注册码,
我填了：
Name: Bisoux
Company : KAC
Serial Num: 123456789
ok在按ok之前,让我们先设一些断点.如:

bpx GetDlgItemTextA
bpx GETWINDOWTEXTA

或用万能的bpx hmemcpy(只要是用注册码或序列号的都可以用这个断点）

现在回到程序(ctrl-d),按OK!Sice将拦下GETWINDOWTEXTA.这就是说程序正在试图调用第一个字符串.
但是,我们输入了三个字符串.所以我们应当从第三次拦截处开始跟踪,按两次F5.拦下后我们在
GETWINDOWTEXTA函数的内部,所以要按 F12回到程序中.

破解首先要做的就是看看下面有些什么,那里有跳转和比较?一般地(但并不经常),程序会调用一些call
然后进行比较,再就是有条件跳转.

第一次,我不会跟进每一个call来看看在哪里和为什么会弹出"Bad Boy".能做的只是双击每一个条件跳
转,那将会设一个断点在上面.(谢谢softice和它的鼠标支持)

一个条件跳转就象其它编程语言的if语句一样.因此我们必须知道' bad boy'窗口弹出是因为它在某一
个条件上不满足程序的要求.

继续跟踪(F10), 双击每一个跳转.最后,bad boy会出现显示"wrong......".kewl,通常最后的一个或到
数第二个跳转是罪魁祸首,按ctrl-d ,下 bl看看断点列表,然后禁用前面的几个.用bd 0 1 ....

现在F5,在输入名字等等
按 ok, sice将栏于
:00408845 8BD8                    mov ebx, eax
:00408847 FF37                    push dword ptr [edi]
:00408849 E8C2070000              call 00409010
:0040884E 83C404                  add esp, 00000004
:00408851 3BC3                    cmp eax, ebx
:00408853 7411                    je 00408866 <== 你会在这 !!!!

* Possible Reference to String Resource ID=00016: "select one of the user
ID names in the list at left, or use "
                                  |
:00408855 6A10                    push 00000010

* Possible Reference to String Resource ID=00063: "Error Message"
                                  |
:00408857 6A3F                    push 0000003F

在你停的地方你会看到'no jump',这是什么意思?每当有比较语句的时候(如cmp,test)都会有一个标志
寄存器储存比较结果(你可以在屏幕的右上角看到它们)条件跳转就会根据标志寄存器来确定是否进行
跳转.要改变它们可以用 r命令,如果不知道如何使用这条命令的话可以输入help r请求帮助.

现在要做的就是将'no jump'改成'jump'.输入r fl z,意思就是改变z标志寄存器的值.

改完后,按F5回到程序.booommmmm!!!!!!  Your registred!!!

但是这个程序还有更精细的东西(如同大多数程序一样),在每一次加载时都会核对注册码.

2.找到正确的注册码
------------------------
既然你知道怎样patch它,你就离正确的注册码不远了.前几步如上所述,当softice拦截后你在:
:00408851 3BC3                    cmp eax, ebx
:00408853 7411                    je 00408866

这就意味着比较是在eax和ebx之间进行的,所以只要d或?一下就可以得到了.

下面我再介绍一种方法
首先反注册程序,删除 HKEY_local_machine/softwares/thunderbyte/digisign/code.反注册后运行程
序,点register,输入,进入softice,bpx GETWINDOWTEXTA,回到程序,按ok按钮,soft-ice拦下,按两次F5
(记住它要调入3个字符串),F12直到回到程序,ok,现在让我们看看我们输入的注册码在哪里.
下 s 0 l ffffffff '123456789'命令(123456789是我输入的注册码)

sice会回复:在 xxxx:xxxxxxxx处找到了.
非常好现在我们设置一个断点:bpr xxxx:xxxxxxxx xxxx:xxxxxxxx+9 rw
意思就是每当程序对这个地址进行读或写操作时就拦下来,rw就是read/write.

完成后,按F5继续运行,拦下后, 我们发现并不是在主程序里,而是在call中.所以按F11走出去,来到:

:0040883C FF1538404100            Call dword ptr [00414038]
:00408842 83C404                  add esp, 00000004  <===  走出来就到了这里
:00408845 8BD8                    mov ebx, eax
:00408847 FF37                    push dword ptr [edi]
:00408849 E8C2070000              call 00409010
:0040884E 83C404                  add esp, 00000004
:00408851 3BC3                    cmp eax, ebx
:00408853 7411                    je 00408866

熟悉吧.eax的值赋给了ebx,后面又进行比较...所以执行到那里后,输入 "? ebx",你就会得到注册码了
bc *后,再回到程序进行注册.

容易吗 ?

结尾
-----------
废话一大堆,懒得翻译了.

            PART 3: 怎样破解Braga's Crackme
Numega Smartcheck 5.0

初学者指南

目标:
Braga.exe - Braga's Little Crackme 1 in Visual Basic 5

工具:
Smartcheck 5.

虽然在fravia.org有很多的Smartcheck的教程,但它们并没有帮助我入门SC,希望这篇教程能对你有所
帮助.这个教程将帮助你掌握基础,而不只是告诉你如何完成braga's crackme.

对那些还不熟悉或不知道SC的,这里有一些摘自它的帮助文件的描述:

SmartCheck是一个运行时的排错工具,专门工作于Visual Basic开发者们遇到的复杂环境:

?隐蔽和难解决的致命run-time错误
?问题出自一系列的事件
?错误的Windows API使用
?送坏值进Visual Basic函数
?Problematic value coercions
?控件错误,如你程序使用的ActiveX controls

heh heh, well,你不但可以用smartcheck来为Visual Basic程序除错
你也可以用SC来找出其它的程序在干什么,不管它是否是用Visual Basic编的.
事实上,cracker们有了它再也不会讨厌破解VB5程序了:
SC使得破解有趣!!

Ok,就介绍到这里.安装好后,运行Smartcheck. 在File菜单,点open,打开braga.exe.然后,在
Program菜单, 选settings.作以下调整:

在Error Detection页,所有的check box都选中.

在Error Detection页,在Advanced中, 前4个checkbox应该选,其它的不选.确保'Suppress API Calls'
没有被选中.

在Reporting页,除了'Report mousemove events from OCX'其它的都要选.

Phew! Ok, now, 按F5开始执行.SC中会出现一个新的窗口,分成三部分.底部,不去管它.

在它的上面,左边,你可以看到很多的function call, 点一个右边就显示更多的详细资料.
你可以看见第一个function call,它是InitializeCriticalSection(PTR: xxxxxxxx)
如果你看看状态栏,就可以知道有多少事件发生了.我这里有1360个,从加载braga.exe开始.在Viewmenu
选Show All Events.当你掌握了sc时,你可以用Specific Events进行实验.

OK, Braga's crackme应该加载完了,输入你的名字和随机的注册码,单击Register.你就会看见一个Dlg
box"Keep Trying :)))"
好的,让我们看看Smartcheck给了我们什么.查找你输入的前四个字母(比如:我输入了night_mastah[mg
m],所以我查找'nigh').

你就会到
__vbaVarMove(VARIANT:String:"night_m",VARIANT:Empty) returns DWORD:63F35C

它取出了你的注册码,准备下面用.然后它又算出你名字的长度,然后找出最左的字母,我这儿是'n' .它
又找出那个字母的Ascii值,转化为十六进制HEX (6E).接着,它又找出你名字的前四个字母,虽然我不知
道它打算拿它干什么.通过观察SC的显示,我认为,它打算找出前四个字母的ascii值,但是程序所做的却
是有一次找出了第一个字母的Ascii值.然后又转化为十六进制.

再向下看,你来到 __vbaVarCat部分,在这里程序算出正确的serial.很容易知道它在干什么,如果不是,
听我解释:
1)它把你名字的第一个字母的十六进制值后面加一个'-'

2)完成后,加入'Pt-Cracker',和另外一个'-'(现在它变成了'xx-Pt-Cracker-',xx就是那个十六进制数

3)然后它把你名字的第一个字母的十六进制值加在最后面,成了'xx-Pt-Cracker-xx'

4)在加入一个'-'. 'xx-Pt-Cracker-xx-'

5)最后,加入12345.变成: 'xx-Pt-Cracker-xx-12345'

向下几行,你可以看到
 __vbaVarTstEq(VARIANT:String:"111222333444555", VARIANT:String:"6E-Pt-Cracker-6E-12345")
                                ^^^^^^|^^^^^^^
                                      +--你输入的注册码
现在就知道那里是什么了.

希望这篇短小的教程能让你掌握Smartcheck 5.0基本操作.

            PART 4: 怎样破解Opera 3.50
                    by NeuRaL_NoiSE

我将告诉你怎样破解 Opera 3.50从而得到所有的功能,而没有任何限制.
无论如何,记住这个家伙在努力,为的是带给你一个优良的浏览器.它可能是你在网上能找到的
最好的和最快的浏览器了.如果你真的喜欢它,就请使用它,注册它!!

***

使用工具:

 - W32Dasm v8.93
 - Hacker's view v6.00

***

PART 1: Getting Ready
_______________________________

Well well well.....你一定很讨厌它的nag screen,对吗!?
Well, 没什么奇怪的,你和大多数的人一样.:)
Ok, 单击 "EVALUATE", 进去好好看看!了解你的敌人,就象Fravia+经常说的那样!...看完后, 单击
HELP/ABOUT OPERA....

PART 2: LET'S GO FOR IT !!! :)
_____________________________

关闭help窗口,单击HELP/REGISTER OPERA...你就会看到一个dialog要你输入名字,组织和reg code...
因为你对第三个栏没有什么线索所以就填入假玩艺.
我想像你展示程序员们是如何打算保护保护措施的前门,而忽略了后门 :)
反编译Opera.exe....你在反编译后经常查找一些什么字符串呢??通常是那些讨厌的'错误的注册码..'
所以单击SEARCH输入"IS INVALID"或任何你记得的错误提示....你看到了什么 ?? NOTHING!!! %-/
没有匹配的,没门!!....ok...我第一次看到 Opera的反编译结果时,我想"WOO!那将会是一个难以致信的
保护!! LET'S ROCK!!"
先让我们停下来思考一下! <-- 一个cracker的优秀品质 :)
程序第一次认定我门是没注册的家伙是在什么时候呢?!? hmm...
YEAH!启动时!...启动时有一个splash screen:

/----------------------\
|  Opera 3.50 blah blah|
|  Copyright  blah blah|
|                      |
|  Registered to:      |
|  (unregistered)      |  <-- A-HA!!! ;)
\----------------------/
hmm...cool...let's see.....再次单击 SEARCH,这回输入"(unregistered)".yeah,有两个...

让我们检查第一个...

:0045F882 7532                    jne 0045F8B6
:0045F884 6A40                    push 00000040
:0045F886 56                      push esi

* Possible Reference to String Resource ID=21110: "Opera 3.50"
                                  |
:0045F887 6876520000              push 00005276
:0045F88C E8400B0000              call 004603D1
:0045F891 56                      push esi
:0045F892 E8F9CA0700              call 004DC390
:0045F897 59                      pop ecx
:0045F898 A344555000              mov dword ptr [00505544], eax
:0045F89D 6A40                    push 00000040
:0045F89F 59                      pop ecx
:0045F8A0 2BC8                    sub ecx, eax
:0045F8A2 8D8090555000            lea eax, dword ptr [eax+00505590]
:0045F8A8 51                      push ecx
:0045F8A9 50                      push eax

* Possible Reference to String Resource ID=21428: " (unregistered)" <-- OUR
                                  |                                   MATCH
:0045F8AA 68B4530000              push 000053B4
:0045F8AF 8BCF                    mov ecx, edi
:0045F8B1 E81B0B0000              call 004603D1

well...你的第一想法是什么?? Yes,我知到就是那个在45F882的JNE....但是想一想,在push 00005276
和push 00053b4之间没有跳转了,所以不应该改它...这是什么意思呢?!?当运行浏览器时,你可以看见"
Opera 3.50 (unregistered)",那么照常理注册后"(unregistered)"应该没有了.如果jne是在两个push
之间,那么我们有理由相信是它决定在push opera 3.50之后是否还要加上"(unregistered)".但是现在
情况并不是这样,如果你将这个jne 改掉你在标题栏里就什么也看不到了.所以我们还要继续找,按F3在
第二个符合的地方停下来...如下:

* Possible Reference to String Resource ID=21110: "Opera 3.50"
                                  |
:00491E84 6876520000              push 00005276
:00491E89 FF3528595000            push dword ptr [00505928]
:00491E8F FFD7                    call edi

* Reference To: USER32.SetDlgItemTextA, Ord:022Ch
                                  |
:00491E91 8B35A4C44E00            mov esi, dword ptr [004EC4A4]
:00491E97 8D85C4FEFFFF            lea eax, dword ptr [ebp+FFFFFEC4]
:00491E9D 50                      push eax
:00491E9E 53                      push ebx
:00491E9F FF7508                  push [ebp+08]
:00491EA2 FFD6                    call esi
:00491EA4 8D8540FBFFFF            lea eax, dword ptr [ebp+FFFFFB40]
:00491EAA 83C3FE                  add ebx, FFFFFFFE
:00491EAD 50                      push eax
:00491EAE 53                      push ebx
:00491EAF FF7508                  push [ebp+08]
:00491EB2 FFD6                    call esi
:00491EB4 8D856CFCFFFF            lea eax, dword ptr [ebp+FFFFFC6C]
:00491EBA 50                      push eax

* Possible Reference to Dialog: SPLASH, CONTROL_ID:2B26, "Text"
                                  |
:00491EBB 68262B0000              push 00002B26
:00491EC0 FF7508                  push [ebp+08]
:00491EC3 FFD6                    call esi
:00491EC5 833DB45D500000          cmp dword ptr [00505DB4], 00000000
:00491ECC 7526                    jne 00491EF4
:00491ECE 8D85C4FEFFFF            lea eax, dword ptr [ebp+FFFFFEC4]
:00491ED4 68FF000000              push 000000FF
:00491ED9 50                      push eax

* Possible Reference to String Resource ID=21428: " (unregistered)" <-- OUR
                                  |                                   MATCH
:00491EDA 68B4530000              push 000053B4
:00491EDF FF3528595000            push dword ptr [00505928]
:00491EE5 FFD7                    call edi
:00491EE7 8D85C5FEFFFF            lea eax, dword ptr [ebp+FFFFFEC5]
:00491EED 50                      push eax
:00491EEE 53                      push ebx
:00491EEF FF7508                  push [ebp+08]
:00491EF2 FFD6                    call esi

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00491C03(U), :00491CFE(U), :00491ECC(C)
|
:00491EF4 6A01                    push 00000001
:00491EF6 58                      pop eax

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00491BF9(U), :00491C8A(U), :00491D08(U)
|
:00491EF7 5F                      pop edi
:00491EF8 5E                      pop esi
:00491EF9 5B                      pop ebx
:00491EFA C9                      leave
:00491EFB C21000                  ret 0010

WOOOOW! MAN!!! 一大堆的代码 !! 它是想把我弄疯吗!? :))
现在使用你的智慧!程序先push了"Opera 3.50",然后是运行一会儿,然后又push了重要的"(unregistered)"
.....你看见了最后那个push前面的那个JNE吗?!? YEAH!! IT'S IT!....睁大眼睛看看:

:00491EC5 833DB45D500000          cmp dword ptr [00505DB4], 00000000
:00491ECC 7526                    jne 00491EF4
:00491ECE 8D85C4FEFFFF            lea eax, dword ptr [ebp+FFFFFEC4]
:00491ED4 68FF000000              push 000000FF
:00491ED9 50                      push eax

* Possible Reference to String Resource ID=21428: " (unregistered)" <-- OUR MATCH
                           |
:00491EDA 68B4530000              push 000053B4

491ECC处的JNE就是cracker们说的GOOD JUMP,因为是它控制了"(unregistered)"的显示与否...这回的
这个jump可是在两个重要的push之间的!!!所以如果程序在491ecc处产生了跳转那么就注册了.
但是要如何实现呢?!把眼睛用502贴到显示器上你就会看到:

:00491EC5 833DB45D500000          cmp dword ptr [00505DB4], 00000000
:00491ECC 7526                    jne 00491EF4

现在再清楚不过了.它把储存在00505DB4中的数值与0比较,如果不是0,它就会跳到 00491ef4处,否则我
们就"UNREGISTERED !"了.现在怎么办呢??很容易!我们要在汇编代码中找出程序对在哪里对 00505DB4
写入了数据....于是来到起始位置,单击SEARCH,输入"mov dword ptr [00505DB4]," ,稍等一会儿就会
找到唯一的一个地方[00505DB4]被写入了数据:

:00491D58 E8DE1A0200              call 004B383B
:00491D5D 3BC6                    cmp eax, esi
:00491D5F A3B45D5000              mov dword ptr [00505DB4], eax <--OUR
                                                                 MATCH

别管那个CMP,这里两个重要的指令就是CALL和MOV.所以,我们现在知道它把EAX的值赋给了 [00505db4]
通过查找的结果可知这里是唯一的一处,如果这里EAX等于0,我们后面就是UNREGISTERED!改成别的数值
应该就不会有这个结果了.你是这样认为的吗?所以我们进入那个call:

:004B383B 8D8138010000            lea eax, dword ptr [ecx+00000138]
:004B3841 85C0                    test eax, eax
:004B3843 741A                    je 004B385F            <--- JUMP NUMBER 1
:004B3845 803800                  cmp byte ptr [eax], 00
:004B3848 7415                    je 004B385F            <--- JUMP NUMBER 2
:004B384A 81C190030000            add ecx, 00000390
:004B3850 51                      push ecx
:004B3851 E82FA5FDFF              call 0048DD85
:004B3856 85C0                    test eax, eax
:004B3858 59                      pop ecx
:004B3859 7404                    je 004B385F            <--- JUMP NUMBER 3
:004B385B 6A01                    push 00000001
:004B385D 58                      pop eax
:004B385E C3                      ret

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004B3843(C), :004B3848(C), :004B3859(C)
|
:004B385F 33C0                    xor eax, eax
:004B3861 C3                      ret

WOOHO!! 这里就是核心部分 !! 我们终于到这里了!!! :)

冷静!!!我们要在这个call结束之前得到eax不等于0的结果对吗?如果我们执行第一个跳转(4B3843),我
们就会到4B385F,那里有 "XOR EAX, EAX"正好让EAX=0!所以它是个邪恶的Jump!如果我们执行第二个跳
转(4B3848),我们会得到同样的结果...第二个也不是好东西!!最后,如果我们执行第三个(4B3859)还是
一样...但是如果这三个跳转我们一个也不执行的话,我们就会到push 1和POP EAX.这样eax就等于1了!
我们就REGISTERED!!

PART THREE: THE PATCHING
________________________

抄下第一个跳转和 PUSH 00000001的偏移量,应该是B3843和B385B.关闭W32DASM.运行HIEW Opera.exe.
进入DECODE MODE来到第一个偏移量处.按F3编辑,按F2修改汇编指令.把JE B385F改成JMPS B385B.按F9
更新,F10退出HIEW.

重要:你知道我们干了些什么吗?我们修改了程序,使得eax=1.这样我们就永远都注册了!!!

PART FOUR: LAST WORDS
_____________________

此处省略废话６００余字.

-NeuRaL_NoiSE

            PART 5:怎样破解DLL Demon v1.0
                http://members.aol.com/progency
                  by BuLLeT

在这部分我们将使用W32Dasm & SoftICE.

1) 运行程序.. "You are on day 1 of 30..."  讨厌厌厌厌厌厌厌 !!!
   单击OK. 在Help menu中选择Register. Hmm...  Serial: XXXXXX
   这是什么? 看起来这是与你输入的注册码一起被运算的数字.

2) 输入你的名字和一个随机的注册码.单击Register. "INVALID"....hmm..是时候反编译它了.

3) 运行W32Dasm反编译DLLDEMON.EXE
   完成了? k :)单击SDR (=String Data Reference),向下找到"INVALID",但是中途你可以看到:
   * Single User Licence
   * Site Licence
   这就意味着这个程序有两种注册的方式,这取决于你付多少钱. 由于这个程序接受很多个注册码,这
   就是说很难用patch来解决.所以别指望得到所有的注册码了. 还是只找出两个吧.

4) 退出W32Dasm.运行DLLDEMON,进入register窗体.输入你的名字和随机的注册码.

5) 按CTRL+D进入SoftICE.我们应该设哪一个断点?你可以自己试试,因为我试过了所以下:BPX HMEMCPY
   -按F5-单击Register - *BRRWWWW*回到了SoftICE ;)

6) 按F5,接着按F11.但是你现在是在KERNEL中....别急!

7) 按F10直到你看见绿线上是: DLLDEMON!CODE+xxxxxxxx.现在你在DLLDEMON内部.接着按F10直到看到:

        MOV EAX, [EBX+00000204]
        CALL 00420634
        MOV EDX, [EBP-10]       <--- 你停在这里!

   再输入:D EDX.看见了什么? Yeah,serial出来了.但是它并不是我们想要的,继续.

8) 继续按F10直到:

        MOV DL, 01
        CALL 004676CC
        MOV EDX, [EBP-08]       <---停在这!

   输入: D EDX.看见数字了吗?就像这种形式: DSxxx-xxxx-xxx.这是"Single User Licence".但是我
   们还要"Site Licence",对吗? Well如果你不想要它,你就可以停下来了,清除所有的断点(=BC*),注
   册程序,但如果你两个都要,就继续往下看.

9) 继续trace,直到: (途中你又将trace通过KERNEL)

        XOR EDX, EDX
        CALL 004676CC
        MOV EDX, [EBP-08]       <--- 停在这!

   Ok...我想你应该知道怎么做了.输入: D EDX,得到: DSxx-xxxx-xxx

10) 清除所有的断点(=BC*),享受registered版本吧. Single/Site licenced.

如果你因为某种原因不理解的话你可以按下面的方法进行注册:

    来到[HKEY_CURRENT_USER\Software\Progency\DLLDemon1.0]

把已有的改成     "rk"=dword:000242c2

然后用以下的数据进行注册:

        Name: BuLLeT
        Single-User-Licence: DSU100-8302-276
        Site-Licence: DS74-5200-130

            PART 6: 怎样破解Nico's Commander v4.10
                      http://www.geocities.com/SiliconValley/Way/2686
                                    by BuLLeT

实际上我并不知道这个程序是什么,干什么,直到我运行两遍以后.

这个程序在启动时会要你输入注册码,还会过期.但是谁关心呢.让我们来搞定它!

1) Ok..运行程序,会看到一个丑陋的NAG-screen."Enter your registration number now...".点yes

2) Ok.现在你可以看到一个registration box.输入一个随机的注册码,按OK.
   NAAAH..."Invalid registration number".  <--- 记下来 !

3) 运行W32Dasm,反编译NC.EXE.选SDR (=String Data Reference)
   找到它.Ok..双击它.关闭SDR窗口.

4)  Ok..现在你可以看见:

    * Referenced by a (U)nconditional or (C)onditional Jump at Address:
    |:00424B49(C)

    * Possible Reference to String Resource ID=04229: "Invalid registration
    number!"
                                      |
    :00424B68 6885100000              push 00001085
    :00424B6D E8C35C0000              call 0042A835
    :00424B72 397DE8                  cmp dword ptr [ebp-18], edi

   Hmm..a (C)onditional Jump at address 00424B49   <--- 查查它..向上

5)  Ok..你看见我看见的吗?

    * Referenced by a (U)nconditional or (C)onditional Jump at Address:
    |:00424B1B(C)
    |
    :00424B42 817DE4DC9A28A2          cmp dword ptr [ebp-1C], A2289ADC
    :00424B49 751D                    jne 00424B68
    :00424B4B A17C5D4800              mov eax, dword ptr [00485D7C]

    * Possible Reference to String Resource ID=04230: "Congratulations. Your
    copy is now registered."

   一个CMP接着JNE (=Jump if NOT Equal),我想这里要反转一下.

6) 试试看.记下这里的偏移量(offset: 23F49).
   退出W32Dasm,运行HIEW (或其它的十六进制编辑器)

7) Ok..(假设你用HIEW).输入: HIEW NC.EXE
   按两次ENTER进入Decode mode.

8) 按F5输入offset.
9) 按F3开始编辑,输入: 74 (=Jump if Equal).

10) 按F9更新,按 ESC直到退出HIEW.

11) ok,运行程序,输入注册码.这回你就会看见: "Congratulations.Your copy is now registered."

            PART 7: 怎样破解Teleport Pro v1.29
                怎样做keygen.  by PaRKER

首先,确保winice.dat中kernel32.dll,gdi32.dll和user32.dll前的";"被去掉了.去掉后,重启.

Ok,现在你准备好啦.运行Teleport Pro. 在help menu,点"Register".出现对话框要求输入:名字, 组
织和注册码.

Hmm,名字: PaRKeR,组织: <空着>,注册码: 12345. OK! Not Registered.好的,按CTRL-D进入SoftICE.
输入"bpx getwindowtexta", "bpx getdlgitemtexta".按CTRL-D回到Register窗口.按OK.SoftICE拦于
getwindowtexta.让我们想想,三个文本框,应该会有三次拦截.所以按F5继续,第二次拦住.F5,第三次拦
住.按F11.现在按F10开始trace.一直到:

157:004246CD	XOR EBX,EBX
157:004246CF	PUSH 0A
157:004246D1	PUSH EBI
157:004246D2	PUSH PTR [ESI+000000DD]
157:004246D8	CALL 0042A960

ARG !!! 在call执行后,你会发现EAX变动了.现在EAX=00003039 ...十六进制的3039就是十进制12345.
我们得到了所输入的注册码.继续:

157:004246DD	MOV EBP,EAX		<--- 赋值给EBP!!!
157:004246DF	MOV EAX,[00484C5C]
157:004246E4	ADD ESP,0C
157:004246E7	CMP [EAX+0000029F],BL
157:004246ED	JZ 0042482A
157:004246F3	CMP EBP,EBX		<--- 比较
157:004246F5	MOV EDI,00429AD4
157:004246FA	JZ 00424755

Hmm, EBP在那里进行了比较 ... 但是 EBX=0.所以这个不是关键的.继续:

157:004246FC	PUSH DWORD PTR [ESI+000000D5]
157:00424702	CALL 00424FAF
157:00424707	CMP EBP,EAX		<--- 比较
157:00424709	POP ECX
157:0042470A	JNZ 0042471B

                         from char EBX - reversed.
157:00424FEE	TEST BL,40
157:00424FF1	JZ 00424FF4
157:00424FF3	INC EBX
157:00424FF4	INC EBX			<--- Next char
157:00424FF5	JMP 00424FD5		<--- And we loop
157:00424FF7	MOV EAX,ESI		<--- Yeah, we finally have it :)

现在EBP和EAX进行了比较.打"? eax"就会看见一个ascii字符串,一个十六进制数字和一个十进制数字.
我们记下它们.bd *,按CTRL-D回到程序.输入1944573845(就是刚才的那个十进制数字).按OK,注册了!!
Well,现在我们要看看key generation了.删除HKEY_CURRENT_USER/Software/Tennyson Maxwell进行反
注册.运行程序,又变成没注册的了.

进入Register,进入SI,be *,激活断点.让我们再看看上面的代码.很明显,注册码是在00424FAF生成的,
然后储存进了 eax.按OK,断点拦下.bc *,清除断点.现在设一个新的断点bpx 424702".按F11.现在我们
来到了好地方了.进入call(F8).按F8直到:

157:00424FCE	MOV ESI,5DFEE4A4	<--- 我认为这个很重要
157:00424FD3	XOR EBX,EBX		<--- EBX=0
157:00424FD5	TEST EDI,EDI		<--- EDI(名字)是空的吗
157:00424FD7	JZ 00424FE2
157:00424FD9	PUSH EDI
157:00424FDA	CALL 0042A020
157:00424FDF	POP ECX
157:00424FE0	JMP 00424FE4
157:00424FE2	XOR EAX,EAX
157:00424FE4	ADD EAX,-4		<--- 长度-4
157:00424FE7	CMP EBX,EAX		<--- 到了长度-4?
157:00424FE9	JAE 00424FF7		<--- 是,出去
157:00424FEB	XOR ESI,[EDI+EBX]	<--- 否,将esi与一个奇怪的数字进行xor运算
                         : it's the 4 bytes of the name
                         from char EBX - reversed.
157:00424FEE	TEST BL,40
157:00424FF1	JZ 00424FF4
157:00424FF3	INC EBX
157:00424FF4	INC EBX			<--- Next char
157:00424FF5	JMP 00424FD5		<--- And we loop
157:00424FF7	MOV EAX,ESI		<--- Yeah, we finally have it :)

我把写注册机留给你做作业.我选择了TASM来做KeyGen.用ASM比其它的更容易, 因为你只需复制这些代
码稍加修改就可以了.记住:Teleport Pro会检测你的名字长度是否大于等于5.

<=-PaRKER-=>

                PART 8A: How to crack FullDisk v3.3
                                     8B: How to code a Patch in ASM
                                         by PaRKER

----------------------------------------
CRACKING FULLDISK v3.3 - 用W32Dasm和Hiew
----------------------------------------

    首先,安装程序并运行它.居然没有nag screen.很好.菜单里有注册项,是名字/注册码保护.你可以
看一看但是它不是这篇教程的目标.好的,关闭程序. Hmmm,这里有一个nag.Ok,待会儿再看看它.现在我
们将系统的时间改一下.再运行,Ok,出现了:

    "Your evalution period of 30 days has expired."

现在开始干活.复制fulldisk.exe到1.exe,然后备份1.exe到1.bak.我们将反编译原文件但是在1.exe身
上进行修改,这样一旦改错我们还可以用备份文件还原.

    用W32Dasm反编译fulldisk.exe.我们先要检察它的时间限制.单击StrnRef按钮,找到上面的那个字
符串.双击它,你就会来到:

:00401C6E 837D801E                cmp dword ptr [ebp-80], 0000001E
:00401C72 0F8E1D000000            jle 00401C95
:00401C78 837D803C                cmp dword ptr [ebp-80], 0000003C
:00401C7C 0F8D13000000            jnl 00401C95
:00401C82 6A00                    push 00000000
:00401C84 6A00                    push 00000000

* Possible StringData Ref from Data Obj ->"Your evaluation period of 30 days "
                                        ->"has expired."
                                  |
:00401C86 6870314100              push 00413170

很清楚了吧.1E就是30的十六进制.程序将[ebp-80]与30进行比较,如果小于等于就跳转正常运行(jle),
否则就弹出过期提示.让我们看看以下的几行:

* Reference To: MFC40.Ordinal:0425, Ord:0425h
                                  |
:00401C8B E8B4D20000              Call 0040EF44
:00401C90 E92A000000              jmp 00401CBF

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00401C72(C), :00401C7C(C)
|
:00401C95 837D803C                cmp dword ptr [ebp-80], 0000003C
:00401C99 0F8E20000000            jle 00401CBF
:00401C9F 6A00                    push 00000000
:00401CA1 6A00                    push 00000000

* Possible StringData Ref from Data Obj ->"Your evaluation period of 30 days "
                                        ->"expired one month ago."
                                  |
:00401CA3 68EC314100              push 004131EC

在:00401C95又有一个检测.它检测是否超过了60(3Ch)天,如果没有就跳到 :00401CBF.当我们看到这一
行时,会发现没有检测之类的东西了.我猜你现在在想: "希望程序直接跳到那里去".

    的确,我们要这样做.把光条移到:00401C72上记下它的offset.应该是1072h.现在来到:00401CBF,
记下offset : 10BFh.
    现在我们开始修改程序.运行Hiew 1.exe,按F4,选decode,按F5,输入1072,现在你可以看到:

.00401C72: 0F8E1D000000                 jle      .000401C95   -------- (1)

按F3,输入E9(jmp),接着输入4800(jump 10BF),按F9更新.现在它变成了:

.00401C72: E948000000                   jmp      .000401CBF   -------- (1)

    Cool.关闭Hiew,运行程序,这回没有讨厌的提示了,但是在关闭程序是还有. Hmmm,在W32Dasm看看.
刚才提示框的标题是:

    "How did you like Fulldisk?"
好的,单击Search,Find Text,查找"How did".它报告dialog box number 67处找到了.现在我们找出通
向那个dialogbox的所有的call.单击DlgRef,双击DialogID_0067.你就会找到一个.但是,可能还有其它
的.再次双击,又出来一个,继续......共有三处.

    我们怎样才能找出正确的那个呢?Hmmm, 我们使用断点.按CTRL-L单击load. 稍微等一下.来到以上
的三处.按F2设断点.然后运行程序.退出Fulldisk.断点生效了! Cool.单击terminate.这里就是最后的
几句:

* Referenced by a CALL at Address:
|:00402DBE   <-----------------这里
|
:0040BAB0 55                      push ebp
:0040BAB1 8BEC                    mov ebp, esp
:0040BAB3 6AFF                    push FFFFFFFF
:0040BAB5 680CBB4000              push 0040BB0C
:0040BABA 64A100000000            mov eax, dword ptr fs:[00000000]
:0040BAC0 50                      push eax
:0040BAC1 64892500000000          mov dword ptr fs:[00000000], esp
:0040BAC8 83EC04                  sub esp, 00000004
:0040BACB 53                      push ebx
:0040BACC 56                      push esi
:0040BACD 57                      push edi
:0040BACE 894DF0                  mov dword ptr [ebp-10], ecx
:0040BAD1 8B4508                  mov eax, dword ptr [ebp+08]
:0040BAD4 50                      push eax

* Possible Reference to Dialog: DialogID_0067
                                  |
:0040BAD5 6A67                    push 00000067
:0040BAD7 8B4DF0                  mov ecx, dword ptr [ebp-10]

    Cool,让我们检查一下:00402DBE.

:00402DA9 83B8A401000000          cmp dword ptr [eax+000001A4], 00000000
:00402DB0 0F8544000000            jne 00402DFA
:00402DB6 6A00                    push 00000000
:00402DB8 8D8D20FFFFFF            lea ecx, dword ptr [ebp+FFFFFF20]
:00402DBE E8ED8C0000              call 0040BAB0

    我想我们已经成功了,在:00402DB0有一个跳转能够越过那个该死的call.再一次,记下:00402DB0和
:00402DFA的offset,在hiew中来到那里:

.00402DB0: 0F8544000000                 jne      .000402DFA   -------- (1)

改成:

.00402DB0: E945000000                   jmp      .000402DFA   -------- (1)

保存.运行程序,再也没有nag和时间限制了.

            PART 8B: How to code a Patch in ASM:

; Fulldisk v3.3 Crack
; by PaRKeR (12/12/98)
;
; Use tasm fdisk33c.asm then tlink /t /3 fdisk33c.obj

.MODEL TINY

.386

.DATA

INTRO   DB      0AH, 0DH, '+-----------------------------------------+
        DB      0AH, 0DH, '|         Fulldisk v3.3 Crack             |
        DB      0AH, 0DH, '|             PaRKeR/CiA''98              |
        DB      0AH, 0DH, '+-----------------------------------------+
        DB      0AH, 0DH, '|   his crack removes the 30 dayslimit　　|
        DB      0AH, 0DH, '|  and the nag screen that appears when   |
        DB      0AH, 0DH, '|closing the program.                     |
        DB      0AH, 0DH, '+-----------------------------------------+, 0AH, 0DH
        DB      0AH, 0DH, ' Opening fulldisk.exe.', 0AH, 0DH, '$'
FILE    DB      'FULLDISK.EXE', 0
HANDLE  DW      0
PATCH1  DB      0E9H, 03EH, 00H, 0
PATCH2  DB      0E9H, 045H, 00H, 0
NOTFOUND DB     ' File not found. Aborting.', 0AH, 0DH, '$'
; dunno how to check filesize, but i have put the informations
FILESIZE DD      01BE00H
BADSIZE DB      ' Filesize incorrect. Aborting.', '$'
CRACKED DB      ' File successfully cracked.', 0AH, 0DH, '$'

.CODE

        ORG     100H

START:
        LEA     EDX, [INTRO]
        CALL    PRINT
        LEA     DX, [FILE]
        MOV     AX, 3D02H
        INT     21H
        MOV     [HANDLE], AX
        CMP     AX, 02H
        JNE     WRITE
        LEA     DX, [NOTFOUND]
        CALL    PRINT
        JMP     EXIT
WRITE:
        MOV     BX, HANDLE
        MOV     CX, 00H
        MOV     DX, 107CH               ; 1st offset
        MOV     AX, 4200H
        INT     21H
        MOV     CX, 03H                 ; 3 bytes to patch
        LEA     DX, [PATCH1]            ; values
        MOV     AH, 40H
        INT     21H
        MOV     BX, HANDLE
        MOV     CX, 00H
        MOV     DX, 21B0H               ; 2nd offset
        MOV     AX, 4200H
        INT     21H
        MOV     CX, 03H                 ; 3 bytes to patch (again)
        LEA     DX, [PATCH2]            ; values
        MOV     AH, 40H
        INT     21H
        LEA     DX, [CRACKED]
        CALL    PRINT
EXIT:
        MOV     AX, 4C00H
        INT     21H

PRINT   PROC
        MOV     AH, 09H
        INT     21H
        RET
PRINT   ENDP

GET     PROC
        MOV     AH, 0AH
        INT     21H
        RET
GET     ENDP

END START

            PART 9A: How to get a serial in Split32 v1.1
                             9B: How to make a keygen in ASM
                                     by PaRKER

破解Split32 v1.1 by PaRKeR
--------------------------

    首先我要说的就是Split32是一个VB5程序,这也是为什么我找它来破解的原因:我听说了很多有关于
Numega SmartCheck的东西,我也想试试它.

    VB5与其它的程序不同的是,它使用的函数不在程序体内,而是在一些动态链接库里头,比如:
MSVBVM50.DLL或其它的.VB5程序的功能差不多是个壳,它只是call那些函数.破解VB5程序可以用SoftICE,
但要在winice.dat中加上EXP=c:\windows\system\msvbvm50.dll;或者反编译它看代码;或者用专门为vb
程序设计的Smartcheck.

    这篇教程分成两个部分:容易的第一部分就是教你如何拿到Split32的注册码,第二部分就是教你如
何做它的注册机.你只需SmartCheck 6.0和一个ascii/hex/dec转化程序和Split32.

PART I - 找到注册码
-------------------

    Okay,运行程序... hmm.它是传统的时间和使用次数限制.单击about.发现它是Name/Key保护
模式.现在看看SmartCheck.首先配置好它(译者:详见前面几课).

    用smartcheck打开Split32.exe.选择Program/Start.现在程序就在SmartCheck的监控之下开
始运行了.你会看见一些API failures,别管它们单击Acknoledge就可以了.一会儿之后就可以看到程序
的界面了.

    你也许注意到了,SmartCheck中又打开了一个窗口,显示了程序的所有事件.这里可是最重要的
地方.现在单击Split32的About.你会发现你的点击动作都被记录下来了.O k.输入名字(PaRKeR)和一个
注册码(12345).单击OK.居然什么事也没有发生,那就退出程序.

    现在你面对的就是smartcheck中的一大堆数据.但是注册码的计算和比较应该是在按下ok键之
后才发生的,所以我们来到:

    + Command1_Click

单击"+",你就会看到:

    - Command1_Click
    |  Text1.Text
    |  Text3.Text <-- "0" (String)
    |  Text1.Text
    |  Len returns LONG:6
    |  ...
    |  ...
    |  + Form4_Unload
    - Command1_Click

就算是个新手也知道这里象是一个产生注册码的地方.现在单击Text1.Text.右边窗口就会出现:

    (No additional details)

Hmmm,把光条向下移3次,你就会看到:

    - String string1 = 0043372C
       |- = "PaRKeR"

很明确了: 6就是"PaRKeR"的长度.如果你有一点编程的常识,剩下的就应该是我们想要的了.继续向下
看突然发现:

    Text3.Text <-- "905591-S47"

好象是注册码.记下它.关闭SmartCheck.运行Split32.单击About.输入Name :PaRKeR,Key:905591-S47.
单击OK.再单击 About发现已经注册了.

TOOOOOOO EASY ! :)

                PART II - 做注册机
                                ------------------

    这一部分将比较难一点.你不但要看代码而且还要知道它是干什么的.
    Ok.让我们回到Program Results Window,当你单击了Command1_Click.把光条向下移动,我们在右边
就可以看到每一条的注释.中间没什么有意义的东西,直到你发现有一个事件call了Mid:

    - string (variant)
    |  - String .bstrVal = 0043372C
    |      |- = "PaRKeR"
    |- Long length = 1 0x00000001
    - start (variant)
        |- Integer .iVal = 1 0x0001

    然后又是另一个事件 : Asc returns Integer:80.Hmmm,当然!80是"P"的十进制ascii码值.再
后面一点,就会看到Text3.Text <-- "81" (String).为什么是81而不是80??? Hmmm,因为81=80+1.再过
几行,看到: Asc returns Integer:97. 97是"a"的ascii码.接着又有Text3.Text<--"180"(String).嘿
嘿!! 97+81=178.等等,180=178+2,于是就有了180=(80+1)+(97+2).看起来好象是:(i+Name[i], i, 0, length-1)的累加.再多看几行,事实证明我们的推测是对的:
       265=(80+1)+(97+2)+(82+3),后面也一直照此计算下去.

Ok. 6个字符之后,有:Val returns double:538  	Text3.Text <-- "905591-S47" (String)...我
们现在该干些什么?其实SmartCheck隐藏了一些细节.点一下"905591-S47"然后再在菜单里选View/Show
 All Events. BINGO!一大堆的更详细的事件显示出来了.

    让我们高亮Val returns double:538 (...).底下是一个call __vbaVarMul,看看右边的窗口:
有150756*6 (hmmm, 6好象是我名字的长度...), 接着 __vbaVarAdd : 904536+517 (hmmm, 904536=6*
150756),接着 __vbaVarAdd : 905053+538 (hmmm, 538 和 905053=904536+517).	Hurra, 现在我们有
了key的第一部分 : "905591".接着一个 __vbaVarCat,接着 __vbaVarAdd : 41+6(记住6是什么).BAM!
现在有了key的第三部分"47".接着又一个 __vbaVarCat.这就意味着程序用 "905591", "-S" 和"47"来
组成key.

我们已经完成了!但是还有一些要验证一下:150756,517和41是变数还是常量呢?公式sum(i+Name[i])是
正确的吗?
对于后者,你可以仔细看那些详细的事件,事实证明是对的.
对于前者,唯一的办法就是用另外一个名字注册一次,事实证明三个数字都是常量.

现在真正的完成了.以下就是完整的过程:
- 第一部分: 150756*长度+517+累加(i+名字[i], i, 0, 长度-1);
- 第二部分 : -S;
- 第三部分 : 长度+41.

PART 9B: How to make a keygen in ASM:

; Split32 v1.1 Key Generator
; by PaRKeR (9/12/98)
;
; Use tasm splitkg.asm then tlink /t /3 splitkg.obj

.MODEL TINY

.386

.DATA

INTRO   DB      0AH, 0DH, '+---------------------------------+'
        DB      0AH, 0DH, '|   Split32 v1.1 Key Generator    |'
        DB      0AH, 0DH, '|     by PaRKeR                   |'
        DB      0AH, 0DH, '+---------------------------------+'
        DB      0AH, 0DH, 'Enter your name : ', '$'
INPUT   DB      20H
NLENGTH DB      0
REGNAME DB      20H DUP (0)
BEGCODE DB      10H DUP (0)
MIDCODE DB      '-S', '$'
ENDCODE DB      10H DUP (0)
OUTPUT  DB      0AH, 0DH, 'Your key is     : ', '$'
BADNAME DB      0AH, 0DH, 'ERROR : No name entered', 0AH, 0DH, '$'
NEWLINE DB      0AH, 0DH, '$'

.CODE

        ORG     100H

START:
        LEA     EDX, [INTRO]
        CALL    PRINT
        LEA     DX, [INPUT]
        CALL    GET
        CMP     BYTE PTR [NLENGTH], 0           ; Is name entered empty ?
        JNE     NEXT
        LEA     DX, [BADNAME]                   ; If yes, error message
        CALL    PRINT
        JMP     EXIT
NEXT:
        MOVZX   EAX, BYTE PTR [NLENGTH]         ; If no, length stored in EAX
        LEA     EDI, [REGNAME]                  ; Name in EDI
        MOV     EBX, EAX                        ; Length in EBX
        MOV     ECX, 150756
        MUL     ECX                             ; 150756*Length in EAX
        XOR     ECX, ECX                        ; i=0
GO:
        MOVZX   EDX, BYTE PTR [EDI+ECX]         ; Name[i] in EDX
        ADD     EAX, EDX                        ; EAX+Name[i] in EAX
        INC     ECX
        ADD     EAX, ECX                        ; EAX+i+1 in EAX
        CMP     ECX, EBX                        ; End of Name ?
        JB      GO
        ADD     EAX, 517                        ; EAX+517 in EAX
        LEA     EDI, [BEGCODE]
        PUSH    EBX
        CALL    HEXCONV
        POP     EBX
        LEA     DX, [OUTPUT]
        CALL    PRINT
        LEA     DX, [BEGCODE]
        CALL    PRINT
        MOV     EAX, EBX                        ; Length in EAX
        ADD     EAX, 41                         ; Length+41 in EAX
        LEA     EDI, [ENDCODE]
        CALL    HEXCONV
        LEA     DX, [MIDCODE]
        CALL    PRINT
        LEA     DX, [ENDCODE]                   ; And we print the whole stuff
        CALL    PRINT
        LEA     DX, [NEWLINE]
        CALL    PRINT
EXIT:
        MOV     AX, 4C00H
        INT     21H

PRINT   PROC
        MOV     AH, 09H
        INT     21H
        RET
PRINT   ENDP

GET     PROC
        MOV     AH, 0AH
        INT     21H
        RET
GET     ENDP

; This procedure converts the number stored in EAX to a string that we put
; at the address given in EDI. Don't forget to push EBX, ECX and EDX if
; needed cause this will change their contents.

HEXCONV PROC
        XOR     EBX, EBX
        MOV     ECX, 0AH
@@LOOP1:
        XOR     EDX, EDX
        DIV     ECX
        ADD     EDX, 30H
        PUSH    EDX
        INC     EBX
        TEST    EAX, EAX
        JNZ     @@LOOP1
        XOR     EDX, EDX
        XOR     EAX, EAX
@@LOOP2:
        POP     EDX
        MOV     BYTE PTR [EDI+EAX], DL
        INC     EAX
        TEST    EBX, EBX
        DEC     EBX
        JNZ     @@LOOP2
        MOV     BYTE PTR [EDI+EAX], '$'
        RET
HEXCONV ENDP

END START

            PART 10A: How to get a serial in MP3 to EXE v1.5
                             10B: How to make a 'keygen'
                             http://software.webset.de/buschjost/mp3eng.htm
                             by tKC

   Step 1. 运行MP3TOEXE

   Step 2. 单击Register,输入"The Keyboard Caper","MP3-12345".

   Step 3. 单击OK. Wrong code.. Hmm,它是Delphi写的! *duh* ;)

   Step 4. Ok,没什么大不了的.退出MP3TOEXE,打开W32Dasm反编译MP3TOEXE.EXE.

   Step 5. 反编译后,单击STRING DATA REFERENCE,向下找到:

           "The Registrationinformation is wrong. Try again?"
           双击它.

   Step 6. 关闭SDR窗口,你可以看到:

   * Possible StringData Ref from Code Obj ->"The Registrationinformation is "
                                           ->"wrong. Try again?"

   :0046DF24 BAA4E44600              mov edx, 0046E4A4

   Step 7. 向上看看,直到:

   :0046DE1B 8D55F8                  lea edx, dword ptr [ebp-08]

   Step 8. 这个是我们要在SoftIce中用到的地址.关闭W32Dasm.回到MP3TOEXE,单击Register按钮.

   Step 9. 按CTRL-D进入SoftIce.输入BPX SHOWWINDOW,接着F5.单击Enter the RegistrationCode .
           SoftIce拦截.

   Step 10. 输入G 46DE1B  <--- 刚得到的地址.我们又回到了MP3TOEXE.按Step 2重新输入,单击OK.

   Step 11. 现在我们到了0177:0046DE1B,你应该可以在屏幕上看到SS: 0074EC58=00C88DE4
           (SS:0074EC58可能在你的电脑上地址不同..).输入D C88DE4,就可以看到我们的名字.ok,
           向下trace直到:

            0177:0046DE2F  PUSH EAX

   Step 12. 现在输入D EAX,你就会看到"12345"(我们输入的假注册码)

   Step 13. 继续Trace,来到了:

            0177:0046DE68  POP EAX

            (在这一行之上,你可以看到"0177: 0046DE65  MOV EDX, [EDX-24]",把它记下来,我们在
            Part 10B还要用它.) <-- 见Part 10B, Step 2

            现在你可以看到:

            EDX=00C88DE4 .. hmm,这是什么呢?

   Step 14. 输入D EDX,你看到了什么?
            *our registration code!!*

   Step 15. 输入BC*,按F5回到MP3TOEXE.

   Step 16. 输入"4BFCAAB2655E43AE" *registered!*

   PART 10B: How to make a 'keygen' for MP3 to EXE v1.5

   Step 1. 现在你需要反注册MP3 to EXE,运行REGEDIT,来到:

           HKEY_LOCAL_MACHINE\Software\Oliver Buschjost\MP3TOEXE\v1.5

           删除: Free, Name 和 Serial.

   Step 2. Ok,打开W32Dasm,拷贝MP3TOEXE.EXE到MP3TOEXE.W32,接着反编译MP3TOEXE.W32.反编译后,
           按Shift-F12(Goto Code Location),输入46DE65 (记得它吗?在Softice里得到的,见Part
           10A,Step 13)

   Step 3. 我假设你已经来到了:

   :0046DE65 8B55DC                  mov edx, dword ptr [ebp-24]

   Step 4. 按PgDn,直到:

   :0046DF24 BAA4E44600              mov edx, 0046E4A4      <---告诉你是错误的注册码,是否
                                   重输?
   :0046DF29 A1D4C54700              mov eax, dword ptr [0047C5D4]
   :0046DF2E 8B00                    mov eax, dword ptr [eax]
   :0046DF30 E8BB15FCFF              call 0042F4F0
   :0046DF35 83F807                  cmp eax, 00000007      <--- 点了yes还是no?
   :0046DF38 7533                    jne 0046DF6D           <--- 跳转

   Step 5. 以上的代码就是显示一个对话框并告诉你注册码错误.Ok,下面我们要让它改口:)

   Step 6. 运行HIEW MP3TOEXE.EXE,按F4选Decode Mode(ASM),按F5,输入6D324 (在W32Dasm里可以看
           到),你就会看到:

    0006D324: BAA4E44600                   mov       edx,00046E4A4 ;" F_?
    0006D329: A1D4C54700                   mov       eax,[00047C5D4]
    0006D32E: 8B00                         mov       eax,[eax]
    0006D330: E8BB15FCFF                   call      00002E8F0   -------- (1)
    0006D335: 83F807                       cmp       eax,007 ;""
    0006D338: 7533                         jne       00006D36D   -------- (2)

   Step 7. 那里就是我们要修改的地方.按F3,输入:

    0006D324: 8B55DC                       mov       edx,[ebp][-0024]  <--- 正确的注册码
    0006D327: 52                           push      edx               <--- 显示注册码
    0006D328: 90                           nop                         <--- nop
    0006D329: A1D4C54700                   mov       eax,[00047C5D4]
    0006D32E: 8B00                         mov       eax,[eax]
    0006D330: E8BB15FCFF                   call      00002E8F0
    0006D335: 83F807                       cmp       eax,007 ;""
    0006D338: C9                           leave                       <--- 关闭box
    0006D339: C3                           retn                        <--- 返回call

   Step 8. 按F9更新MP3TOEXE.EXE,退出HIEW,运行MP3TOEXE.Oops!看起来它还有CRC效验! Ok,回到
           W32Dasm,单击STRING DATA REFERENCE,找到:

           "This program has been modified " 双击它.

   Step 9. 关闭SDR窗口,你会看到:

   * Possible StringData Ref from Code Obj ->"This program has been modified "
                                           ->"either by a virus or by a transfer "
                                           ->"problem. It will terminate now."

   :00462870 68FC284600              push 004628FC
   :00462875 6A00                    push 00000000

   Step 10. Ok,向上直到:

   :00462856 7430                    je 00462888

   Step 11. 我们要修改这里来跳过那个该死的提示.运行HIEW MP3TOEXE.EXE,按F5输入61C56,按F3,
            输入EB.按F9更新,退出HIEW.运行MP3TOEXE,嘿嘿,CRC效验失效了!

   Step 12. 输入名字,注册码(记住要"MP3-"开头). *boom* 现在你可以看到一个正确的注册码了!用
            它试试看.*heeeeyaa* You've made it!!


                    TUT13

欢迎来到第13课!

你需要以下的工具 ：（我使用这些工具，我假定你也将使用它们）

   SoftIce 3.24
   W32Dasm 8.93
   Hacker's View 6.00
   SmartCheck 6.0
   TASM 5.00
   Windows Commander 3.53

            PART 1: Crack的基础      by BuLLeT

Heya !

Ok...坐在这里也不知写些什么好,我想我应该写些关于基础的东东.写这个教程事实上是由于最近我收
到了许多问我: "你怎么知道那里就是要修改的地方呢?"或 "你怎么知道那里就是要设断点的地方呢?"
这些问题很多次被问到所以我认为是时候回复它们了.虽然这个教程并不要求你有很多的破解经验但是
我认为你至少要有 W32Dasm,SoftICE和HIEW,它们将有很大的作用.

在这篇教程中我不会告诉你如何crack某个特殊的程序, 而是教你一些基础知识以便你下次要破解时容
易一点.好的..让我们开始吧.我假设你已经有了反编译器.

新手们经常问我的一个问题是: "你能推荐一个程序让我破解吗?" 我不能..但是我可以给你一个建议.
我相信每一个人都会有工具盘里面装满了共享软件.在上面找找. 你总会找到一个小一点的保护措施弱
的软件,就把它作为目标.我不推荐你用VB (=Visual Basic)和被加壳的软件,因为这样的话你需要脱壳
以及其它技术.(我以后会讲如何破解加壳的软件).不选择VB程序是因为它们都不是真正的程序.它们必
须要VBRUNxxx.DLL才能运行,所以你反编译了主程序根本没有用因为重要的代码都是在DLL中.不选择加
壳的程序的原因很明显.你不能修改程序--exe里的代码和运行时内存里的代码根本不相同.

"现在我找到了合适的程序我该怎样做呢?"
好的.首先,检查看看它是否和你认为的一样弱.一个简单的方法就是用编辑器打开它.如:
HIEW FILENAME.EXE.在第一页你就可以看出它是否被加了壳(大多数情况下).如果没有被加密或加壳你
就可以看到有: .idata  /  .rdata  /  .tls  /  .reloc / .rsrc.如果被加了壳一般的就看不到了.
如果是被SHRINKER加的壳你就可以看到: .shrink2  /  .shrink3 .如果是被PE-CRYPT加密你就可以看
到  .ficken (德语的fuck)很多次.

假设你得到了合适的程序了,运行它再多了解有关于它的东西.如:文本/NAG屏/按钮等等.最重要的就是
出错信息. "Wrong serial.."记下,它因为你在后面要用到它."为什么要它?".也许你已经知道了,因为
你看过其它的教程 :P,你需要它来找到call出错messagebox的地方.但是仅仅编辑它用search找它会很
浪费时间,因为可能有更多的东西要考虑.因此要用 W32Dasm来反汇编它.反编译后你会看到一屏幕难懂
的汇编码 .如果你看得懂它们就最好可是如果程序够简单你也不必知道它们是什么意思.你还记得刚要
你记下的那个message么? 如果是这样的话,单击在工具栏里的SDR (=String Data Reference).这个功
能可是非常有用的. "下一步怎么办?".想想看!

在sdr中找到那个message(它也许只显示了message的一部分)

有一个东西你有可能找到那就是版本.你知道为什么这个message如此重要吗?.向下,看其它的message,
你最终可以找到.双击它.现在data-window 改变了,你可以看到状态栏里有:CODE: XXXXXXXX / OFFSET
XXXXXXXXh.这里就是第一个储存了error message的地方,但有可能还有地方也储存了,记下 offset,再
双击它(error message). 有时它还会改变,但如果没有,你就可以关闭SDR window看汇编代码.

你首先要学一些指令:

  CMP   = 比较   (如 CMP EAX, EBX) <- 比较EAX和EBX
  JE    = 如果相等就跳转
  JNE   = 如果不相等就跳转
  JL    = 如果小于就跳转
  JLE   = 如果小于等于就跳转
  JA    = 如果大于就跳转
  JAE   = 如果大于等于就跳转
  JMP   = 无条件跳转

但是我们没有在正确的代码上.因为我们现在在message中,我们是想要在 CALL message处.向上直到看
到类似的:

    * Referenced by a (U)nconditional or (C)onditional Jump at Address:
    |:00xxxxxx(U/C)

00xxxxxx是code location而不是offset. xxxxxx是一个数字.

现在你到那个地址去,再看看.你可以看到诸如此类的代码.这只是个例子,其实有许多种形式.

    :00xxxxxx 3BC5              cmp eax, ebp          <---- 比较
    :00xxxxxx 741E              je 00xxxxxx           <---- 相等则跳

3BC5是cmp eax, ebp的机器码.
学了我刚教你的汇编语言后,这段程序应该非常容易理解.EAX 和EBP 都是寄存器,在这里用来储存序列
号.EAX 存正确的注册码,EBP 存我们输入的注册码.于是这就非常明显了 .这里将EAX(=正确的注册码)
与EBP (=错误的注册码)进行比较,如果相等就跳到00xxxxxx执行.Nah...要让程序接受任何注册码就只
要把JE (=相等就跳)改成JMP (=无条件跳).或把JE (=相等就跳)改成JNE(=不相等就跳),这样要注册就
只能输入错误的注册码(这个我最拿手)现在双击JE那一行,注意底下的offset.就象: 00xxxxxxh,h是表
示它是一个十六进制数.

现在,你知道在哪patch和patch什么, 所以运行HIEW FILENAME.EXE,按<ENTER>两次进入DECODE模式.下
面是它的功能键:  F5 = GOTO OFFSET   /  F3 = EDIT  /  F9 = UPDATE.有了它们就好办了, 按F5输
入offset. 按F3开始编辑,输入75 (=JNE).按F9更新,再退出HIEW.运行程序,再注册一次它就被注册了.
(当然这只是对那些简单的程序有效)

刚才你看的方法只能用W32Dasm不能用SoftICE.但是,在SoftICE中,你可以通过? EAX得到正确的注册码
这后面会详细讲.

So..回答第二个问题, 怎样正确的设置断点.Well....这个你会学的很快.总的来说,当破解DELPHI程序
时可以在 GetDlgItemText(A)或 GetWindowText(A)上设断(16-bit程序就用GetDlgItemText,32-bit程
序就用GetDlgItemTextA,getwindowtext(a)同理).Now..在其它的函数里这个A的作用也一样.我曾说过
在初级阶段希望你们不要破解VB程序.但是这里有一个理由反对它,有时破解VB程序非常容易.你只要设
断于__VbaStrCmp或__VbaStrcomp(__是两个下划线),但首先要修改一下WINICE.DAT.Ok, 是时候设正确
的断点了(以后用BPX代). 许多cracker建议用Quick View(快速察看)来看看 import.但我不经常用.你
只需把4个(GetDlgItemText/GetDlgItemTextA/GetWindowText/GetWindowTextA)都设断.这样 SoftICE
就一定会拦住(至少在初级阶段是这样).这些是最常使用的 BPX,几乎对所有的程序都有效.所以这样设
断然后破解!
Ok..你要确保你要破解的程序没有注册且不是被破解过的版本.让我假设你有两项要填: Name/Serial.
你输入你的名字和随机的注册码.按CTRL+D进入SoftICE设置BPX.再按F5.单击OK/REGISTER/CHECK按钮,
SoftICE将拦截.如果没拦下,回到SoftICE清除所有的BPX(=BC*). 在HMEMCPY上设断.这个将拦截于每次
进行内存拷贝时.使用这个你需要一定的经验,因为你要通过KERNEL和USER才到得了程序内部.So..假设
程序使用了四个中的一个,被SoftICE拦下.下面就要开始trace.在SoftICE中你需要掌握下列键的用法:
F5 = 运行 / F8 = 单步跟踪 / F10 = 单步执行 /
F11 = 走出CALL
ok..现在你可以按F11走出去,但是你可能忘了什么.程序有两个inputbox,也就是说它要拦下两次.因此
按F5让程序读第二个inputbox.Ok..再次拦下,现在你就可以按F11走出CALL,开始trace(按F10).在此过
程中你会看见你输入的注册码和名字出现在寄存器窗口中.现在因为我不知道你要破解的软件所以我不
能告诉你具体的方法.让我们跳过比较注册码的那一段.就向上面的一样你可以看见类似的代码:

    :00xxxxxx 3BC5              cmp eax, ebp          <---- Compare
    :00xxxxxx 741E              je 00xxxxxx           <---- Jump if Equal

这里又容易了.现在你知道我们的注册码是在EBP,正确的就是在EAX.所以打? EAX或D EAX就可以看见注
册码了.接下来清除所有的断点然后回到程序里注册.

                PART 2: 使用Softice  by BuLLeT

在这一部分你会得到一些SoftIce的重要/实用信息.我会解答以下问题:

 * What is SoftIce?
 * What is a breakpoint?
 * How do i search for a string/hex?
 * How do i choose which breakpoint to set?
 * A list of the most used breakpoints!

What is SoftIce?
----------------

实际上我并不认为这是个值得回答的问题,因为如果你有的话你一定知道它是什么.SoftIce是一个高级
调试器.首先你安装SoftIce.在AUTOEXEC.BAT加上<drive>:\<dir1>\WINICE.EXE ,这样一启动电脑就会
加载SoftIce.启动Windows后,你可以用CTRL+D进入SoftIce.回到Windows用CTRL+D (或F5).另外一个重
要的东西就是 WINICE.DAT.在这个文件中把以下几行前面的";"去掉:

EXP=c:\windows\system\kernel32.dll
EXP=c:\windows\system\user32.dll
EXP=c:\windows\system\gdi32.dll
EXP=c:\windows\system\msvbvm50.dll
EXP=c:\windows\system\shell32.dll
EXP=c:\windows\system\advapi32.dll

然后重新启动

What is a breakpoint?
---------------------

断点(BPX)就是你在程序里设置的中断.比如要在registration  box处中断.例:如果你输入了错误的注
册码,就会有一个messagebox弹出来告诉你出错了,你就要设断点于messagebeep.设置断点用:

BPX <the BPX you want>
BPM <memory address>

How do i search for a string/hex?
---------------------------------

要查找,用:

S 0 L FFFFFFFF 'BuLLeT'     (从0到FFFFFFFF找"BuLLeT")
S 0 L FFFFFFFF 42,75,4C,4C 65 54 (查找十六进制串42754C4C6554)

How do i choose which breakpoint to set?
----------------------------------------

这个问题有时比较难.首先要知道你要破解的是16还是32-bit程序.如果是32bit一般的要在函数名后加
上A.如: BPX getwindowtextA (后面会解释).要确认是16还是32-bit,可以用编辑器打开它.看看内容.
如果看到类似于:  U N R E G I S T E R E D,那就应该是32-bit程序.如果是:UNREGISTERED就应该是
16-bit.另外一个方法就是看程序的README.TXT.有时作者会告诉你.但是你可以和我一样16和32-bit的
BPX都设置.
(译者:可以用十六进制编辑器打开主程序文件,找到
"This program must be run under Microsoft Window"之类的文字,再向下看一点点就会看到PE或NE,
PE就是32-bit,NE就是16-bit)

A list of the most used breakpoints!
------------------------------------

                                 16-BIT                   32-BIT

Reading/writing files:  readfile                   readfileA
                        writefile                  writefileA
                        createfile                 createfileA

Reading INI-files:      getprivateprofilestring    getprivateprofilestringA
                        getprivateprofileint       getprivateprofileintA

Registry access:        regcreatekey               regcreatekeyA
                        regdeletekey               regdeletekeyA
                        regqueryvalue              regqueryvalueA
                        regclosekey                regclosekeyA
                        regopenkey                 regopenkeyA

Dialog boxes:           getwindowtext              getwindowtextA
                        getdlgitemtext             getdlgitemtextA
                        getdlgitemint              getdlgitemintA

Drive access:           getdrivetype               getdrivetypeA

Message boxes:          messagebox                 messageboxA
                        messagebeep                messagebeepA

Time and Date:          getlocaltime               getlocaltimeA
                        getsystemtime              getsystemtimeA
                        getfiletime                getfiletimeA

Create a window:        createwindow               createwindowA
                        showwindow                 showwindowA

Some usefull VB:        hmemcpy
                        __vbastrcomp
                        multibytetowidechar
                        widechartomultibyte

注意:你是否能在以上函数设置断点主要取决于WINICE.DAT的配置.

        PART 3: How to get a serial in DLL Show v3.9 by BuLLeT
                    http://www.execpc.com/~sbd

在没注册之前这个程序可以试用30天.我们来搞定它.

1) 运行程序. Hmm..出现了NAG.Continue,来到HELP菜单.点"Register..."

2) 输入UserName, Organization和serial.
   (User Name: BuLLeT  /  Organization: CiA  /  Registration: 22446688)

3) CTRL+D进入SoftICE,在GetDlgItemTextA设置断点

4) 按F5回到程序,单击OK/REGISTER之类的按钮 ;)

5) Softice将栏下.因为程序有3个输入栏,所以再按F5 两次.拦下后按F11,走出CALL.

6) 按F10 16次来到:

    * Referenced by a (U)nconditional or (C)onditional Jump at Address:
    |:0040E65F(C)
    |
    :0040E66D 53                push ebx
    :0040E66E 56                push esi
    :0040E66F E85C700000        call 004156D0         <---- Hmm..a CALL
    :0040E674 83C408            add esp, 00000008     <---- Not important
    :0040E677 3BC5              cmp, eax, ebp         <---- Compare.. :)
    :0040E679 741E              je 0040E699           <---- Jump if equal

7) 这里有几行经典的代码.现在执行到CMP后,下: ? EAX,看看出现了什么.YOUR SERIAL !!!!!
   (在我这: 3702837715)

8) 记下它,清除所有的断点(BC*),按F5,再注册一次.但是这一次输入刚得到的注册码.怎么样注册成功
   了吧&^$&

            PART 4: How to crack 4-Net v2.0 by BuLLeT
                        http://www.geocities.com/SiliconValley/Way/2686

1) 运行程序.来到HELP-REGISTER,输入对应的资料.(Name:BuLLeT / Serial: 22446688).注册.
   记下报错信息!

2) 现在退出程序,用W32Dasm反编译程序.来到SDR(=String data reference).双击刚才记下的错误信息.

3) Hmm..两个CALL.记下call哪里.向上直到:

    :004800B1 E8423CF8FF   call 00403CF8   <---  Hmm..a CALL
    :004800B6 7530         jne 004800E8    <---  ...a strange one <--|
    :004800B8 8D55EC       lea edx, dword ptr [ebp-14]               |
    :004800BB 8B45FC       mov eax, dword ptr [ebp-04]               |
    :004800BE 8B8048020000 mov eax, dword ptr [eax+00000248]         |
    :004800C4 E817F3F9FF   call 0041F3E0                             |
    :004800C9 8B55EC       mov edx, dword ptr [ebp-14]               |
                                            |
    * Possible StringData Ref from Code Obj ->"Cl4nET"               |
        |								 |
    :004800CC B864014800   mov eax, 00480164			 |
    :004800D1 E8FA3DF8FF   call 00403ED0				 |
    :004800D6 85C0         test eax, eax   <--- Test eax, eax..nice  |
    :004800D8 7E0E         jle 004800E8    <--- Another jump       <--

4) 两个jump到同一个地方;)我们可能要修改它们!
   JNE (=不等就跳)    -->  JE (=等于就跳)
   JLE (=小等就跳)  -->  JAE (=大等就跳)
   这可能是最经常用的手法了,但是,在这里我们将第一个改成JE,第二个改成JNE.

5) 退出W32Dasm,运行HIEW.

6) 按ENTER两次进入debug mode.

7) 按 F5 输入 OFFSET (7F4B6)

8) 按 F3 输入 74 (=JE)

9) 按 F9 更新

10) 按 F5 输入 OFFSET (7F4D8)

11) 按 F3 输入 75 (=JNE)

12) 按 F9 更新

13) 按 ESC 退出

14) 运行程序来到 HELP-REGISTER注册一次.
    REGISTERED!!

        PART 5: How to crack Voodoo Lights & Cosmos-1 v1.1.11 by BuLLeT
                    http://www.SomeWhere.On.The.Net

1) 运行屏保..hmm..工作正常..连UNREGISTERED都没有显示.这就意味着它是有期限的.的确是这样 ;)
   30天..过期后它就不能运行了.你只得到"Your trial period has expired .."或类似的东东.好的
   将时间向后调几十天(30天以上),再运行.BAAHHH,NAG出现了.记下它,退出.

2) 用W32Dasm反编译它 (c:\windows\system\voodoo~1.scr),进入SDR(=String Data Reference)

3) 找到刚记下的字符串,双击它.你会看到那里只有一个CALL,向上看看看哪里调用这个CALL(CALL 	         AT 004013B3)

4) 你会看到:

    * Referenced by a CALL at Address:
    |:004013B3
    |
    :004094D8 83C4F0       add esp, FFFFFFF0
    :004094DB E828010000   call 00409608
    :004094E0 84C0         test al, al
    :004094E2 754B         jne 0040952F<-----------
    :004094E4 54           push esp

    * Reference To: KERNEL32.GetSystemTime, Ord:0000h
    |
    :004094E5 E8ADB20400   Call 00454797
    :004094EA 66813C24CE07 cmp word ptr [esp], 07CE   <- 比较30天
        ...一些代码....
    :004094F2 66837C240209            cmp word ptr [esp+02], 0009
    :004094F8 731F                    jnb 00409519<-------------

   Hmm..当过期时它就跳.看004094F8的JNB,我们也要改它.

5) 现在开始修改.用nop吗?嗯,好主意.退出W32Dasm运行HIEW.

6) 按ENTER两次进入debug mode.

7) 按 F5 输入 OFFSET (=8AF0)

8) 按 F3 输入两个90!! (=NOP)

9) 按 F5 输入第二个 offset. (=8AF8)

10) 按 F3 输入 EB (=JMP)

11) 按 F9 更新, 退出 HIEW.

12) 再运行程序就可以享受到"REGISTERED"版本了.

注意: 这样做只是永不过期.程序本身并没有被注册.你可以自己课后试试看,祝你好运.

             PART 6: How to crack Pixshow v4.0 by Darkshadow [CiA]
                  http://web.triton.net/fasttrax/sunshine/sshome.html

在这一部分我将教你如何破解Pixshow v4.0
Ok.. 开始吧..先安装Pixshow 4.0 .... :P

1. 运行pixshow,弹出一个对话框说过期了*不要管它*.单击"Close".

2. 又出来一个对话框并且要你输入名字和注册码.我输dSCiA和1234567.

3. 单击"OK",出来一个message box告诉你"Registration failed!".好的,把它记下来.单击"OK"退出
   Pixshow.

4. 现在运行W32dam v8.9反编译pixshow.exe,反编译后单击SDR (String Data References)按钮.

5. 你可以看到:-

   String Resource ID=65280: "Field '%s' must have a value"
   String Resource ID=65500: "Assertion failed"
   String Resource ID=65535: "Invalid numeric input"
   "  ("
   " >>>"
   " already exists. Select another "
   " AMPM"
   " AND ("
   " by Sunshine Software"
   " files found - Double click filename "
   " files"
   " has a size of zero. This may "
   " is already bookmarked!"
   " mailto:"
   " not found."
   " to recycle bin"
   " v@"
   等等

6. 向下找到你记下的那个信息,双击它.关闭SDR.

7. 你就会看到:-

   * Possible StringData Ref from Code Obj ->"Registration successful!"
                                  |
   :004C4F00 B878504C00              mov eax, 004C5078
   :004C4F05 E866D9F7FF              call 00442870
   :004C4F0A EB0A                    jmp 004C4F16

   * Referenced by a (U)nconditional or (C)onditional Jump at Address:
   |:004C4DF9(C) <------------------- 这就是出错信息出现的地方
   |

   * Possible StringData Ref from Code Obj ->"Registration failed!"
                                  |
   :004C4F0C B89C504C00              mov eax, 004C509C
   :004C4F11 E85AD9F7FF              call 00442870

8. 你看见 004C4DF9了吗..现在点"Goto Code Location"输入004C4DF9,点"OK"

9. 你就会看到以下的代码:-

   * Possible StringData Ref from Code Obj ->"498p-"
                                  |
   :004C4DE6 BA984F4C00              mov edx, 004C4F98
   :004C4DEB E8ECF0F3FF              call 00403EDC
   :004C4DF0 8B55F8                  mov edx, dword ptr [ebp-08]
   :004C4DF3 58                      pop eax
   :004C4DF4 E8A7F1F3FF              call 00403FA0
   :004C4DF9 0F850D010000            jne 004C4F0C <--- 这一行将是绿色的
   :004C4DFF 6825300000              push 00003025
   :004C4E04 68C47A0000              push 00007AC4

10. 现在看看 W32dam的状态栏,你可以看到 @Offset 000C41F9h File:PixShow.exe
    那里就是要修改的地址.退出W32dam.

11. 运行HIEW,两次回车,然后来到offset 000C41F9,就会看到:-

    .000C4DF9: 0F850D010000                 jne      .0000C4F0C   -------- (1)
    .000C4DFF: 6825300000                   push      000003025
    .000C4E04: 68C47A0000                   push      000007AC4
    .000C4E09: 8D45F8                       lea       eax,[ebp][-0008]
    .000C4E0C: 50                           push      eax
    .000C4E0D: 8D55F4                       lea       edx,[ebp][-000C]

12. 现在开始修改..按 F3 将光标移到 85上并把它改成84.按F9保存修改结果.JNE就变成了JE.

13. 退出HIEW,运行PixShow.输入名字和注册码.点"OK" *BOOM* registered *WOW*

            PART 7: How to crack CDRLABEL 4.1 by RSiP
                                http://www.ziplabel.com

运行W32DASM
调入CDRLABEL.EXE
进入String Data References
找到"Registration Error"并且双击它.你就会看到:

:004134CC FF1590664500            Call dword ptr [00456690]
:004134D2 E9CA1C0000              jmp 004151A1
:004134D7 8B150C2D4500            mov edx, dword ptr [00452D0C]
:004134DD A1082D4500              mov eax, dword ptr [00452D08]
:004134E2 8D4C2410                lea ecx, dword ptr [esp+10]
:004134E6 51                      push ecx
:004134E7 52                      push edx
:004134E8 50                      push eax
:004134E9 E8B2B30000              call 0041E8A0        <= 漂亮 !
:004134EE 83C40C                  add esp, 0000000C
:004134F1 85C0                    test eax, eax
:004134F3 7518                    jne 0041350D
:004134F5 6A10                    push 00000010

* Possible StringData Ref from Data Obj ->"Registration Error"

:004134F7 68E0904300              push 004390E0

* Possible StringData Ref from Data Obj ->"Sorry, only registered users may "
                                        ->"access this function"

你看见了吗?
:004134E9 E8B2B30000              call 0041E8A0
把光标移到它上面,按"CALL"按钮.

你就会看到:

* Referenced by a CALL at Addresses:
|:00403B16   , :0040A1B3   , :0041313C   , :004134E9   , :00414AD7
|:00414CA0   , :00414E68
|
:0041E8A0 83EC0C                  sub esp, 0000000C
:0041E8A3 8B4C2414                mov ecx, dword ptr [esp+14]
:0041E8A7 8B442410                mov eax, dword ptr [esp+10]
:0041E8AB 894C2404                mov dword ptr [esp+04], ecx
:0041E8AF 80F142                  xor cl, 42
:0041E8B2 8B542418                mov edx, dword ptr [esp+18]
:0041E8B6 884C2404                mov byte ptr [esp+04], cl
:0041E8BA 8A4C2407                mov cl, byte ptr [esp+07]
:0041E8BE 53                      push ebx
:0041E8BF 8A5C2409                mov bl, byte ptr [esp+09]
:0041E8C3 80F166                  xor cl, 66
:0041E8C6 89442404                mov dword ptr [esp+04], eax
:0041E8CA 884C240B                mov byte ptr [esp+0B], cl
:0041E8CE 8A4C2406                mov cl, byte ptr [esp+06]
:0041E8D2 80F365                  xor bl, 65
:0041E8D5 80F141                  xor cl, 41
:0041E8D8 3444                    xor al, 44
:0041E8DA 3ACB                    cmp cl, bl
:0041E8DC C6420300                mov [edx+03], 00
:0041E8E0 751A                    jne 0041E8FC      <=这里 BAD BOY!
:0041E8E2 8A4C240B                mov cl, byte ptr [esp+0B]
:0041E8E6 884202                  mov byte ptr [edx+02], al
:0041E8E9 8A442408                mov al, byte ptr [esp+08]
:0041E8ED 880A                    mov byte ptr [edx], cl
:0041E8EF 884201                  mov byte ptr [edx+01], al
:0041E8F2 B801000000              mov eax, 00000001
:0041E8F7 5B                      pop ebx
:0041E8F8 83C40C                  add esp, 0000000C
:0041E8FB C3                      ret

让我们看看BAD BOY跳转干些什么...
按"Jump to"按扭.

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041E8E0(C)
|
:0041E8FC A1F42C4500              mov eax, dword ptr [00452CF4]
:0041E901 85C0                    test eax, eax
:0041E903 740A                    je 0041E90F    <=记住它
:0041E905 B801000000              mov eax, 00000001
:0041E90A 5B                      pop ebx
:0041E90B 83C40C                  add esp, 0000000C
:0041E90E C3                      ret

把光条移到:0041E8E0 751A jne 0041E8FC,记下它的偏移量@Offset 0001DCE0h .

现在开始修改

Hiew cdrlabel.exe
按F4 [mode]
按 [select mode DECODE]
按 F5 [goto line.....]
输入 0001DCE0
你会看到

:0041E8E0 751A                    jne 0041E8FC
 按F3,把751A改成9090,再按F9保存.

现在成了:
:0041E8E0 90                      nop
:0041E8E1 90                      nop

你也可以把JNE改成JE,但是我更喜欢NOP!!

运行CDRLABEL 来到HELP 接着 ABOUT CDRLABEL...
*** THANKS FOR REGISTERING! ***