• 逆向破解之160个CrackMe —— 010-011


    CrackMe —— 010

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

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

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

    来源 <-点击查看

    编号 作者 保护方式
    010 Andrénalin3 Serial
    011 Andrénalin4 Serial

    工具 

    x32dbg

    VB Decompiler Pro

    吾爱破解内存补丁生成器1.0

    开始破解之旅

    ON.1

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

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

    我们点进进入来地址,向上翻看,看到最近的一个跳转,跳过了正确跳转的提示地方,我们在此下断点

    F9运行,在输入框内输入任意文字,停在了我们的断点处,将寄存器ZF值设置为0,F9运行,发现弹出正确提示框

    首先我们使用DelphiDecompiler 打开010号程序

    点击左侧边框中的Code -> Form1 -> Command1_Click 

    右侧显示出了源代码

    我们分析源代码可得

    loc_00401EC2: var_58 = Text1.Text              取输入框文本
      loc_00401EFA: var_44 = var_58              
      loc_00401F56: For var_24 = 1 To Len(var_44) Step 1  循环输入框文本长度
      loc_00401F68: 
      loc_00401F6A: If var_104 = 0 Then GoTo loc_0040202B
      loc_00401FA3: var_58 = CStr(Mid(var_44, CLng(var_24), 1))  取变量var_24个长度的字符串
      loc_00401FB0: Asc(var_58) = Asc(var_58) + 000Ah        将变量进行ascii运算+000AH
      loc_00401FC4: var_84 = Chr$(Asc(var_58)+000Ah)         将变量进行ascii运算+000AH 将结果转化为字符串
      loc_00401FE6: var_9C = var_34 & Chr$(Asc(var_58)+000Ah)     将变量进行ascii运算+000AH 将结果转化为字符串 同时和var_34变量相加
      loc_00401FED: var_34 = var_9C
      loc_00402020: Next var_24
      loc_00402026: GoTo loc_00401F68
      loc_0040202B: 'Referenced from: 00401F6A
      loc_00402053: If (var_34 = "kXy^rO|*yXo*mkMuOn*+") = 0 Then GoTo loc_00402119       比较如何变量var_34等于 kXy^rO|*yXo*mkMuOn*+ 进行跳转

    ON.2

    爆破方式破解

    00402050 | 66:85C0                  | test ax,ax                                              |
    00402053 | 0F84 C0000000            | je andrénalin.3.402119                                  | 将JE 修改为NOP
    00402059 | FF15 6C414000            | call dword ptr ds:[<&rtcBeep>]                          |
    0040205F | 8B1D 94414000            | mov ebx,dword ptr ds:[<&__vbaVarDup>]                   |
    00402065 | B9 0A000000              | mov ecx,0xA                                             | A:'
    '
    0040206A | B8 04000280              | mov eax,0x80020004                                      |
    0040206F | 898D 64FFFFFF            | mov dword ptr ss:[ebp-0x9C],ecx                         | [ebp-9C]:"梵"
    00402075 | 898D 74FFFFFF            | mov dword ptr ss:[ebp-0x8C],ecx                         |
    0040207B | 8D95 44FFFFFF            | lea edx,dword ptr ss:[ebp-0xBC]                         | [ebp-BC]:"梵"
    00402081 | 8D4D 84                  | lea ecx,dword ptr ss:[ebp-0x7C]                         |
    00402084 | 8985 6CFFFFFF            | mov dword ptr ss:[ebp-0x94],eax                         |
    0040208A | 8985 7CFFFFFF            | mov dword ptr ss:[ebp-0x84],eax                         |
    00402090 | C785 4CFFFFFF 281B4000   | mov dword ptr ss:[ebp-0xB4],andrénalin.3.401B28         | 401B28:L"RiCHTiG !"
    

    我们将00402053地址修改为NOP保存,即可爆破成功 

    内存补丁方式

    我们打开内存补丁生成器,在内存地址中填入00402053 ,修改指令处填写0F84 ,原指令为84对应汇编语言为jejne85

     

    将程序拖入内存补丁程序内,点击添加指令,再点击导出补丁即可

    打开010号程序,打开生成的内存补丁程序,点击开始补丁,在输入框内输入任意数据,点击OK,破解成功

    CrackMe —— 011

    ON.1

    首先使用 VB Decompiler Pro程序打开011号程序

    点击Code -> Form1

    我们看到下面有4个Timer函数,我们点击一个查看反编译代码

    经过分析可以得知计算方式

    循环:

      向前取第N为计算ascii 值+从后取一位转换为数值型

      计算其16进制

          字符串相加其结果

    循环完毕

    对比判断Key

    以上为伪代码

    我们可以得知最后两位为数值型

    我们可以逆向其已知Key

    0817E747D7A7D7C7F82836D74747A7F7E7B7C7D826D817E7B7C 举例,x32dbg搜索字符串会搜索到很多类似的字符串,仔细观察发现其中会充满RR之类的字符无法转成16进制,固寻找一个正确的字符串

    data = '0817E747D7A7D7C7F82836D74747A7F7E7B7C7D826D817E7B7C'
    a = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '*', '#']
    k = 0
    for i in a:
        for j in a:
            if j in ['*', '#'] or i in ['*', '#']:        因为* # 字符无法转换为10进制所以跳过
                continue
            if ord(i) + (10 * int(i) + int(j)) == int(data[1:3], 16):
                k = 10 * int(i) + int(j)
                print('最后一位为:', k)
                break
    password = ''
    for i in range(1, len(data), 2):
        password = password + chr(int(str(data[i:i + 2]), 16) - k)
    print(password)
    

     最后计算出结果为 74*3032589#**0541238#7412

     我们填入输入框内,提示我们注册成功

      

    ON.2

    搜索字符串,找到正确的注册字符,地址为0040D0CC,进入该地址

    0040D0AE | 66:85C0                  | test ax,ax                                              |
    0040D0B1 | 74 4C                    | je andrénalin.4.40D0FF                                  |
    0040D0B3 | 8B45 08                  | mov eax,dword ptr ss:[ebp+0x8]                          |
    0040D0B6 | 50                       | push eax                                                |
    0040D0B7 | 8B10                     | mov edx,dword ptr ds:[eax]                              | edx:EntryPoint
    0040D0B9 | FF92 38030000            | call dword ptr ds:[edx+0x338]                           |
    0040D0BF | 50                       | push eax                                                |
    0040D0C0 | 8D45 AC                  | lea eax,dword ptr ss:[ebp-0x54]                         |
    

    看到最近的跳转处0040D0B1,此处跳转会经过我们的正确代码,将其改为NOP

    此时回到程序界面发现程序已经注册成功 

  • 相关阅读:
    dataTables分页实现两个前提
    centos 7 下 nginx 1.10.3 编译安装的方法
    redis 远程连接出错的解决办法
    Yii2事件驱动的运行机制
    Yii2项目高级模版 三个模块在同一个目录下的重定向配置
    PHP处理上传文件信息数组中的文件类型 正确获取
    PHP is_writeable 存在bug , 写一个自定函数 判断文件是否可写
    PHP面试题学习
    解决yii2 禁用layout时AppAsset不加载资源的问题
    如何在 Docker 容器中运行 Kali Linux 2.0
  • 原文地址:https://www.cnblogs.com/lonenysky/p/11342288.html
Copyright © 2020-2023  润新知