OD 实验(十一) - 对一个程序的破解
程序:
点击安装程序
这是一个拼图程序
点击 Options -> Flash Sizes
程序会提示是未注册版本
点击一些选项的时候会提示该程序只给注册的用户
点击 Register
随便输入一个密码,然后点击 OK
密码错误
用 PEiD 看一下该程序使用的是什么编译器
Microsoft Visual C++ 7.0
逆向:
用 OD 打开程序
首先先查找一下关键字
右键 -> 查找 -> 所有参考文本字串
拉到最顶端,右键 -> 查找文本
双击跟进该字符串所在的地方
这里有个 je 跳转指令,如果跳转实现的话就会显示 unregistered
那就让 je 不实现跳转
那 je 跳转指令改为 nop
保存程序
运行程序
点击 Options -> Flash Sizes,没有再显示 unregistered
但是点击其它选项还是会弹出提示框
继续看一下程序
je 跳转指令上的 mov 指令把 esp+0x4 处的值赋给 al
在 mov 指令处下一个断点,重新跑一下程序
esp+0x4 的地址为 0012E19C,值为 0,所以 al 的值也为 0
上图所示,mov 指令本地调用来自 004047D3 和 00404880,跟上去看看
右键
先跟 004047D3
下一个断点
按 Enter 键回到 mov 指令处
接下来跟 00404880
在此处也下一个断点
重新载入程序跑一下
程序先停在该处
可以把 00404880 的断点删除
按 Alt+B 查看断点,按 Delete 进行删除
因为 004047D3 处的 call 指令先对 mov 指令进行操作
上面有个 push 指令
push 指令把 eax 推入栈中
而 0012E19C 决定了 al 的值
所以此处的 eax 决定 0012E19C,0012E19C 决定 al
而 eax 的值取决于它上面的那条 call 指令
因为函数的返回值存放在 eax 中
在此处的 call 指令处下一个断点
重新跑一下程序
按 F7 步入该 call 指令,看看该 call 指令任何返回 eax 的值
按 F8 往下走
这里有个循环,每执行一次循环
EAX 上的 ASCII 值就会少一个字符
当字符全减完之后,它就会往下走
此时寄存器 eax 的值为 9
因为 <No Pass> 为 9 个字符
cmp 指令把密码位数和 4 进行比较
如果密码位数大于 4 的话,将执行 jnb 跳转
如果密码位数小于 4 的话,执行 xor 指令,把 al 的值变为 0
先跟着 jnb 跳转看看情况
这里有个 call 指令,它有 3 个参数,分别是 push 的那三个参数
步过 call 指令继续往下走
test 指令比较 eax 的值,如果 eax 的值不为 0 的话,将执行 jnz 跳转;如果 eax 的值为 0 的话,将不执行 jnz 跳转
跳转将跳到 xor 指令处
xor 指令将 al 清 0,pop 将 esi 出栈,然后返回,al 部分为 0,程序还是会提示注册不成功
所以改一下 xor 指令就好了
保存文件,运行一下
被限制的功能都能用了
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架