zoukankan      html  css  js  c++  java
  • 复健小cm

    系统 : Windows xp

    程序 : RegKiller-crackme

    程序下载地址 :http://pan.baidu.com/s/1cC1CeU

    要求 : 编写注册机

    使用工具 :OD

    可在看雪论坛中查找关于此程序的破文,标题为“CrackMe 6 算法分析+注册机”。

     

    OD载入程序,找出关键子串“right code”,向上翻找出关键算法:

    004417B8  /.  55            push    ebp
    004417B9  |.  8BEC          mov     ebp, esp
    004417BB  |.  6A 00         push    0
    004417BD  |.  6A 00         push    0
    004417BF  |.  6A 00         push    0
    004417C1  |.  53            push    ebx
    004417C2  |.  8BD8          mov     ebx, eax
    004417C4  |.  33C0          xor     eax, eax
    004417C6  |.  55            push    ebp
    004417C7  |.  68 60184400   push    00441860
    004417CC  |.  64:FF30       push    dword ptr fs:[eax]
    004417CF  |.  64:8920       mov     dword ptr fs:[eax], esp
    004417D2  |.  8D55 FC       lea     edx, dword ptr [ebp-4]
    004417D5  |.  8B83 C8020000 mov     eax, dword ptr [ebx+2C8]
    004417DB  |.  E8 C419FEFF   call    004231A4
    004417E0  |.  8B45 FC       mov     eax, dword ptr [ebp-4]           ;  取出密钥
    004417E3  |.  50            push    eax                              ;  密钥入栈
    004417E4  |.  8D55 F4       lea     edx, dword ptr [ebp-C]
    004417E7  |.  8B83 C4020000 mov     eax, dword ptr [ebx+2C4]
    004417ED  |.  E8 B219FEFF   call    004231A4
    004417F2  |.  8B45 F4       mov     eax, dword ptr [ebp-C]           ;  取出用户名
    004417F5  |.  8D55 F8       lea     edx, dword ptr [ebp-8]
    004417F8  |.  E8 FBFEFFFF   call    004416F8                         ;  算出序列号
    004417FD  |.  8B55 F8       mov     edx, dword ptr [ebp-8]
    00441800  |.  58            pop     eax                              ;  密钥弹栈
    00441801  |.  E8 3E23FCFF   call    00403B44                         ;  是否相同?
    00441806  |.  75 1A         jnz     short 00441822
    00441808  |.  6A 40         push    40
    0044180A  |.  B9 6C184400   mov     ecx, 0044186C                    ;  u made it
    0044180F  |.  BA 78184400   mov     edx, 00441878                    ;  right code
    00441814  |.  A1 302C4400   mov     eax, dword ptr [442C30]
    00441819  |.  8B00          mov     eax, dword ptr [eax]
    0044181B  |.  E8 D4D6FFFF   call    0043EEF4
    00441820  |.  EB 18         jmp     short 0044183A
    00441822  |>  6A 10         push    10
    00441824  |.  B9 84184400   mov     ecx, 00441884                    ;  error
    00441829  |.  BA 8C184400   mov     edx, 0044188C                    ;  wrong code
    0044182E  |.  A1 302C4400   mov     eax, dword ptr [442C30]
    00441833  |.  8B00          mov     eax, dword ptr [eax]
    00441835  |.  E8 BAD6FFFF   call    0043EEF4

    跟入4416F8算法CALL:

    004416F8  /$  53            push    ebx
    004416F9  |.  56            push    esi
    004416FA  |.  57            push    edi
    004416FB  |.  83C4 DC       add     esp, -24
    004416FE  |.  891424        mov     dword ptr [esp], edx
    00441701  |.  8BF8          mov     edi, eax
    00441703  |.  BB 05033949   mov     ebx, 49390305                    ;  赋值给寄存器两个常量
    00441708  |.  BE 20126348   mov     esi, 48631220
    0044170D  |.  8BC7          mov     eax, edi
    0044170F  |.  E8 2023FCFF   call    00403A34                         ;  计算用户名长度
    00441714  |.  85C0          test    eax, eax                         ;  长度是否为0?
    00441716  |.  7E 2E         jle     short 00441746
    00441718  |.  BA 01000000   mov     edx, 1
    0044171D  |>  33C9          /xor     ecx, ecx
    0044171F  |.  8A4C17 FF     |mov     cl, byte ptr [edi+edx-1]        ;  循环迭代用户名子串
    00441723  |.  33D9          |xor     ebx, ecx                        ;  和两个常量进行异或
    00441725  |.  33F3          |xor     esi, ebx
    00441727  |.  F6C3 01       |test    bl, 1                           ;  异或操作结果等于1?
    0044172A  |.  74 0F         |je      short 0044173B
    0044172C  |.  D1FB          |sar     ebx, 1                          ;  算数右移一位
    0044172E  |.  79 03         |jns     short 00441733                  ;  符号为正?
    00441730  |.  83D3 00       |adc     ebx, 0                          ;  不为正则ebx += ebx+0+1
    00441733  |>  81F3 11032001 |xor     ebx, 1200311                    ;  与一个固定值异或
    00441739  |.  EB 07         |jmp     short 00441742
    0044173B  |>  D1FB          |sar     ebx, 1                          ;  算数右移一位
    0044173D  |.  79 03         |jns     short 00441742                  ;  符号为正?
    0044173F  |.  83D3 00       |adc     ebx, 0                          ;  不为正则ebx += ebx+0+1
    00441742  |>  42            |inc     edx                             ;  循环变量自增
    00441743  |.  48            |dec     eax                             ;  长度-1
    00441744  |.^ 75 D7         jnz     short 0044171D
    00441746  |>  8B0424        mov     eax, dword ptr [esp]
    00441749  |.  50            push    eax
    0044174A  |.  8BC3          mov     eax, ebx                         ;  循环得出的结果给eax
    0044174C  |.  25 FFFF0000   and     eax, 0FFFF                       ;  按位与
    00441751  |.  894424 08     mov     dword ptr [esp+8], eax
    00441755  |.  C64424 0C 00  mov     byte ptr [esp+C], 0
    0044175A  |.  C1EB 10       shr     ebx, 10                          ;  逻辑右移
    0044175D  |.  895C24 10     mov     dword ptr [esp+10], ebx          ;  保存结果
    00441761  |.  C64424 14 00  mov     byte ptr [esp+14], 0
    00441766  |.  8BC6          mov     eax, esi                         ;  之前循环异或的值
    00441768  |.  25 FFFF0000   and     eax, 0FFFF                       ;  按位与
    0044176D  |.  894424 18     mov     dword ptr [esp+18], eax          ;  保存
    00441771  |.  C64424 1C 00  mov     byte ptr [esp+1C], 0
    00441776  |.  C1EE 10       shr     esi, 10                          ;  逻辑右移
    00441779  |.  897424 20     mov     dword ptr [esp+20], esi          ;  保存
    0044177D  |.  C64424 24 00  mov     byte ptr [esp+24], 0
    00441782  |.  8D5424 08     lea     edx, dword ptr [esp+8]
    00441786  |.  B9 03000000   mov     ecx, 3
    0044178B  |.  B8 A4174400   mov     eax, 004417A4                    ;  %.4x-%.4x-%.4x-%.4x
    00441790  |.  E8 6F68FCFF   call    00408004
    00441795  |.  83C4 24       add     esp, 24
    00441798  |.  5F            pop     edi
    00441799  |.  5E            pop     esi
    0044179A  |.  5B            pop     ebx
    0044179B  .  C3            retn

    这个cm采用了F(用户名)=密钥的形式。很简单的一个cm,小心将算法部分转化成高级语言即可破解。

    我们直接打开之前搭建的框架,并修改OnBtnDecrypt函数如下:

    void CKengen_TemplateDlg::OnBtnDecrypt() 
    {
        // TODO: Add your control notification handler code here
        CString str;
        GetDlgItemText( IDC_EDIT_NAME,str );                    //获取用户名字串基本信息。
        int len = str.GetLength();
        unsigned int XorRes1 = 0x49390305,XorRes2 = 0x48631220;
        unsigned int AndRes1,AndRes2,ShrRes1,ShrRes2;
    
        if ( len != 0 ){                                        //格式控制。
            for ( int i = 0 ; i != len ; i++ ){
                XorRes1 ^= str[i];
                XorRes2 ^= XorRes1;
                
                if ( XRLowIsOne( XorRes1 ) )
                    XorRes1 = CallAsm( XorRes1 );
                else{
                    XorRes1 = CallAsm( XorRes1 );
                    XorRes1 ^= 0x1200311;
                }
            }
    
            AndRes1 = XorRes1 & 0x0FFFF;            //And结果1
            __asm{                                    //Shr结果1
                push ebx
    
                mov ebx,XorRes1
                shr ebx,0x10
                mov ShrRes1,ebx
    
                pop ebx
            }
            AndRes2 = XorRes2 & 0x0FFFF;            //And结果2
            __asm{                                    //Shr结果2
                push ebx
    
                mov ebx,XorRes2
                shr ebx,0x10
                mov ShrRes2,ebx
    
                pop ebx
            }
    
            CString PassWord;
            PassWord.Format( "%.4X-%.4X-%.4X-%.4X",AndRes1,ShrRes1,AndRes2,ShrRes2 );    //格式改成大写
            SetDlgItemText( IDC_EDIT_PASSWORD,PassWord );
        }
        else
            MessageBox( "用户名格式错误!" );
    }

    并添加如下类成员函数:

    inline unsigned int CallAsm( unsigned int XorRes )
    {
        unsigned int temp;
            __asm{
                        push ebx
    
                        mov ebx,XorRes
                        sar ebx,1
                        jns end
                        adc ebx,0
    
    end:                mov temp,ebx
                        pop ebx
            }
    
        return temp;
    }
    
    inline bool XRLowIsOne( unsigned int xr )
    {
        bool flag = true;
            __asm{
                push eax
    
                mov eax,xr
                test al,1                //低位是否为1?
                je end                    //为1直接结束
                mov flag,0
    
    end:        pop eax
            }
    
        return flag;
    }

    再在OnInitDialog中添加此代码修改标题:SetWindowText(_T("RegKiller-crackme_Keygen"));

    运行效果:

  • 相关阅读:
    Setting up jQuery Unobtrusive Validation
    Valid vs Validate
    HTML Tags containing Vue.js v-if and v-for directives flash at loading
    What does a CSS selector in square brackets select in HTML?
    Template refs
    How to check if a variable is not null?
    Android中的Context
    Android从零基础到App上线
    ConstraintLayout 使用汇总
    ConstraintLayout的使用
  • 原文地址:https://www.cnblogs.com/ZRBYYXDM/p/5374251.html
Copyright © 2011-2022 走看看