欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

hellfire2000破解过程及注册机的编写(下) (6千字)

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+ebpedi=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]);
    }
}

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功