hellfire2000破解过程及注册机的编写(下) (6千字)
文章名称:hellfire2000破解过程及注册机的编写(下)e_mail:luoyi.ly@yeah.net
oicq:36606500
目的:帮助和我一样的广大初学者。
软件名称: hellfire2000
软件简介:略
保护分析:略
教程正文
进入该软件注册算法的关键call中后,我们可以看到如下代码:
:00405916 8AC8 mov cl, al --------------------------------
:00405918 2455 and al, 55
:0040591A 80E1AA and cl, AA
:0040591D 2AC8 sub cl, al
:0040591F 8A442410 mov al, byte ptr [esp+10] 第一步 循环次数
:00405923 02C1 add al, cl 由名字和公司决定
:00405925 47 inc edi
:00405926 88442410 mov byte ptr [esp+10], al
:0040592A 8A0437 mov al, byte ptr [edi+esi]
:0040592D 84C0 test al, al
:0040592F 75E5 jne 00405916 ------------------------------
:00405931 83FF05 cmp edi, 00000005
:00405934 7D08 jge 0040593E
.............
.............
:0040593E 8B4C2410 mov ecx, dword ptr [esp+10]
:00405942 33D2 xor edx, edx
:00405944 81E1FF000000 and ecx, 000000FF
:0040594A 8954241C mov dword ptr [esp+1C], edx
:0040594E 2BCE sub ecx, esi
:00405950 894C2418 mov dword ptr [esp+18], ecx
:00405954 EB04 jmp 0040595A
.............
.............
:00405956 8B4C2418 mov ecx, dword ptr [esp+18] ----------------------
:0040595A 8BC2 mov eax, edx
:0040595C 99 cdq
:0040595D F7FB idiv ebx edx中保存了循环次数除以6的余数n
:0040595F 8D0431 lea eax, dword ptr [ecx+esi] <------eax=第一步的结果+n
:00405962 B90A000000 mov ecx, 0000000A
:00405967 8D3C2A lea edi, dword ptr [edx+ebp] edi=ebp+n
:0040596A 99 cdq
:0040596B F7F9 idiv ecx 第一步的结果除以a,
:0040596D 8A0E mov cl, byte ptr [esi]
:0040596F 8A07 mov al, byte ptr [edi]
:00405971 8A92C4FD4100 mov dl, byte ptr [edx+0041FDC4] <------查表(就是在注册机
:00405977 32D1 xor dl, cl 里的table[10]那张
:00405979 32C2 xor al, dl 表。
:0040597B 8B54241C mov edx, dword ptr [esp+1C]
:0040597F 8807 mov byte ptr [edi], al
:00405981 33C0 xor eax, eax
:00405983 85DB test ebx, ebx
:00405985 7E0C jle 00405993
:00405987 8A0E mov cl, byte ptr [esi]---------------------
:00405989 02CA add cl, dl
:0040598B 300C28 xor byte ptr [eax+ebp], cl 小二步 6次
:0040598E 40 inc eax
:0040598F 3BC3 cmp eax, ebx
:00405991 7CF4 jl 00405987--------------------------------
:00405993 8A4601 mov al, byte ptr [esi+01]
:00405996 42 inc edx
:00405997 46 inc esi 大二步 由名字和公司决定
:00405998 8954241C mov dword ptr [esp+1C], edx 保存edx值 循环次数
:0040599C 84C0 test al, al
:0040599E 75B6 jne 00405956 -----------------------------------------
:004059A0 33F6 xor esi, esi
:004059A2 85DB test ebx, ebx
:004059A4 7E1A jle 004059C0
:004059A6 8A042E mov al, byte ptr [esi+ebp]--------------------
:004059A9 8AD0 mov dl, al
:004059AB 80E2F3 and dl, F3
:004059AE C0E802 shr al, 02
:004059B1 C0E202 shl dl, 02
:004059B4 2433 and al, 33 第三步 6次
:004059B6 0AD0 or dl, al
:004059B8 88142E mov byte ptr [esi+ebp], dl
:004059BB 46 inc esi
:004059BC 3BF3 cmp esi, ebx
:004059BE 7CE6 jl 004059A6 ---------------------------------
:004059C0 5F pop edi
:004059C1 5E pop esi
:004059C2 5D pop ebp
:004059C3 B801000000 mov eax, 00000001
:004059C8 5B pop ebx
:004059C9 59 pop ecx
:004059CA C3 ret
注册机的编写实际上就是读懂汇编代码的问题,我把我的理解都写在代码旁边,希望对大家能有一些帮
助。下面我只是粗线条地分析一下注册码的产生过程,让大家在更短的时间内读懂上面的代码。
这段代码用到的数据是由user name,company组合而成的。在这里,我的是luoyiupc,(也就是把两个
字符串组合一下)。设这个字符串为name[]。
这一段代码由3个循环组成,其中,第二个循环还套了一个小循环。整个注册码的产生过程是这样的:
1.经过第一个循环,由name[]产生一个数N。其中要注意进借位的问题。
2.经过第二个循环,由name[]和N长生一个12位的整数。每两位做一个元素,组成数组code[6]。
3.经过第三个循环,由code[6]产生最终注册码。存放在ebp为首的地址空间里。
下面就是我用tc2.0编的注册机程序的源代码,由于不太熟悉c语言,编的程序效率肯定不太高。如有
哪位大虾能够指点一二,小弟感激不尽!另外需要说明的一点就是注册码不区分大小写,在我的程序里
输出用的都是小写字母,你把它们改称大写也能成功注册。
注册机的编写:
#include <string.h>
#include <stdio.h>
main(){
static char name[40];
char company[20];
int al,cl,dl,N=0,TEMP=0,i,j,index,high,low;
int code[6]={0};
int table[10]={1,2,3,0x1E,0,0x39,0x49,0x48,0x1B,0};
printf("Please input your name:");
gets(name);
printf("Please input your company:");
gets(company);
strcat(name,company);
for(i=0;(al=cl=name[i])!='\0';i++){
al&=0x55;cl&=0xAA;
TEMP=(cl>al)?(cl-al):(256+cl-al);
N=(N+TEMP)&0xFF;
}
for(i=0;(cl=name[i])!='\0';i++){
index=(N+i)%10;
dl=table[index];
al=code[i%6];
dl^=cl;
code[i%6]=al^dl;
cl+=i;
for(j=0;j<6;j++){
code[j]^=cl;
}
}
printf("Your registration code is:\n");
for(i=0;(al=dl=code[i])&&i<6;i++){
dl&=0xF3;dl<<=2;dl&=0xFF;
al>>=2;al&=0x33;al&=0xFF;
code[i]=(dl|al);
printf("%2x",code[i]);
}
}
