破解 CrackMe#1 [UBC] by bRaINbuSY

系统 : Windows xp

程序 : CrackMe#1

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

要求 : 编写注册机

使用工具 :IDA & OD

可在看雪论坛中查找关于此程序的破文:http://bbs.pediy.com/showthread.php?t=29063

IDA载入程序,找出提示破解成功的字串“You cracked the UBC CrackMe#1 ! Please send your solution to [email protected] !”并定位关键代码:

00458800  /.  55            push    ebp
00458801  |.  8BEC          mov     ebp, esp
00458803  |.  6A 00         push    0
00458805  |.  53            push    ebx
00458806  |.  8BD8          mov     ebx, eax
00458808  |.  33C0          xor     eax, eax
0045880A  |.  55            push    ebp
0045880B  |.  68 74884500   push    00458874
00458810  |.  64:FF30       push    dword ptr fs:[eax]
00458813  |.  64:8920       mov     dword ptr fs:[eax], esp
00458816  |.  E8 45FFFFFF   call    00458760                         ;  获取用户名
0045881B  |.  8D55 FC       lea     edx, dword ptr [ebp-4]           ;  取一段内存
0045881E  |.  8B83 D0020000 mov     eax, dword ptr [ebx+2D0]
00458824  |.  E8 97CDFCFF   call    004255C0                         ;  获取序列号
00458829  |.  8B45 FC       mov     eax, dword ptr [ebp-4]           ;  取序列号
0045882C  |.  E8 43EFFAFF   call    00407774                         ;  F(序列号)
00458831  |.  3B05 44B84500 cmp     eax, dword ptr [45B844]
00458837  |.  75 1B         jnz     short 00458854
00458839  |.  B8 88884500   mov     eax, 00458888                    ;  ASCII "You cracked the UBC CrackMe#1 ! Please send your solution to [email protected] !"
0045883E  |.  E8 29C1FEFF   call    0044496C
00458843  |.  BA E8884500   mov     edx, 004588E8                    ;  ASCII "CRACKED"
00458848  |.  A1 3CB84500   mov     eax, dword ptr [45B83C]
0045884D  |.  E8 9ECDFCFF   call    004255F0
00458852  |.  EB 0A         jmp     short 0045885E
00458854  |>  B8 F8884500   mov     eax, 004588F8                    ;  ASCII "Try Again !"
00458859  |.  E8 0EC1FEFF   call    0044496C

进入F(序列号):

00407774  /$  55            push    ebp
00407775  |.  8BEC          mov     ebp, esp
00407777  |.  83C4 F0       add     esp, -10
0040777A  |.  53            push    ebx
0040777B  |.  56            push    esi
0040777C  |.  33D2          xor     edx, edx
0040777E  |.  8955 F8       mov     dword ptr [ebp-8], edx
00407781  |.  8BD8          mov     ebx, eax
00407783  |.  33C0          xor     eax, eax
00407785  |.  55            push    ebp
00407786  |.  68 DC774000   push    004077DC
0040778B  |.  64:FF30       push    dword ptr fs:[eax]
0040778E  |.  64:8920       mov     dword ptr fs:[eax], esp
00407791  |.  8D55 FC       lea     edx, dword ptr [ebp-4]
00407794  |.  8BC3          mov     eax, ebx
00407796  |.  E8 D9B1FFFF   call    00402974                         ;  关键call
0040779B  |.  8BF0          mov     esi, eax
0040779D  |.  837D FC 00    cmp     dword ptr [ebp-4], 0
004077A1  |.  74 23         je      short 004077C6
004077A3  |.  8D55 F8       lea     edx, dword ptr [ebp-8]
004077A6  |.  A1 90A44500   mov     eax, dword ptr [45A490]
004077AB  |.  E8 A4D6FFFF   call    00404E54
004077B0  |.  8B45 F8       mov     eax, dword ptr [ebp-8]
004077B3  |.  50            push    eax
004077B4  |.  895D F0       mov     dword ptr [ebp-10], ebx
004077B7  |.  C645 F4 0B    mov     byte ptr [ebp-C], 0B
004077BB  |.  8D55 F0       lea     edx, dword ptr [ebp-10]
004077BE  |.  33C9          xor     ecx, ecx
004077C0  |.  58            pop     eax
004077C1  |.  E8 A6FCFFFF   call    0040746C
004077C6  |>  33C0          xor     eax, eax
004077C8  |.  5A            pop     edx
004077C9  |.  59            pop     ecx
004077CA  |.  59            pop     ecx
004077CB  |.  64:8910       mov     dword ptr fs:[eax], edx
004077CE  |.  68 E3774000   push    004077E3
004077D3  |>  8D45 F8       lea     eax, dword ptr [ebp-8]
004077D6  |.  E8 0DC0FFFF   call    004037E8
004077DB  \.  C3            retn

关键call:

00402974  /$  53            push    ebx
00402975  |.  56            push    esi
00402976  |.  57            push    edi
00402977  |.  89C6          mov     esi, eax
00402979  |.  50            push    eax
0040297A  |.  85C0          test    eax, eax                         ;  序列号为空?
0040297C  |.  74 73         je      short 004029F1
0040297E  |.  31C0          xor     eax, eax
00402980  |.  31DB          xor     ebx, ebx
00402982  |.  BF CCCCCC0C   mov     edi, 0CCCCCCC
00402987  |>  8A1E          /mov     bl, byte ptr [esi]              ;  迭代序列号
00402989  |.  46            |inc     esi
0040298A  |.  80FB 20       |cmp     bl, 20                          ;  字符 = 0x20?
0040298D  |.^ 74 F8         \je      short 00402987                  ;  不是则退出循环
0040298F  |.  B5 00         mov     ch, 0
00402991  |.  80FB 2D       cmp     bl, 2D                           ;  Switch (cases 24..78)
00402994  |.  74 69         je      short 004029FF
00402996  |.  80FB 2B       cmp     bl, 2B                           ;  ‘+’
00402999  |.  74 66         je      short 00402A01
0040299B  |.  80FB 24       cmp     bl, 24
0040299E  |.  74 66         je      short 00402A06
004029A0  |.  80FB 78       cmp     bl, 78
004029A3  |.  74 61         je      short 00402A06
004029A5  |.  80FB 58       cmp     bl, 58
004029A8  |.  74 5C         je      short 00402A06
004029AA  |.  80FB 30       cmp     bl, 30
004029AD  |.  75 13         jnz     short 004029C2
004029AF  |.  8A1E          mov     bl, byte ptr [esi]               ;  Case 30 (‘0‘) of switch 00402991
004029B1  |.  46            inc     esi
004029B2  |.  80FB 78       cmp     bl, 78
004029B5  |.  74 4F         je      short 00402A06
004029B7  |.  80FB 58       cmp     bl, 58
004029BA  |.  74 4A         je      short 00402A06
004029BC  |.  84DB          test    bl, bl
004029BE  |.  74 20         je      short 004029E0
004029C0  |.  EB 04         jmp     short 004029C6
004029C2  |>  84DB          test    bl, bl                           ;  Default case of switch 00402991
004029C4  |.  74 34         je      short 004029FA                   ;  为空则跳转
004029C6  |>  80EB 30       /sub     bl, 30
004029C9  |.  80FB 09       |cmp     bl, 9                           ;  高于9?
004029CC  |.  77 2C         |ja      short 004029FA
004029CE  |.  39F8          |cmp     eax, edi                        ;  高于0CCCCCCC?
004029D0  |.  77 28         |ja      short 004029FA
004029D2  |.  8D0480        |lea     eax, dword ptr [eax+eax*4]      ;  eax = eax + eax*4
004029D5  |.  01C0          |add     eax, eax                        ;  eax += eax
004029D7  |.  01D8          |add     eax, ebx                        ;  累加
004029D9  |.  8A1E          |mov     bl, byte ptr [esi]              ;  取下一个字符
004029DB  |.  46            |inc     esi
004029DC  |.  84DB          |test    bl, bl                          ;  不为空?
004029DE  |.^ 75 E6         \jnz     short 004029C6
004029E0  |>  FECD          dec     ch
004029E2  |.  74 10         je      short 004029F4
004029E4  |.  85C0          test    eax, eax
004029E6  |.  7C 12         jl      short 004029FA
004029E8  |>  59            pop     ecx
004029E9  |.  31F6          xor     esi, esi
004029EB  |>  8932          mov     dword ptr [edx], esi
004029ED  |.  5F            pop     edi
004029EE  |.  5E            pop     esi
004029EF  |.  5B            pop     ebx
004029F0  |.  C3            retn

再回去看看程序流程中的关键比对,将eax与45B844处的数据进行对比。这里,对45B844下写入断点,重新运行程序发现关键算法:

004587A2  |.  33C0          xor     eax, eax                         ;  清空eax
004587A4  |.  8903          mov     dword ptr [ebx], eax             ;  对内存置零
004587A6  |.  8B07          mov     eax, dword ptr [edi]             ;  取用户名
004587A8  |.  E8 B7B2FAFF   call    00403A64                         ;  计算长度
004587AD  |.  85C0          test    eax, eax                         ;  为空?
004587AF  |.  7E 19         jle     short 004587CA
004587B1  |.  C706 01000000 mov     dword ptr [esi], 1
004587B7  |>  8B17          /mov     edx, dword ptr [edi]            ;  取用户名
004587B9  |.  8B0E          |mov     ecx, dword ptr [esi]
004587BB  |.  0FB6540A FF   |movzx   edx, byte ptr [edx+ecx-1]       ;  迭代字串
004587C0  |.  C1E2 03       |shl     edx, 3                          ;  逻辑左移3位
004587C3  |.  0113          |add     dword ptr [ebx], edx            ;  与内存值累加
004587C5  |.  FF06          |inc     dword ptr [esi]                 ;  循环变量自增
004587C7  |.  48            |dec     eax                             ;  长度-1
004587C8  |.^ 75 ED         \jnz     short 004587B7
004587CA  |>  8B07          mov     eax, dword ptr [edi]
004587CC  |.  E8 93B2FAFF   call    00403A64                         ;  计算长度
004587D1  |.  C1E0 03       shl     eax, 3                           ;  长度逻辑左移3位
004587D4  |.  0103          add     dword ptr [ebx], eax             ;  与内存值累加
004587D6  |.  8B03          mov     eax, dword ptr [ebx]
004587D8  |.  C1E0 02       shl     eax, 2                           ;  长度逻辑左移2位
004587DB  |.  8903          mov     dword ptr [ebx], eax             ;  存入内存
004587DD  |.  33C0          xor     eax, eax
004587DF  |.  5A            pop     edx
004587E0  |.  59            pop     ecx
004587E1  |.  59            pop     ecx
004587E2  |.  64:8910       mov     dword ptr fs:[eax], edx
004587E5  |.  68 FA874500   push    004587FA
004587EA  |>  8D45 FC       lea     eax, dword ptr [ebp-4]
004587ED  |.  E8 F6AFFAFF   call    004037E8
004587F2  \.  C3            retn

至此,程序算法流程已经分析得差不多了。马上动手编写注册机。

我们直接打开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();

    int FNameres = 0;
    if ( len != 0 ){                                        //格式控制。
        for ( int i = 0 ; i != len ; i++ )
            FNameres += str[i] << 3;

        FNameres += len << 3;
        FNameres = FNameres << 2;

        //模拟F(序列号):十进制转化十六进制
        /*
            CString serial = "1234";

            int FSelres = 0;
            for ( int j = 0 ; j != serial.GetLength() ; j++ ){
                FSelres *= 10;
                FSelres += ( serial[j] - 0x30 );
            }
        */

        if ( FNameres > 0x0CCCCCCC )
            return ;

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

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

运行效果:

时间: 2024-10-11 10:11:18

破解 CrackMe#1 [UBC] by bRaINbuSY的相关文章

破解 crackme(“不可逆“函数)

系统 : Windows xp 程序 : crackme 程序下载地址 :http://pan.baidu.com/s/1i41oh9r 要求 : 注册机编写 使用工具 : IDA Pro & OD 可在“PEDIY CrackMe 2007”中查找关于此程序的讨论,标题为“简单分析crackme算法之一”. 运行程序,在Help->Register菜单项中注册,输入测试用户名密码.程序提示错误,错误字串为:“No luck there, mate!”.打开IDA载入程序,通过字串表定位错误

软件破解入门(暴力破解CrackMe)

所谓暴力破解,就是通过修改汇编代码进而控制程序的运行流程,达到不需注册码也能正常使用软件的目的.相对于解出算法进而编写注册机,暴破的技术含量是比较低的.但也正是因为一本05年的杂志上介绍“暴力破解”的文章,让我入了这个大坑.近来想重拾调试器,就先从最简单的CrackMe入手,熟练一下各工具方法. 下载CrackMe3文件(我用的是看雪<加密与解密>中的CFF CrackMe #3 程序  http://pan.baidu.com/s/1dD9v9x3 ). 1.查看此程序是否加壳.加壳的话还得

破解 crackme(浅析去除警告窗口)

系统 : Windows xp 程序 : crackme 程序下载地址 :http://pan.baidu.com/s/1kUrbcAr 要求 : 注册机编写 & 去除Nag窗口 使用工具 : IDA Pro & OD 可在“PEDIY CrackMe 2007”中查找关于此程序的讨论,标题为“Pj一个超简单的Crackme,适合像我一样的新手~_~”. 运行该程序,发现一开始就给了我们一个大大的警告窗口: 这不找抽吗?载入IDA查看字串表,发现字串“Patch Me if you can

《C++黑客编程揭秘与防范》(第二版)

本书是<C++黑客编程揭秘与防范>的升级版,在前书的基础上新添加了一些内容,同时也删除了一些过时的内容.本书以Win32应用层下安全开发为中心,介绍Windows系统下的安全开发. 本书介绍了操作系统的相关操作,比如进程.线程.注册表等知识.当读者掌握了关于进程.线程.注册表等相关的开发知识后,就可以把一些常规的操作进程.注册表.文件等用代码进行实现,这样,一些日常的操作可与学习的编程知识相结合.除了操作的知识外,本书还介绍了关于网络应用程序的开发,了解Winsock的开发后,读者就会明白在应

Android 逆向实战(一)

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Helvetica; color: #000000 } p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Helvetica; color: #000000; min-height: 13.0px } span.s1 { } 现在很多 apk 在开发中为了保证代码不被轻易逆向出来会对关键代码采用 ndk开发的方式. 什么是 Androi

逆向工程实战--Acid burn

0x00 序言 这是第二次破解 crackme 小程序,感觉明显比第一次熟练,破解过程很顺利,几乎是分分钟就可以找到正确的 serial,但是我们的目标是破解计算过程,下面将详细介绍. 0x01 初次运行 刚开始拿到 crackme 先运行程序,看看有哪些明显的特征,或者有哪些任务需要完成: 双击程序后弹框,显然第一个任务就是把这个框框弄掉,我们继续运行: 这个小程序比上次的要复杂,有两个 serial ,我们先看看左边的: 不出意外,猜错了,有明显的弹框和失败字符串作为特征,我们接着看右边的:

CommandoVM-虚拟机映像文件 | VM打开直接用

呵呵!自从火眼发布了这个CommandoVM,想必大家应该都挺激动,然而实际操作一下,基本炸裂-- 因为并没有给类似于kali这种直接安装的现成镜像,而是要通过github的脚本去完全网络安装 实际操作的朋友的朋友就知道网速有多么炸裂-- 我找了高速的服务器翻滚出去,终于10个小时安装完毕,现在给现成的vm映像发布出来,直接用vmware打开就可以了 CommandoVM-虚拟机映像文件下载链接 链接: https://pan.baidu.com/s/1t4-X-LFRjbarbMIShmT5r

360破解大赛crackme分析--之3DES解密附加数据

详细的分析这里有,本人只是对这里面有趣的算法进行了一些学习 分析链接 这次是逆向的使用3DES解密的过程中的内容: 使用微软的crypt库 使用3DES解密程序中的附加数据 代码: VOID encryptData() { TCHAR szModuleFile[MAX_PATH] = "C:\\Users\\Administrator\\Desktop\\破解技术考题 360\\破解考题.over"; HANDLE hFile = ::CreateFile(szModuleFile,

CrackMe的简单破解

[CrackMe的简单破解] 对于以下这样的输入账号和密码的窗口,我们可以猜测该程序使用最简单的机制实现,即用strmp来比较用户输入的密码和原始密码匹配.所以为了破解该程序,可以通过bp strmp来设置strmp的函数断点,当调用到strcmp的时候就能看到密码了. 设置断点: 运行结果: [修改判定逻辑] 前半部分说的是通过strcmp断点来获取密码.现在要介绍通过修改程序二进制代码来修改程序逻辑,使得输入任意密码结果正确.首先程序失败的时候会有中文提示,我们首先找到引用这个"密码错误&q