• 标 题:请高手破此软件, impex 2.0,3.0. 郭大志老师请看(correct url) (144字)
  • 作 者:letterweb
  • 时 间:2000-6-8 14:44:44
  • 链 接:http://bbs.pediy.com

URL: http://bluecoffee.163.net/new.htm

输入试验注册码号没有信息, 用TRW 干脆就不能输入试验码.

是用VFOXPRO6.0编程,
是不是试用版, 无法破解?

  • 标 题:既是FoxPro程序,用反编译程序试试,用SoftICE或TRW跟是一种痛苦,在VFP6R.DLL中出不来 (155字)
  • 作 者:郭大志
  • 时 间:2000-6-8 18:15:00
  • 链 接:http://bbs.pediy.com

它的序列号放在c:\windows\system\serial.sys中。估计把这个文件拷到别的机器上就能用同样的注册码注册。

BTW,请不要叫我老师,岂敢好为人师,大家讨论讨论而已。

  • 标 题:到目前为止得到的结果如下 (3千字)
  • 作 者:郭大志
  • 时 间:2000-6-8 20:16:33
  • 链 接:http://bbs.pediy.com

序列号放在c:\windows\system\serial.sys中,
注册码放在c:\windows\system\secret.sys中。
这两个文件都是加密过的,算法很简单,用unfoxall(我只有demo版,而且这个demo版的40个文件限制无法去除,因强行修改40个文件限制会死机)对serial.exe进行反编译可以得到其加密和解密的算法。如下:

加密算法:
PROCEDURE secret
PARAMETER CSTRING
ESTRING = ''
NLONG = LEN(CSTRING)
FOR I = 1 TO NLONG
    ESTRING = ESTRING + CHR(ASC(SUBSTR(CSTRING,I,1)) + I + NLONG)
ENDFOR
RETURN ESTRING
ENDPROC

解密算法:
PROCEDURE desecret
PARAMETER CSTRING
ESTRING = ''
NLONG = LEN(CSTRING)
FOR I = 1 TO NLONG
    ESTRING = ESTRING + CHR(ASC(SUBSTR(CSTRING,I,1)) - I - NLONG)
ENDFOR
RETURN ESTRING
ENDPROC

用SoftICE跟踪它读取注册码后判断的过程,知道上述解密算法对应的汇编程序段如下:
0167:0C0746D7  MOV      ESI,ECX
0167:0C0746D9  MOV      EAX,[ESI]      //取一个字节
0167:0C0746DB  SUB      EAX,[EDX]      //相减
0167:0C0746DD  JO        0C12995B
0167:0C0746E3  MOV      [ESI],EAX
0167:0C0746E5  SUB      EAX,EAX

解开一个字符后,回到下面的地方,把解开的字符保存起来:

0167:0C018C1F  CALL      0C00CDEB    //解开一个字符
0167:0C018C24  MOV      ESI,EAX        //EAX中存放该字符
0167:0C018C26  MOV      ECX,ESI
0167:0C018C28  CALL      0C018C75
0167:0C018C2D  CMP      ESI,000000FF
0167:0C018C33  MOV      EDI,EAX
0167:0C018C35  JA        0C0D95E5
0167:0C018C3B  MOV      EDX,EDI
0167:0C018C3D  LEA      ECX,[ESP+0E]

之后它要把你输入的8位的注册码的前4位和后四位调换一下,比如我输入的为“12345678”,调换后变成“56781234”,
然后转换成一个数,对此数进行简单的浮点运算。

0167:0C09F332  LEA      EAX,[EDI*4+EDI]
0167:0C09F335  LEA      EDI,[EAX*2+ECX-30]  //每次转换一个字符
0167:0C09F339  MOV      AL,[ESP+11]
0167:0C09F33D  INC      ESI
0167:0C09F33E  TEST      AL,AL
0167:0C09F340  JNZ      0C09F383
0167:0C09F342  XOR      ECX,ECX
0167:0C09F344  MOV      CL,[ESI]
0167:0C09F346  LEA      EAX,[ECX-30]
0167:0C09F349  CMP      EAX,35
0167:0C09F34C  JA        0C09F367
0167:0C09F34E  XOR      EDX,EDX
0167:0C09F350  MOV      DL,[EAX+0C09F424]
0167:0C09F356  JMP      [EDX*4+0C09F410]
0167:0C09F35D  MOV      EAX,[ESP+18]
0167:0C09F361  TEST      EAX,EAX
0167:0C09F363  JZ        0C09F339
0167:0C09F365  JMP      0C09F311
0167:0C09F367  MOV      CL,[ESP+2C]
0167:0C09F36B  MOV      AL,[ESI]
0167:0C09F36D  CMP      AL,CL
0167:0C09F36F  JZ        0C09F378
0167:0C09F371  MOV      BYTE PTR [ESP+11],01
0167:0C09F376  JMP      0C09F339
0167:0C09F378  MOV      [ESP+11],BL
0167:0C09F37C  MOV      EBX,00000001
0167:0C09F381  JMP      0C09F339
0167:0C09F383  MOV      EAX,[ESP+24]
0167:0C09F387  MOV      DL,[ESP+13]
0167:0C09F38B  MOV      [ESP+14],EDI    //保存转换结果
0167:0C09F38F  MOV      [EAX],DL
0167:0C09F391  MOV      AL,[ESP+12]
0167:0C09F395  TEST      AL,AL
0167:0C09F397  JNZ      0C0EC5A9
0167:0C09F39D  MOV      EAX,[ESP+18]
0167:0C09F3A1  CMP      EAX,09
0167:0C09F3A4  JG        0C0EC5BE
0167:0C09F3AA  FILD      DWORD PTR [ESP+14]  //转换结果变成浮点数

离找到注册码还差一步,用SoftICE跟实在太累!

  • 标 题:搞定了 (1千字)
  • 作 者:郭大志
  • 时 间:2000-6-9 17:36:34
  • 链 接:http://bbs.pediy.com

谢谢letterweb。我下载了unfoxall之后,反编译,找到如下判断注册码的代码,有了源程序显然很简单,如下:
* -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
*  文件名: CHECKSN.PRG <-- 本文件由 UnFoxAll 创建
* -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-


IF  .NOT. FILE((CSERIAL)) .OR.  .NOT. FILE((CSECRET))  //检查文件cserial.sys和csecret.sys是否存在
    LREGISTER = .F.    //不存在就未注册
    DO CHECKEXP        //检查是否过期
ELSE
    NSERIAL = FOPEN((CSERIAL))      //打开cserial.sys
    NSIZE = FSEEK(NSERIAL,0,2)
    = FSEEK(NSERIAL,0,0)
    NO = FREAD(NSERIAL,NSIZE)        //读取序列号
    NO = DESECRET(NO)                    //解密序列号
    = FCLOSE(NSERIAL)
    NSECRET = FOPEN((CSECRET))  //打开csecret.sys
    NSIZE = FSEEK(NSECRET,0,2)
    = FSEEK(NSECRET,0,0)
    CKEY = FREAD(NSECRET,NSIZE)  //读取注册码
    CKEY = DESECRET(CKEY)            //解密注册码
    = FCLOSE(NSECRET)
    KEY1 = SUBSTR(CKEY,1,4)          //注册码的前四位
    KEY2 = SUBSTR(CKEY,5,8)          //注册码的后四位
    CKEY = KEY2 + KEY1                  //前四位和后四位交换了一下
    CKEY = STR(VAL(CKEY) - 550331,8) //减去550331
    IF CKEY <> NO                                //差等于序列号吗?
      LREGISTER = .F.                        //不等则未注册
      DO CHECKEXP                          //检查是否过期
    ELSE
      LREGISTER = .T.                        //注册用户
    ENDIF
ENDIF

至此可以很轻易地写出注册机。checkexp.prg是对时间进行判断,即判是否过期,时间放在文件setdate.sys中。

BTW:我下载的unfoxall中带的敌后武工队的注册机怎么不灵光,只好自己把unfoxall搞定了。

  • 标 题:try (461字)
  • 作 者:郭大志
  • 时 间:2000-6-10 0:09:04
  • 链 接:http://bbs.pediy.com

#include <stdio.h>

void main(void)
{

    long serial;
    int k;
    char buf[32];

    printf("Input your serial:");
    scanf("%lu", &serial);

    serial += 550331L;
    sprintf(buf, "%08lu", serial);

    printf("Your registration code is :");
    for(k = 4; k < 8; k++) putchar(buf[k]);
    for(k = 0; k < 4; k++) putchar(buf[k]);
    putchar('\n');
}

实际上可以不用注册机,把别人的serial.sys 和secret.sys拷过来就可以用。