通过一个crackme学习逆向基础知识以及Delphi框架
字数 1968 2025-08-26 22:11:45

通过CrackMe学习逆向基础与Delphi框架分析

前言

本教程基于160个CrackMe系列的第5个实例,这是一个使用Delphi框架编写并带有UPX壳的逆向分析练习。通过这个案例,我们将系统学习逆向工程的基础知识,包括脱壳技术、Delphi程序分析方法和多层防护机制的绕过策略。

一、查壳与脱壳

1. 查壳工具使用

使用Exeinfo PE工具检测程序,发现程序带有UPX壳:

  • UPX是一种常见的压缩壳
  • 特征:程序开头有pushad指令

2. 壳的类型与原理

压缩壳

  • 作用:减小程序体积而不影响内存装载
  • 解压机制:
    • 记录原PE文件的节数量和大小
    • 解压时在壳代码后占用等大空间存放解压后的代码
    • 避免解压过程中覆盖相邻代码

加密壳

  • 种类繁多,功能各异
  • 主要功能:保护程序、防止反编译、提供注册验证等

3. 手动脱壳步骤

  1. 寻找OEP(原始入口点)

    • 使用ESP定律:在pushad后对ESP下硬件断点
    • 单步跟踪直到发现跳转到主函数的jmp指令
    • OEP特征:push ebpmov ebp, esp开栈操作
  2. 脱壳方法

    • 使用OD的脱壳插件进行内存转储
    • 注意:壳会抹去原程序的IAT(导入地址表)
  3. 修复IAT

    • 使用ImportREC工具修复转储后的程序
    • 获取导入表后修复转储文件

4. 脱壳机使用

对于UPX壳,可以使用专用脱壳机快速完成脱壳,保证代码对齐准确。

二、Delphi程序分析

1. 框架分析工具

使用DarkDe4分析Delphi程序:

  • 查看窗体信息:发现隐藏的TEdit2控件
  • 事件分析:
    • 表单创建
    • 计时器事件
    • 双击事件
    • 编辑框事件
    • 鼠标移动事件
    • 按钮点击事件

2. IDA与OD协同分析

  1. IDA导出MAP文件

    • 在IDA中选择"Produce file" → "Create MAP file"
    • 包含所有符号签名信息
  2. OD导入MAP文件

    • 使用LoadMapEx插件导入
    • 效果:增加调试注释,部分函数名称更改为IDA分析结果

三、字符串分析

查找关键字符串:

  • 注册成功提示信息
  • 错误提示信息
  • 文件路径信息

通过字符串定位关键判断点,发现程序有4个主要防护检测。

四、多层防护分析

第一层防护:文件验证

  1. 检测机制

    • 检查指定路径下的ok.txt文件
    • 读取文件内容与预设字符串比较
  2. 绕过方法

    • 修改文件路径为有效路径(如C盘)
    • 创建ok.txt文件并写入特定内容

第二层防护:点击计数

  1. 检测机制

    • 变量ds:[eax+0x308]初始化为0x28E
    • 右键点击按钮1会使值加3
    • 需要使最终值为0x29D
  2. 绕过方法

    • 右键点击注册按钮5次:(0x29D-0x28E)/3=5

第三层防护:鼠标位置与图片验证

  1. 图片序列

    • Image1: "人之初"
    • Image2: "性本善"
    • Image3: "性相近"
    • Image4: "习相远"
  2. 鼠标位置要求

    • 图片为"性相近"时:
      • 横坐标≤0xEX
      • 纵坐标≤0x12C
    • 图片为"性本善"时:
      • 横坐标≥0x17
      • 纵坐标≤0x12C
  3. 嵌套检测

    • 变量ds:[ebx+0x310]需等于0x10
    • 变量ds:[ebx+0x30C]需不等于0x9

第四层防护:编辑框2验证

  1. 激活编辑框2

    • 右键点击注册按钮5次
    • 双击Panel1控件两次
  2. 内容验证

    • 长度必须为8
    • 第2个字符必须是'_'(0x5F)
    • 第6个字符必须是','(0x2C)
  3. 编辑框1验证

    • 内容长度必须是3的倍数
    • 内容必须为"ajj"

第五层防护:图片点击计数

  1. 变量关系

    • 需要使ds:[ebx+0x318]等于ds:[ebx+0x314]
    • ds:[ebx+0x314]的值由磁盘空间计算得出
  2. 点击规则

    • 根据显示数字不同执行不同点击组合:
      • 0: "习相远"左键2次,"人之初"右键3次
      • 1: "习相远"左键1次,"习相远"右键2次
      • 2: "性本善"左键2次,"性相近"右键2次
      • 3: "习相远"左键1次,"习相远"右键8次
      • 4: "习相远"左键2次,"人之初"右键3次

五、完整绕过流程

  1. 文件准备

    • 在C:\ajj.126.c0m\j\o\j\o路径创建ok.txt
    • 写入特定内容
  2. 点击操作

    • 右键点击注册按钮5次
    • 左键双击Panel空白处2次
  3. 输入内容

    • 编辑框1输入"ajj"
    • 编辑框2输入符合格式的8字符(如"1_345,78")
  4. 鼠标操作

    • 图片为"性相近"时从右下角移入
    • 图片为"性本善"时从左下角移入
  5. 图片点击

    • 根据显示数字执行对应的点击组合

六、总结

这个CrackMe涵盖了逆向工程的多个关键知识点:

  1. 壳的识别与脱壳技术
  2. Delphi程序的结构分析
  3. 多层防护机制的逆向分析
  4. 动态调试与静态分析结合的方法
  5. 复杂验证逻辑的梳理与绕过

通过这个案例,可以系统掌握逆向工程的基本流程和方法,为分析更复杂的程序打下坚实基础。

通过CrackMe学习逆向基础与Delphi框架分析 前言 本教程基于160个CrackMe系列的第5个实例,这是一个使用Delphi框架编写并带有UPX壳的逆向分析练习。通过这个案例,我们将系统学习逆向工程的基础知识,包括脱壳技术、Delphi程序分析方法和多层防护机制的绕过策略。 一、查壳与脱壳 1. 查壳工具使用 使用Exeinfo PE工具检测程序,发现程序带有UPX壳: UPX是一种常见的压缩壳 特征:程序开头有 pushad 指令 2. 壳的类型与原理 压缩壳 作用:减小程序体积而不影响内存装载 解压机制: 记录原PE文件的节数量和大小 解压时在壳代码后占用等大空间存放解压后的代码 避免解压过程中覆盖相邻代码 加密壳 种类繁多,功能各异 主要功能:保护程序、防止反编译、提供注册验证等 3. 手动脱壳步骤 寻找OEP(原始入口点) 使用ESP定律:在 pushad 后对ESP下硬件断点 单步跟踪直到发现跳转到主函数的 jmp 指令 OEP特征: push ebp 和 mov ebp, esp 开栈操作 脱壳方法 使用OD的脱壳插件进行内存转储 注意:壳会抹去原程序的IAT(导入地址表) 修复IAT 使用ImportREC工具修复转储后的程序 获取导入表后修复转储文件 4. 脱壳机使用 对于UPX壳,可以使用专用脱壳机快速完成脱壳,保证代码对齐准确。 二、Delphi程序分析 1. 框架分析工具 使用DarkDe4分析Delphi程序: 查看窗体信息:发现隐藏的TEdit2控件 事件分析: 表单创建 计时器事件 双击事件 编辑框事件 鼠标移动事件 按钮点击事件 2. IDA与OD协同分析 IDA导出MAP文件 在IDA中选择"Produce file" → "Create MAP file" 包含所有符号签名信息 OD导入MAP文件 使用LoadMapEx插件导入 效果:增加调试注释,部分函数名称更改为IDA分析结果 三、字符串分析 查找关键字符串: 注册成功提示信息 错误提示信息 文件路径信息 通过字符串定位关键判断点,发现程序有4个主要防护检测。 四、多层防护分析 第一层防护:文件验证 检测机制 检查指定路径下的ok.txt文件 读取文件内容与预设字符串比较 绕过方法 修改文件路径为有效路径(如C盘) 创建ok.txt文件并写入特定内容 第二层防护:点击计数 检测机制 变量 ds:[eax+0x308] 初始化为0x28E 右键点击按钮1会使值加3 需要使最终值为0x29D 绕过方法 右键点击注册按钮5次:(0x29D-0x28E)/3=5 第三层防护:鼠标位置与图片验证 图片序列 Image1: "人之初" Image2: "性本善" Image3: "性相近" Image4: "习相远" 鼠标位置要求 图片为"性相近"时: 横坐标≤0xEX 纵坐标≤0x12C 图片为"性本善"时: 横坐标≥0x17 纵坐标≤0x12C 嵌套检测 变量 ds:[ebx+0x310] 需等于0x10 变量 ds:[ebx+0x30C] 需不等于0x9 第四层防护:编辑框2验证 激活编辑框2 右键点击注册按钮5次 双击Panel1控件两次 内容验证 长度必须为8 第2个字符必须是'_ '(0x5F) 第6个字符必须是','(0x2C) 编辑框1验证 内容长度必须是3的倍数 内容必须为"ajj" 第五层防护:图片点击计数 变量关系 需要使 ds:[ebx+0x318] 等于 ds:[ebx+0x314] ds:[ebx+0x314] 的值由磁盘空间计算得出 点击规则 根据显示数字不同执行不同点击组合: 0: "习相远"左键2次,"人之初"右键3次 1: "习相远"左键1次,"习相远"右键2次 2: "性本善"左键2次,"性相近"右键2次 3: "习相远"左键1次,"习相远"右键8次 4: "习相远"左键2次,"人之初"右键3次 五、完整绕过流程 文件准备 在C:\ajj.126.c0m\j\o\j\o路径创建ok.txt 写入特定内容 点击操作 右键点击注册按钮5次 左键双击Panel空白处2次 输入内容 编辑框1输入"ajj" 编辑框2输入符合格式的8字符(如"1_ 345,78") 鼠标操作 图片为"性相近"时从右下角移入 图片为"性本善"时从左下角移入 图片点击 根据显示数字执行对应的点击组合 六、总结 这个CrackMe涵盖了逆向工程的多个关键知识点: 壳的识别与脱壳技术 Delphi程序的结构分析 多层防护机制的逆向分析 动态调试与静态分析结合的方法 复杂验证逻辑的梳理与绕过 通过这个案例,可以系统掌握逆向工程的基本流程和方法,为分析更复杂的程序打下坚实基础。