资料整理: 高春辉, ID: Paul Gao, 沈阳华储 BBS 站. BBS 站台电话: (024)3846411.
====== Error Free 01/20 =======================================================

Drag & Zip

> >Drag And File Win 95/NT               : 7000000000

>   上项对的, 但是不适用 Drag & Zip ; 在线上找了半天也找不到 (其
>   实我有找到一  Cracker 站, 画面有 Drag & Zip 但拉了老半天, 让
>   中华电信又多赚了好几百, 就是拉不下来) 所以只好用 SoftICE95
>   追追看罗!

>   我就用 '7878787878' 当 Key! 为什么我要用 '7878787878' 当 Key
>   ? 因为用 '0123456789' 常常会和软体内的资料相冲, 待会 Search
>   出来的位址, 可能就不是我打的 '字串' 之位址.

>   那为什么我不用 '6767676767' 而要用 '7878787878' ? 因为我是 "
>   男生" 啊! 遇到很龟毛的事, 习惯说 "怎么那么 X X ".

>   SoftICE 找出 '7878787878' 字串的位址, 拦到 Memory 的 Read /
>   Write 的点之後, 就开始一步一步 Trace, 设断点, 用笔在纸上记录
>   可疑的位址 ... :)

>   准备找出 "注册无效" 的地点, 不停的按 [F-10], [F-10] 起码按了
>   近千次....按按按, 这个 Call 有显示动作了, 看是不是 "注册无效
>   " 嗯? "注册完成" ?? 张大眼睛再看, 真的是 "注册完成" ! 奇怪?
>   我有动到任何东西吗?

>   莫非注册码真的是 '7878787878' ? 有 Drag & Zip 的人, 不妨试试
>   看, 看是不是 Drag & Zip 装死骗我. 瞎猫碰到死老鼠猜中注册码,
>   有史以来我还是第一遭...

====== Error Free 02/20 =======================================================

CAD/DRAW 4.1 Level 2

>  1.用 Winice 载入 Win95
>  2.执行 CAD/DRAW 4.1, 选择注册,
>  3.输入大名, 注册码先填 78787878 , 用此时O习惯问题.
>  4.按 Ctrl_D 进入 winice
>  5.用 S 30:0 L FFFFFFFF '78787878' , 会搜出位址 ss:ssssssss
>  6.用 BPM ss:ssssssss 设断点.
>  7.按 F5 返回 CAD/DRAW 4.1.
>  8.按 <钥匙> 後, winice 会拦截到, 而又进入 winice .
>  9.用 BD * 清除断点
> 10.在 winice 画面下, 一直按 F10, 按到如下: (<- 会按蛮久的, 但还好啦!)

>   14F:402332    CALL    EDI
>                 LEA     EAX,[ESP+20]
>                 MOV     EDI,[0064...]
>         :               :
>                 LEA     EAX,[ESP+00000024]
>                 LEA     ECX,[ESP+20]
>                 PUSH    EAX
>                 PUSH    ECX
>   14F:4023AD    CALL    4719F0  <--  按 F10 到此, 记得换 F8 进入 CALL

> 11.进入 CALL 继续压 F10, 如下:

>   14F:4719F0    PUSH    EBX
>         :               :
>         :               :
>   14F:471A11    CALL    471870  <-- 至此请压 F9 设断点.

> 12.再按 F5 返回 CAD/DRAW 4.1
> 13.请输入如下格式的注册码:

>    04200-04.00-00000-000   <- 後面不得有看不见的空白.

> 14.再按 <钥匙> 後, 又会被 winice 会拦截到.

>   假如以上的 address 14F:?????? 都与我的一样 ( ?????? 应该一样才对,
>   不一样的应该是 14F: ), 就用 G 471A69

>   14F:471A69    CMP     ECX,EAX <- 把 EAX  抄下来换成十进位 kkkkk.
>                 JZ      471A74     ECX 应是 0, 因为你打 00000 .

> 15.再按 F5 返回 CAD/DRAW 4.1
> 16.把换算出来的十进位的 5 个数字(kkkkk), 输入到如下格式的注册码:

>   04200-04.00-kkkkk-000

> 17.再按 <钥匙> 後, 又会被 winice 会拦截到.

>   就用 G 471AB7

>   14F:471AB7    SUB     EAX,EDX <- 把 EDX  抄下来换成十进位 ggg.
>                 POP     EBP        EAX 应是 0, 因为你打 000 .
>                 POP     EDI

> 18.用 BD * 先暂停拦截, 再按 F5 返回 CAD/DRAW 4.1
> 19.把换算出来的十进位的 3 个数字(ggg), 输入到如下格式的注册码:

>    04200-04.00-kkkkk-ggg

> 20.再按 <钥匙> 後, 注册成功! Ya!

> 注: 第一个 04200  是可以到 04399 的, 04.00 也可以到 04.19 的;
>     但上两个的数值, 会影响到後面的数字, 故改大名及这边时, 都要
>     再 Trace  一次, 看看 kkkkk & ggg 的变化.

====== Error Free 03/20 =======================================================

Eudora 3.0 Pro 没有 2.x, 用SICE 也可以安装

>   1.用 softice95  载入 win95.
>   2.执行 eudora.tmp 目录下的 setup . <- 想必你早已用 "暴力" 解开了
>                     只是没有 2.1.2.

>   3.按 <Next> 按到目录设定的地方, 有 brower 那里.
>   4.先把目标路径设定好, 再按 ctrl-d 进入 winice .
>   5.用 BPX USER!LOCKMYTASK  设断点

>   6.用 F5 返回 SETUP, 按 <NEXT> 一定会显示 2.1.2  不在,
>     不过没关系, 按 <确定> 後就又会被 winice 拦截到.?

>     用 BC * 先清掉断点.

>   7.再来就一直在 WINICE 下按住 F10, 按住不放比较轻松啦! 因为要
>     按一阵子. 不过你要注意一下 SOFTICE  下半部所写的字, 一开始
>     应该是 USER(08) .

>   8.当那个字变成 _INST0432!.text+???  就停下来, 没马上停没关系
>     , 但不要嫌著没事, 再那里硬撑.

>   9.用 U 0043B76C, 就会看到:

>   14F:0043B76C  CMP     DWORD PTR [EBP-14],01   <- 把这里设断点.
>                 JMP     0043B683
>                 CMP     DWORD PTR [EBP-14],02
>                 JMP     0043B6A7
>                 CMP     DWORD PTR [EBP-14],03
>                 JMP     0043B6CB
>                 CMP     DWORD PTR [EBP-14],04
>                 JMP     0043B6EF
>                 CMP     DWORD PTR [EBP-14],05
>                 :               :

>  10.先用 BD * 暂停拦截一下, 按 F5 回 SETUP, 等画面稳定
>     两秒後, 再按 Ctrl-d , 才用 BE * 使 winice 恢复拦截.

>  11.按 F5 返回 SETUP .
>  12.按 BROWER 画面上的 <NEXT> , 此时会被 winice  拦到.

>  13.第一次按 F5 , 这又会被 winice 拦到.
>  14.第二次按 F5 , 一定还会被 winice 拦下来.

>  15.用 E EBP-14 来改记忆体的内容. 原本应该是 5. 现在你就
>     把它改成 1.

>  16.用 BD * 暂停中_, 按 F5 就 pass 啦!

>   对啦! s-ice 会把中断时的时间停下来, 以便对时间一比一
>   的模拟, 用完之後, 别忘了, 对一对你电脑上的时钟!

====== Error Free 04/20 =======================================================

Instant File Access

>   这个程式很好追, 想练习破解的人, 你们不妨只看我的 (1)-(11)
>   的步骤, 然後其它的就自己先追一追 (Trace & Trace), 追的到
>   了, 那你在 Hacker 学院就注册完成了.

>   (1) 用 winice 载入 Win95 .
>   (2) 执行 IFA  选择注册, 输入大名、等等东西 ..
>   (3) 注册码先填 78787878 <- 用此数 (78787878) 是习惯问题.
>   (4) 按 Ctrl_D 进入 winice
>   (5) S 30:0 L FFFFFFFF '78787878'

>        WINICE 会搜出一个位址 ss:ssssssss

>   (6) BPM ss:ssssssss   <- 设断点
>   (7) 按 F5 把控制权还给 IFA .
>   (8) 在 IFA  下按 OK ! 被 WINICE 拦截, 如下

> xxxx:9EAA  REPZ MOVSD           ; <- 在此点拦下, 你就开始按 F10
>                 POP     ECX
>                 AND     ECX,3
>            REPZ MOVSB
>                 XOR     DX,DX   ; <- 按到此, 先停下来

>   (9) 用 BD * 暂停以前的断点
>  (10) 用 BPM ES:EDI-8 设另外一个.
>  (11) 按 F5 返回 IFA, 一下子又被拦了下来, 如下:

> xxxx:1AA7       CMP     AL,20   ; <- 在此点拦下.
>                 JZ      1AA6    ; <- 不要看到 JZ 就以为到站了
>                 CMP     AL,9    ;    这边不是啦! 才到中坜而已
>                 JZ      1AA6    ;    台北还很远. 而且等一下要
>                                 ;    先去休息站

>  (12) 再用 BD * 暂停以前的断点, 一直按 F10  按到如下:

> xxxx:1AB8       LODSB           ; <- 你会在这里跑迥圈
>                 CMP     AL,39   ;
>                 JA      1ADC
>                 :       :
>                 JMP     1AB8    ; <- 你看又上去了

> ; 不过没关系, 它不是死胡同, 它只跑八次, 因为注册码你打
> ; 八个字, 它在检查那八个字是不是数字等. 好了, 在休息站
> ; 休息过了, 可以继续走了, 起程吧!

> xxxx:1ADC       POP     AX      ; <- 我们就不要再流连忘怀, 游标移到此 ?
>                 CMP     AL,2D   ;    按 F7 再按 F10, 继续慢慢走慢慢看.

>  (13) 用 F10  走走走, 走到.....

> xxxx:D5ED       CALL    D934
>                 ADD     SP,06
>                 CMP     AX,[EP-08]  ; <- 走到这里停起来, 台北到啦! 下车了.
>                 JNZ     D602        ; <- 跳到 D602 就没戏唱了哦!
>                 CMP     DX,[BP-06]
>                 JNZ     D602

>  (14) 把 DX 和 AX 的值准确的抄下来, DX 是 MSWord, AX 是 LSWord
>       , 排成一个 4 bytes  的 16 进位码,  再它换算成 10 进位,
>       就是你要的东西了..

====== Error Free 05/20 =======================================================

ACDsee for win95 1.0

>   本版的注册核对 routine  和 beta10 的一模一样, ACDsee95 1.0 beta
>    10 我讲过了, 本篇就是完全 Copy beta10  的那篇示范, 再改了一下
>   小地方而已.
>   -----         -----           -----           -----
>   这个程式很好追, 比上次那个 IFA  难追一点点而已, 但是因为注册的
>   运算式蛮复杂的, 所以我就不分析了, 建议直接用强迫跳过去的.

>   想练习破解的人, 此程式说难也不难, 你们不妨只看我的 (1)-(11) 的
>   基本动作, 其它的自己先练习看看. 追的到了, 那你在 Hacker 学院的
>   新生训练也就过啦!

>   (1) 用 winice 载入 Win95 .
>   (2) 执行  acdsee version 1.0, 选择注册, 输入大名.
>   (3) 注册码先填 78787878 <- 用此数 (78787878) 是习惯问题.
>   (4) 按 Ctrl_D 进入 winice
>   (5) S 30:0 L FFFFFFFF '78787878'

>        WINICE 会搜出一个位址 ss:ssssssss

>   (6) BPM ss:ssssssss   <- 设断点
>   (7) 按 F5 把控制权还给 acdsee .
>   (8) 在 acdsee 下按 OK ! 被 WINICE 拦截, 如下

> xxxx:9EAA  REPZ MOVSD
>                 POP     ECX    ; <- b此点拦下, 你就开始按 F10
>                 AND     ECX,3
>            REPZ MOVSB
>                 XOR     DX,DX   ; <- 按到此, 先停下来

>   (9) 用 BD * 暂停以前的断点
>  (10) 用 BPM ES:EDI-8 设另外一个.
>  (11) 按 F5 返回 acdsee, 一下子又被拦了下来, 如下:

>                 MOV     EDI,EBX
> 14F:40363C      REPNZ   SCASB   ; <- 在此点拦下
>                 NOT     ECX
>                 DEC     ECX

>  (12) 再用 BD * 暂停以前的断点, 用 F10  一直走到如下:

>  注: 你会经过许多判别, B算的 Loop , 自己用眼睛分析一下
>      , 利用游标的上下及 F7 键, 来缩简追踪的时间哦!

> 14F:4035C9      CALL    403620          ; <- 你会从此 Subroutine
>                 LEA     EAX,[ESP+48]    ; <- 返回至此

>                 LEA     ECX,[ESP+74]    ;    想用 '排列组合' 来猜码,
>                 ADD     ESP,10          ; <- 可以把断点设在此.
>                                         ; 用 "d eax" 或 "d ecx" 来看资料.

> ; 不过此软体用 Username 来顺著猜 '注册码' 并不好猜; 不过你可以牵
> ; N它产生的名字, 就是先选注册码, 再用 '排列组合' 反推可注册成功
> ; 的 Username , 就比较容易多了.

>                 MOV     DL,[EAX]        ;
>                 CMP     DL,[ECX]        ; <- 比较奇数字符?
>     4035DD      JNZ     $Error          ; -> 跳到 4035F9 就玩完了

>                 OR      DL,DL
>                 JZ      $Yes            ; <- 是零, 就是比较完了.

>                 MOV     DL,[EAX+1]
>                 CMP     DL,[ECX+1]      ; <- 比较偶数字符?
>                 JNZ     $Error          ; -> 让 CPU  走到 $Error 就寿了.
>                 OR      DL,DL
>                 JNZ     $next..         ; 不是零, 就是比较还没完

>     $Yes        XOR     EAX,EAX         ; <-- Yes!
>                 JMP     $Ret_Rdy
>                                         ; 最後的提示:
>     $Error      SBB     EAX,EAX         ; <- 绝对不能让 cpu  走到这一行
>                 SBB     EAX,-01         ;
>                 :       :
>     $Ret_Rdy    :       :

>  (13) 重点就是在 4035DD , 要害我已经告诉你们了, 其它的自己想办
>       法改. 会的人不要说答案, 我一定要强迫想入门 Hacker 的线上
>        "魔友" 去看组语的书.

>  一个 Soft-ICE  的指令说明: 当你想看机械码时, 可以用 code on ..

====== Error Free 06/20 =======================================================

Paint Shop Pro 4.12 beta2

>   先把系统的日期改一下, 通常我为了方便, 我会递增一年.
>   试著执行, 果然跑出了被打 X  的窗子..

>   用 ldr  载入後你会看见...

> 14F:4CF3F0      INVALID         ; <- 这是 Soft-ICE 奇怪的地方, 不过没关系
>                 :               ;    按一下 [F8] 就正常了. 如下

>     4CF3F6      PUSH    EBP     ; <- 游标在此, 开始按 [F10]  追罗!
>                 MOV     ESP,ESP
>                 MOV     EBP,ESP
>                 :       :
>                 CALL    [.....]
>                 PUSH    EAX
>     4CF542      CALL    4CFB54  ; 追至此请按 [F8] 进入 CALL .
>                                 ; 再换 [F10]

>   我为什么知道以上这个 call 要换 f8 进入? 因为我用 f10  带过
>   那个 call 时, 就跳出 "抬头主画面" 和 "过期告示" 了, 所以我
>   知道那个 call 有问题, 必须进入观查..
> ----
>                 :       :
>                 PUSH    DWORD PTR [EBP+..]
>     4CFB64      CALL    4CFBC2  ; 追至此再按 [F8] 进去看看.

>   这个 call 要用 f8 进入观查的原由那还要问吗? 因为我有用 f10
>   带过那个 call 嘛! O.K ?
> ----
>     4CFBC2      JMP     [4F8748] ; 再按一次 [F8]  (又追到别的档案
>                                  ; 去了! )

>   这里为什么我要用 f8 ? 因为手刚好放在 F8 上面嘛! 除了 CALL
>   之外, F8 & F10  之作用都一样, 都是单步执行.
> ----
>   此时已经到了 MFC42!.TEXT 的范围了. 因没其它的线索, 只好用
>   [F10] 继续追..

>                 PUSH    EBP
>                 MOV     EBP,ESP
>                 :       :
>   5F40A51B      CALL    [EBX+58] ; <- 最讨厌追到这个. 用 [F8] 再往里面伸.
> ----
>     4031B6      INVALID         ; <- 又来了, 没关系再按一下 [F8]
>                 :               ;    就好了, 如下:

>   这个 invalid  我还是不知道会什么会这样, 不过出现此东西时, 按
>    F8 大多不会有什么问题, 但按 F10  会依不同的软体而定, 有时会
>   当掉.
> ----
>   Ya! 又回到了 psp!.text , 这下子你 psp  竟放我回来, 有你好看.

>     448420      MOV     EAX,FS[0....]
>                 :       :
>                 :       :               ; 哇! 这一条龙真长, 按了好久好久
>                 MOV     EBX,[EAX]
>                 PUSH    00000080
>     4487B4      CALL    [EBX+000000C0]  ; <- 用 F10 经过此, 主画探N出来了.
>                 TEST    EAX,EAX
>                 JZ      448...  ; Jz!?  别穷紧张, 你若强制让 eax为零时, 表
>                 :       :       ; 示开窗不成功, 但是系统已经开成功了, 所以
>                 :       :       ; 会使程式错乱. 开窗一次, 会送一个旗号回来.
>                 :       :       ;
>                 :       :       ; 又按 F10  按了好久.
>                 ;       :       ;
>                 CALL    40280B  ; <- 这是要害 ..
>                 TEST    EAX,EAX
>                 JZ      ...     ; <- 有没有看见 'JZ' ?
>                 PUSH    00
>                 PUSH    10
>     44896A      CALL    4CE668  ; 哇! 被打  x 的窗子弹出来了.
>                 :       :       ; 往上一看... Jz !!

>   想当 Hacker 的人, 自己进入要害的 call 内分析看看, 程式很短
>   , 所以我就不公布答案了! 其他的高手, 最好不要说答案, 我想训
>   练一下想入门 hacker 的人, 我希望他们没事就去啃组语.

>   当你追到手修改完成後, 别忘了把 "系统日期时间" 改回来, 再执
>   行 ScanDisk , 要把 "无效暾? 和 "无效档名" 两项的检查项目
>   打勾, 再来 Scan 所有的 Disk .

>   因为 Win95  对日期很敏感, 日期矛盾时, Win95 的某些 Appz 会
>   当掉; 有的主机板异常会跳到 209x 年, 那就会不时的当.

====== Error Free 07/20 =======================================================

Lunar FTP V1.1

>   触机: 算命者预测未来的一种感觉; 如: 测字, 虽然同一个字, 但
>         面对的时地物不同时, 算出来的未来也不同, 那种不同的
>         feeling 就叫 "触机" . 英文是不是叫 "sense"? 先死?

>   破这程式的注册码最好要有那种 "触机" , 没有的话, 你可能会猜
>   的蛮累的, 不然你就要很深入的一行一行分析此软体, 但是这样会
>   很耗时; 想要拥有那种有如作家灵感般的 hacker 触机, 你就要没
>   事多看书, 多拿软体来破, 经验足了它自然会成为你的一种本能.

>   不多说了! 进入正题..... 按照基本动作 (1)-(11) 就可以飞到目
>   标软体的领空了.

>   (1) 用 winice 载入 Win95 .
>   (2) 执行  LunarFTP 先选择注册
>   (3) 先填 78787878  一行就好.
>   (4) 按 Ctrl_D 进入 winice
>   (5) S 30:0 L FFFFFFFF '78787878'

>        WINICE 会搜出一个位址 ss:ssssssss

>   (6) BPM ss:ssssssss   <- 设断点
>   (7) 按 F5 把控制权还给 LunarFTP .
>   (8) 在 LunarFTP 下按 OK ! 被 WINICE 拦截, 如下

> xxxx:9EAA  REPZ MOVSD           ; <- 在此点拦下, 你就开始按 F10
>                 POP     ECX
>                 AND     ECX,3
>            REPZ MOVSB
>                 XOR     DX,DX   ; <- 按到此, 先停下来

>   (9) 用 BD * 暂停以前的断点
>  (10) 用 BPM ES:EDI-8 设另外一个. ; <- 因为你打 8 个字, 所以减 8.
>  (11) 按 F5 返回 LunarFTP 一下子又被拦了下来, 如下:

> 14F:4875FB      REPNZ   SCASB   ; <- 在此点拦下
>                 NOT     ECX
>                 LEA     EAX,[ECX-01]

>  (12) 用 BD * 暂停以前的断点. 用 F10  开始走...走到:

>                 POP     ECX
>                 LEA     EAX,[ESI+00001055]
> 14F:412DAF      PUSH    EAX     ; <- 至此先停下来. 先按 F9 设一下断点

>   此时你用 D EAX  看资料, 你会看到 USERNAME, SERIALNO.. 等敏感的
>   字眼. 但是并没有看见你打的字.

>   此察动作只是其中之一例, 但它是最重要门槛之一, 若你是要练习追,
>   不妨类似的地方都要 Dump 出来看; 看不出资料有任何关联也没关系,
>   但有嫌疑形像时, 就用笔记录下来; 这类的观查记录动作, 有益於你的
>   Hacker sense! 不是 "先死" 啦! 是 "触机" 啦!

>   那位同学, 把你隔壁那个摇起来... O.K ! 我们继续...

>  (13) 按 F5 返回 LunarFTP , 重新再选注册, 照著如下四行的格式打,
>       别忘了, 先打在 "笔记本" 再用 Copy 的, 不然你会後悔..

>       USERNAME: (你的大名)
>       SERIALNO: (随便, 我是打 8 个数字)
>       KEY:
>       ABCDEFGH Z

>   我为什么会知道以上的格式, 除了做了许多类似 (12) 的 D EAX  的
>   观察动作外, 其实还带点猜测性, 所以说 "触机" 对一个 Hacker 而
>   言很重要. 这种感觉我一时也说不上来, 大概是我的表达能力有限吧
>   ! 只好暂用 "触机" 一词.

>   幸好今天运气不错, 我只猜了两次注册格式. 我不是说过吗, 破解程
>   式除 "毅力" 之外, 另外一个很重要的就是 "运气" !

>  (14) 按下 OK 之後, 又会被 WINICE 拦下来, 也就是刚刚你停下来的
>       位址, 你就继续按 F10 .... 走到如下 (会走很久很久, 这里也
>       也是很长的一条龙) :

> 14F:41320D      CALL    436FB6  ; <- 这是要害, 必须用 F8 进入观察
>                 POP     ECX
>                 TEST    EAX,EAX ; <- 强迫让 EAX=1, 会弹出 "成功视窗"
>                 JNZ     413239  ; <- 不是 0, 就跳走
>                 MOV     EDX,[EBP+..]
>                 :       :
>                 PUSH    EAX
>     413232      CALL    492AC3  ; <- 当你走过这里的时候, 失败视窗就
>                 JMP     413259  ;    会弹出来, 往上一看啊! 上面有个
>                                 ;    JNZ , 以上那个 CALL 必有问题.

>   为什么我会知 eax=1  会弹出 "成功视窗" 咧? 因为我有试嘛! 我用
>    R EAX=1可不可以? 当然可以, 否则 S-ICE  就有 BUG  了. 分析软
>   体就是要多试, 这个试试, 那个试试, 多猜多试多做记录..

>   (15) 用 F8 进入那个 CALL (要害) 内, 你n分析程式, 有那些情况
>        返回时, EAX 不会等於 "零". 用 F10  走到如下:

> 14F:436FB5      PUSH    EBP
>                 :       :       ; 要害的心脏在此. 如下:
>     437058      XOR     EAX,EAX ; 比较第一个字符时, EAX 必须等於 0 .?

>         $loop   MOV     DL,[EAX+EBP+FFFFFCD4]   ; 先拿一个字符.
>                 CMP     DL,[EAX+EBP+FFFFFED4]   ; 这是一个字符的比较?
>                 JZ      $next                   ; 相等就准备比较下一个.

>                 XOR     EAX,EAX       ; 在此返回  EAX 就是 0 '?
>                 JMP     $Return_Ready ; eax=0 就没救了.

>         $next   INC     EAX     ; 指标 + 1
>                 CMP     EAX,0C8 ; 这下子你可有得抄了, 居然比较 0C8 次!
>                 JL      $loop   ; 慢慢的抄, 仔细的抄, 不要抄错. 被电脑
>                                 ; 罚写的滋味不错吧!

>   (16) 注册的标准格式

>       USERNAME: (你的大名)
>       SERIALNO: (随便, 我是打 8 个数字)
>       KEY: (後面空白)
>       (你抄到的码, 总共 200 (C8) 个英文字母, 可换行, 怕打错时,
>        可以插空白没关系, 我是每四个字就插一个空白)
>       Z ( <- 结尾时, 请多加这个 Z  字当终结 )

>   要害内的重点分析已经说给你听了, 只要你看的懂组合语言, 你就
>   找的到那两百个英文字母..

>   再叮咛一次, 先打在笔记本上, 打好 Save 再 Copy 过来注册, 否
>   则要是抄错一个字, 必昏无疑... 你会干死的..

>   一个  S-ICE 指令, 当你想看某个位置的资料时, 可以用 "D" ,
>   , 它就是 Dump 的缩写. 范例如下:

>   D 800000
>   D DS:EAX
>   D EBP+0FCD4

====== Error Free 08/20 =======================================================

007 for Win32 1.0d

>   1.用 Winice 载入 Win95
>   2.执行 Ask007 . 等待抬头的延迟画面. 按 [I Agree] .
>   3.把滑鼠移到视窗上的顶行的 [007 for Win32]
>   4.按下右键, 选 [About 007] . 此时又会跑出刚刚的抬头.

>   为什么不用刚刚那一个? 两个都一样, 我为什么就一定要用刚
>   刚那一个? 我就偏偏要用这一个.

>   每次的 "猜测" 及 "设断" 总是要再来一次, 你若执意要用进
>   入程式那一个, 要再来一次时, 就必须结束程式再从新执行,
>   比较麻烦啦! 不是不可以用啦!

>   分析软体要 "多猜多试" 忘了吗? 试一次那段程式就执行过啦
>   ! 想再来一次, 当然就是想办法再让要试的地方从Y走一次罗!

>   5.用 bpx lockmytask , 设断点. 当你又按下[I Agree] 时,
>     在它抬头消失完成之刹那, 就会被 S-ice  拦下, 如下:

> USER!LOCKMYTASK
> xxxx:636C       ENTER   0004,00 ; <- 在此拦下.
>                 PUSH    SI
>                 PUSH    DS
> --- USER(3) ---

>    把这个 lockmytask 记起来, 假如你没有其它比较好的断点可
>    设时, 这个总是能发挥效用. 专门在抓关窗子的点. 不要问我
>    原理, 这个点是试出来的.

>    记住! 多试就会抓到未知系统的某些规则.

>   6.此时你按一下 F12, 如下:

> yyyy:44B1       CALL    USER!LOCKMYTASK
>                 MOV     EAX,[BP+0A] ; <- 在此点拦下,
>                 LES     BX,[BP-04]
> --- USER(8) ---

>    你们可以看看拦下点的上一行, 是 CALL 那里啊? 不熟 S-ICE
>    的人, 自己猜猜看, F12 是内设为 P RET, 那 P RET 是做什么
>    用的? 这个指令不错吧!

>    注: s-ice 是可以自定功能键的, 不过我都用内设的. 想当 hacker
>        的人, 到 s-ice  的目录下找, 找找看 "定义档" 在那里?

>   7.接下来就不管了, 你就一直按 F12, 一直按, 要按有一阵哦!
>     第二次 ASK007!  又再度的跑出来时, 如下:

> 14F:00403F41    CMP     [ESP+121],3F1   ;
>                 JNZ     403FA7          ; 不等於时, 就跳走.
>                 MOV     ESI,[ESP+0124]
>                 :       :
> 14F:00403F66    CALL    00402820        ; <- 这个就是那个抬头
>                 LEA     EAX,[ESP+30]    ; <- 刚到时, 你会在此
>                 ADD     ESP,10
>                 :       :
> 14F:00403F74    CMP     [ESP+20],7CD    ; <- 换成十进位看看
>                 JBE     403FA7
>                 PUSH    40

>   我为什知道那个 CALL 是完整的 "抬头" routine ? 我把断点设在
>   那行 CALL , 然後再选一次 About 007, 这样试行不行?

>   当然要找出这个 CALL , 就是每按一次 F12, 就在上面的 Call ,
>   设断点试之; 再按一次, 就再设断试一次..... 最终就会让你找到
>   了, 不对吗?

>   那如果按一百次呢? 当然就要试一百次啊! 破软体要有毅力, 不是
>   说假的, 这一点你们一定要接受, 没办法..... 不过在 Win95  下
>   的此程式你可以在 ASK007!  的范围时, 才设断试之便可.

====== Error Free 09/20 =======================================================

Gif gif gif

>   1.用 wice 辑载入 95 .
>   2.执行 ggg  , 选择注册, 打下大名
>   3.注册号码先填 78787878.
>   4.按 Ctrl-D , 进入 s-ice,
>   5.用 S 30:0 L FFFFFFFF '78787878'

>   此时 sice 会搜到一个位址 30:004xxxxx . 唉! 以前不是都搜到
>   :8xxxxxxx 吗? 怎么这一次会搜到 004xxxxx ??

>   管它的, 按照 hacker 以往的习性, 就在按一次 s  试之! 果然搜
>   到另一个位址 :8xxxxxxx. 常常用这个 :8xxxxxxx  来追也蛮烦的
>   , 这次就换一条新路走走看..

>   6.用 bpm 30:4xxxxx 设断, 压 F5 返回 ggg .
>   7.按下 ok 後, 会被 sice 拦下来, 如下:

> 14F:BFF780DC    MOV     [EAX+08],ESI    ; <- 在此拦下.
>                 MOV     [ESI+08],EDX
>                 MOV     [EDX+04],ESI

> --- KERNEL32! ---

>   8.按 F12  几下就到 ggg  的领空了, 如下:

> 14F:4358F4      CALL    4504EC
>                 POP     EDI     ; <- 刚到时在此.
>                 POP     EBP
> --- GGG! ---

>   9.若己进入射程范围, 接下我通常会按 F10  开始走.

>   通常要 hack  (砍) 掉一个保护时, 你必须先了解原程式的走向; 用
>   F12 往往会跳的太快, 比较不容易看清楚程式是怎么走的. 必竟现在
>   已经登陆了, 还是小心一点好.

>   走走走, 不久你就会走到....

> 14F:00410F70    CALL    0043E26D
>                 ADD     ESP,P4    ; <- 你会跳回至此
>                 :       :
>         ###     CALL    00410C52  ; <- 可能有问题,
>                 ADD     ESP,08
>         ***     TEST    AL,AL     ; 强迫 AL=1 似乎没什么事
>                 JZ      00410FA1  ; 若是 0, 就注册失败了.
>                 :       :
> 14F:00410F9F    JMP     00410FD1  ; 跳开
> 14F:00410FA1    PUSH    38
>                 :       :
> 14F:00410FC9    CALL    0041E8E1  ; <-这里会跳出讯息的背框, 大
>                 ADD     ESP,1C    ;   小和 "失败窗" 一样, 因此
>                 :       :         ;   暂时猜测至此就危险了.

>   这个地方和通`的情况不太一样, 因为在 ***  那里时, 若令 AL=1
>   并不会发生什么事, 只是会把注册窗收掉而已; 但若令 AL=0 就必定
>   失败. 手上没线其他线索, 所以只能用 F8 , 进入那个 "可能有问题
>   " 的 ### CALL .

>  10.好吧! 那我们就进去看看吧! 如下:

>         :       :       :
> 14F:410C5D      CALL    00410A40  ; <- 要害在此, 进去观摩一下.
>                 ADD     ESP,08
>                 MOVZX   EAX,AL
>                 TEST    EAX,EAX   ; <- 再做一次实验, 令 EAX=1
>                 JNZ     00410C70  ;    居然注册成功.?
>                 XOR     AL,AL     ; <- 在此又让 AL 填  0 了.?
>                 JMP     00410CA4

>   有 "注册成功" 样子 (想当 hacker-乱砍者, 就自己找, 看看画面的
>   那里有注册成功的痕迹) , 那 410C5D 那个 CALL 保证有问题, 而且
>   问题可大了..呵呵! 这下子总部, 即在不远的前方..

>  11.用 F8 进入 410C5D 那个 CALL . 如下:?

>                 :       :
> 14F:00410A4A    CALL    00420785
>                 ADD     ESP,04
>                 CMP     EAX,10          ; 这个 10 ?
>                 JZ      00410A5B
>                 XOR     AL,AL           ; 若让 CPU  走至此, 会 AL=0
>                 JMP     Return_Ready    ; 返回, 那就完蛋了.
>                 :       :

>   举例了那么多次的范例给你们看, 我倒要看看你们的樵夫触机 (Hacker
>   Sense ) 有没有变的更灵敏?

>   在 CMP EAX,10 那行停下来, 看看此时的  EAX 为 8, 你们有没有联想
>   到什么? 试著猜猜看....哎啊! 再想想看! ....有人说啦! 对对对, 没
>   错! 很可能就是注册号码的字数.

>   不过推断并不一定等於事   因为程式不是你写的, 所以一定要求证看
>   看, 这样比较不会被先入为主的观念套死, 而困在这个恐怖的迷宫中.
>   很多保护砍不掉, 通常就是 "太靠势" .

>   实验很简单, 用 BD * 暂停以前的断点, 在 CMP EAX,10 那一行设断,
>   从新注册, 注册码填随便填两三个字, 按 OK , 当被 sice 拦下来时,
>   看一下 EAX  是不是你刚刚打字数. 对了! 可不要再打同样的字数 8,
>   否则若运气不好, 这下子你就追惨了.?

>  12.好! CMP EAX,10  那个 10 就是十进位的 16 嘛! 刚刚那个断点还要
>     用, 按 F5 返回重新注册, 注册码暂时打 16 个数字. 按下 OK ! 被
>      sice 拦下在刚设断的地方, 此时你就继续用 F10  慢慢走, 分析一
>     下此戒备森严的路程. 走到....

>   OK! 在谈之前, 我们必须再回忆一下我们主要的任务到底是什么? 不然
>   你来这边干嘛? 我们要分析此 Routine, 在什么条件下执行完毕时, 不
>   会让 AL=0 返回.

>         :       :       :
> 14F:00410A7A    CALL    004108BB     ; <- 依下看, 此 CALL 很有看头.
>                 ADD     ESP,08
>                 PUSH    ESI
>                 MOV     [EBP-10],AL  ; 把 AL 存起来,
>                 CALL    004208CD     ; 先假设此 CALL 对返回的 AL 无关
>                 ADD     ESP,04
>                 MOV     AL,[EBP-10]  ; 把 AL 提回来
>                 POP     ESI
>                 POP     EDI
>                 LEAVE
>                 RET             ; <- 这个就是 x86 ASM  的 Return 指令哦!

>   求证一下第二个 CALL 与 AL 是否於返回的 AL 值无关; 在 [EBP-10],AL
>   那一行之前, 令 AL=1 就知道, 自己实验试之.

>  13.用 F8 再进入 410A7A 个行 CALL , 按 F10  没多久就...

>                 :       :
> 14F:0041954     MOV     EDX,0046009C
>                 MOVZX   EAX,BYTE[EDX+EAX]
>                 MOV     AL,[EAX+EDI]    ; 拿一个 Byte
>                 CMP     AL,[EBP-14]     ; 比较一个 Byte
>                 JZ      $Next           ; 相等就比较下一个

>                 XOR     AL,AL           ; <- 这个是令 AL=0 的指令.
>                 JMP     Return_Ready    ;    在此返回就...

>          $Next  INC     SI              ; 指标 + 1
>                 CMP     SI,05           ; 比较 5  次
>                 JB      004108F6        ; 小於就跳到前面准备继续比
>                 MOV     AL,01           ; <- 有没有看到 AL=1
>                 :       :

>   哇! 这里就是比较的核心了, 可惜啊! 这里的被比较之两个值, 居然是
>   被运算过的, 我懒的再分析前面的运算式了, 你们就看著办吧!

====== Error Free 10/20 =======================================================

WinJammer 2.30

>   由於 Winjammer  有附一个 Wjmrplay , 它也有注册选项, 所以我们就
>   拿它 (Wjmrplay) 来开刀, 因为程式比较小通常执行岜冉峡? 路比较
>   少通常也比较容易追.

>   你们还记得前几堂课讲的追踪密码示范吗? 没忘记吧! 不错不错, 你们
>   也蛮行的嘛! 平常我在上课时, 看你们都在睡觉, 想不到你们对课堂上
>   的东西, 也都记得蛮清楚的. 那 (1)-(11) 密码拦截的基本动作, 我就
>   不再重覆了哦!

>  12.到了第十一动时, 也就是 bpm ds:di-8  之後的拦截点, 如下:

> xxxx:5BAF       JZ      5BAB    ; <-- 你会在此拦下.
>                 JMP     5BC5
>                 CMP     BYTE PTR [SI],20
> --- wjmrplay ---?

>  13.此时你按一下 F12, 如下:

>   因为上一段有很多 LOOP , 若按 F10  要按蛮久的, 而且我分析之後,
>   也没什么重点, 就是光在那边跑圈圈, 除非你是自己独立追的, 才会跟
>   著它跑几圈, 然後发现没什么要紧, 之後你自然也会跳走.

> xxxx:5A87       CALL    5B9C
>                 POP     BX     ;<- 你会从这跑出来
>                 PUSH

>  14.此时你开始用 F10  走走, 走到 ...

> xxxx:5B72       CALL    15EC    ; <- 这是要害,
>                 ADD     SP,04
>                 OR      AX,AX   ; <- 在此试 RAX=0 , 会弹出成功视窗
>                 JNZ     5B82
>                 PUSH    WORD PTR [..
>                 PUSH    AX
>                 JMP     5B93    ;
>      5B82       PUSH    DS
>                 PUSH    096C
>                 CALL    344E    ; <- 当用 F10  带过这个 CALL 时,
>                                 ;    失败视窗就弹出来了. 往上一看
>                                 ;    啊! 上面有个 CALL , 中奖

>  15.你用 F8 进入那个要害. 如下:

> xxxx:15EC       PUSH    BP
>                 :       :
>      15F7       MOV     SI,[BP+04]
>                 MOV     DI,[BP+06]
>                 XOR     AX,AX
>                 MOV     CX,FFFF
>           REPNZ SCASB
>                 NOT     CX
>                 SUB     DI,CX
>           REPNZ CMPSB
>                 JZ      $Return_Ready
>                 SBB     AX,AX
>                 SBB     AX,-1

>   比较的核心就在上面, 你们越来越来厉害了, 那我给你们的考题, 当然
>   难度也就要比以前高了哦! 要注册码就自己分析如上的程式, 高手不要
>   说答案, 我要强迫 Hacker 新生多啃几个  x86 的指令.

====== Error Free 11/20 =======================================================

TIPPY FOR WINDOWS 95 V 1.32

>   通常遇到有注册选项时, 我们都先用「 78787878 拦截法」试追
>   之, 但是我试的结果, 此招失效, 拦不下来.

>   拦不下来怎么办? 答案很简单, 要嘛就放弃不追 (老子不跟你玩
>   了, 你保护又奈我何? ) , 不死心就换步试试看.

>   当 hacker 就是要多试, 还是那一句老话, 多猜多试多做记录,
>   因为目标程式不会是 Hacker 写, 所以 hacker 整天面对的就是
>   茫茫大海, 当然程式的作者不会发疯打电话来告诉你要害在那里
>   ; 再则 Hacker 是人不是神, 亦不可能每猜必中.

>   那个 78787878 不可行, 当然就不要一直死要用 78787878 来对
>   招; 我们要用智取, 不可用力敌. 大丈夫要能屈能伸, 识实务者
>   为俊杰. 人在屋檐下不得不低头, 好干! 你就抬头看看, 给撞出
>   了一个包, 在那边叫痛, 那我可不管你.

>   我们就换一招在 007! 那篇曾讲的 "收窗拦截法" , 还记得吧?
>   不知用什么设断时, 这个 bpx lockmytask 往往可以发挥效用.
>   以前声明过了, 这个点是「试」出来, 不要问我原理..

>   把 Username 打下去, 注册码先填 78787878 好了, 一按 ok !
>   注册程式毫不留情马上亮出 "失败窗" 这张王牌.

>   没关系, 没有三两三, 岂敢上梁山, 换我们按一下 ctrl-d , 就
>   用 bpx lockmytask 设断, 压 F5 返回 Tippy, 当你按一下 "失
>   败窗" 上的按钮时, 马上就被 wice 拦下; 呵呵! 厉害的 wice
>   果然名不虚传.

>   此时先用 bd * 暂停刚刚的断点, 你就开始按 F12, 要按有一阵
>   子哦! 当跑到 Tippy  的  踬   你就马上停下来如下:

> 14F:473255      CALL    473897  ; <- 把游标移至此设断,
>                                 ;        因为要 "试" 了!
>                 JMP     ...     ; <- 你会跳出来至此.

>   我们先把上面的 CALL 设断来试试看 (记得试点时, 别忘了先用
>    BD * 暂停先前的断点) , 用 F5 返回 Tippy  时, 操作注册时
>   , 你会发现按下 ok 时, 就会被 wice 拦下来.

>   当你用 F10  带过这个 CALL 时 , "失败窗" 就会弹出来; 当你
>   在点一下按钮时,  "失败窗" 一消失, 又会被 wice 拦下; 这代
>   表此 CALL 有问题.

>   嘿! 找到第一个重大线索, 有机会啦! 我们就往上分析看看, 在
>   什么情况下, CPU 的执行才不会跑到此地. 往上一看..如下:

> 14F:473214      MOV     EAX,[4804F0]
>                 CMP     EAX,[4804E0]    ; 在此设断猜码试之.

>                 JZ      47325C          ; 在此试强制跳到 47325C
>                 PUSH    50              ;   Tippy 会缩起来...
>                 :       :
>                 CALL    4738D9
>                 :       :
>                 CALL    4738A3
>                 :       :
>     473255      CALL    473897  ; 这个可说是失败窗的总部了
>     47325A      JMP     4732AF  ;   往上一看有个 JZ ! 嘿, 爽吧!

>     47325C      MOV     EAX,[4804F0]

>   好像找到要害了哦! 好! 我们就把以前的断点先暂停, 在 CMP EAX
>   那一行设断试之; 来用 d 4804e0 来观查与 eax  有什么关系. 注
>   册码试著改几组...

>   咿~!两数值皆不超过 1FF !  而且有某一方是固定的, 当然固定
>   的那一方就是用你的 Username 算出来的, 反正 1FF  才 512  嘛
>   , 那注册码你们就      q一下罗!

>   这个机率为 1/512  排列组合猜码, 给 Hacker 新生练习一下; 要
>   新生分析整个注册运算的 Routine, 似乎是太残忍了点. 因为我也
>   懒的去分析, 我自己 ID 的注册码, 也是用排列组合试出来的, 我
>   约试了五、六十次吧!

>   底下的! 不要再那边鬼叫鬼叫, 五、六十次的试码, 对 Hacker 是
>   小事一庄, 没上千次就偷笑了. 你们看一下, 光是本篇文章内总共
>   有几个 "试" 字? 以上只是所有过程的精华那一小部份哦! 若再加
>   上在非精华的背後误 "试" , 那就不计其数了.

>   再提示一点, 注册码要八个字.

====== Error Free 12/20 =======================================================

roboword.exe is 249,360 bytes

>   首先我们要先谈一谈如何拦截本程式--其实只要 wice 在手,
>   你是可以随时中断进去 trace  的. 你就像一个潜水夫, 潜水
>   配备亦是一级棒, 若海底内没有任何指标, 你要如何找出海中
>   的一支银针呢? 很难吧! 除非踩到狗屎, 好运当头才找的到.

>   像一般的注册号码拦截, 你在画面上会看到注册的窗子, 那个
>   窗子或你打的 78787878 , 就是在海中的 "显眼指标" , 只要
>   拼命的往 78787878 游过去, 若银针没有伪装的话, 通常是容
>   易找到银针的.

>   像以前我讲的 bpx lockmytask 的收窗拦截, 也是把 "打x窗
>   子" 当成一个的指标, 然後再找进去. 故破解软体的第一指标
>   , 若能够预设的够适当, 那么以後的路子就会很好走.

>   这之的目标主角 "ROBOWORD" , 既没有注册窗子、又不能让你
>   打 78787878 、亦没 "打x窗子" , 那你如何预设断点?

>   说了一堆纸上谈兵的东西, 有一个很重要的 "前戏" , 我们却
>   还没做. 因为破了要有用才行, 我们要先检查一下, 破了到底
>   有没有用? 因为这是测试版, 依经验, 测试版是有很多东西不
>   存在的.

>   重要资料不存在, 就算你破了比对核心, 依然没什么鸟用, 除
>   非你改写程式的功力一级   若要改写一大串的东西, 不如重
>   写还来得比较快, 写出来了, 你还可以光明正大的卖钱.

>   前戏不是要你对女朋友怎样, 而是要你用 Ultraedit  把字典
>   档载进来观察. 一看! 这个测试版居然有 G-Z  的资料, 这下
>   子你女朋友完了, 不! 是金点完了...

>   教了你们这么多堂课, 眼看著一学期又要过, 我想再看看你们
>   的樵夫触机 (hacker sense) 提升到那里, 看看你们有没有资
>   格脱离 hacker 断奶期.

>   Ok! 我问你们, 在 ROBOWORD 的执行期间, 在画面上有什么东
>   西, 可以让你当成设断的参考指标? 想一想..... 有没有想到
>   ? 想到的举手..... 好! 你举手, 请说... 对! 画面有 "A to
>   F...demo version" 等字.

>   这个 "demo version" 就是我们要攻进去的第一据点. 不过千
>   万不可以为这类的指标, 都很容易的就会被你找到. 也不可先
>   入为主以为就是找不到,  hacker 就是一想到方法, 就先 trace
>   再讲; trace 不到, 再想其它的...

>   1.执行 roboword .
>   2.切入 wice .
>   3.用 s 30:0 L FFFFFFFF 'demo version'

>   有一点爽了..因为搜到了一个位置 30:xxxxxxxx

>   4.用 bpm 30:xxxxxxxx 设断.
>   5.按 F5 返回.

>   好! 第一个猜试断点设好了, 接下怎么办? 当然就是想办法让
>   我们可爱的 "金点罗伯兄" 走到你预设的断点罗! 你就随便指
>   一个字看看, 要是条件成立就会被 wice 拦下来.

>   什么? 拦不下来? 我看看..... 哎呀! 你这个死小子, 没事老
>   让字典程式查 "fuck" ! 不要查 "fuck" 啦!  "fuck" 它的字
>   头是在  A-F 之内! 旁边有个 "shit" 字你试试看..

>   什么? 还是拦不下来? 我再看看... 哎哟! 你怎么用破解档在
>   练习破解呢? 快去找 "纯" 试用版的回来, 再 install  一次
>   试之.

>   6.经过了一番努力, 你们总算给拦下来了. 如下:

> xxxx:AA8D       REPNZ   SCASB           ; <- 被拦下的地方
>                 LDS     SI,[BP+06]
>                 LES     DI,[BP+0A]
>                 MOV     AX,DI
>                 :       :
> --- KERNEL(01) ---

>   这下是更爽了, 因为预测的条件是成立的. 不过要爽太早, 因
>   为程式不是你写的, 好不好追, 还是个未知数.

>   7.你先按一下 F12, 到 roboword 的领空观查看看. 如下

> yyyy:06DE       CALL    KERNEL!LSYRCPY
>                 MOV     AX,0001         ; <- 返回至此...
>                 POP     SI
>                 :       :
> --- ROBOWORD(03) ---

>   每到一个新地方时, 你就大略的分析一下附近的程式, 我们先
>   往上看, 因为这里是出现 'A TO F ..'  的地方, 我要了解一
>   下, 有那些条件会使 CPU  走到这里.

>   8.你把游标往上移, 你会看到...如下:

> yyyy:0D0C       CMP     AX,0064 ; 和 64 比较?
>                 JZ      0D74
>                 :       :
>      0D2E       CMP     AX,0065 ; 65?
>                 JZ      0D74
>                 :       :
>      0D50       CMP     AX,0066 ; 66?
>                 JZ      0D74
>                 INC     WORD PTR[...]
>                 :       :
>      0D69       CALL    KERNEL!...
>                 MOV     AX,0001         ; <- 刚刚返回的地方.

> --- ROBOWORD(03) ---

>   以上有 64,65,66 你们想一想, 比较这些数字有什么特殊的意
>   义? 你们再往上看时, 亦有 61,62,63 , 那倒底有什么意义?
>   若是常常玩电脑的人, 应该一看就知道那是小写的 a,b,c...f
>   的 ASCII  码. 这下子你们可爽翻了a!

>   以上是给新生的第一个习题... 若搜到很多个 'demo version'
>   , 请从断电重开机. 或是用最後一个 30:8xxxxxxx .  

>   等一等! 等一下再收拾书包, 因为还没下课. 假如你不喜欢它
>   的抬头的话... 怎样? 还想听下去吧!

>   9.离开 roboword , 用 ldr  载入 roboword . 如下:

> xxxx:3F3A       XOR     BP,BP           ; 用 F10  开始走
>                 PUSH    BP
>                 :       :
>      3FCF       CALL    yyyy:3FE4       ; 用 F8 进入

>  10.进入  yyyy:3FE4 的地方如下, 用 F10  开始走.

> yyyy:3FE4       MOV     AX,DS
>                 NOP
>                 :       :
>      4002       CALL    zzzz:0000       ; 用 F8 再深入

>  11.进入  zzzz:0000 你会看如下, 亦是用 F10  继续走.

> zzzz:0000       ENTER   ...
>                 CMP     WORD PTR[BP+0C...
>                 :       :
>      0197       CALL    KERNEL!GETPRI...
>       $$        PUSH    WORD PTR[2200]
>                 PUSH    7D
>                 PUSH    00
>                 PUSH    2C9F
>                 PUSH    0330
>       ##        CALL    USER!DIALOGBOX  ; <- 跑出抬头的 call .
>       @@        CALL    wwww:098E

>   我们已经知道 ## 那个 call 是显示抬头的, 但你不可以进去
>   user! 的地盘改东西. 因为 user!  是系统的范围, 改它的程
>   式码, 你的系统会完蛋.

>   当然你可以插 jmp  的指令, 使程式飞过 call user! 的上空
>   , 也就是直到达 @@ . 但是 jmp  不可以乱插. 因为那些 push
>   是一些引数, 是要给  dialogbox 用的, 但是 dialogbox  会
>   自动补回 sp 值, 所以 jmp  不可乱插.

>   当执行光棒走到 @@ 时, 你就把 sp 值记下来; 你再重新执行
>    roboword 一次, 当到了走 0197 时就开始注意 sp 值哦! 慢
>   慢的一步一步走, 当 sp 和刚刚一样时, 光棒所停留的那一行
>    push , 也就是你要改成 jmp @@ 的地方.

>   其它的就自行练习吧!

====== Error Free 13/20 =======================================================

In Curcuit Emulator

>   In Curcuit Emulator, 实体电路模拟器. 为了踪软体执行的动
>   作明细, 所用的一个模拟 CPU  的电子设备.

>   注:  "ICE" 字眼, 若未注明, 通常是指 "模拟 CPU  之设备"

>   你可以想像一下, 有一台机器叫 ICE, 它会有一条排线, 排线端
>   有一个很像 CPU  多脚的插头. 你把它目标板子上的 CPU  拆下
>   来, 把这个头插到  CPU 的座上面.

>   那你就可以在 ICE  这边的萤幕键盘上, 控制, 观查 CPU  所有
>   动作.

>   当然 NuMage 非常臭屁, 居然取名为 Soft-"ICE" . 但他也非常
>   厉害, 用光用 Soft 就可以作出类似於真实 ICE  的功能.

>   要破解软体, 就要先追踪观查软体的走向, ICE 就是用来追踪用
>   . 用没钱买真的 386,486,586,686  的 ICE, 就只好用 Soft-ICE.

>   586 的 ICE  少说也有廿万..

====== Error Free 14/20 =======================================================

破解程式和抓虫是很相像

> >大家都说s-ice很好用
> >可是各位先进谁知道那有s-ice修改的相关资料?
> >最好是针对初学者写的...

>    Soft-ICE 只是给会低阶者的一种追踪操作的工具而已, 使用者
>   本身的基本条件一定要了解低阶语言. 最起你手边也要有一本
>   80x86 的指令群来待查, 因为现在 80x86  一票又一票, 指令多
>   的记不完.

>   像以前的 6502 就免了, 我连机械码都背起来了, 因为以前的 Apple
>   在 monitor  下, 并没提供线上组译器, 改程式就是查表, 然後
>   把机械码打下去, 查久了自然就背起来了!

>   LDA # 是 A9, STA 是 85, JSR 是 20 对不对? <-- 十几年後的
>   今天, 照样记了这几个最常用的 . 4C 好像是 JMP ...

>   其实破解程式和抓虫是很相像, 举例来说吧!

>   假设回到十几年前, 同班同学因专题制做, 必须用组语写了一个
>   程式; 但是呢! 却不能跑, 因交期快到了, 除错了老半天, 不得
>   已只好求救於我.

>   若程式不短时, 我当然不可能只用看的罗! 我会用除错器去执行
>   的它的程式, 若是写 APPLE ][ 上面的, 当然一打 call -151,
>   就可以进入内建的除错藿   以前 APPLE ][ 称做 monitor (监
>   督系统, 意谓著是一种程式走向的监控环境. )

>   像 PC 当然就是用 debug.exe  或 Soft-ICE 之类的环境, 以前
>    Soft-ICE 还没有出来时, 大家都嘛用 debug.exe, 也有人用真
>   正的  ICE 啦! 不过那太贵了, 个人用户是比较不可能去用那个
>   的, 大不了借公司的回来用.

>   程式写不好想改正, 你也要知道是那一点在搞鬼, 不然你怎么改
>   ? 找问题最实在最准确的方法, 当然就是看著它执行, 直到看到
>   它出  , 就找到了.

>   你在除错环境下来监控程式的走向, 你的眼睛跟著程式的指令一
>   步一步慢慢的走, 看看几个地方资料改变, 就这样的一直跟到一
>   个死胡同. 当然你要看的懂低阶的指令, 也要有写程式的基本暹
>   辑思考, 不然你怎知道那一段程式, 是个死胡同??

>   找到死胡同了, 事情也就好办了, 因为只要你有办法把那一段死
>   胡同, 改写後, 使程式依照你的意愿走, 那么你就除错成功了,
>   那就可以向你的同学敲份牛排来吃了! 当然! 你的同学也可以顺
>   利毕业.

>   破解呢? 其实过程也是一样, 因为使你不能使用的那段程式, 就
>   是前面所讲的死胡同而已, Soft-ICE  只是比 Debug  好用, 环
>   境更好而已, 两者的使用方法大同小异. 只要你会 debug, Soft
>   ICE 就不难学习.

>   像前代已久的 Apple ][ , 它的 monitor, 操作也是蛮类似的.
>   所以, 只要你会低阶语言, 你就会使用这些除错工具. 破解的基?
>   本条件:

>   第一. 你要会写程式.
>   第二. 你要会低阶语言.
>   第三. 你要有除错的毅力 (毅力? 没错! 就是 "毅力" !)

>   第四. 会用除错工具, 当然只要你写过低阶的程式, 这项工具
>         你一定没问题. 打 ?  看看功能键, 五分钟不了解六、
>         七成才怪 (有六、七成就够用了啦! 因为其它三成都嘛
>         很少用的) .

====== Error Free 15/20 =======================================================

Dr Eye 2 磁片还魂记

>第一、你必须有原版的磁片,并且已安装、注册。
>       (为什么要有这一步呢?? 就是请用原版 !!!!)
>第二、copy dreye20\peadict\*.* ,其时只要有dict.exe
>       (如果要dict.exe不要找我,我不想作的太绝了)

  第二可以改成 "省略" .

>第三、到登录编辑程式(如果找不到那你的95 学分就不级格了),
>     找∶
>   [HKEY_USERS\.Default\Software\Microsoft\Windows\CurrentVersion\Explorer]
>   "link"=
>   "Version"=
>             ^^^^^^後面的资料(资料不是一定的)不告诉你,问那些想当坏人的人
>   将登录档资料汇出 !!!!!!

>第四、大功告成,以後在安装时就不用注册片来注册,
>      只要将dict.exe盖掉、登录档汇入就行了!!!!

  第四可以改成:

  A.「控制台」->「移除程式」->「Dr.Eye 2」 (只移注册, 不要全移掉
    , 所以对话框选 No ), 

  B.用 RegEdit  把刚刚写出的 "登录档" 汇入!

  C.塞在磁碟机中的那一片「还魂」的原版磁片, 就可以拿出来了. 

>另外有一件事就是它的磁片保护是怎么作的,我曾经去physical copy 磁片
>可是没有用,这个能不能教教我!!!!

  1.找不到雷射孔, 应该不是雷射保护.

  2.用 Physical Copy  无效, 有可能是「弱磁位元」, 或则是「检查轨长」.

  3.「弱磁位元」要用比较特朱的磁碟机来制作, 且会挑 User 方的磁碟机, 
    不适合薄利多销的产品. 

  4.「检查轨长」比较容易做. 且不容易 Copy , 因为要找到两台转速丝毫不差
    的磁碟机有困难.

====== Error Free 16/20 =======================================================

Roland VSC-88 软体音源

  在进入手术房示范刀法之前, 我先说说对这类程式的看法: 

  我第一次动手下去追之前, 其实我也想了几天; 因为它播放 50 秒的
  计时终了, 使 User 不能继续聆听的手法, 并不是跳出一个窗子警告
  中断, 而是慢慢的渐弱缩尾; 也就是说 50.00  秒和 50.00+ 秒的表
  面状况差异不明显, 这会造成 Hacker 在设断上的困扰.
 
  那个 50 秒的临界点, 前後差异因为太不明显, 所以想要在刚好 50 
  秒渐弱之刹那断下来, 不容易吧! 那怎么办? 没辄就是看天吃饭! 

  在 Win  起始後, 其第一次使用 VSC-88 的开头, 会跑出一个日裔的
  窗子来警告嘛! 那我们就先把这个窗子决解掉再说. 至於那个 50 秒
  的计时, 顺其自然.

  1.用 winice 载入 95 , 执行 VSC-88 . 它会弹出一个 50 秒的警告
    窗子. 有没有忘记我以前曾讲的拦窗子的点 lockmytask ? 只要用
    这个设断成功, 依经验, 约有八成的程式不是很难解的. 

  2.注意哦! 这次的窗子, 若没把握到, 就得重开机了哦! 在窗子中,
    按下 Ctrl-d 切入 winice .

  3.打 BPX LOCKMYTASK 设断, 压 F5 返回 VSC-88 的画面. 

  4.按下窗内的 "确定" , 一收窗, 就会被 winice 拦下来, 如下:

  USER!LOCKMYTASK
  CS:636C       ENTER   0004,00 ; <- 在这里拦下来.
                PUSH    SI
        :               :
                                
  5.就开始用 F12  键, 往外层的常式跳! 注意按! 一按到了 VSC  的
    地盘, 就要马上停下来! 如下: 

  1E07:4D00     CMP     WORD PTR[005C],0 ; 
                JZ      4D27             ; <- JZ
                CMP     WORD PTR[00D4],0 ; 
                JZ      4D27             ; <- JZ
        :               :
       4D1C     CALL    USER!MESSAGEBOX  ;
                MOV     WORD PTR[00D4],0 ; <- 返回至此, 由此可知, 上
                CMP     :       :        ;    面的 CALL 与窗子有关.
  --- VSC(1) ---

  往上一看, 有两个 JZ 会飞越这个 MESSAGEBOX ! 有两个 JZ , 通常
  我会先试第一个. 那要强迫第一个跳至 4D27 , 有几种方式可行. 如
  下:
      
    一、把 JZ 改成 JMP .
    二、把第一个 CMP  那行最後的 0, 改成 [005C] 相同的资料.
    三、把 [005C] 内填零.

  通常我会用第三种. 因为在 WINICE 中, 用 E Addr 比较方便. 上两
  种必须用 A Addr 来组译, 必须注意组译出来的 Bytes  数.

  6.用 E DS:005C, 此时的资料栏如下:

  --- VSC(2) ---
  DS:005C       01 00 05 00 01 00
                ^^^^^
  有没有注意到第一个 CMP  後面的 "WORD" 字眼? 那个 WORD 就是指
  使用的资料长度是一个 Word , 也就是两个 Bytes, 因此就是把上面
  画底线的两个 Bytes  填零就可以了.

  7.把 DS:005C  的地方填零後, 按 F5 再返回 VSC-88 试看看.

  结果, 试听时发现 "老天爷居然给饭吃" !  50 秒的限制不见了? 有
  没有注意到资料栏的地盘是 VSC ?  那表示东西不是在 VSC.DLL, 就
  是在 VSC.EXE  罗!

  其实还没完, 因为我改了把上头的 01 改成 00 之後, 再进入 Win95
  时, 会弹出一个视窗, 说 "波形的资料毁损" ! 

  天啊! 那我只好再改程式段再试试看吧! 也就是第一个 CMP  那个地
  方. 因为资料段和程式段不同, 说不定它只检查资料段. 

  8.我们再看一下那一段, 如下:

  1E07:4D00     CMP     WORD PTR[005C],0 
                JZ      4D27             

  是不是改成如下就好了?

  1E07:4D00     MOV     WORD PTR[005C],0 
                JMP     4D27             
  
  但是改成如上会多出一个 BYTE , 因为第二个 BYTE 是 0, 所以只要
  改一个 BYTE 的叙述就好了, 你可以用 BYTE PTR 的叙述来改. 

  也许你会想, 最好连那个 JZ 都不要改; 正在想办法把 [005C] 放 0
  , 又可使 Zero 旗标举起来的叙述. 答案是有的, 那就是 AND !

====== Error Free 17/20 =======================================================

丑丑字型 & 中文 Win95.

  平常 Hacker 有大半的时间, 大概都在砍别人所设下的防护
  措施吧! 不过有时候呐! 也会修改到非保护关卡的常式; 或
  是撞到他人撰写程式时, 不小心所留下来的 Bug. 

  呵! 有时候会不小心帮忙抓软体中的 Bug Routine, 这大概
  就是 Hacker 要存在的意义吧! 

  我在追踪 ShellWizard 3.0  窗子上的字型问题时, 分析了
  老半天! 似乎有愈来愈明显的趋势, 显示的 CWin95 本身的
  字型系统有问题. 

  因为我追进了 User32.dll , 把它存取资料改掉後, 居然所
  有 "丑丑字型的视窗" 之软体, 都变成很漂亮!

  追踪过程很繁索, 我就直接讲重点好了. 有 "丑丑字型的视
  窗" 之软体, 都会呼叫「CreateDialogIndirectParamA」这
  个 Routine  来画窗子.

  在呼叫「CreateDialogIndirectParamA」之前, 它会先去呼
  叫「GetSystemMetrics」, 这个常式在使用之前, 必须先  
   Push 一个值给她, 如下:

  PUSH  xx
  CALL  USER32!GetSystemMetrics

  若有像 ShellWizard 3.0  主窗那种丑丑字型之软体, 都是
  PUSH 2A . 如下:

  PUSH  2A                      ; <- 会出问题的都是 2A .?
  CALL  USER32!GetSystemMetrics
  CMP   EAX,EBX                 ; <- 会出 "丑" 时, EAX 都是 1.

  1.切入 S-ICE, 用「bpx GetSystemMetrics if @(ESP+04)==2A」
    来条件设断. 以上是 SICE 3.0x 的设断语法哦! 在 2.0 
    中, 并不适用.

  2.按 F5 返回 Win95, 一执行 ShellWizard 3.0 Pro, 会被
    S-ICE 拦下来, 就开始单步执行罗! 如下:
    
  :u getsystemmetrics l 40
  USER32!GetSystemMetrics
  014F:BFF648C7  XOR     EAX,EAX        ; <- 在此拦下.
  014F:BFF648C9  MOV     EDX,[ESP+04]
  014F:BFF648CD  CMP     EDX,00
  014F:BFF648D0  JL      BFF64919               
  014F:BFF648D2  CMP     EDX,4A
  014F:BFF648D5  JA      BFF64919
  014F:BFF648D7  CMP     EDX,29
  014F:BFF648DA  JZ      BFF64929
  014F:BFF648DC  MOV     EAX,[BFF6714E]
  014F:BFF648E1  ADD     EAX,000003C4
  014F:BFF648E6  ADD     EAX,EDX
  014F:BFF648E8  ADD     EAX,EDX
  014F:BFF648EA  MOVZX   EAX,WORD PTR [EAX] ; <- 执行到此先停住
  014F:BFF648ED  CMP     EDX,16
  014F:BFF648F0  JAE     BFF64919

  3.当执行光棒停在 MOVZX   EAX,WORD PTR [EAX] 时, 用 
    D EAX 来看资料. 如下:
  :d eax
  0157:81EB2418 01 00 02 00 00 00 02 00-02 00 A0 00 18..
                ^^^^^
  4.用 E EAX  来吧把第一个 01 填 00 吧! 再用 BD * 暂停
    所有的断点, 然後按 F5 返回. 怎样? 

    ShellWizard 3.0 Pro 有没有变的相当漂亮? 妙的是! 她
    这次的画面, 居然给多出了四个原先被盖住的选项.

  5.此时系统的参数就被你改过了, 就开始试变丑的各种软体
    吧! CuteFTP、FTP Explorer、CAMCAD 2.0.9e 的 About & 
    WinPack 的 About、WinHacker 95... 最後别忘了试 Clean
    Sweep ! 看她的面孔有没有变的很正常....

注: 因为手边没有 GetSystemMetrics 的资料, 系统的东西若
    要动, 还是要谨慎一点好, 故我尚在考虑中, 尚未产生固
    定的改法, 所以暂时先在 S-ICE  下, 改著玩吧!

    若有人有 GetSystemMetrics & CreateDialogIndirectParamA
    两常式的呼叫使用法, 请提供一下吧! 

====== Error Free 18/20 =======================================================

Re: 丑丑字型 & 中文 Win95.

>    若是要直接修改user32.dll档,应该怎么做呢?
>    因为不太用会SoftICE,所以还希望您能够指导如
>    何修改user32.dll:)谢

  你真的要动它? 我还没有想出固定的改法呐! 因为系统的东东
  , 不像应用程式一般, 不能开玩笑的, 不先了解原 Routine、
  考虑再三, 我是不会去研究永久性改法的. 不然若传开了, 那
  天出大槌了, 会害死一票国人 ...

  目前我有发现一个程式会出槌, 用 Anawave Gravity 1.1  看
  中文信时, 会完蛋. 我这边其它的软体, 看起倒是还算正常.

  当这类丑丑的软体, 若 GetSystemMetrics(2Ah)  传回非零值
  时, 在中文 95 系统会使用的字型是 "细明体 8"  (它若使用
   "细明体 9" 不知有好! 可惜呀!...唉...) .

  英文软体的基本字型, 好像是使用 "MS Sans Serif 8"  才会
  比较正常. 否则用 "细明体 8" 除了字丑以外, 字高太短才是
  大事, 否则 SW30pro  的那四个选项, 就不会被那张图给盖住
  了. 

  对了! 谁找的到 Ture Type  的  "MS Sans Serif" 之字形? 

  不过在应用软体层面上, 你们倒是可以先动. 追法如下:

  1.切入 S-ICE, 用「bpx GetSystemMetrics if @(ESP+04)==2A」
    来条件设断. 以上是 SICE 3.0x 的设断语法哦! 在 2.0 
    中, 并不适用.

  2.按 F5 返回 Win95, 一执行 ShellWizard 3.0 Pro, 会被
    S-ICE 拦下来, 按一下 F12 or F11 . 你就会看你如下的
    样子了:

  原来:

    PUSH  2A                    ; <- 会出问题的都是 2A .?
    CALL  USER32!GetSystemMetrics
    CMP   EAX,EBX ; or TEST EAX,EAX ; <- 会出 "丑" 时, EAX 都是 1.
 
  改成:

    PUSH  2A
    CALL  USER32!GetSystemMetrics               
    XOR   EAX,EAX              ; <- 这样子该应用软体就正常了
 
  注:  SW30pro 是在 MFC42.DLL , 其它大半的都是在主 .EXE 
       档中. 修改 MFC42.DLL  应该不致於牵扯太广.

  「改之前先备份原来的档案! 切记! 切记! 」

====== Error Free 19/20 =======================================================

More Space 2.7 ! 减肥示范教材!

  通常在追一个软体之前, 就是要找一个 "明显变化" and  "即时可试"
  的事件出来. 要找这个, 就是要多操作你的目标软体. 像是要砍之前的
  先玩玩看. 先熟目标软体的操作特性, 是有助於设断的 Sense  的! 对
  啦! 再问你们一次! Sense 是不是念做 "先死" ? 

  不过这一点我很放心, 因为会主动去砍的软体, 想必也对它唾涎有一阵
  子罗! 是不是有点像追女孩子一样? 还没有说过一句话, 对方的一切周
  遭, 老早就都背得滚瓜烂熟了! 至是否闭著眼睛, 就可以走到她的房间
  ? 那等以後追上了, 再去求证吧! 太早求证, 会被人家骂 "猪哥" 哦!

  经过对目标软体 More Space 2.7 的熟悉, 我知道在 Duplicate Files
  的视窗中, 点右上角的磁碟机选择栏时, 会跳出一个小窗子来告诉你要
  注册罗! 且履试不爽, 故这个小窗子就是我们的第一据点.

  以前我讲过 lockmytask 有没有忘记? ..什么! 忘光啦! .. O.K! 没关
  系, 反正它在今天是英雄无用武之地, 发挥不出来. 我们再换一招, 试
  试 destroywindow  看看.

  1.进入 More Space 2.7 的 Duplicate Files  的地盘.
  2.点一下磁碟机选择栏的其中一个方格, 此时会跳出一个小窗子.
  3.按 Ctrl-d , 切入 sice .
  4.打 bpx destroywindow, 按 F5 返回.
  5.当点一下 "OK" 时, 会被 sice 拦下来. 如下: 
  
  14F:BFF62391  MOV     CL,B4           ; <- 在此拦下
                JMP     BFF623D7

  6.按一下 F12 , 居然就到了目标领空! 如下:

  14F:417BB4    RET     ; <- 返回至此.

  7.再按一下 F12 , 如下:

  14F:423C6B    CALL    [EDX+68]
                MOV     EDX,[EBP-04] ; <- 返回至此.

  有没有注意到上行有个 CALL ? 通常有 CALL 时, 你就要先看看上面有
  没有判断式. 有的话, 你先暂停所有的断点, 在那个 CALL 设断. 返回
  程式之後, 点一下磁碟机选择栏, 被 sice 拦下来之後, 再用 F10  带
  过那个 CALL , 看是不是小窗子的整个领域之 CALL .

  如果不是, 则必须暂停所有的断点, 再跳到 "步骤-5" , 再按 "OK" 前
  , 再把 DestroyWindow  打开. 按 "OK" 断下来後, 再一直按 F12, 直
  到返回此地的上一层 CALL 为止.

  8.就这样不断的重来按 F12  的往回跳, 最终你会反返回到..如下:

  14F:4C079C    CALL    470FF8  ; <- 在此设断试带 F10  看看.
                JMP             ; <- 返回至此.  

  9.当然这个 CALL 470FF8  就是小窗子的总领空罗! 往上看有..如下:

  14F:4C078E    CALL    4B9378  ; <- 想必是核对总部, 进入观查.
                TEST    AL,AL   ; <- 在此设断试之..
                JNZ     4C97A3

 10.把先前的所有断点再暂停一次. 在 TEST  AL,AL  那一行设断, 压
     F5 , 回目标程式. 一点磁碟机小格, 又会被 SICE 拦下. 

 11.把 AL 改成 1, 试之. 试的结果, 不会跑出小窗子了, 最重要最重
    要的是, 你点的磁碟机, 居然出现打勾! 

 12.那我们就进入那个 CALL 看看..如下:
     
  :u 4b9378 l 80
  014F:004B9378  PUSH    EBX
                 PUSH    ESI
                 XOR     EBX,EBX
        :                       :

 13.等一等. 我们进来要干嘛? 

  因为我们 <步骤-9> 试 AL 时, 知道 AL=0 返回不利! 所以我们要分
  析此地的 routine, 在什么情况下 , AL 才不会带 0  返回... 继续
  , 如下:

  014F:004B937C  PUSH    00008000
                 CALL    KERNEL32!SetErrorMode
                 MOV     ESI,EAX
                 PUSH    004B93EC               ; <- 此位址 Dump 出来看

                 CALL    KERNEL32!LoadLibraryA  ; <- 载 .DLL 档时, 大多
                                                ;    会用到此函式. 看一
                                                ;    此软体 Help 的注册
                                                ;    章节.
  014F:004B9392  MOV     [004C2C00],EAX
                 MOVZX   EAX,SI
                 PUSH    EAX
                 CALL    KERNEL32!SetErrorMode
                 CMP     DWORD PTR [004C2C00],20
                 JL      004B93E4               ; <- 这里有一个判断.

  014F:004B93A9  PUSH    004B93F8
                 MOV     EAX,[004C2C00]
                 PUSH    EAX
                 CALL    KERNEL32!GetProcAddress

  014F:004B93B9  MOV     ESI,EAX
                 MOV     [004C3964],ESI
                 TEST    ESI,ESI
                 JZ      004B93D9       ; <- 这里也有一个判断..

  014F:004B93C5  MOV     EAX,000004D2
                 CALL    [004C3964]
                 CMP     EAX,000004D2
                 JNZ     004B93D9       ; <- 这里又是一个判断.

  014F:004B93D7  MOV     BL,01          ; <- 01 ? 生命之泉!
         4B93D9  MOV     EAX,[004C2C00] 
                 PUSH    EAX
                 CALL    KERNEL32!FreeLibrary ; 把 .DLL 放掉.

  014F:004B93E4  MOV     EAX,EBX        ; 哦! 原来 EAX  是用 EBX  的
                 POP     ESI
                 POP     EBX
                 RET

  好啦! 就讲到此为止. 要玩, 就自己看著办! 要害的总部, 已经告诉你
  们了; 高手不要说答案, 留给 Hacker 新生自行单步执行练习吧! 也让
  他们多啃一些组合语言的书! O.K ?...下课....

====== Error Free 20/20 =======================================================

Cwin95 丑字型- 细明 8 之一

  今天再来谈谈有点偏离 Hacking (砍事) 的 "字型" 话题...

  其实我现在可以决解 CWin95 丑字型的方法, 依这段期间的修改记录
  看来, 已经可以达到八、九成的满意度了; 剩下的那一成, 就是找不
  到我心中想要的那个字型档. 

  所以迟迟没有把方法 Post 上来, 因为没有那个我心目中想要的字型
  档, 故 Post 上来, 对网友也没什小路用..

  我们最常见的问题, 就是英文软体会使用 MS Sans Serif - 8 的字
  型, 但这类软体其字型问题大概可分成两种:

  1.当 GetSystemMetrics(2Ah)  传回非零值时, 它会以 "细明-8" 
    来显示. 如: UltraEdit, Win Hacker ..等.

  2.应用软体本身不受系统的引响, 依然我行我素, 正常的以 "MS Sans
    Serif-8", 来显示. 表面上好像很正常, 但是若那一行带到中文字
    时, 中文字照样以 "细明-8" 呈现. 

    当你把它改成 "MS Sans Serif-9 " 时, 遇到中文字一样是 "细明
    -8" , 会照成中文化的困难. 应该是 CWin95 用的 MS Sans Serif  
    不是 True Type  的吧! 如: Agent ..
  
  以上两种类形的软体, 不管是那一种, 在中文化时, 都会有一个问题
  存在, 就是字高的问题, 因为 "MS Sans Serif -8" 居然会比 "细明
  -9" 来的高. 

  若用的字形, 其字高不对时, 会照成某些表格画面的不搭调、出轨画
  面、乌云遮半月... 等情况.

  如: 「Powertoy 的 tweakui」.
      「Paint Shop Pro -> Color -> Edit Palette」
      「ShellWizard 3.0 的主画面」

  如果可以找的到某个 True Type  的字型档, 若它的 -9 和 "MS Sans
  Serif-8 " 一样高、一样宽, 那不就...!! 没错! 的确如此..

  这些日子我就是在找那种字型档, 包括也再找建立字型档的软体, 因
  为自己建造, 慢慢画慢慢改总可以了吧! 但是理想归理想, 字形建造
  器想不到在 PC 界是如此的....唉! 不提也罢..

  在 MAC  界, 居然有一大票的全功能免费试用版; 在 PC 界, 一大票
  都是字型流漤器, 字形建造器只有小猫两三支, 而且都是几百年前的
  老软体, 连 "狂人" 都不屑一顾. 只好拉那超古老的试用版来试之, 
  但是并不好用.

  幸好我在网上有拉到一个 Fmonster35 , 可以改字形档的一些定义, 
  但是字高还是改不了. 翻遍了我所有的光碟片中的几千个 Font 档, 
  总算找到了一个. 唯一可惜的它是斜体字. 但它算是合格中的最美了. 

  这个的 font 名, 我把它改为 TS Sans Serif, 和 MS Sans Serif
  差一个字, 在 UltraEdit  中, 改 Appz 时, 会比较方便嘛! 而且
  有许多 Appz 只允许你改等长的名字, 多一个少一个字都不行. 所
  以我才取名为 TS Sans Serif . 

  想要转成较好看的 "细明 9" , 总算有了一些生机, 下列三个方法
  记起来:

  1.搜 08 00 4D 00 53 00 20 00 53 00 .
       09 00 54 00 53 00 20 00 53 00 .
       ^^    ^^
    用 Replace ALL . 

    09 是指 -9, 54 是 T, 把 MS Sans Serif  改成 TS Sans Serif. 
    要不要改成 TS Sans Serif 因情况而定, 若有 "细明-9" 的英字
    有出轨才要改, 如: Easy CD Pro 95 V2.11(20) 按钮上的字.

    或, 它本来就是显示正常的 MS Sans Serif-8 了, 只是要中文化
    , 光改成 -9 也没有用. 如: Agent .
    
  2.若还有表格不正常, 再搜 4D 00 53 00 20 00 53, 若有搜到时, 
    你会看到前面有几个零, 如下:

    搜 08 00 00 00 00 01 4D 00 53 00 20 
    改 09                54(T) 

    如: FsPatch, WinPatch 等. 这改成 TS Sans Serif-9 比较好看.

  3.若还有问题, 再搜 08 00 48 00 65 00 6C 00 76 00
         Replace All 09 00 48 00 65 00 6C 00 76 00

    把 Helv-8 改成 Helv-9 , 如: UltraEdit ..

  另外在 win.ini 中, 有如下这个, 你们就自行研究看看吧!

[fonts]
[FontSubstitutes]
Helv=MS Sans Serif
Tms Rmn=MS Serif
Times=Times New Roman
Helvetica=Arial
MS Shell Dlg=MS Sans Serif
Arial Cyr,204=Arial,204
Courier New Cyr,204=Courier New,204
Times New Roman Cyr,204=Times New Roman,204
Arial Greek,161=Arial,161
Courier New Greek,161=Courier New,161
Times New Roman Greek,161=Times New Roman,161
Arial CE,238=Arial,238
Courier New CE,238=Courier New,238
Times New Roman CE,238=Times New Roman,238

  最重要最重的 TS Sans Serif 档名是 Tnimbusi.zip , 我把它放
  在 ftp.tku.edu.tw  的 upload 目录中, 等一, 两天, 读取权应
  该就会开放了. 

  抓到解开後, 放在临时目录中, 再用滑鼠把它丢到 windows\fonts
  中就可以了.

== E-mail: paulgao@nease.net = 完 = 资料整理: 高春辉 于 06/09/97, 08/28/97. ===