某软件逆向算法探源
字数 1413 2025-08-06 18:08:09

某软件逆向算法分析与爆破教学

1. 初步分析与错误信息定位

  1. 错误信息捕获

    • 程序在输入无效时会返回"无效的ID或名字"的报错字符串
    • 使用OllyDbg搜索该字符串可以快速定位关键验证点
  2. 关键跳转定位

    • 在004C2ABF处有一个call指令调用验证算法
    • 004C2AC4处将算法返回值进行比较(1为正确,0为错误)
    • 004C2AC6处的跳转指令决定程序流程(为0时跳转到错误提示)

2. 爆破方法

  1. 直接修改验证逻辑

    • 找到验证函数的开头(push ebp处)
    • 修改为直接返回1的代码:
      mov eax, 1
      retn
      
    • 这样无论输入什么都会通过验证
  2. 验证爆破效果

    • 运行修改后的程序
    • 输入任意ID和名字都应显示"已注册"

3. 算法深入分析

3.1 输入数据获取

  1. 用户名获取

    • 程序将用户名存储在EDX寄存器指向的地址(如0019F364)
    • 可在堆栈窗口跟踪该地址查看输入内容
  2. 序列号获取

    • EDI寄存器指向序列号存储地址
    • 同样可在堆栈窗口跟踪

3.2 长度检测绕过

  1. 长度检测函数

    • 函数调用后将EAX与0xA(10)比较
    • 输入的序列号长度存储在EAX中(如"12345678"对应8)
  2. 关键字符串发现

    • 程序中存在两个神秘字符串:A1910和A1423
    • 这些字符串在后续验证中起关键作用

3.3 核心验证算法

  1. 字符串比较指令

    • repne scasb:逐字节比较字符串
      • 用于将输入序列号与A1910/A1423进行比较
      • 当字符匹配时停止循环
    • repe cmps:字符串按位比较
      • 用于完整比较输入与预设字符串
  2. 验证流程

    • 前5位必须是A1910或A1423
    • 中间3位为任意0-9数字
    • 最后2位的ASCII码相加后,与10相除的余数必须为4
  3. 数学验证部分

    • 程序执行以下运算:
      eax = eax + edx
      ecx = 10
      eax / ecx → 商在eax,余数在edx
      
    • 关键比较:edx(余数)必须等于4

4. 完整算法总结

  1. 有效序列号规则

    • 格式:A1910xxxyyA1423xxxyy
      • xxx:3位任意数字(0-9)
      • yy:2位数字,满足 (y1 + y2) % 10 == 4
  2. 示例有效序列号

    • A191000004 (0+0+0+0+4=4)
    • A142312348 (1+2+3+4+8=18 → 18%10=8 → 无效)
    • A191099994 (9+9+9+9+4=40 → 40%10=0 → 无效)
    • A142300044 (0+0+0+0+4=4 → 有效)

5. 关键汇编指令解析

  1. repne scasb

    • 功能:在EDI指向的内存中扫描AL寄存器中的字节
    • 直到找到匹配或ECX计数为0
    • 常用于字符串搜索和比较
  2. repe cmps

    • 功能:比较ESI和EDI指向的内存内容
    • 直到发现不匹配或ECX计数为0
    • 用于字符串精确比较

6. 防御建议

  1. 加强验证逻辑

    • 使用更复杂的校验算法
    • 加入时间或硬件相关的验证因素
  2. 反调试措施

    • 检测调试器存在
    • 使用代码混淆技术
  3. 关键字符串保护

    • 加密硬编码字符串
    • 运行时动态生成关键字符串

7. 参考资源

  1. 汇编指令详解:

    • repne scasb详解 - CSDN博客
    • repe cmps指令 - 博客园
  2. 逆向工程工具:

    • OllyDbg
    • IDA Pro
  3. 相关技术:

    • 软件保护技术
    • 反逆向工程方法

本教学文档详细解析了目标软件的验证算法,从基础爆破到深入分析,涵盖了关键汇编指令和完整算法逻辑。通过此案例可以学习基本的逆向工程方法和验证算法分析技巧。

某软件逆向算法分析与爆破教学 1. 初步分析与错误信息定位 错误信息捕获 : 程序在输入无效时会返回"无效的ID或名字"的报错字符串 使用OllyDbg搜索该字符串可以快速定位关键验证点 关键跳转定位 : 在004C2ABF处有一个call指令调用验证算法 004C2AC4处将算法返回值进行比较(1为正确,0为错误) 004C2AC6处的跳转指令决定程序流程(为0时跳转到错误提示) 2. 爆破方法 直接修改验证逻辑 : 找到验证函数的开头(push ebp处) 修改为直接返回1的代码: 这样无论输入什么都会通过验证 验证爆破效果 : 运行修改后的程序 输入任意ID和名字都应显示"已注册" 3. 算法深入分析 3.1 输入数据获取 用户名获取 : 程序将用户名存储在EDX寄存器指向的地址(如0019F364) 可在堆栈窗口跟踪该地址查看输入内容 序列号获取 : EDI寄存器指向序列号存储地址 同样可在堆栈窗口跟踪 3.2 长度检测绕过 长度检测函数 : 函数调用后将EAX与0xA(10)比较 输入的序列号长度存储在EAX中(如"12345678"对应8) 关键字符串发现 : 程序中存在两个神秘字符串:A1910和A1423 这些字符串在后续验证中起关键作用 3.3 核心验证算法 字符串比较指令 : repne scasb :逐字节比较字符串 用于将输入序列号与A1910/A1423进行比较 当字符匹配时停止循环 repe cmps :字符串按位比较 用于完整比较输入与预设字符串 验证流程 : 前5位必须是A1910或A1423 中间3位为任意0-9数字 最后2位的ASCII码相加后,与10相除的余数必须为4 数学验证部分 : 程序执行以下运算: 关键比较:edx(余数)必须等于4 4. 完整算法总结 有效序列号规则 : 格式: A1910xxxyy 或 A1423xxxyy xxx :3位任意数字(0-9) yy :2位数字,满足 (y1 + y2) % 10 == 4 示例有效序列号 : A191000004 (0+0+0+0+4=4) A142312348 (1+2+3+4+8=18 → 18%10=8 → 无效) A191099994 (9+9+9+9+4=40 → 40%10=0 → 无效) A142300044 (0+0+0+0+4=4 → 有效) 5. 关键汇编指令解析 repne scasb : 功能:在EDI指向的内存中扫描AL寄存器中的字节 直到找到匹配或ECX计数为0 常用于字符串搜索和比较 repe cmps : 功能:比较ESI和EDI指向的内存内容 直到发现不匹配或ECX计数为0 用于字符串精确比较 6. 防御建议 加强验证逻辑 : 使用更复杂的校验算法 加入时间或硬件相关的验证因素 反调试措施 : 检测调试器存在 使用代码混淆技术 关键字符串保护 : 加密硬编码字符串 运行时动态生成关键字符串 7. 参考资源 汇编指令详解: repne scasb详解 - CSDN博客 repe cmps指令 - 博客园 逆向工程工具: OllyDbg IDA Pro 相关技术: 软件保护技术 反逆向工程方法 本教学文档详细解析了目标软件的验证算法,从基础爆破到深入分析,涵盖了关键汇编指令和完整算法逻辑。通过此案例可以学习基本的逆向工程方法和验证算法分析技巧。