= 69、Gif Construction (16-bit) 1.0P(patch4) 破解 ============================================

Gif Construction (16-bit) 1.0P(patch4) 破解

 该程序是用来制作GIF89A图片的, 文件名 GIFCON.EXE

 1. Username: 填入 Cheng Jong
    注册码:  AAAAA (先乱填, 为什么不添数字? 自己跟跟看就知道了:-)

 2. Ctrl-D 切入 S-ICE...

 3. bpx hmemcpy

 4. 按F5切回GIFCON...然后按下OK键...

 5. S-ICE拦下后... BD * 把拦中断的功能关掉
    按几次F12...跳回GIFCON的领空...

    S DS:0 L FFFFFFFE 'Cheng Jong'
    S DS:0 L FFFFFFFE 'AAAAA'

    找到在XXXX地址处, 用BPM锁定该内存单元...

    bpm ds:xxxx

 6. 按G 回车, F10数次可以看到如下代码:

    xxxx:805A    CALL      XXXX:356E
                 :         :
   
    该CALL将用户名大写转小写.

 7. S DS:0 L FFFFFFFE 'cheng jong' 找到在XXXX地址.

    bpm ds:xxxx  锁定小写姓名...

    
 8. G 数次后... 可以看到如下代码:

    XXXX:69D9    MOV       AL,ES:[BX]   ; <- 取出第一个字母
                 MOV       AH,00
                 LES       BX,[BP+06]
                 ADD       BX,[BP-06]
                 MOV       DL,ES:[BX]
                 MOV       DH,00
                 IMUL      DX
                 ADD       [BP-0A],AX   ; <- 算完后保存.
                 JMP       69F0
    XXXX:69F0    AND       WORD PTR [BP-0A],7FFF
                 :         :

     这里代码对用户名的的一个字母进行注册码运算...

 9. 再继续往下...可以看到如下代码:

    XXXX:69BF    MOV       AL,ES:[EBX]  ; <- 取出其余字母
                 MOV       AH,00
                 NOT       AX
                 XOR       AX,00C2
                 MOV       CL,[BP-04]
                 SHL       AX,CL
                 ADD       [BP-0A],AX  ; <- 算完后保存.
                 JMP       69F0
                 :         :

     这里代码对用户名的的其余字母进行注册码运算...

 10. 再继续往下...可以看到如下代码:

                 LEA       AX,[BP+FEF6]
                 PUSH      AX
                 PUSH      CS
    XXXX:8094    CALL      6946       ; <- 进入8,9节运算部分
                 ^^^^^^^^^^^^^^^^     ; <- AX=运算结果!!
                 ADD       SP,04
                 MOV       BX,001C    ; <- 除以"1C"即28
                 XOR       DX,DX      ; <- 余数在"DX"中
                 DIV       BX
                 MOV       [BP-04],DX ; <- 保存余数.
                 :         :
    由这段可以看出程序将用户名进行一系列运算后, 得2个字节的结
    果. 再除以28得余数. 余数乘以8, 查内含的密码表得最终数值.
    而该值应正好等于用户系列号经同样一系列计算所得2字节结果.
    从这些可以看出程序注册吗校验原理, 不能由用户名简单的得到
    用户系列号.


 11. 最后... 当看到如下代码时:

    XXXX:809A    MOV       BX,[BP-04]   ; <- 余数取出
                 SHL       BX,03        ; <- 乘以8
                 CMP       AX,[BX+0EAB] ; <- 查0EAB处密码表
                 ^^^^^^^^^^^^^^^^^^^^^  ; <- 比较=0成功
                 JNZ       80B2         ; <- 注册码不成功跳80B2...
                 MOV       AX,0001      ; <- 哈, 注册成功AX=1
                 LEA       SP,[BP-02]
                 :         :
    
    CODE ON把JNZ改成JMP了就可以, 这样注册码随便输都OK啦!
     
 再次整理一遍:
   
 改 GIFCON.EXE

 FIND: 03 3B 87 AB 0E 75 0C B8 01 00 
 EDIT: -- -- -- -- -- 90 90 -- -- --

-- 

Rick Cheng
ICQ UIN: 2689013
SysOp of Longven BBS, CFidoNet: 6:666/3, Tel:86-555-249-6223