某软件逆向算法探源
字数 1413 2025-08-06 18:08:09
某软件逆向算法分析与爆破教学
1. 初步分析与错误信息定位
-
错误信息捕获:
- 程序在输入无效时会返回"无效的ID或名字"的报错字符串
- 使用OllyDbg搜索该字符串可以快速定位关键验证点
-
关键跳转定位:
- 在004C2ABF处有一个call指令调用验证算法
- 004C2AC4处将算法返回值进行比较(1为正确,0为错误)
- 004C2AC6处的跳转指令决定程序流程(为0时跳转到错误提示)
2. 爆破方法
-
直接修改验证逻辑:
- 找到验证函数的开头(push ebp处)
- 修改为直接返回1的代码:
mov eax, 1 retn - 这样无论输入什么都会通过验证
-
验证爆破效果:
- 运行修改后的程序
- 输入任意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
-
数学验证部分:
- 程序执行以下运算:
eax = eax + edx ecx = 10 eax / ecx → 商在eax,余数在edx - 关键比较:edx(余数)必须等于4
- 程序执行以下运算:
4. 完整算法总结
-
有效序列号规则:
- 格式:
A1910xxxyy或A1423xxxyyxxx: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
-
相关技术:
- 软件保护技术
- 反逆向工程方法
本教学文档详细解析了目标软件的验证算法,从基础爆破到深入分析,涵盖了关键汇编指令和完整算法逻辑。通过此案例可以学习基本的逆向工程方法和验证算法分析技巧。