首页
社区
课程
招聘
[原创]Pr0Zel大神的CrackMe 注册机的编写
发表于: 2014-8-21 22:57 5704

[原创]Pr0Zel大神的CrackMe 注册机的编写

2014-8-21 22:57
5704

【软件附件】  CrackMe.zip
【破解作者】 Night
【作者主页】 www.freecracker.com
【使用工具】 OD
【破解平台】 Win7
【软件名称】 Pr0Zel大神的CrackMe.exe
【软件附件】
------------------------------------------------------------------------------------------------------------
1. 程序程序输入用户名和Key值   然后下 bp GetDlgItemTextA  程序会断到下面的代码处。
0040154B   .  8B46 64       mov eax,dword ptr ds:[esi+0x64]          ;  Key值
0040154E   .  8B2D D4314000 mov ebp,dword ptr ds:[<&MSVCRT._mbscmp>] ;  msvcrt._mbscmp
00401554   .  68 EC404000   push CrackMe.004040EC                    ; /s2 = ""
00401559   .  50            push eax                                 ; |s1
0040155A   .  FFD5          call ebp                                 ; \让key值与空串比较 判断是否输入了字符
0040155C   .  83C4 08       add esp,0x8
0040155F   .  85C0          test eax,eax
00401561   .  74 7A         je XCrackMe.004015DD
00401563   .  8B46 60       mov eax,dword ptr ds:[esi+0x60]          ;  获取用户名存放到eax中
00401566   .  8D5E 60       lea ebx,dword ptr ds:[esi+0x60]
00401569   .  68 EC404000   push CrackMe.004040EC
0040156E   .  50            push eax                                 ;  用户名压入栈
0040156F   .  FFD5          call ebp
00401571   .  83C4 08       add esp,0x8
00401574   .  85C0          test eax,eax
00401576   .  74 65         je XCrackMe.004015DD
00401578   .  8B4E 64       mov ecx,dword ptr ds:[esi+0x64]          ;  指向key值
0040157B   .  33C0          xor eax,eax
0040157D   >  0FBE1401      movsx edx,byte ptr ds:[ecx+eax]          ;  取key值的第一位 存放到edx中
00401581   .  81F2 AA000000 xor edx,0xAA                             ;  edx  =  edx ^ 0xAA
00401587   .  03FA          add edi,edx                              ;  edi = edi + edx   edi初始化时 为 0
00401589   .  40            inc eax
0040158A   .  83F8 09       cmp eax,0x9
0040158D   .^ 7C EE         jl XCrackMe.0040157D                     ;  循环运行九次  取Key值中的九位(生成一个校验值)
0040158F   .  57            push edi                                 ;  上次运算的和
00401590   .  51            push ecx                                 ;  Key值压入栈
00401591   .  8BCC          mov ecx,esp
00401593   .  896424 1C     mov dword ptr ss:[esp+0x1C],esp
00401597   .  53            push ebx
00401598   .  E8 81070000   call <jmp.&MFC42.#535>
0040159D   .  8BCE          mov ecx,esi
0040159F   .  E8 8C030000   call CrackMe.00401930                    ;  进来  这里是算法



        00401930  /$  6A FF         push -0x1
        00401932  |.  68 38204000   push CrackMe.00402038                    ;  SE 处理程序安装
        00401937  |.  64:A1 0000000>mov eax,dword ptr fs:[0]
        0040193D  |.  50            push eax
        0040193E  |.  64:8925 00000>mov dword ptr fs:[0],esp
        00401945  |.  83EC 0C       sub esp,0xC
        00401948  |.  53            push ebx
        00401949  |.  56            push esi
        0040194A  |.  57            push edi
        0040194B  |.  8B5424 28     mov edx,dword ptr ss:[esp+0x28]          ;  edx 指向 用户名
        0040194F  |.  B0 4B         mov al,0x4B                              ;  al = 0x4B
        00401951  |.  884424 0C     mov byte ptr ss:[esp+0xC],al
        00401955  |.  884424 10     mov byte ptr ss:[esp+0x10],al
        00401959  |.  8B4A F8       mov ecx,dword ptr ds:[edx-0x8]           ;  用户名长度
        0040195C  |.  B0 4E         mov al,0x4E                              ;  al = 0x4E
        0040195E  |.  884424 12     mov byte ptr ss:[esp+0x12],al
        00401962  |.  884424 14     mov byte ptr ss:[esp+0x14],al
        00401966  |.  33FF          xor edi,edi                              ;  edi = 0
        00401968  |.  33F6          xor esi,esi                              ;  esi = 0
        0040196A  |.  33C0          xor eax,eax                              ;  eax = 0
        0040196C  |.  C64424 0D 45  mov byte ptr ss:[esp+0xD],0x45
        00401971  |.  85C9          test ecx,ecx
        00401973  |.  C64424 0E 59  mov byte ptr ss:[esp+0xE],0x59
        00401978  |.  C64424 0F 2D  mov byte ptr ss:[esp+0xF],0x2D
        0040197D  |.  C64424 11 41  mov byte ptr ss:[esp+0x11],0x41
        00401982  |.  C64424 13 4F  mov byte ptr ss:[esp+0x13],0x4F
        00401987  |.  7E 0B         jle XCrackMe.00401994
        00401989  |>  0FBE1C10      /movsx ebx,byte ptr ds:[eax+edx]         ;  取用户名的第一位
        0040198D  |.  03F3          |add esi,ebx                             ;  esi = esi + ebx  esi 初始化为 0
        0040198F  |.  40            |inc eax
        00401990  |.  3BC1          |cmp eax,ecx                             ;  循环5次
        00401992  |.^ 7C F5         \jl XCrackMe.00401989                    ;  求用户名的ASCII之和 保存到esi中
        00401994  |>  33C9          xor ecx,ecx                              ;  1FA
        00401996  |>  0FBE440C 0C   /movsx eax,byte ptr ss:[esp+ecx+0xC]     ;  程序自己生成的一串字符串
        0040199B  |.  0FAFC6        |imul eax,esi                            ;  eax = eax * esi 结果保存到eax中
        0040199E  |.  99            |cdq
        0040199F  |.  BB 1A000000   |mov ebx,0x1A                            ;  ebx = 0x1A
        004019A4  |.  F7FB          |idiv ebx                                ;  eax / ebx  商存放在eax中   余数存放到 edx 中
        004019A6  |.  83C2 61       |add edx,0x61                            ;  edx = edx + 0x61  edx是上面相除后的余数
        004019A9  |.  81F2 AA000000 |xor edx,0xAA                            ;  edx = edx ^ 0xAA
        004019AF  |.  03FA          |add edi,edx                             ;  edi = edi + edx    edi 初始化为 0
        004019B1  |.  41            |inc ecx
        004019B2  |.  83F9 09       |cmp ecx,0x9                             ;  循环执行9次(生成一个校验值)
        004019B5  |.^ 7C DF         \jl XCrackMe.00401996
        004019B7  |.  8B4424 2C     mov eax,dword ptr ss:[esp+0x2C]          ;  567
        004019BB  |.  C74424 20 FFF>mov dword ptr ss:[esp+0x20],-0x1
        004019C3  |.  3BF8          cmp edi,eax                              ;  如果两个校验值相同的话就通过验证了
        004019C5  |.  5F            pop edi
        004019C6  |.  5E            pop esi
        004019C7  |.  5B            pop ebx
        004019C8  |.  8D4C24 1C     lea ecx,dword ptr ss:[esp+0x1C]
        004019CC  |.  75 1B         jnz XCrackMe.004019E9
        004019CE  |.  E8 37020000   call <jmp.&MFC42.#800>
        004019D3  |.  B8 01000000   mov eax,0x1
        004019D8  |.  8B4C24 0C     mov ecx,dword ptr ss:[esp+0xC]
        004019DC  |.  64:890D 00000>mov dword ptr fs:[0],ecx
        004019E3  |.  83C4 18       add esp,0x18
        004019E6  |.  C2 0800       retn 0x8

2 . 注册机的实现:
/*
*           软件名称:         CrackMe
           保护方式:     CRC 校验
           注册机完成人: Night
           完成时间:     2014年8月21日12:00
*/

#include "stdafx.h"
#include "string.h"

int _tmain(int argc, _TCHAR* argv[])
{
        int data [9] = {0x4B,0x45,0x59,0x2D,0x4B,0x41,0x4E,0x4F,0x4E};
        //用户名
        char userName[100] = { 0 };
        //用户名的长度
        int  userNameLen   = 0;
        //用户名的ASCII之和
        unsigned int  userNameSum   = 0;
        //存放值
        unsigned int  mulValue      = 0;
        unsigned int  value         = 0;
        //商
        unsigned int  quotient      = 0;
        //余数
        unsigned int  mod                    = 0;
        //校验码
        unsigned int  Checksum      = 0;
        //注册码
        int           decode[9]     = {0};

        printf("请输入用户名:");
        gets_s(userName);
        userNameLen = strlen(userName);
       
        //用户名求ASCII之和
        for (int i = 0; i < userNameLen; i++)
        {
                userNameSum += userName[i];
        }

        //程序求出验证码
        for (int i = 0; i < 9; i++)
        {
                mulValue = data[i] * userNameSum;
                value    = 0x1A;

                quotient = mulValue / value;
                mod                 = mulValue % value;

                value    = mod + 0x61;
                value    = value ^ 0xAA;

                Checksum = Checksum + value;
        }

        //这里计算出Key值
        int s1,s2,s3,s4,s5,s6,s7,s8,s9;
        for (int a = 1; a <= 0xFF; a++)
        {
                s1 = a ^ 0xAA;
                for (int b = 1; b <= 0xFF; b++)
                {
                        s2 = b ^ 0xAA;
                        for (int c = 1; c <= 0xFF; c++)
                        {
                                s3 = c ^ 0xAA;
                                for (int d = 1; d <= 0xFF; d++)
                                {
                                        s4 = d ^ 0xAA;
                                        for (int e = 1; e <= 0xFF; e++)
                                        {
                                                s5 = e ^ 0xAA;
                                                for (int f = 1; f <= 0xFF ; f++)
                                                {
                                                        s6 = f ^ 0xAA;
                                                        for (int g = 1; g <= 0xFF; g++)
                                                        {
                                                                s7 = g ^ 0xAA;
                                                                for (int h = 1; h <= 0xFF; h++)
                                                                {
                                                                        s8 = h ^ 0xAA;
                                                                        for (int i = 1; i <= 0xFF; i++)
                                                                        {
                                                                                s9 = i ^ 0xAA;
                                                                                if((s1+s2+s3+s4+s5+s6+s7+s8+s9) == Checksum)
                                                                                {
                                                                                        decode[0] = a;
                                                                                        decode[1] = b;
                                                                                        decode[2] = c;
                                                                                        decode[3] = d;
                                                                                        decode[4] = e;
                                                                                        decode[5] = f;
                                                                                        decode[6] = g;
                                                                                        decode[7] = h;
                                                                                        decode[8] = i;
                                                                                        goto Exit;
                                                                                       
                                                                                }
                                                                        }
                                                                }
                                                        }
                                                }
                                        }
                                }
                        }
                }
        }
Exit:
        printf("注册码的十六进制串:");
        for (int i = 0; i < 9; i++)
        {
                printf("%02X",decode[i]);
        }
        printf("\n注册码的字符串为:");
        for (int i = 0; i < 9; i++)
        {
                printf("%c",decode[i]);
        }
        printf("\n");
        return 0;
}

PS:注册机运行环境VS2010


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 3
支持
分享
最新回复 (4)
雪    币: 340
活跃值: (71)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
2
如果分析的有问题,请各位大神多多指教。 谢谢
2014-8-21 23:02
0
雪    币: 168
活跃值: (823)
能力值: ( LV10,RANK:173 )
在线值:
发帖
回帖
粉丝
3
我怎么觉得楼主的附件 CrackMe.exe 有问题呀,断不下来,你再重新调试看看确认下是否有问题?
PS:我已经明白了,楼主可以忽略此回复帖。
2014-8-22 15:41
0
雪    币: 517
活跃值: (35)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
4
这个还不大好跟踪。
但你的注册机存在问题,还没进入注册算法的角色。
第三个穷举循环纯粹多余,仔细想想看!
2014-8-22 17:24
0
雪    币: 340
活跃值: (71)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
5
谢谢大神, 算法我仔细思考一下。
2014-8-22 23:02
0
游客
登录 | 注册 方可回帖
返回
//