系统 : Windows xp

程序 : dccrackme1

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

要求 : 注册机编写 & 拆解nag窗口

使用工具 : OD & DeDe

可在看雪论坛中查找关于此程序的破文,传送门

 

DeDe载入程序查看“过程”标签,其中有两个事件:

1.按钮点击,这肯定就是注册的按钮了

2.窗口创建,看来程序运行时的msg就是在这里编写的

 

首先把双击打开窗口创建的代码,拉到最后发现关键代码:

* Reference to: dialogs.ShowMessage(AnsiString);
|
004431A6   E8A9E6FFFF             call    00441854
004431AB   33C0                   xor     eax, eax
004431AD   5A                     pop     edx
004431AE   59                     pop     ecx
004431AF   59                     pop     ecx
004431B0   648910                 mov     fs:[eax], edx

函数采用eax指向的字符串作为参数,直接nop掉就可以。

 

或者也可以默默地帮他加点料:

鼠标选中内存区域,右击选择二进制-》编辑,在文本框输入一些字符串,再点击继续运行

 

。。。。。。

 

解决了烦人的窗口,现在来看看注册代码:

00441C08  /.  55            push    ebp                              ;  Btn_click
00441C09  |.  8BEC          mov     ebp, esp
00441C0B  |.  33C9          xor     ecx, ecx
00441C0D  |.  51            push    ecx
00441C0E  |.  51            push    ecx
00441C0F  |.  51            push    ecx
00441C10  |.  51            push    ecx
00441C11  |.  53            push    ebx
00441C12  |.  56            push    esi
00441C13  |.  8945 FC       mov     dword ptr [ebp-4], eax
00441C16  |.  33C0          xor     eax, eax
00441C18  |.  55            push    ebp
00441C19  |.  68 CD1C4400   push    00441CCD
00441C1E  |.  64:FF30       push    dword ptr fs:[eax]
00441C21  |.  64:8920       mov     dword ptr fs:[eax], esp
00441C24  |.  33F6          xor     esi, esi
00441C26  |.  8D55 F8       lea     edx, dword ptr [ebp-8]
00441C29  |.  8B45 FC       mov     eax, dword ptr [ebp-4]
00441C2C  |.  8B80 C8020000 mov     eax, dword ptr [eax+2C8]
00441C32  |.  E8 8D16FEFF   call    004232C4                         ;  获取用户名
00441C37  |.  8B45 F8       mov     eax, dword ptr [ebp-8]
00441C3A  |.  E8 491EFCFF   call    00403A88                         ;  获取用户名长度
00441C3F  |.  8BD0          mov     edx, eax
00441C41  |.  85D2          test    edx, edx                         ;  不能为0
00441C43  |.  7E 22         jle     short 00441C67
00441C45  |.  B9 01000000   mov     ecx, 1
00441C4A  |>  8B45 F8       /mov     eax, dword ptr [ebp-8]
00441C4D  |.  8A4408 FF     |mov     al, byte ptr [eax+ecx-1]        ;  循环迭代用户名字符串
00441C51  |.  25 FF000000   |and     eax, 0FF
00441C56  |.  8BD8          |mov     ebx, eax
00441C58  |.  83EB 17       |sub     ebx, 17
00441C5B  |.  83E8 11       |sub     eax, 11
00441C5E  |.  0FAFD8        |imul    ebx, eax                        ;  (byte-17)*(byte-11)
00441C61  |.  03F3          |add     esi, ebx                        ;  累加
00441C63  |.  41            |inc     ecx
00441C64  |.  4A            |dec     edx                             ;  循环变量递减
00441C65  |.^ 75 E3         \jnz     short 00441C4A
00441C67  |>  8D55 F4       lea     edx, dword ptr [ebp-C]
00441C6A  |.  8B45 FC       mov     eax, dword ptr [ebp-4]
00441C6D  |.  8B80 CC020000 mov     eax, dword ptr [eax+2CC]
00441C73  |.  E8 4C16FEFF   call    004232C4                         ;  取出密码
00441C78  |.  8B45 F4       mov     eax, dword ptr [ebp-C]
00441C7B  |.  50            push    eax
00441C7C  |.  8D55 F0       lea     edx, dword ptr [ebp-10]
00441C7F  |.  8BC6          mov     eax, esi
00441C81  |.  E8 325AFCFF   call    004076B8                         ;  IntToStr
00441C86  |.  8B55 F0       mov     edx, dword ptr [ebp-10]          ;  算出的序列号
00441C89  |.  58            pop     eax
00441C8A  |.  E8 091FFCFF   call    00403B98                         ;  比较
00441C8F  |.  75 0C         jnz     short 00441C9D
00441C91  |.  A1 30584400   mov     eax, dword ptr [445830]
00441C96  |.  E8 B9FBFFFF   call    00441854
00441C9B  |.  EB 0A         jmp     short 00441CA7
00441C9D  |>  A1 34584400   mov     eax, dword ptr [445834]
00441CA2  |.  E8 ADFBFFFF   call    00441854
00441CA7  |>  33C0          xor     eax, eax
00441CA9  |.  5A            pop     edx
00441CAA  |.  59            pop     ecx
00441CAB  |.  59            pop     ecx

打开http://www.cnblogs.com/ZRBYYXDM/p/5115596.html中搭建的框架,修改OnBtnDecrypt函数如下:

void CKengen_TemplateDlg::OnBtnDecrypt() 
{
    // TODO: Add your control notification handler code here
    CString str;
    GetDlgItemText( IDC_EDIT_NAME,str );                    //获取用户名字串基本信息。
    int len = str.GetLength();

    if ( len != 0 ){                                        //格式控制。
        unsigned int res = 0;
        for ( int i = 0 ; i != len ; i++ )
            res += (str[i]-0x17) * (str[i]-0x11);

        CString PassWord;
        PassWord.Format( "%d",res );
        SetDlgItemText( IDC_EDIT_PASSWORD,PassWord );
    }
    else
        MessageBox( "用户名格式错误!" );
}

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

运行效果: