软件名称: 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');
}
- 标 题:ePublisher Gold v1.3 的注册码及注册机
- 作 者:chn-boy
- 时 间:2000-12-3 19:55:28
- 链 接:http://bbs.pediy.com