crackme破解

加密与解密买了有半个多月了,一直在学习。昨天把书的第五章看完了,理论知道后,技术只能通过大量的练习来提高。以我现在的水平,难度大的也不会,所以就挑些简单的来练习。

这个例子是《加密与解密 第四版》第五章中附带的2007年的CrackMe中给的。破解的作者是 爱在天涯 大佬,不过看到最后,大佬可能是困了,不分析了。这个例子对我来说,不算简单,但稍微思考一下,应该可以做出来。

新手破解,会存在很多纰漏,望大佬们加以指正,感谢。

image

根据错误提示,来到关键代码处:

00401139   $  6A 32         push    32                               ; /Count = 32 (50.)
0040113B   .  68 F3204000   push    004020F3                         ; |Buffer = Crackme1.004020F3
00401140   .  68 C8000000   push    0C8                              ; |ControlID = C8 (200.)
00401145   .  FF75 08       push    dword ptr [ebp+8]                ; |hWnd
00401148   .  E8 DE000000   call    <jmp.&USER32.GetDlgItemTextA>    ; \GetDlgItemTextA
0040114D   .  83F8 00       cmp     eax, 0                           ;  空字符串
00401150   .  0F84 99000000 je      004011EF                         ;  失败
00401156   .  83F8 04       cmp     eax, 4
00401159   .  0F82 90000000 jb      004011EF                         ;  长度<4,失败
0040115F   .  33C9          xor     ecx, ecx                         ;  i = 0
00401161   .  33DB          xor     ebx, ebx
00401163   .  33F6          xor     esi, esi                         ;  sum = 0
00401165   .  8945 FC       mov     dword ptr [ebp-4], eax           ;  len = strlen(name)
00401168   >  0FBE81 F32040>movsx   eax, byte ptr [ecx+4020F3]
0040116F   .  83F8 20       cmp     eax, 20
00401172   .  74 07         je      short 0040117B                   ;  如果是空格,忽略,进行下一个循环
00401174   .  6BC0 04       imul    eax, eax, 4                      ;  用户名的单个字符的16进制*4
00401177   .  03D8          add     ebx, eax
00401179   .  8BF3          mov     esi, ebx                         ;  sum = sum+eax*4
0040117B   >  41            inc     ecx
0040117C   .  3B4D FC       cmp     ecx, dword ptr [ebp-4]
0040117F   .^ 75 E7         jnz     short 00401168                   ;  未处理完毕,继续循环
00401181   .  83FE 00       cmp     esi, 0
00401184   .  74 69         je      short 004011EF
00401186   .  BB 89476500   mov     ebx, 654789                      ;  tmp = 0x654789
0040118B   >  0FBE81 F22040>movsx   eax, byte ptr [ecx+4020F2]       ;  注册码的倒序
00401192   .  4B            dec     ebx                              ;  tmp--
00401193   .  6BC3 02       imul    eax, ebx, 2
00401196   .  03D8          add     ebx, eax                         ;  tmp = tmp * 0x2
00401198   .  4B            dec     ebx                              ;  tmp--
00401199   .  49            dec     ecx                              ;  len - 1
0040119A   .^ 75 EF         jnz     short 0040118B
0040119C   .  56            push    esi                              ; /<%lu>
0040119D   .  53            push    ebx                              ; |<%lX>
0040119E   .  68 C7204000   push    004020C7                         ; |Format = "BS-%lX-%lu"
004011A3   .  68 BB214000   push    004021BB                         ; |s = Crackme1.004021BB
004011A8   .  E8 6C000000   call    <jmp.&USER32.wsprintfA>          ; \wsprintfA
004011AD   .  58            pop     eax
004011AE   .  58            pop     eax
004011AF   .  58            pop     eax
004011B0   .  58            pop     eax
004011B1   .  E8 01000000   call    004011B7
004011B6   .  C3            retn
004011B7   $  33C9          xor     ecx, ecx
004011B9   .  6A 32         push    32                               ; /Count = 32 (50.)
004011BB   .  68 57214000   push    00402157                         ; |Buffer = Crackme1.00402157
004011C0   .  68 C9000000   push    0C9                              ; |ControlID = C9 (201.)
004011C5   .  FF75 08       push    dword ptr [ebp+8]                ; |hWnd
004011C8   .  E8 5E000000   call    <jmp.&USER32.GetDlgItemTextA>    ; \GetDlgItemTextA
004011CD   .  83F8 00       cmp     eax, 0
004011D0   .  74 1D         je      short 004011EF                   ;  注册码为0,失败
004011D2   .  33C9          xor     ecx, ecx                         ;  j = 0
004011D4   >  0FBE81 572140>movsx   eax, byte ptr [ecx+402157]       ;  获取注册码首位
004011DB   .  0FBE99 BB2140>movsx   ebx, byte ptr [ecx+4021BB]       ;  取正确的注册码首位
004011E2   .  3BC3          cmp     eax, ebx
004011E4   .  75 09         jnz     short 004011EF                   ;  不相等,失败
004011E6   .  83F8 00       cmp     eax, 0
004011E9   .  74 19         je      short 00401204                   ;  输入的注册码为NULL,失败
004011EB   .  41            inc     ecx                              ;  j++
004011EC   .^ EB E6         jmp     short 004011D4                   ;  继续比较下一位
004011EE   .  C3            retn
004011EF   >  6A 10         push    10                               ; /Style = MB_OK|MB_ICONHAND|MB_APPLMODAL
004011F1   .  68 E4204000   push    004020E4                         ; |Title = "Nope"
004011F6   .  68 E9204000   push    004020E9                         ; |Text = "Try again"
004011FB   .  FF75 08       push    dword ptr [ebp+8]                ; |hOwner
004011FE   .  E8 34000000   call    <jmp.&USER32.MessageBoxA>        ; \MessageBoxA
00401203   .  C3            retn
00401204   >  6A 40         push    40                               ; /Style = MB_OK|MB_ICONASTERISK|MB_APPLMODAL
00401206   .  68 D2204000   push    004020D2                         ; |Title = "Solved"
0040120B   .  68 D9204000   push    004020D9                         ; |Text = "Well done."
00401210   .  FF75 08       push    dword ptr [ebp+8]                ; |hOwner
00401213   .  E8 1F000000   call    <jmp.&USER32.MessageBoxA>        ; \MessageBoxA
00401218   .  C3            retn

可以看到,程序调用了两次GetDlgItemTextA(),不出意外,分别是获取用户名和注册码。
具体的分析可以看注释。

贴一个简单的注册机:

/*

reference:http://bbs.pediy.com/showthread.php?threadid=10533 
author:lingyin
date:2018-12-30

*/

#include<string.h>
#include<stdio.h>

int main()
{
    char name[20];
    int i,sum = 0;
    int len = 0;
    char ch;
    int tmp = 0x654789;

    printf("请输入要破解的账号:\n");
    scanf("%s",name);
    len = strlen(name);

    if(len < 4)
    {
        printf("请至少输入4个字符!!!!");
        return;
    }

    //printf("%d",strlen(name));
    //printf("%s\n",name);

    for(i = 0;i < len;i++)
    {
        ch = name[i];

        if(ch < 0x20)
            return;

        sum += ch * 0x4;


    }

    for(i = len-1;i >= 0;i--)
    {
        ch = name[i];
        tmp--;
        tmp += tmp*0x2;
        tmp--;

    }


    //输出最后的正确的注册码
    printf("BS-%lX-%lu\n",tmp,sum);
    
    getch();
    return 0;

}
image

输入pediy,会输出注册码:BS-6022E527-2156.
这个注册机,我测试了几个账号,没问题,如果哪位朋友,发现存在BUG,麻烦告诉我,万分感谢.

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,142评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,298评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,068评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,081评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,099评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,071评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,990评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,832评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,274评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,488评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,649评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,378评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,979评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,625评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,643评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,545评论 2 352

推荐阅读更多精彩内容