• 标 题:经过4个小时的奋战,终于搞清了它的注册计算原理,给大家分享。准备写出注册机(只能用BRUCK攻击) (1千字)
  • 作 者:pcrocker
  • 时 间:2001-2-10 5:41:42
  • 链 接:http://bbs.pediy.com

TafWeb出品的PageBuilder V3.0c1

TafWeb出品的PageBuilder V3.0c1 版本日期1999-08-26 下载地址:http://download.sina.com.cn/scgi/click.pl?s_id=884&href=1&ants=/pbldr_30.zip 用过的网页设计工具不多,这个PageBuilder也许是一个方便的面向文字的编辑工具。在试用版中,有60天的使用限制,网上的注册机我找到的最高版本是V3.0C。于是自己破解,好难:-( 它的注册计算过程比较麻烦,没有明确的call+test+jz(jnz)的过程,而是对注册用户名作了处理(程序代码从0041DA8E到0041E011是注册变换过程),之后是几个取商、取余数的过程。

用file scanner查出这个page builder V3.0c1是用aspack压的,解压后本来准备暴破的,不甘心。于是费时4个多小时,终于搞清它的注册原理,如下(以下数字均为16进制):
  1、将输入的User名称各字符的ASCII相加,再加上固定值3*3+3=9(被乘数和后面加数的3是版本号),再加PageBuiler的ASCII字符值是288,得到的结果,设为AA;
  2、取奇数位1、3、5、7,迭代B=(1)*2*5+(3); B=B*2*5+(5); BB=B*2*5+(7),其中(i)表示为第i位的数值,其结果设为BB;
  3、取偶数位8、6、4、2(注意顺序),同上面一样处理:C=(8)*2*5+(6); C=C*2*5+(4); CC=C*2*5+(2),接下来是CC=CC-AA,其结果设为CC;
  4、BB mod 7=0;
  5、CC mod d=0;
  6、int[BB/7]=int[CC/d] 且 >94;
  7、大家看到第9 位没有用到,事实上第9位是校验位。我不是分析程序得到的,原因在于这个程序比较狡猾,计算后的值在内存地址中不固定,我是一遍遍试出来的 :-< 。将前8 位数值相加,将和的个位与十位再相加,如果是一位数则应当与第9位相等;如果出现前8 位类似是 777-777-77,和为56,5+6=11>9,则将该结果再处理1+1=2,即第9位应为2;
  以上就是它的注册计算过程,整个过程跟下来好累,下面要作的就是写出注册机,手头只有TC2.0,还不错。

  • 标 题:测试下来,上面的分析可能还有不正确的地方, (104字)
  • 作 者:pcrocker
  • 时 间:2001-2-10 7:04:57

第1步中的固定值可能不正确,有待核实。给出一个可用的注册码:
UserName: PcRocker
Number  : 240-479-245

  • 标 题:这里是注册程序(TC2.0) (1千字)
  • 作 者:pcrocker
  • 时 间:2001-2-10 8:45:27

这里是注册程序:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

void main( void )
{
    char  cName[ 50 ], *p = cName;
    int    nUser = 0, nCodeOdd=0,nCodeEven=0,nTemp,i,nOutPut[10];
    printf( "\n TafWeb Software----PageBuilder 3.0c1 (c) by PcRocker.\n\nEnter your name: " );

    scanf("%s",&cName);

    nTemp=0;
    while( *p!=0 ) {
    nUser+= (int) *p++;
    nTemp++;
    }
    p--;
    nUser-= (int) *p;     /* to adjust the sum of UserName */
    nUser-= 30*nTemp;  /* also                          */
    nUser+=657;            /* for page builder 3.0c1,it's a static value    */
printf("%x\n",nUser);
    for(nCodeEven=nUser*2; nCodeEven<9999; nCodeEven++)
    {
        nTemp=nCodeEven-nUser;
        nTemp/=13;
        if( nTemp<148 )
            continue;
        else
        {
            nTemp*= 7;
            break;
        }
    }

    nCodeOdd=nTemp+(nCodeEven-nUser)%13;
    nCodeOdd+=1036;      /* 7 and 148     */
    nCodeEven+=1924;    /* 13 and 148  */
    printf("\nYour registration code is:\t");

    for( i=0; i<4; i++)
    {
        nTemp=nCodeOdd%10;
        nOutPut[6-2*i]=nTemp;
        nCodeOdd-=nTemp;
        nCodeOdd/=10;

        nTemp=nCodeEven%10;
        nOutPut[2*i+1]=nTemp;
        nCodeEven-=nTemp;
        nCodeEven/=10;
    }

    nTemp=0;
    for( i=0; i<8; i++)
    {
        nTemp+=nOutPut[i];
        printf("%d",nOutPut[i]);
        if( i%3==2)
            printf("-");
    }
    if(nTemp>9)
        nTemp=nTemp%10+nTemp/10;
    printf("%1d\n",nTemp);
    getch();

}