• 逆向破解之160个CrackMe —— 008-009


    CrackMe —— 008

    160 CrackMe 是比较适合新手学习逆向破解的CrackMe的一个集合一共160个待逆向破解的程序

    CrackMe:它们都是一些公开给别人尝试破解的小程序,制作 crackme 的人可能是程序员,想测试一下自己的软件保护技术,也可能是一位 cracker,想挑战一下其它 cracker 的破解实力,也可能是一些正在学习破解的人,自己编一些小程序给自己破。

    CrackMe简称CM。
    程序下载地址:点击我

    来源 <-点击查看

    编号 作者 保护方式
    008 Andrénalin Serial
    009 Andrénalin Name/Serial

    工具 

    x32dbg

    KeyMake

    VB Decompiler Pro

    peid

    开始破解之旅

    ON.1

    首先使用x32dbg打开程序搜索字符串 

    我们看到有一个 “SuCCESFul !" 的字符串,从字面上猜测应该是输入正确的Key之后所跳转的地方

    我们点进进入来地址,向上翻看,来到该函数的起始点并设置断点

    00401CD0 | 55                       | push ebp                                |    函数起始点
    00401CD1 | 8BEC                     | mov ebp,esp                             |
    00401CD3 | 83EC 0C                  | sub esp,0xC                             |
    00401CD6 | 68 16104000              | push <JMP.&__vbaExceptHandler>          |
    00401CDB | 64:A1 00000000           | mov eax,dword ptr fs:[0]                |
    

     在输入框内输入任意数据,点击OK按钮,停在了我们的断点处

    单步F8向下,同时观察右边寄存器窗口

    00401D70 | 8B4D D8                  | mov ecx,dword ptr ss:[ebp-0x28]         | [ebp-28]:L"1234"       我们输入的数据
    00401D73 | 51                       | push ecx                                | ecx:L"1234"
    00401D74 | 68 541A4000              | push andrénalin.1.401A54                | 401A54:L"SynTaX 2oo1"  疑似Key
    00401D79 | FF15 08314000            | call dword ptr ds:[<&__vbaStrCmp>]      |
    00401D7F | 8BF8                     | mov edi,eax                             |
    00401D81 | 8D4D D8                  | lea ecx,dword ptr ss:[ebp-0x28]         | [ebp-28]:L"1234"
    00401D84 | F7DF                     | neg edi                                 |

    出现了一串疑似Key的字符串

    我们将该串放入输入框点击OK 

     提示我们破解成功

    ON.2

    爆破方式破解

    从新载入程序,来到我们的搜索到字符串的地址处,向上查看

    00401D91 | 8D4D D4                  | lea ecx,dword ptr ss:[ebp-0x2C]         |
    00401D94 | FF15 60314000            | call dword ptr ds:[<&__vbaFreeObj>]     |
    00401D9A | 66:3BFE                  | cmp di,si                               |
    00401D9D | 0F84 A0000000            | je andrénalin.1.401E43                  |   判断Key正确跳转处
    00401DA3 | FF15 2C314000            | call dword ptr ds:[<&rtcBeep>]          |
    00401DA9 | 8B3D 48314000            | mov edi,dword ptr ds:[<&__vbaVarDup>]   |
    00401DAF | B9 04000280              | mov ecx,0x80020004                      |
    00401DB4 | 894D 9C                  | mov dword ptr ss:[ebp-0x64],ecx         |
    00401DB7 | B8 0A000000              | mov eax,0xA                             | A:'
    '
    00401DBC | 894D AC                  | mov dword ptr ss:[ebp-0x54],ecx         |
    00401DBF | BB 08000000              | mov ebx,0x8                             |
    00401DC4 | 8D95 74FFFFFF            | lea edx,dword ptr ss:[ebp-0x8C]         |
    00401DCA | 8D4D B4                  | lea ecx,dword ptr ss:[ebp-0x4C]         |
    

     我们看到最近的一个跳转跳过了正确提示处,此处疑似为判断Key正确跳转处,我们将其NOP,再次在输入框内输入任意数据,点击OK

    此时我们已经成功爆破~

    内存补丁方式

    从之前的分析我们可以得知

    00401D73 | 51                       | push ecx                                | ecx:L"08"
    00401D74 | 68 541A4000              | push andrénalin.1.401A54                | 401A54:L"SynTaX 2oo1"    此处压入了401A54这个地址 ,该地址为我们的Key秘钥地址
    00401D79 | FF15 08314000            | call dword ptr ds:[<&__vbaStrCmp>]      |
    

     首先打开我们的KeyMake,载入008号程序,打开内存注册机,我们添加数据

    这里我们需要在选择内存方式内存地址处填写401A54 ,同时选择宽字符串 

    点击添加 -> 生成

    打开我们生成后的文件,输入任意数据,Key立即显示了出来

    CrackMe —— 009

    ON.1

    007和006破解方式一样

    首先搜索字符串,我们看到了错误提示那个字符串,很长很长... 进入地址004023E1向上翻看来到函数起始处,并设置断点

    00401FF0 | 55                       | push ebp                                |  函数起始处
    00401FF1 | 8BEC                     | mov ebp,esp                             |
    00401FF3 | 83EC 0C                  | sub esp,0xC                             |
    00401FF6 | 68 26104000              | push <JMP.&__vbaExceptHandler>          |
    00401FFB | 64:A1 00000000           | mov eax,dword ptr fs:[0]                |
    00402001 | 50                       | push eax                                |
    00402002 | 64:8925 00000000         | mov dword ptr fs:[0],esp                |
    00402009 | 81EC 18010000            | sub esp,0x118                           |
    0040200F | 53                       | push ebx                                |
    

    在输入框内输入任意数据,点击OK按钮,停在了我们的断点处,同上一个程序一样,我们单步向下走,同时观察右边寄存器窗口

    在单步走的过程中,我们发现一处调用call疑似对比Key,call 的名字为vabVarTestEq,其中Eq一般为对比的缩写

    进入这个call

    0F10B99E | FF7424 08                | push dword ptr ss:[esp+0x8]             |
    0F10B9A2 | FF7424 08                | push dword ptr ss:[esp+0x8]             |
    0F10B9A6 | 6A 00                    | push 0x0                                |
    0F10B9A8 | E8 E74AFFFF              | call msvbvm50.F100494                   |
    0F10B9AD | 8B0485 D4C50E0F          | mov eax,dword ptr ds:[eax*4+0xF0EC5D4]  |
    0F10B9B4 | C2 0800                  | ret 0x8                                 |
    

     发现内部还有一个call,再次进入单步走

    0F10062F | 8B55 0C                  | mov edx,dword ptr ss:[ebp+0xC]          |
    0F100632 | FF73 08                  | push dword ptr ds:[ebx+0x8]             | [ebx+8]:L"987654321"     我们输入的Key
    0F100635 | FF72 08                  | push dword ptr ds:[edx+0x8]             | [edx+8]:L"185-8518-500"  要对比的Key
    0F100638 | FF75 08                  | push dword ptr ss:[ebp+0x8]             |
    0F10063B | E8 BC3FF0FF              | call msvbvm50.F0045FC                   |
    0F100640 | 0FBFF0                   | movsx esi,ax                            |
    

     发现一处疑似真实Key的地址,我们输入这个Key来测试一下

    bingo~答案正确我们来看看这个是如何计算的

    我们使用peid打开程序,发现程序使用VB写的

    用我们的VB Decompiler 程序打开009号软件

    VB Decompiler:VB Decompiler是一款VB反编译软件,可以直接看到VB程序的源代码

    此时007号程序的验证代码已经出现在了我们的面前

      Dim Me As Me
      loc_00402092: var_58 = Text2.Text
      loc_004020CA: var_44 = var_58
      loc_00402126: For var_24 = 1 To Len(var_44) Step 1
      loc_00402132: 
      loc_00402134: If var_108 = 0 Then GoTo loc_004021D6
      loc_00402169: var_58 = CStr(Mid(var_44, CLng(var_24), 1))
      loc_00402176: var_B4 = Asc(var_58)
      loc_00402195: var_ret_2 = var_34 + Asc(var_58)
      loc_004021A0: var_34 = var_ret_2
      loc_004021CB: Next var_24
      loc_004021D1: GoTo loc_00402132
      loc_004021D6: 'Referenced from: 00402134
      loc_00402204: var_34 = var_34 * 1234567890
      loc_0040222F: call ebx(8, 00000001h, 00000004h, var_34, var_108, var_118, Me, undef 'Ignore this '__vbaFreeVarList, %ecx = %S_edx_S, 004041A0h)
      loc_00402254: call ebx(8, 00000001h, 00000009h, var_34)
      loc_00402276: var_58 = Text1.Text
      loc_00402298: var_64 = var_58
      loc_004022CB: If (var_58 = var_34) = 0 Then GoTo loc_00402391
      loc_004022D1: Beep

    通过不断循环Name文本框内输入的用户名截取每个字符计算其ASCII码不断相加 最后相加的和乘于1234567890

    004021E5 | C785 5CFFFFFF D2029649   | mov dword ptr ss:[ebp-0xA4],0x499602D2                  | [ebp-A4]:L"-"   第四位置换为"-"
    004021EF | C785 54FFFFFF 03000000   | mov dword ptr ss:[ebp-0xAC],0x3                         | 
    004021F9 | FF15 5C414000            | call dword ptr ds:[<&__vbaVarMul>]                      |
    004021FF | 8BD0                     | mov edx,eax                                             |
    00402201 | 8D4D CC                  | lea ecx,dword ptr ss:[ebp-0x34]                         |
    00402204 | FFD6                     | call esi                                                |
    00402206 | 8B1D A0414000            | mov ebx,dword ptr ds:[<&__vbaMidStmtVar>]               |
    0040220C | 8D4D CC                  | lea ecx,dword ptr ss:[ebp-0x34]                         |
    0040220F | 51                       | push ecx                                                |
    00402210 | 6A 04                    | push 0x4                                                |
    00402212 | 8D95 54FFFFFF            | lea edx,dword ptr ss:[ebp-0xAC]                         |
    00402218 | 6A 01                    | push 0x1                                                |
    0040221A | 52                       | push edx                                                |
    0040221B | C785 5CFFFFFF 341C4000   | mov dword ptr ss:[ebp-0xA4],andrénalin.2.401C34         | [ebp-A4]:L"-", 401C34:L"-" 第九位置换为"-"
    00402225 | C785 54FFFFFF 08000000   | mov dword ptr ss:[ebp-0xAC],0x8                         |
    0040222F | FFD3                     | call ebx                                                |
    

     计算的结果每4位置换为 "-" 

    Python伪代码

    sun = 0
    for i in "123":
        sun += ord(i)
    sun *= 1234567890
    sun_str = str(sun)
    print(sun_str[:3] + '-' + sun_str[4:8] + '-' + sun_str[9:])
    

    ON.2

    爆破方式破解

    004022C2 | FF15 00414000            | call dword ptr ds:[<&__vbaFreeVar>]     |
    004022C8 | 66:85DB                  | test bx,bx                              |
    004022CB | 0F84 C0000000            | je andrénalin.2.402391                  |
    004022D1 | FF15 74414000            | call dword ptr ds:[<&rtcBeep>]          |
    004022D7 | 8B1D 98414000            | mov ebx,dword ptr ds:[<&__vbaVarDup>]   |
    

     在错误提示字符串上放最近的一个跳转,我们发现跳转跳过了正确提示信息来到了错误信息,将其NOP,输入任意数据,点击OK 

    爆破成功,成功弹出正确信息

  • 相关阅读:
    写在读ng之前的基础知识----笔记
    angularJS中-$route路由-$http(ajax)的使用
    angular学习-入门基础
    grunt使用watch和livereload的Gruntfile.js的配置
    jQuery1.4源码解读
    Handlebars的使用方法文档整理(Handlebars.js)
    zepto源代码解读
    CentOS 安装rz和sz命令
    Linux下*.tar.gz文件解压缩命令
    Linux下用rm删除的文件的恢复方法
  • 原文地址:https://www.cnblogs.com/lonenysky/p/11335086.html
Copyright © 2020-2023  润新知