首页
社区
课程
招聘
[原创]第一次的crack
发表于: 2012-5-1 14:54 2654

[原创]第一次的crack

2012-5-1 14:54
2654
【文章标题】: 第一次的crack
【文章作者】: 剑斩残云
【软件名称】: crackme2.exe
【下载地址】: http://www.crackmes.de/users/mucki/crackme2/
【作者声明】: 今天论坛上看到的一个crackme,codepine发的,看到了就下载下来玩一玩。做完了才去看他的解法,貌似差不多,但是我还是经验很不足。第一次的帖子,发下纪念。
--------------------------------------------------------------------------------
【详细过程】
od载入后运行,输入用户名zjw023,序列号12345678,找到重要的代码区域,进行分析
004011BB       55                      push ebp
004011BC       8BEC                    mov ebp,esp
004011BE       57                      push edi
004011BF       56                      push esi
004011C0       53                      push ebx
004011C1       6A 32                   push 32
004011C3       68 84624000             push crackme2.00406284              ; ASCII "zjw023"
004011C8       6A 01                   push 1
004011CA       FF75 08                 push dword ptr ss:[ebp+8]
004011CD       E8 16020000             call <jmp.&user32.GetDlgItemTextA>
004011D2       64:8B15 18000000        mov edx,dword ptr fs:[18]
004011D9       8B52 30                 mov edx,dword ptr ds:[edx+30]
004011DC       0FB652 02               movzx edx,byte ptr ds:[edx+2]
004011E0       83F8 00                 cmp eax,0
004011E3       7F 11                   jg short crackme2.004011F6          ; 跳了
004011E5       68 D8604000             push crackme2.004060D8              ; ASCII "nameless"
004011EA       6A 01                   push 1
004011EC       FF75 08                 push dword ptr ss:[ebp+8]
004011EF       E8 0C020000             call <jmp.&user32.SetDlgItemTextA>
004011F4     ^ EB CB                   jmp short crackme2.004011C1
004011F6       8D35 84624000           lea esi,dword ptr ds:[406284]
004011FC       33C9                    xor ecx,ecx                         ; ecx=0;  ecx做sum
004011FE       0FBE06                  movsx eax,byte ptr ds:[esi]         ; eax= esi name[]第一位
00401201       8BD8                    mov ebx,eax                         ; ebx=eax
00401203       2BF2                    sub esi,edx                         ; esi-=ebx
00401205       C1E0 04                 shl eax,4                           ; eax=eax左移4位
00401208       C1EB 05                 shr ebx,5                           ; ebx右移5位
0040120B       33C3                    xor eax,ebx                         ; eax异或ebx
0040120D       83C0 26                 add eax,26                          ; eax=eax+26
00401210       33C1                    xor eax,ecx                         ; eax异或ecx
00401212       03C8                    add ecx,eax                         ; ecx=ecx+eax
00401214       46                      inc esi                             ; name[]指针指向下一位
00401215       803E 00                 cmp byte ptr ds:[esi],0             ; 是否已经指向name[]完的下一位?
00401218     ^ 75 E4                   jnz short crackme2.004011FE         ; 没完继续循环
0040121A       B8 EF0D0C00             mov eax,0C0DEF                      ; ---循环结束  eax=0C0DEF
0040121F       2BC1                    sub eax,ecx                         ; eax-=ecx
00401221       0FAFC0                  imul eax,eax                        ; eax=eax*eax;
00401224       50                      push eax                            ; eax入栈
00401225       51                      push ecx                            ; ecx入栈
00401226       68 E1604000             push crackme2.004060E1              ; ASCII "CM2-%lX-%lX"
0040122B       68 B6624000             push crackme2.004062B6              ; ASCII "CM2-C397-7926FE40"
00401230       E8 9B010000             call <jmp.&user32.wsprintfA>        ; 上面格式为 "CM2-ecx-eax"
00401235       6A 4B                   push 4B
00401237       68 B1604000             push crackme2.004060B1              ; ASCII "12345678"
0040123C       6A 02                   push 2
0040123E       FF75 08                 push dword ptr ss:[ebp+8]
00401241       E8 A2010000             call <jmp.&user32.GetDlgItemTextA>
00401246       68 B1604000             push crackme2.004060B1              ; ASCII "12345678"
0040124B       68 B6624000             push crackme2.004062B6              ; ASCII "CM2-C397-7926FE40"
00401250       E8 DB010000             call <jmp.&kernel32.lstrcmpA>       ; 比较正确的话eax=0;
00401255       75 16                   jnz short crackme2.0040126D
00401257       6A 00                   push 0
00401259       68 00604000             push crackme2.00406000              ; ASCII "crackme2"
0040125E       68 3D604000             push crackme2.0040603D              ; ASCII "Valid serial - now write a keygen!"
00401263       FF75 08                 push dword ptr ss:[ebp+8]
00401266       E8 89010000             call <jmp.&user32.MessageBoxA>
0040126B       EB 14                   jmp short crackme2.00401281
0040126D       6A 10                   push 10
0040126F       68 00604000             push crackme2.00406000              ; ASCII "crackme2"
00401274       68 60604000             push crackme2.00406060              ; ASCII "Wrong serial - try again!"
00401279       FF75 08                 push dword ptr ss:[ebp+8]
0040127C       E8 73010000             call <jmp.&user32.MessageBoxA>
00401281       5B                      pop ebx
00401282       5E                      pop esi
00401283       5F                      pop edi
00401284       C9                      leave
00401285       C2 0400                 retn 4

算法基本分析出来。运行一圈下来,发现0040124B这个代码区把计算出的序列号计算出来。
填入序列号,OK,表明分析的大方向还是没有错的。
这个比较简单,新手还是可以的。
不过...这题要求弄出注册机,不过注册机还不知道怎么弄,还要继续学习。

把附件带上。
crackme2.zip

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 9
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
注册机直接用c语言写个简单的算法这样算不

#include<stdio.h>
main()
{
        char str[20];
        long sum=0,ax,bx;
        int i;

        printf("Enter username: ");
        scanf("%s",str);
        for(i=0;str[i]!='\0';i++)
        {
                ax=str[i];
                bx=ax;
                ax=ax<<4;
                bx=bx>>5;
                ax^=bx;
                ax+=0x26;
                ax^=sum;
                sum+=ax;
                printf("ax=%lx  bx=%lx  cx=%lx\n",ax,bx,sum);
        }
        ax=0x0C0DEF;
        ax-=sum;
        ax*=ax;

        printf("key:\nCM2-%lx-%lx\n",sum,ax);
        getchar();
}
2012-5-1 20:39
0
雪    币: 11
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
学习交流一下
2012-5-1 22:11
0
游客
登录 | 注册 方可回帖
返回
//