• 标 题:菜鸟破解录之 GIF Construction Set Pro及算法分析 (8千字)
  • 作 者:xiA Qin
  • 时 间:2000-9-1 10:44:20
  • 链 接:http://bbs.pediy.com

菜鸟破解录之 GIF Construction Set Pro及算法分析


软件名称:  GIF Construction Set Pro
软件版本:  2.0a(Ptach 20) 
软件大小:  4132KB 
软件授权:  共享软件 
使用平台:  Win95/98/NT 
发布公司:  http://www.mindworkshop.com/alchemy/gifcon.html
软件简介: 
          快速、专业地创建为你的网页创建透明、交错和活动的GIF文件。动画向导可另你在几分钟之内创建极具魅力的Web图形。



作    者:xiA Qin
解密日前:2000年8月30日
解密工具:Trw2000 1.22

说    明:这是我写的第一篇算法分析的破文,难免有错误存在,望各位大侠指点。


这个程序需要在安装时,就需要输入注册码和注册名。


输入注册信息:
注册 码:11111-22-33333-44

注:为了方便说明,分为4段。
    第1段为:11111
    第2段为:22
    第3段为:33333
    第4段为:44

注册名:Chinese        #字符数必须大于5位数。

..............................
015F:00403163  PUSH    EAX
015F:00403164  LEA      EDX,[EBP+FFFFFBF4]
015F:0040316A  PUSH    EDX
015F:0040316B  CALL    00424508
015F:00403170  ADD      ESP,BYTE +08
015F:00403173  LEA      ECX,[EBP+FFFFFBF4]
015F:00403179  PUSH    ECX
015F:0040317A  PUSH    DWORD 0042FCB6
015F:0040317F  CALL    00424598
015F:00403184  ADD      ESP,BYTE +08
015F:00403187  MOV      DWORD [EBP-04],01
015F:0040318E  PUSH    DWORD 0042FCB6
015F:00403193  CALL    004245C8
015F:00403198  POP      ECX
015F:00403199  CMP      EAX,BYTE +11        //又要检查注册码位数,17位。
015F:0040319C  JZ      004031A3            //不相等,就跳。
015F:0040319E  XOR      EAX,EAX
015F:004031A0  MOV      [EBP-04],EAX
015F:004031A3  CMP      DWORD [EBP-04],BYTE +00
015F:004031A7  JZ      00403203
015F:004031A9  XOR      EDX,EDX
015F:004031AB  MOV      [EBP-08],EDX
015F:004031AE  MOV      ESI,EDX
015F:004031B0  JMP      SHORT 004031D4
015F:004031B2  XOR      EAX,EAX                  //将eax清零。
015F:004031B4  MOV      AL,[ESI+0042F8B4]        //依次载入姓名字符。
015F:004031BA  PUSH    EAX                     
015F:004031BB  CALL    00429FCC                  //将大写A~Z转换为小写a~z。
015F:004031C0  POP      ECX                     
015F:004031C1  MOV      EDX,ESI               
015F:004031C3  AND      EDX,BYTE +07             
015F:004031C6  XOR      ECX,ECX                 
015F:004031C8  MOV      CL,[EDX+0042E088]       
015F:004031CE  XOR      EAX,ECX                  // 把EAX和ECX做异或操作,
015F:004031D0  ADD      [EBP-08],EAX              //累加异或操作 [EBP-08]=[EBP-08]+EAX
015F:004031D3  INC      ESI                     
015F:004031D4  CMP      BYTE [ESI+0042F8B4],00    //取下个字符,等于00,就结束计算。
015F:004031DB  JNZ      004031B2                  //比较姓名字符是否计算结束
015F:004031DD  MOV      EAX,[EBP-08]              //将[EBP-08]的值移入寄存器eax中
015F:004031E0  MOV      ECX,64                    //将16进制的64移入寄存器ECX
015F:004031E5  CDQ                                //判断eax中的值是否大于80000000,
015F:004031E6  IDIV    ECX                      //用EAX与ECX求余.
015F:004031E8  MOV      ESI,EDX                  //余数从EDX移入ESI。

一、算法总结:
1、这部分就是把你输入的注册名的每个字符都转成相应的Ascii码!

2、然后,与相对应80 40 20 10 08 04 02 01进行异或计算。再将计算后的值累加。
然后注册名大于8位,就循环使用80 40 20 10 08 04 02 01。

3、直到注册名计算完毕的值A与64求余。得到B.这就是我们需要的是第2段注册码
4、将B转换成十进制数就是注册码,这就是我们需要的是第2段注册码

计算公式:
注:注册名的第一位用a1来代替,第二位用a2来代替,第三位用a3来代替......,以次类推。

(a1 xor 80)+(a2 xor 40)+(a3 xor 20)+(a4 xor 10)+(a5 xor 08)+(a6 xor 04)+(a7 xor 02)
+(a8 xor 80)+(a9 xor 80)+(a10 xor 40)+(a10 xor 20)+(a11 xor 10)+(a12 xor 08).......=A

A IDIV 64=B

将B转换成十进制数就是注册码. 是第2段注册码。

二、举例说明:

我输入的注册名是chinese,它对应的Ascii如下。

字    符:  c  h  i  n  e s  e
  Ascii: 63 68 69 6e 65 73 65  与80 40 20 10 08 04 02 进行异或计算

(63 xor 80)+(68 xor 40)+(69 xor 20)+(6e xor 10)+(65 xor 08)+(73 xor 04)+(65xor 02)=
e3+28+49+7e+6d+77+67=31D

31D IDIV 64 =61

61转换成十进制为97。  <<--第2段注册码


015F:004031EA  TEST    ESI,ESI
015F:004031EC  JNZ      004031EF
015F:004031EE  INC      ESI
015F:004031EF  PUSH    DWORD 0042FCBC
015F:004031F4  CALL    0042A088
015F:004031F9  POP      ECX
015F:004031FA  CMP      ESI,EAX        //比较注册码。
015F:004031FC  JZ      00403203        //不相等,就跳。                 
015F:004031FE  XOR      EAX,EAX
015F:00403200  MOV      [EBP-04],EAX
015F:00403203  CMP      DWORD [EBP-04],BYTE +00
015F:00403207  JZ      NEAR 0040328E
015F:0040320D  XOR      EDX,EDX
015F:0040320F  MOV      [EBP-08],EDX
015F:00403212  XOR      ESI,ESI
015F:00403214  JMP      SHORT 0040322F
015F:00403216  MOV      AL,[ESI+0042FCB6]    <<--|  11111
015F:0040321C  MOV      EDX,ESI                  |
015F:0040321E  AND      EDX,BYTE +07            |
015F:00403221  XOR      AL,[EDX+0042E088]        |
015F:00403227  XOR      ECX,ECX                  |
015F:00403229  MOV      CL,AL                    |
015F:0040322B  ADD      [EBP-08],ECX            |
015F:0040322E  INC      ESI                      |
015F:0040322F  CMP      BYTE [ESI+0042FCB6],00  |
015F:00403236  JZ      0040323D                |
015F:00403238  CMP      ESI,BYTE +05            |
015F:0040323B  JL      00403216            <<--|
015F:0040323D  XOR      ESI,ESI
015F:0040323F  JMP      SHORT 0040325A
015F:00403241  MOV      AL,[ESI+0042FCBF]    <<--|
015F:00403247  MOV      EDX,ESI                  | 33333
015F:00403249  AND      EDX,BYTE +07            |
015F:0040324C  XOR      AL,[EDX+0042E088]        |
015F:00403252  XOR      ECX,ECX                  |
015F:00403254  MOV      CL,AL                    |
015F:00403256  ADD      [EBP-08],ECX            |
015F:00403259  INC      ESI                      |
015F:0040325A  CMP      BYTE [ESI+0042FCBF],00  |
015F:00403261  JZ      00403268                |
015F:00403263  CMP      ESI,BYTE +05            |
015F:00403266  JL      00403241            <<--|
015F:00403268  MOV      EAX,[EBP-08]
015F:0040326B  MOV      ECX,64         
015F:00403270  CDQ   
015F:00403271  IDIV    ECX
015F:00403273  MOV      ESI,EDX

此处的计算方法基本相同,不同的地方是它是用注册码的第1段(11111)和第3段(33333)来计算。
                                                   
一、算法总结:
1、把你输入的注册码第1段(11111)的每个字符都转成相应的Ascii码!
2、然后,与相对应80 40 20 10 08 进行异或计算。再将计算后的值A累加。
3、把你输入的注册码第3段(33333)的每个字符都转成相应的Ascii码!
4、然后,与相对应80 40 20 10 08 进行异或计算。再将计算后的值B累加。
5、直到注册码计算完毕的值B与64求余。得到C.这就是我们需要的注册码C。
6、将C转换成十进制数就是注册码,这就是我们需要的第4段注册码。

计算公式:
注:注册码第1段(11111)的第一位用a1来代替,第二位用a2来代替,第三位用a3来代替......,以次类推
  注册码第3段(33333)的第一位用b1来代替,第二位用b2来代替,第三位用b3来代替......,以次类推

(a1 xor 80)+(a2 xor 40)+(a3 xor 20)+(a4 xor 10)+(a5 xor 08)=A

A+(b1 xor 80)+(b2 xor 40)+(b3 xor 20)+(b4 xor 10)+(b5 xor 08)=B

B IDIV 64=C

将C转换成十进制数就是注册码.

二、举例说明:
我输入的注册码第1段是11111、第2段33333。

(31 xor 80)+(31 xor 40)+(31 xor 20)+(31 xor 10)+(31 xor 08)=B1+71+11+21+39=18D

18D+(33 xor 80)+(33 xor 40)+(33 xor 20)+(33 xor 10)+(33 xor 08)=18D+B3+73+13+23+3B=324

324 IDIV 64=04


04转换成十进制为04。<<--第4段注册码。


015F:00403275  TEST    ESI,ESI
015F:00403277  JNZ      0040327A
015F:00403279  INC      ESI
015F:0040327A  PUSH    DWORD 0042FCC5
015F:0040327F  CALL    0042A088
015F:00403284  POP      ECX
015F:00403285  CMP      ESI,EAX              // ? eax 44  是输入的注册码.
015F:00403287  JZ      0040328E                ? esi 04    正确的注册码.
015F:00403289  XOR      EAX,EAX
015F:0040328B  MOV      [EBP-04],EAX
015F:0040328E  CMP      DWORD [EBP-04],BYTE +00
015F:00403292  JNZ      004032A6
015F:00403294  PUSH    DWORD 00430FCC
015F:00403299  PUSH    EBX
015F:0040329A  CALL    004038FD              //密码失败对话框
015F:0040329F  ADD      ESP,BYTE +08
015F:004032A2  XOR      EAX,EAX
015F:004032A4  JMP      SHORT 00403310
.........................


通过以上分析可以知道,这个程序是用注册册名计算第2段注册吗。用第1段和第3段来计算第4段注册码。

也就是说,注册码第2段,同注册名有关。
          注册码第4段,同注册码第1段和第3段有关。

整理一下:

注册码:11111-97-33333-04
注册名:Chinese

罗罗嗦嗦讲了一大堆,希望大家能够明白我的意思!