OD 实验(十三) - 对一个程序的逆向
程序:

运行程序

点击 Start,它就会进行对系统的扫描

点击 About -> Enter Registration Code

随便输入一下内容,点击 OK,会弹出该弹窗
用 PEiD 看一下

该程序是用 Microsoft Visual C++ 6.0 写的
逆向:
用 OD 载入程序

右键 -> 查找 -> 所有模块间的调用

键盘直接敲 getwindowtext

找到几个 GetWindowTextA,A 为 ASCII 码,W 为 Unicode
右键 -> 在每个调用到 GetWindowTextA 上设置断点

程序调用到 GetWindowTextA 的地方都会被下断点

一共下了 3 个断点
另一个方法:

按 Ctrl+N

也是键盘直接敲 getwindowtext

右键 -> 在每个参考上设置断点

设置完断点之后跑一下程序

OD 停在该断点处,此时程序的界面都还没出来,这不是我们想要的 GetWindowTextA
把该断点去掉,按 F9 继续运行程序

又停在了 GetWindowTextA 处,此时什么都还没输入,所以这个也不是我们要的 GetWindowTextA
把断点去掉,按 F9 继续往下跑

界面出来了,按 About,输入注册码

点击 OK

程序停在了这个 GetWindowTextA 处
看一下栈的窗口

这三个为 GetWindowTextA 函数的三个参数
GetWindowTextA 的三个参数:
hWnd 为指向包含文本的窗口或控件的句柄
lpString 为指定将接收文本的缓冲区的指针。如果字符串和缓冲区一样长或更长,则该字符串将被截断,并以一个空字符结尾
nMaxCount 为指定拷贝到缓冲区内的字符的最大数目,其中包含空字符。如果文本超过这个限制,则它会被截断
hWnd 是获取 Edit 控件,父句柄为 000C05CE,,Buffer 的 值 00C04770 就是字符串存放的地址,这里 nMaxCount 的值为 4
按 F8 往下走

走到这里,EAX 的值为 4,因为刚才输入的 test 为 4 个字节
接下来的 je 跳转指令是对该字符串是否为空进行判断
之后的那条 je 跳转是判断输入的注册码是否为空

F8 继续往下走

这里有个跳转,如果 al 不等于 0 的话将会进行跳转

跳到该处,之后就是提示成功
此时的 al 为 0,不能直接跳转

影响 al 的值可能是上面这条 call 指令
可能在这个 call 中进行验证

下面还有一个一模一样的三条指令,可能是双重验证
F7 步入该 call 指令

看一下该函数的所有返回指令

这条 retn 指令之前有个 mov 指令,把 1 赋给 al,就是让 al 不等于 0

第二个 retn 指令之前有个 xor 指令,把 al 清零,也就是让 al 等于 0
所以我们要在第一个 retn 指令处返回
按 F8 往下走

这里有个已实现的跳转
如果跳转的话,就跳过了那个成功的 retn,之后就是失败的那个 retn

所以不能让它跳转

修改 SF 让其不跳转
继续 F8 往下

又有一个已实现的跳转

如果执行跳转的话,将刚好跳过成功的 retn
所以也不能跳,将 ZF 置 1
继续往下

这个 jnz 跳转也是跳到相同的位置,将 ZF 置 1,不跳转
继续往下走

第三个 jnz 跟前面两个一样,ZF 置 1 不跳转
继续往下
之后还有一个 jnz 跳转指令,跟上面三个情况一样,ZF 置 1,不进行跳转

继续往下走

之后就是成功的 retn 的语句了

出来之后,al 的值就为 1 了

跳转已实现,将进行跳转

跳转到成功之前的位置
进行跳转,往下走

提示注册成功
点击“确定”

但是这里却显示许可证没有被注册
回到 OD,右键 -> 查找 -> 所有参考字符串

找到该字符串
双击来到它所在的地方

该处是由上面那个 je 跳转指令进行跳转的,而 je 是否跳转取决于上面那个 al 的值,而 al 的值是它上面那个 call 语句决定的

在 call 处下一个断点,然后跑一下程序
点击程序的 About,程序会停在该断点处

F7 步入该函数
先看一下 retn

该函数只有一个 retn 返回
按 F8 往下走

这里将输入的注册码入栈,此时的 al 为 0,jnz 也就不进行跳转,会继续往下走,执行后面的 xor bl, bl 语句将 bl 清零

如果执行跳转的话,bl 的值就为 1

最终 al 的值取决于 bl 的值,所以要让 bl 的值为 0,也就是让上面那个 jnz 执行跳转
也可以直接将 mov al, bl 进行修改,确保 al 的值为非零

OD 实验(十三) - 对一个程序的逆向的更多相关文章
- OD 实验(十七) - 对一个程序的逆向分析
程序: 运行程序 弹出一个对话框,点击 OK 来到主界面,点击 Help -> Register Now 这是输入注册码的地方 按关闭程序的按钮 会提示剩下 30 天的使用时间 用 Ressco ...
- OD 实验(八) - 对一个程序的逆向
程序: 运行 弹出 NAG 窗口,提示要花 20 美元注册 然后会进入主窗口 提示剩余 5 天的使用时间 点击,菜单栏 -> Help -> About 显示未注册版本 逆向: 用 OD ...
- OD 实验(七) - 对一个程序的破解和去广告
程序: 这里有很多的动态链接库 双击运行程序 这个程序有次数限制 按钮也在隐藏处 主界面 退出程序,会弹出一个广告 目的: 让程序的使用次数不受限制,且没有显示次数的窗口 去除程序关闭时候的广告 逆向 ...
- OD 实验(十一) - 对一个程序的破解
程序: 点击安装程序 这是一个拼图程序 点击 Options -> Flash Sizes 程序会提示是未注册版本 点击一些选项的时候会提示该程序只给注册的用户 点击 Register 随便输入 ...
- OD 实验(九) - 对一个程序的破解
程序: 运行程序 点击 About 这是要注册的 点击 Register 输入邮箱和注册码,点击 Register Now 逆向: 用 OD 打开程序 右键 -> 查找 -> 所有参考文本 ...
- OD 实验(六) - 对一个程序的破解
程序: 双击进行安装,安装过程默认就好了 安装完成 运行程序 输入 User 为 sch01ar,点击 Create 点击 Log In 这里显示为未注册版本 看看未注册版本有哪些功能被限制 这里会显 ...
- OD 实验(十五) - 对一个程序的逆向
程序: 打开程序 出现一个 NAG 窗口 这是主界面 点击 Exit 程序出现 NAG 窗口,然后退出 用 PEiD 看一下 是用 VC++ 6.0 写的程序 逆向: 用 OD 载入程序 跑一下程序 ...
- OD 实验(十) - 对一个 VB 程序的逆向
前话: VB 程序用 OD 进行逆向的话,可以先查找相关的变量和字符串,以寻找突破口 变量: __vbaVarTstEq __vbaVarCompEq __vbaVarTstNe __vbaVarCo ...
- 【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验十三:串口模块② — 接收
实验十三:串口模块② - 接收 我们在实验十二实现了串口发送,然而这章实验则要实现串口接收 ... 在此,笔者也会使用其它思路实现串口接收. 图13.1 模块之间的数据传输. 假设我们不考虑波特率,而 ...
随机推荐
- java作业调度框架Quartz
在软件开发中,很多时候需要在特定时间的时间执行某些操作,比如每天的凌晨三点.每周的周日.每个月的15号,Apache Quartz就是一个开源的作业调度框架,可以让计划的程序任务一个预定义的日期和时间 ...
- MPAndroidChart Wiki(译文)~Part 5
19. ChartData子类 这篇wiki主要关注ChartData子类的具体介绍.至于此部分没有提及到的ChartData的子类,代表他们没有特性功能需要介绍. BarData 方法 使用 set ...
- [Linux] 输出文件的指定行
1.获取第k行(以k=10为例) 要注意的是,如果文件包含内容不足10行,应该不输出. # Read from the file file.txt and output the tenth line ...
- Linux下的Maven安装与配置
关于Maven的介绍可以参考:Maven详解 这篇在原理上讲得比较详细,在安装上是windows版本的,这里补上linux下的安装和配置: 1.下载maven安装包 http://maven.apac ...
- [CSAPP笔记]Binary , Unsigned , Signed 之间的相互装换
LaTex+MarkDown+Pandoc组合套件写博客的处女作,试试效果.各自的分工为:Latex下编辑公式,在Sublime Text 2下使用Markdown排版,最后用Pandoc导出. 摘要 ...
- python数据取整
第三方包:numpy 安装 $ sudo dnf install numpy 4舍6入5取偶 def getInteger(): a = np.float(5.5) # 4舍6入 5取偶 int_a ...
- phpcms后台主菜单不显示
phpcms\modules\admin\templates\main.tpl.php 注释掉既可
- matlab 相关系数的计算
1. 首先说说自相关和互相关的概念. 这 个是信号分析里的概念,他们分别表示的是两个时间序列之间和同一个时间序列在任意两个不同时刻的取值之间的相关程度,即互相关函数是描述随机信号 x(t),y ...
- 服务器上通过FTP共享文件夹
近日,公司某服务器共同操作的人员增多,而我只需访问及替换某些文件,故想到共享文件夹. 在IIS中建立ftp站点,添加虚拟目录(可多个,对应不同文件夹),设置允许访问的用户(添加用户,见在IIS上搭建F ...
- LOJ#3054. 「HNOI 2019」鱼
LOJ#3054. 「HNOI 2019」鱼 https://loj.ac/problem/3054 题意 平面上有n个点,问能组成几个六个点的鱼.(n<=1000) 分析 鱼题,劲啊. 容易想 ...