7、软件漏洞挖掘与防护---深入代码分析完成软件注册

项目七 深入代码分析完成软件注册

一、 项目环境

VMware Workstation Pro 安装 Windows Server 2008 Datacenter 操作系统。

二、 项目软件工具

1.未注册版软件 MrBills(一款扫描仪软件)
2.软件安全动态分析工具 OllyDbg

三、 项目实践

项目需求:通过 OllyDbg 软件深入分析 MrBills.exe 程序,使其原本未注册软件变成已注册版软件,然后可以使用户能够正常使用该款软件。
项目操作:

1.运行 VMware Workstation Pro 的 Windows Server 2008 操作系统,进入操作系统后运行 MrBills.exe 软件程序,进入软件主界面,可以看到该款软件为未注册版本软件,如图 7-1 所示。

在这里插入图片描述
图 7-1 软件主界面

2.点击上图主界面中的[About]按钮,弹出该软件的版本信息界面,在版本信息界面当中有[Register]注册按钮,如图 7-2 所示。

在这里插入图片描述
图 7-2 版本信息

3.点击[Register]注册按钮,输入任意的邮件地址和许可证号,然后点击注册, 如图 7-3 所示,结果会发现弹出注册失败提示框,提示我们“您输入了无效的电子邮件地址或许可证号,请再试一次”如图 7-4 所示。

在这里插入图片描述
图 7-3 注册界面

在这里插入图片描述

图 7-4 注册失败

4.记住图 7-4 的这句注册失败提示信息,因为它可以作为一个关键的字符串来查找。用 OllyDbg 打开 MrBills.exe 程序,在 CPU 主窗口中右键→查找所有参考文本字符串→查找注册失败的提示信息“You have entered an invalid…”(注意把进度条拉至文本字串的最上方,因为文本字串是从上往下查找的),如图 7-5 所示。

在这里插入图片描述
图 7-5 文本字符串查找

5.双击该字符串,跟随到 CPU 窗口中,这时我们看到了这条提示信息上方有一条跳转指令“jnz”,分析该跳转指令,由于注册的时候弹出的是注册失败提示信息,说明该关键跳转“jnz”未实现跳转,如果是实现跳转的话根据图 7-6 可知提示的应该是注册成功“Thank you for registering!”的提示内容。之前的章节我们知道影响 jnz 跳转的标志位是 ZF 标志位,当 ZF=0 时,实现跳转,ZF=1 时不跳转,那么此处 ZF=1,所以 jnz 跳转指令才没有跳转。故该跳转指令为关键跳转, 给这个跳转指令下个注释,注释为关键跳转,如图 7-6 所示。

在这里插入图片描述
图 7-6 关键跳转

6.接下来要分析是哪条指令影响跳转 jnz 的条件判断呢?观察图 7-6,在 jnz 跳转指令上方有一条“test al,al”指令,该指令会改变寄存器中标志位 ZF 的值(0 或 1)。因为 test 指令进行的是逻辑与运算(and),如果两个 al 为 1 的话,结果为 1;两个为 0 的话,结果为 0。它不改变 al 的值,只会修改标志位的值。此时通过 eax 寄存器可以看出 al 为 0,所以 ZF 标志位为 1,(运算结果为 0 时,标志位 Z 置 1),如图 7-7 所示,进而 jnz 不会跳转,即来到注册失败处。

在这里插入图片描述
图 7-7 寄存器窗口

7.综上我们就可以推理出,想办法把 al 的值由 0 变为 1,就可以实现 jnz 关键跳转,进而使软件注册成功了!但是 al 值又是谁决定的呢?这是我们接下来需要思考的问题。如图 7-8 所示,可以看到在 test 语句上方有一个 call 语句,我们在 win32 汇编语言里学过 call 调用函数进行一堆操作之后的返回值都存放在寄存器 EAX 里,也就是说这个 call 语句会影响到 al 的值。(al 是 eax 的最低位/最后一个字节,eax 是 32 位的,al 是 8 位)那么这个 call 语句就是需要进入分析的,在该 call 语句处下断点,重载后写入注册信息触发该断点,接着按下F7 进入这个 call 语句里。

在这里插入图片描述
图 7-8 第一个 call 语句

8.进入第一个 call 语句界面后,不要盲目地按 F8 单步步过往下执行,先观察下程序内容(很多初学者就一直 F8 走,寄存器也不看,下面地址也不看,进行了什么样的逻辑关系也不看,就是直接的走,然后就迷路了!)观察之后,我们发现又出现了两个相连 call 和 test,如图 7-9 所示。这两个 call 也会影响到我们关注的 al 的值,所以注释上“需进入”,方便之后进入分析。

在这里插入图片描述
图 7-9 第二、第三个 call 语句

9.我们先 F7 进入第二个 call 语句里面,观察分析里面的代码,发现了两个关于al 的可疑之处,如图 7-10 所示。mov bl,al 和 mov al,bl 这两句指令是干啥的呢?这两句指令执行就是将 al 的值给 bl,bl 的值再还给 al。现在我们可以推想一下,bl 可能是用来暂时保存数据的,al 标志着是否已经被注册,它不希望被修改,所以将 al 保存在 bl 里面,经过一些操作后,再将 bl 赋给 al。那么在这之前,决定 al 值的 call 语句或许就是一个关键点!

在这里插入图片描述
图 7-10 第四个 call 语句

10.接下来按 F7 步入到第四个 call 语句里面,然后按 F8 单步往下执行,执行到“inc bl”加一指令,我们发现寄存器窗口中 bl 值为 00,再继续往下执行,执行到“mov al,bl”指令处,此时 al 的值也为 00,如图 7-11 所示。

在这里插入图片描述
图 7-11 al 值为 0

11.根据上图,我们发现 al 的值在这里被 bl 赋为 0,这里其实就是修改的关键点了,将这个 al 的值修改为 1 的话,就可以注册成功了,但我们先走出去,稍后再来一轮到这里进行修改。按下 F8 往下执行,我们要绕出去,最后会返回到第一个 call 语句下方,如图 7-12 所示。

在这里插入图片描述

图 7-12 返回到第一个 call 语句位置

12.好了,进到几个关键 call 里面仔细分析一番以后后,终于找到了注册的关键所在,只需要把第 4 个关键 call 语句里面的 al 的值修改为 1(原来为 0),就可以注册成功了!使用“mov al,1”指令将 al 值修改为 1,如图 7-13 所示。

在这里插入图片描述
图 7-13 修改关键点

13.然后按下 F9 运行程序,我们会发现软件注册成功,并且主界面上的未注册提示“Unregistered”也不见了,如图 7-14 所示。

在这里插入图片描述
在这里插入图片描述

图 7-14 注册成功

14.最后我们需要选中修改的指令进行保存,右键→复制到可执行文件→备份→ 保存数据到文件,保存文件名为 MrBills(1).exe,然后在打开保存后的程序,发现已然是一个注册完后的软件,如图 7-15 所示。

在这里插入图片描述

图 7-15 保存文件

发布了46 篇原创文章 · 获赞 62 · 访问量 29万+

猜你喜欢

转载自blog.csdn.net/qq_42250189/article/details/105582020