OllyDbg动态调试与逆向破解TraceMe.exe

Posted Tr0e

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OllyDbg动态调试与逆向破解TraceMe.exe相关的知识,希望对你有一定的参考价值。

前言

OllyDbg 是一个新的动态追踪工具,是将 IDA 与 SoftICE 结合起来的产物,Ring3 级调试器,非常容易上手,另外由于 OllyDbg 是一个通用的 32 位汇编分析调试器且操作界面非常直观简单,己代替 SoftICE 成为当今最为流行的调试解密工具了。同时 OllyDbg 还支持插件扩展功能,是目前最强大的调试工具,OllyDbg中文官方网站

OllyDbg

下面先简单介绍下 OllyDbg 这款工具的基本使用,OllyDbg下载地址(吾爱破解专用版)

基础介绍

OllyDbg 的核心窗口如下:

简单解释一下各个窗口的功能:

窗口功能
反汇编窗口显示被调试程序的反汇编代码
寄存器窗口显示当前所选线程的 CPU 寄存器内容
信息窗口显示反汇编窗口中选中的第一个命令的参数及一些跳转目标地址、字串等
数据窗口显示内存或文件的内容
堆栈窗口显示当前线程的堆栈

OllyDbg 有两个关键的路径配置项目需要指定:

  • UDD 目录:其作用是保存你调试的工作,比如你调试一个软件,设置了断点,添加了注释,一次没做完,这时 OllyDBG
    就会把你所做的工作保存到这个 UDD 目录,以便你下次调试时可以继续以前的工作;

  • Plugin 插件目录:OllyDBG 支持插件功能,插件的安装也很简单,只要把下载的插件(一般是个 DLL 文件)复制到 OllyDBG 安装目录下的 PLUGIN 目录中就可以了,OllyDBG 启动时会自动识别。

配置页面如下图所示:

快捷操作

OllyDbg 的核心快捷键:

快捷键备注
F2:设置断点只要在光标定位的位置(上图中灰色条)按F2键即可,再按一次F2键则会删除断点
F8:单步步过每按一次这个键执行一条反汇编窗口中的一条指令,遇到 CALL 等子程序不进入其代码
F7:单步步入功能同单步步过(F8)类似,区别是遇到 CALL 等子程序时会进入其中,进入后首先会停留在子程序的第一条指令上
F4:运行到选定位置作用就是直接运行到光标所在位置处暂停
F9:运行按下这个键如果没有设置相应断点的话,被调试的程序将直接开始运行
CTRL+F9:执行到返回此命令在执行到一个 ret (返回指令)指令时暂停,可用于快速定位到当前 CALL 所调用函数的末端位置
Alt+b:打开断点编辑器可查看、编辑所有下过的断点
Alt+F9:执行到用户代码如果跟进系统DLL提供的API函数中,此时想返回到应用程序领空里,可用该快捷键执行返回到用户代码命令

OllyDbg 的其他介绍和使用方法此处不再展开,有兴趣可学习一下 OllyDbg 的教程(B站视频):动态调试工具之OllyDbg(OD)教程

TraceMe

本文所要演示的 TraceMe.exe 程序,来自段钢的《加密与解密》一书中的示例程序,程序下载地址

程序的大致运行流程如下:

下文的目的是借助 OllyDbg 对程序的逻辑进行分析并尝试破解序列号校验(类似于软件破解)。

调试分析

1、使用 OllyDbg 打开 TraceMe.exe 程序,程序将自动暂停在 WinMain() 函数入口点( 该函数是 32 位应用程序开始执行时的入口点),点击如下按钮或者 F9 开始运行程序:
2、从工具栏的插件选项中打开 “API断点设置工具”,尝试勾选常见的的文本框数值获取的函数 “GetDlgItemTextA”,点击确定后程序将自动在程序中调用了该函数的位置设置断点:
3、接着任意输入用户名和序列号,点击 check 按钮,发现程序暂停到 上述设置的调用函数 “GetDlgItemTextA” 的地址处:4、按快捷键 Ctrl+F9,使程序快速执行到函数 “GetDlgItemTextA” 的末尾 ret 返回指令处暂停(结合堆栈窗口的信息,猜测本次函数调用仅获取了用户名 “11111”):
5、接着按 F8 单步步过,程序将返回至原先调用了该 “GetDlgItemTextA” 函数的程序位置处(结合汇编代码、注释栏目的信息可确认确实调用了两次获取控件值的参数):
6、继续按 F8 单步步过,直到 CALL 指令处,程序已经搜集完用户输入的用户名和序列号,同时在该位置将两个值压入栈中,猜测此处正式调用了判断序列号是否有效的核心逻辑函数:
7、按 F7 单步步入,跳转并查看被调用的函数的内部逻辑:
F8 单步步过,运行到该函数末尾,注意到栈中原来存储用户名的变量值发生了改变(同时请留意下 EAX 寄存器的值均为 0):
8、继续 F8,返回程序程序原来的运行位置,发现后面即将紧接着执行 test 判断指令( 汇编语言的 test 指令是测试指令,用于测试某些位是否为0,执行的是与运算,并且会将 CF 和 OF 置 0,并且影响 SF、ZF,若测试的位均为 0,则 SF=0、ZF=1),同时紧跟着执行了 je 判断跳转指令( je 指令即 Jump if Equals,在 ZF 被置位时跳转):
继续 F8,在 je 指令的汇编代码行处可以添加注释“疑似关键跳转”:
9、继续 F8,进行跳转,发现信息窗口已经开始提示序列号错误:

10、直接 F9 放行程序,弹窗提示序列号错误:

破解校验

通过上述调试分析,基本上可以判定 004011F5 地址处的关键跳转指令将直接影响程序进行序列号校验的运行结果,下面尝试通过 OllyDbg 对运行结果进行断点拦截和篡改,从而绕过序列号校验。

1、既然 je 指令对 ZF 标志位的值进行了判断,可以在 je 指令处设置断点,重新运行程序并输入错误的用户名密码,然后篡改 ZF 标志位的值(由 1 改为 0):
2、接着放行程序,奇迹就此诞生,成功破解:

程序篡改

问题来了:上述通过篡改程序运行过程中寄存器的值的方式不太方便,你总不能每次运行该程序都打开 OllyDbg 进行动态调试篡改吧?那么,能不能一步到位,永久实现破解,每次都开该程序都能自动绕过序列号校验呢?答案当然是可以,但是方法不是该寄存器标志位的值,而是该程序的汇编代码了(即 je 汇编指令),下面进行演示。

1、双击 je 指令处的汇编代码,将 je 修改为 jne 指令:
2、选中修改的这一条汇编指令(上下多选中几条也没关系),右键选择保存到可执行程序:
3、在弹出的新窗口继续右键选择“Save File”选项,将修改后的程序另存为 TrcaeMeHack.exe 文件:
4、随后运行篡改并保存的 TrcaeMeHack.exe 文件,随意输入用户名和序列号,发现均可绕过序列号校验:

至此,整个程序的破解工作已完成!

总结

本文介绍了 OllyDbg 调试工具的使用,并借助 TraceMe.exe 测试程序对其进行调试并成功破解其序列号校验。由于侧重介绍 OllyDbg 的使用和对程序的猜解思路,故调试过程中没深究与分析程序的校验逻辑,关于程序的逆向分析与破解脚本编写可参见:TraceMe注册机编写 OD工具使用-逆向TraceMe.exe

同时可以看到,OllyDbg 的动态调试功能与作用,跟上一篇文章 GDB动态调试攻防世界Simple-Check-100 介绍的 Linux 下的动态调试工具 GDB 属于异曲同工!

以上是关于OllyDbg动态调试与逆向破解TraceMe.exe的主要内容,如果未能解决你的问题,请参考以下文章

OllyDbg逆向破解入门攻略?拿来吧你!

OllyDbg逆向破解入门攻略?拿来吧你!

Windows 逆向OD 调试器工具 ( 推荐汉化版的 OD 调试工具 | 吾爱破解专用版Ollydbg | 备选工具 )

逆向学习入门-优秀的汇编调试工具OllyDbg

windows逆向 -- Debug工具简介

如何使用 Ollydbg 对软件进行逆向工程