• 标 题:ePublisher Gold v1.3 的注册码及注册机
  • 作 者:chn-boy
  • 时 间:2000-12-3 19:55:28
  • 链 接:http://bbs.pediy.com

软件名称: ePublisher Gold v1.3 的注册码
此文目的: 如何获得该软件的注册码
调试工具: SoftICE4.05、W32dsm89.exe
调试平台: Win2K
编程工具: Turbo c 2.0

作者:    chn-boy
写作日期: 2000-12-03

【正文】
    由于这个软件的注册算法异常的复杂,所以具体的跟踪说明部分就不再给出了,值得提到的一点
就是怎么下中断。
    先用W32dsm89分析该软件,使用Found Text,查找:You entered an incorrect registration
这个出错的字符串,你会发现:
:0045EB77 BA84EC4500              mov edx, 0045EC84 <-- 在该处下中断
:0045EB7C E83F50FAFF              call 00403BC0
:0045EB81 8B952CFEFFFF            mov edx, dword ptr [ebp+FFFFFE2C]
:0045EB87 8D8530FEFFFF            lea eax, dword ptr [ebp+FFFFFE30]
:0045EB8D E8F06BFAFF              call 00405782
:0045EB92 8D8530FEFFFF            lea eax, dword ptr [ebp+FFFFFE30]
:0045EB98 E8116EFAFF              call 004059AE
:0045EB9D E8DA3BFAFF              call 0040277C
:0045EBA2 8B55FC                  mov edx, dword ptr [ebp-04]
:0045EBA5 8D8530FEFFFF            lea eax, dword ptr [ebp+FFFFFE30]
:0045EBAB E84053FAFF              call 00403EF0
:0045EBB0 E8486CFAFF              call 004057FD
:0045EBB5 E8C23BFAFF              call 0040277C
:0045EBBA 8D8530FEFFFF            lea eax, dword ptr [ebp+FFFFFE30]
:0045EBC0 E85F6CFAFF              call 00405824
:0045EBC5 E8B23BFAFF              call 0040277C
:0045EBCA E8C1FBFFFF              call 0045E790 <-- 注册码算法Call,关键
:0045EBCF 84C0                    test al, al
:0045EBD1 745B                    je 0045EC2E <--如果al=0那么程序就报错了
————————————————————————————————————————————
  /* 中间的这一部分是显示注册成功的代码段,这里省略,歉 */
————————————————————————————————————————————
* Possible StringData Ref from Code Obj ->"You entered an incorrect registration "
                                        ->"key.  Please try again."
:0045EC2E B8B4EC4500              mov eax, 0045ECB4
:0045EC33 E820EDFEFF              call 0044D958

    上面的Call 0045e790为真正注册码演算比较子过程,里面的程序我看了,好复杂哦,跟的
我差点没有信心了,不过还是坚持过来了。。 :)))) 就是这个Call,看去了我一个上午的
时间。。天啦,时间宝贵啊。。。嘿嘿。好了,闲话少说,言归正传:


【算法分析】
    1)假设你输入的Virtual Code是:3219486678905858 (为何要是16位,后面给出说明)。
      程序从第1个字符起把相邻的2个进行预处理合并成一个字符。如32两个字符,用
      0x33<<4+0x32-0x30=0x32;下面一个是19两个字符,用0x31<<4 + 0x39 - 0x30 = 0x19,
      那么处理完后,得到一个新的字符串:0x32,0x19,0x48,0x66,0x78,0x90,0x58,0x58 共八
      个字符。

    2)然后再将这八个字符进行一系列xor处理(好好好复杂哦,看的头都大了),重新得到一
      个新的字符串,长度仍然是8个。新的字符串再与0xDB,0x35,0x25,0x0A,0x90,0xE8,0x3C,
      0x9D 这个字符串分别xor,得到的新的字符串看看里面是不是包含了v:1.0 (0x76,0x3A,
      0x31,0x2E,0x30)和m:g (,0x6D,0x3A,0x67)这两个子字符串。如果有,那么注册成功,
      否则弹出注册错误的对话框。换句话说,如果我们可以让预先输入的Virtual Code在经过
      一系列的运算以后,等于v:1.0m:g这个字符串的话,那么我们就能够注册成功。

    3)经过一个上午的艰苦工作,我得到了一个字符串0x98,0xB1,0x41,0x06,0x82,0x3A,0xBF,0x29,
      如果我们把输入的Virtual Code经过合并预处理之后(也就是我们第1步所得到的)能等于
      这个字符串的话,那么我们就胜利了。。。哈,你们笑,我可是哭着得到这个黄金字符串
      的。

    4)先不管3721,手动做一个注册码出来再说,我做的是:987q4106821Z8o29 嘿嘿

    5)算法明了,那么下面就要写注册机啦。。呵呵


【注册机】
   
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>

    unsigned char gold_str[] = {0x98,0xB1,0x41,0x06,0x82,0x3A,0xBF,0x29}; /* 黄金字符串 :) */
    unsigned char code_str[] = "987q4106821Z8o29";
    unsigned char ch1,ch2,ch3;
    int k = 0, number = 1;

    void main() {
      printf("\nCopyRight by chn-boy ['y' to continue] : \n"); /* 先留个版权再说,哈哈 */
      randomize();
      do {
        for(k=0;k<8;k++) {
          ch1 = (gold_str[k]>>4) + 3; /* 3的意思就是0x30,详细请看算法分析 */
          ch2 = gold_str[k] & 0x0F;
          ch3 = (unsigned char)(random(6)+2); /* ch3为偶数位字符的高4bit的值 */
          ch1 -= ch3;      /* 此处ch1为奇数位字符的低4bit的值 */
          ch2 += (ch3 << 4);    /* 此处的ch2为随机得到的偶数位字符 */
          ch3 = (unsigned char)(random(6)+2); /* 此处的ch3为奇数位字符随机的高4bit值 */
          ch1 += (ch3 << 4);
          code_str[k*2] = ch1;
          code_str[k*2+1] = ch2;
        }
        printf("\n  The %3dth Code is: %s\n", number, code_str);
        number++;
      }while(getch()=='y');
  }