需要破解的程序

双击程序,提示需要许可证文件

逆向程序

用 OD 打开

LoadIconA 为加载图标

LoadCursorA 为加载鼠标

F8 走一下程序

走到了这里,调用了 CreateFileA,打开或创建文件 Keyfile.dat

但是当前目录没有 Keyfile.dat 文件

接下来是有个跳转指令 jnz 指令跳转到地址 0040109A

先看一下地址 0040109A 上的指令

地址 0040109A 走下去是调用 ReadFile

如果这个 jnz 语句没跳转而是直走的话,程序将退出

所以要让 jnz 这个语句实现跳转,当前的条件不足以让这个 jnz 进行跳转

jnz 跳转的条件是 ZF=0

把 ZF 改为 0,让这个 jnz 指令进行跳转

按 F8 往下走

程序实现了跳转

然后 F8 继续往下走

然后走到 ReadFile 读取文件

之后有个 jnz 跳转指令,还是有一个 jmp 跳转指令

该跳转哪个跳转指令还不能确定

先看看地址 004010B4 上有什么指令,为 xor ebx, ebx

再看看地址 004010F7 上的指令

这个是最早运行程序弹出来的对话框

看来要执行 jnz 跳转指令

将 ZF 置 0,按 F8 进行跳转

之后有一个 jl 跳转指令

看看地址 004010F7 上的指令

看来不能进行这个跳转

jl 跳转指令为当 SF != OF 的时候才进行跳转

将 SF 的 1 修改为 0,不让 jl 跳转指令进行跳转

F8 往下走

有个 je 跳转指令,跳转到地址 004010D3

不知道下面的情况怎么样,执行 je 跳转指令看看情况

然后有两个跳转指令 jl 和 jmp

从上面的步骤可以知道,地址 004010F7 不能走,那就不跳转 jl 指令,执行 jmp 跳转指令

这个跳转已经实现了,把 SF 设置为 0,为 SF = OF 不进行跳转

然后按 F8 往下走,到 jmp 跳转指令

看看地址 00401205 上的指令

这个地址上的指令是最终想要的

所以执行这个 jmp 跳转指令是正确的

按 F8 走 jmp 跳转

然后按 F8 进行往下走

成功

修改程序

重新走一下程序

这个 jnz 跳转指令需要跳转,可以改为 jmp 跳转指令,jmp 跳转指令为无条件跳转

改完按 F8,进行跳转

然后接着走

这个 jnz 跳转指令也需要跳转,那就也改成 jmp

然后接着走,之后有个 jl 指令

这个地方不能跳,改为 nop

然后往下走,有个 je 跳转指令,他会直接跳,让他跳

接下来是一条 jl 跳转指令,这个跳转不能跳,改为 nop

最后 jmp 指令跳往正确的地方

修改完成了

选中所修改的区域,即最初修改的地方到最后修改的地方

点击右键 -> 复制到可执行文件 -> 选择

然后右键 -> 备份 -> 保存数据到文件

成功

逆向算法

重新载入程序

走到第一条跳转指令前,这条指令显示为灰色是因为刚才修改过这个地方

将 ZF 置 0,让其跳转

跳转之后按 F8 往下走

这段指令是程序的核心算法

往下走

将 ZF 置 0,让 jnz 跳转指令跳转

跳转到 xor 异或指令

xor ebx,ebx

该 xor 异或指令会将 ebx 清 0

程序在

cmp dword ptr ds:[0x402173],0x10

上对地址为 0x402173 的值和 0x10 进行判断

往上拉可以看到程序往 402173 上放了什么

402173 上放的是 ReadFile 的第四个参数

函数参数的入栈顺序是:第一个参数先入栈,在最下面,接着是第二个参数入栈放在倒二下的位置,以此类推

ReadFile 函数:

BOOL ReadFile(
HANDLE hFile, //文件的句柄
LPVOID lpBuffer, //用于保存读入数据的一个缓冲区
DWORD nNumberOfBytesToRead, //要读入的字节数
LPDWORD lpNumberOfBytesRead, //指向实际读取字节数的指针
LPOVERLAPPED lpOverlapped
//如文件打开时指定了FILE_FLAG_OVERLAPPED,那么必须,用这个参数引用一个特殊的结构。
//该结构定义了一次异步读取操作。否则,应将这个参数设为NULL
);

ReadFile 函数的第四个参数为读取文件内容的字节数

cmp 比较文件内容字节数和 16 字节的关系(0x10 的十进制为 16)

如果文件内容的字节数小于 16 字节的话,将会走到下一条指令,然后跳转

所以文件内容至少为 16 字节,将不进行跳转

接下来是

语句

mov al,byte ptr ds:[ebx+0x40211A]

把地址 0x40211A 上的值加上 ebx 的值给 al

地址 0x40211A 为 ReadFile 的第二个参数

然后

cmp al,0x0

比较 al 是否为 0

如果 al 等于 0,ZF 就置 1,然后 je 跳转语句会跳转到

如果 esi 等于 8 的话,就会跳转到

所以 esi 要大于 8

要让 al 大于 0,不进行跳转

然后会走到

0x47 是字符 G 的 ASCII 码值 71 的十六进制

如果 al 的值等于 0x47 的话,ZF 就会置 1,下一条的 jnz 语句将不会进行跳转

之后执行指令 inc esi,递增 esi

esi 的值至少要为 9

所以 Keyfile.dat 中的值至少要有 9 个 G

创建一个 Keyfile.dat 文件

内容为 9 个 G,然后是数字 1,2,3,4,5,6,7,8,一共十七个字节

现在直接运行原程序

成功

OD 实验(三) - 破解程序的文件验证的更多相关文章

  1. OD 实验(一) - 修改程序标题

    需要修改的程序 把 I love fishc.com 修改为 hello world sch01ar 用 OD 打开程序 在程序入口处开始一直按 F8 运行程序,看看在哪里弹出对话框 运行到该地址的时 ...

  2. 20155308&20155316 2017-2018-1 《信息安全系统设计基础》实验三

    20155308&20155316 2017-2018-1 <信息安全系统设计基础>实验三 并发程序-1 学习使用Linux命令wc(1) 基于Linux Socket程序设计实现 ...

  3. 2017-2018-1 20155234 实验三 实时系统及mypwd实现

    2017-2018-1 20155234实验三实时系统及mypwd实现 实验三-并发程序-1 学习使用Linux命令wc(1) 基于Linux Socket程序设计实现wc(1)服务器(端口号是你学号 ...

  4. struts2学习笔记(三)—— 在用户注冊程序中使用验证框架

    实现目标:       1.使用验证框架对用户注冊信息进行验证       2.验证username.password.邮箱不能为空       3.验证username.password长度     ...

  5. 软件工程第三个程序:“WC项目” —— 文件信息统计(Word Count ) 命令行程序

    软件工程第三个程序:“WC项目” —— 文件信息统计(Word Count ) 命令行程序 格式:wc.exe [parameter][filename] 在[parameter]中,用户通过输入参数 ...

  6. 微信小程序配置域名的时候提示“校验文件验证失败”

    在微信小程序后台配置web-view的业务域名跟扫普通链接二维码打开小程序两项功能时, 一直提示"校验文件验证失败,请下载校验文件,上传到服务器指定的目录" 实际访问校验文件的路径 ...

  7. OD 实验(八) - 对一个程序的逆向

    程序: 运行 弹出 NAG 窗口,提示要花 20 美元注册 然后会进入主窗口 提示剩余 5 天的使用时间 点击,菜单栏 -> Help -> About 显示未注册版本 逆向: 用 OD ...

  8. 20145229&20145316 《信息安全系统设计基础》实验三 实时系统的移植

    实验封面 实验内容 1.安装ADS(安装文件在00-ads1.2目录下,破解方法00-ads1.2\Crack目录下) 2.安装GIVEIO驱动(安装文件在01-GIVEIO目录下) 3.把整个GIV ...

  9. 20162330 实验三 《敏捷开发与XP实践》 实验报告

    2016-2017-2 实验报告目录: 1 2 3 4 5 20162330 实验三 <敏捷开发与XP实践> 实验报告 课程名称:<程序设计与数据结构> 学生班级:1623班 ...

随机推荐

  1. [置顶] 如何用PYTHON代码写出音乐

    如何用PYTHON代码写出音乐 什么是MIDI 博主本人虽然五音不全,而且唱歌还很难听,但是还是非常喜欢听歌的.我一直在做这样的尝试,就是通过人工智能算法实现机器自动的作词和编曲(在这里预告下,通过深 ...

  2. libcurl 错误码总结

    下载出现这种错误(Requested range was not delivered by the server  ),说明是重复下载,删掉本地的再下载就不会出现了

  3. SQL基础三(例子)

    -----------聚合函数使用------------------------ --1.查询student表中所有学生人数 select count(stuno) from student --2 ...

  4. [sklearn]性能度量之AUC值(from sklearn.metrics import roc_auc_curve)

    原创博文,转载请注明出处! 1.AUC AUC(Area Under ROC Curve),即ROC曲线下面积. 2.AUC意义 若学习器A的ROC曲线被学习器B的ROC曲线包围,则学习器B的性能优于 ...

  5. Android:BroadcastReceiver

    参考:<第一行代码:Android> 郭霖(著)   Broadcast分类 注册方式: 动态广播 在代码中注册receiver 一定要手动在onDestroy()时调用unregiste ...

  6. 批量归一化batch_normalization

    为了解决在深度神经网络训练初期降低梯度消失/爆炸问题,Sergey loffe和Christian Szegedy提出了使用批量归一化的技术的方案,该技术包括在每一层激活函数之前在模型里加一个操作,简 ...

  7. BZOJ1015: [JSOI2008]星球大战starwar【并查集】【傻逼题】

    Description 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系.某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这些星球通过 ...

  8. Luogu3387 缩点 【tarjan】【DP】

    Luogu3387 缩点 题目背景 缩点+DP 题目描述 给定一个n个点m条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之和最大.你只需要求出这个权值和. 允许多次经过一条边或者一个点, ...

  9. 如何使用 MSBuild Target(Exec)中的控制台输出

    我曾经写过一篇文章 如何创建一个基于命令行工具的跨平台的 NuGet 工具包,通过编写一个控制台程序来参与编译过程.但是,相比于 基于 Task 的方式,可控制的因素还是太少了. 有没有什么办法能够让 ...

  10. P2P UPD打洞原理

    转自:http://blog.pfan.cn/fengfei/18828.html 首先先介绍一些基本概念:            NAT(Network Address             Tr ...