您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列。因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全、逆向分析和恶意代码检测,“系统安全”系列文章会更加聚焦,更加系统,更加深入,也是作者的慢慢成长史。换专业确实挺难的,逆向分析也是块硬骨头,但我也试试,看看自己未来四年究竟能将它学到什么程度,漫漫长征路,偏向虎山行。享受过程,一起加油~

作者前文介绍了OllyDbg动态调试工具的基本用法,包括界面介绍、常用快捷键和TraceMe案例分析。这篇文章将讲解逆向分析之OllyDbg动态调试工具,包括INT3断点、反调试、硬件断点和内存断点。 这些基础性知识不仅和系统安全相关,同样与我们身边常用的软件、文档、操作系统紧密联系,希望这些知识对您有所帮助,更希望大家提高安全意识,安全保障任重道远。本文参考了B站yxfzedu、安全网站和参考文献中的文章,并结合自己的经验和实践进行撰写,在此感谢这些大佬们。

文章目录

  • 一.常用断点之INT3断点
    • 1.查看INT3断点
    • 2.INT3原理
    • 3.INT3例子
  • 二.INT3断点的反调试与反反调试
  • 三.常用断点之硬件断点原理解析
  • 四.常用断点之内存断点原理解析
  • 五.总结

作者的github资源:
软件安全:https://github.com/eastmountyxz/Software-Security-Course
其他工具:https://github.com/eastmountyxz/NetworkSecuritySelf-study
逆向分析:https://github.com/eastmountyxz/Reverse-Analysis-Case

文章目录

  • 一.常用断点之INT3断点
    • 1.查看INT3断点
    • 2.INT3原理
    • 3.INT3例子
  • 二.INT3断点的反调试与反反调试
  • 三.常用断点之硬件断点原理解析
  • 四.常用断点之内存断点原理解析
  • 五.总结

从2019年7月开始,我来到了一个陌生的专业——网络空间安全。初入安全领域,是非常痛苦和难受的,要学的东西太多、涉及面太广,但好在自己通过分享100篇“网络安全自学”系列文章,艰难前行着。感恩这一年相识、相知、相趣的安全大佬和朋友们,如果写得不好或不足之处,还请大家海涵!

接下来我将开启新的安全系列,叫“系统安全”,也是免费的100篇文章,作者将更加深入的去研究恶意样本分析、逆向分析、内网渗透、网络攻防实战等,也将通过在线笔记和实践操作的形式分享与博友们学习,希望能与您一起进步,加油~

  • 推荐前文:网络安全自学篇系列-100篇

作者的github资源:

  • 逆向分析:https://github.com/eastmountyxz/SystemSecurity-ReverseAnalysis
  • 网络安全:https://github.com/eastmountyxz/NetworkSecuritySelf-study

前文分析:

  • [系统安全] 一.什么是逆向分析、逆向分析基础及经典扫雷游戏逆向
  • [系统安全] 二.如何学好逆向分析及吕布传游戏逆向案例
  • [系统安全] 三.IDA Pro反汇编工具初识及逆向工程解密实战
  • [系统安全] 四.OllyDbg动态分析工具基础用法及Crakeme逆向
  • [系统安全] 五.OllyDbg和Cheat Engine工具逆向分析植物大战僵尸游戏
  • [系统安全] 六.逆向分析之条件语句和循环语句源码还原及流程控制
  • [系统安全] 七.逆向分析之PE病毒原理、C++实现文件加解密及OllyDbg逆向
  • [系统安全] 八.Windows漏洞利用之CVE-2019-0708复现及蓝屏攻击
  • [系统安全] 九.Windows漏洞利用之MS08-067远程代码执行漏洞复现及深度提权
  • [系统安全] 十.Windows漏洞利用之SMBv3服务远程代码执行漏洞(CVE-2020-0796)复现
  • [系统安全] 十一.那些年的熊猫烧香及PE病毒行为机理分析
  • [系统安全] 十二.熊猫烧香病毒IDA和OD逆向分析(上)病毒初始化
  • [系统安全] 十三.熊猫烧香病毒IDA和OD逆向分析(中)病毒释放机理
  • [系统安全] 十四.熊猫烧香病毒IDA和OD逆向分析–病毒释放过程(下)
  • [系统安全] 十五.Chrome浏览器保留密码功能渗透解析、蓝屏漏洞及某音乐软件漏洞复现
  • [系统安全] 十六.PE文件逆向基础知识(PE解析、PE编辑工具和PE修改)
  • [系统安全] 十七.Windows PE病毒概念、分类及感染方式详解
  • [系统安全] 十八.病毒攻防机理及WinRAR恶意劫持漏洞(脚本病毒、自启动、定时关机、蓝屏攻击)
  • [系统安全] 十九.宏病毒之入门基础、防御措施、自发邮件及APT28宏样本分析
  • [系统安全] 二十.PE数字签名之(上)什么是数字签名及Signtool签名工具详解
  • [系统安全] 二十一.PE数字签名之(中)Signcode、PEView、010Editor、Asn1View工具用法
  • [系统安全] 二十二.PE数字签名之(下)微软证书漏洞CVE-2020-0601复现及Windows验证机制分析
  • [系统安全] 二十三.逆向分析之OllyDbg动态调试复习及TraceMe案例分析
  • [系统安全] 二十四.逆向分析之OllyDbg调试INT3断点、反调试、硬件断点与内存断点

声明:本人坚决反对利用教学方法进行犯罪的行为,一切犯罪行为必将受到严惩,绿色网络需要我们共同维护,更推荐大家了解它们背后的原理,更好地进行防护。该样本不会分享给大家,分析工具会分享。(参考文献见后)


一.常用断点之INT3断点

1.查看INT3断点

INT3断点对应OD中的F2断点,有时也称为CC断点。为什么叫CC断点呢?因为转换成硬编码之后就是CC,我们来查看CC断点。

首先,我们用OD打开程序TraceMe.exe

打开之后会自动定位至004013A0,接着再下一行增加断点(按F2),即INT3断点。

但OD中并没有显示CC,我们打开Cheat Engine软件。

然后在OD按下F9运行,弹出如下图对话框。

接着在CE中选择该程序TraceMe打开。

然后点击“手动加入地址”,输入地址“4013A1”。

接着选中数据并右键点击“显示未十六进制”。

由于采用小端存储,故“FF6AECCC”是从右往左数的,如下图所示。

如果我们选择“4字节”点击,然后选择“Byte”,可以转换成1个字节,因为CC就占用一个字节,我们主要是观察它的。

为什么OD不显示CC呢?
其实OD是为了不破坏源代码的完整性,默认隐藏掉了。


2.INT3原理

接着我们分析INT3的原理。程序运行中,OD会检查汇编指令有没有INT3,即机器码有没有CC指令。如果存在,就会引发并捕获这个异常,程序就中断在此处,然后OD会删除INT3,还原原来的代码,接着继续运行我们的程序。

执行流程的原理可归纳为:

  • 替换指令,换成INT3指令或CC硬编码
  • OD检测到INT3指令之后会引发一个异常并且捕获它,这时候程序就会中断
  • 删除INT3指令,还原之前的指令

优点:

  • 可以无限的下INT3断点

缺点:

  • 很容易被检测

为什么要详细介绍断点的原理呢?
只有了解每个断点的原理之后,以后做爆破才知道应该下什么样的断点合适。


3.INT3例子

接下来我们举个INT3断点的例子,使用OD打开TraceMe.exe程序,设置API断点。

这里勾选“GetDlgItemTextA”函数。

接着输入用户名和序列号,按F9运行程序。

代码会停在“761F4390”位置,我们接着用CE看看它是不是CC断点。

接着以十六进制显示,并只显示一字节,发现的确是CC断点。所以,CC断点很容易被检测出来。


二.INT3断点的反调试与反反调试

我们编写的软件被爆破时,总会被下INT3断点,我们能不能写个程序防止别人下CC断点,从而保护我们的程序呢?这个就叫反调试,而反反调试是绕过保护过程。

  • 反调试:保护这个程序
  • 反反调试:爆破这个程序

基础知识:

  • FARPROC结构体
  • GetProcAddress函数
    它是一个计算机函数,功能是检索指定的动态链接库(DLL)中的输出库函数地址
  • LoadLibrary函数
    将指定的模块加载到调用进程的地址空间中

接着我们用VS编写代码讲解。LoadLibrary函数会返回一个句柄,然后调用GetProcAddress函数。GetProcAddress返回值包括:

  • 如果函数调用成功,返回值是DLL中的输出函数地址
  • 如果函数调用失败,返回值是NULL。得到进一步的错误信息,调用函数GetLastError
FARPROC GetProcAddress(HMODULE hModule,     // DLL模块句柄LPCSTR lpProcName    // 函数名
);

第一步,我们打开VS编写C++代码。

下列代码是获取MessageBoxA函数的首地址,并判断是否为CC断点。

#include <iostream>
#include <Windows.h>
int main()
{//获取MessageBoxA的首地址FARPROC addr = GetProcAddress(LoadLibrary(L"user32.dll"), "MessageBoxA");//仅获取首地址的第一个字节byte byteAddr = *(byte *)addr;//弹框::MessageBoxA(NULL, "内容", "标题", MB_OK);//判断地址if(byteAddr == 0xCC) {//检测到有人在调试我们的程序 退出程序printf("检测到非法调试");}else {printf("代码正常");}getchar();
}

在VS中输入上述代码。

第二步,运行前,需要简单设置。

  • 设置Release

  • 设置属性

  • 禁用Spectre缓解

  • 设置随机基址否

第三步,接着运行代码
运行结果如下图所示:

显示代码正常执行。

第四步,使用OD调试程序
接下来我们尝试调试这个EXE程序,用OD打开“ConsoleApplication1.exe”。

OD打开如下图所示:

然后点击“插件”->“API断点设置工具”->“常用断点设置”,给MessageBoxA下断点。

运行OD,断点位于761E0F40位置,对应user32.MessageBoxA。

继续运行代码。

查看调试信息,发现检测到非法调试,也表明我们的判断没有问题。

第五步,删除断点对比执行结果
接着按下“b”删除断点,继续运行代码。

发现代码正常运行。

这就是一个INT3断点的反调试过程。
那么,怎么进行反反调试呢?我们又怎么下INT3断点呢?

我们进入函数之后,可以将断点下到中间或尾部即可。OD重新打开程序,并找到MessageBoxA的位置。

我们在中间位置下断点,如下图所示 761E0F45处。

接着F9运行程序,发现此时输出“代码正常”,该断点并没有被检测出来,这就是所谓的反反调试。


三.常用断点之硬件断点原理解析

硬件断点和调试寄存器有关,共有8个调试寄存器DR0~DR7。

  • DR0~DR3: 保存断点地址。由于只有4个硬件断点寄存器,所以同时最多只能设置4个硬件断点
  • DR4~DR5: 系统保留
  • DR6: 状态寄存器,显示哪个硬件调试寄存器引发的断点。如果是Dr0-Dr3的话,相应位会被置1。如果是Dr0引发的断点,则Dr6的第0位被置1;如果是Dr1引发的断点,则Dr6的第1位被置1,依次类推。因为硬件断点同时只会触发一个,所以Dr6的低4位最多只有一位被置1,所以在进入单步后,我们可以通过检测Dr6的低4位是否有1的位,就可以判断该单步是否是因为硬件断点被断下的。如果是硬件断点被断下的,进而可以通过Dr6的哪一位为1来判断是由Dr0-Dr3中的哪个断点断下的。
  • DR7: 控制寄存器。设置相应控制位,用于控制断点的方式

原理:

  • DR0~DR3保存我们断点的地址
  • DR7寄存器设置相对应的控制位
  • 程序执行到该地址时,CPU会向OD发送异常信息
  • 程序会执行中断操作,等待用户操作

优点:

  • 速度快,比INT3快,因为INT3需要改汇编代码,而硬件断点使用寄存器
  • 不容易被检测

缺点:

  • 最多只能下4个硬件断点

接着我们继续用OD分析TraceMe.exe为例,打开之后定位至004013A0位置。

选择004013B6位置,右键“断点”->“硬件执行”。

这样就增加了一个硬件断点,当CPU运行到该地址会发送一场信息中断。

如何查看硬件断点呢?点击“调试”->“硬件断点”可以查看刚打的硬件断点。

接着按下F9运行程序,它会停在硬件断点位置。


四.常用断点之内存断点原理解析

在介绍内存断点之前,首先需要知道什么是内存属性。内存属性包括Read、Write、Execute的组合,即可读、可写、可执行。比如VirtualProtectEx函数,可以改变在特定进程中内存区域的保护属性。

内存断点就是根据内存属性来实现的,比如想对一个地址打个内存访问断点,就是把这个地址的内存属性改为不可访问(不可读写执行),当程序运行到此处时,就会产生一个异常被OD捕获,从而中断程序。

原理:

  • 设置完内存断点之后,它就是对这个地址赋予了不可读、不可写、不可执行的属性
  • 程序运行到这里之后,会产生一个异常
  • OD捕获这个异常,然后程序中断,实现了一个内存断点

优点:

  • 没有改变汇编代码,改变的是内存属性
  • 游戏爆破时,如果常规断点没效果,可以尝试内存断点

接下来我们想在004013D0位置代码增加内存断点,对应代码:

mov dword ptr ds:[0x405528],edx

该代码就是一个写操作,edx往ds:[0x405528]中写入一个值。

选择数据窗口中跟随。

然后再数据窗口中选择4个字节,右键“断点”->“内存写入”或“内存访问”。

然后按下F9运行,此时断到了此处。证明我们内存写入断点已经生效。

接下来补充内存读写断点和硬件读写断点的区别。

以刚才的代码为例,我们先删除刚才的内存断点。

接着OD重新打开EXE程序,数据窗口跟随到405528。

选中4字节,设置其为“硬件写入”断点。

运行代码,此时硬件断点断在了下一行位置004013D6。

至此,内存断点和硬件断点介绍完毕!


五.总结

写到这里,这篇文章就介绍完毕,希望您喜欢~

  • 常用断点之INT3断点
    1.查看INT3断点
    2.INT3原理
    3.INT3例子
  • INT3断点的反调试与反反调试
  • 常用断点之硬件断点原理解析
  • 常用断点之内存断点原理解析

这篇文章中如果存在一些不足,还请海涵。作者作为网络安全初学者的慢慢成长路吧!希望未来能更透彻撰写相关文章。同时非常感谢参考文献中的安全大佬们的文章分享,感谢师傅、师兄师弟、师姐师妹们的教导,深知自己很菜,得努力前行。

欢迎大家讨论,是否觉得这系列文章帮助到您!任何建议都可以评论告知读者,共勉。

  • 逆向分析:https://github.com/eastmountyxz/SystemSecurity-ReverseAnalysis
  • 网络安全:https://github.com/eastmountyxz/NetworkSecuritySelf-study

2020年8月18新开的“娜璋AI安全之家”,主要围绕Python大数据分析、网络空间安全、人工智能、Web渗透及攻防技术进行讲解,同时分享CCF、SCI、南核北核论文的算法实现。娜璋之家会更加系统,并重构作者的所有文章,从零讲解Python和安全,写了近十年文章,真心想把自己所学所感所做分享出来,还请各位多多指教,真诚邀请您的关注!谢谢。

(By:Eastmount 2021-02-4 夜于武汉 http://blog.csdn.net/eastmount/ )


参考文章:
[1] 动态调试工具之OllyDbg(OD)教程 - B站yxfzedu
[2] [逆向笔记] OD工具使用-逆向TraceMe.exe- 17bdw随手笔记
[3]《加密与解密》段钢等著
[4]《OllyDBG入门教程》看雪学院 - CCDebuger
[5] 160个Crackme006 - 鬼手56大佬
[6] [调试逆向] 硬件断点的原理与实现 - 52PJ VicZ
[7] https://github.com/eastmountyxz/Reverse-Analysis-Case
[8] Cheat Engine 基本用法 - thomas_blog

[系统安全] 二十四.逆向分析之OllyDbg调试INT3断点、反调试、硬件断点与内存断点相关推荐

  1. [系统安全] 二.如何学好逆向分析及吕布传游戏逆向案例

    您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列.因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全.逆向分 ...

  2. [系统安全] 三十.CS逆向分析 (1)你的游戏子弹用完了吗?Cheat Engine工具入门普及

    您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列.因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全.逆向分 ...

  3. [系统安全] 二十三.逆向分析之OllyDbg动态调试复习及TraceMe案例分析

    您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列.因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全.逆向分 ...

  4. Power BI(二十四)power pivot之产品/客户分类分析(ABC分析)

    Power BI(二十四)power pivot之产品/客户分类分析(ABC分析) 之前我们介绍过帕累托分析,现在我们使用power pivot进行产品/客户分类分析(ABC分析) 我们就以产品ABC ...

  5. [安全攻防进阶篇] 四.逆向分析之条件语句和循环语句源码还原及流程控制逆向

    从2019年7月开始,我来到了一个陌生的专业--网络空间安全.初入安全领域,是非常痛苦和难受的,要学的东西太多.涉及面太广,但好在自己通过分享100篇"网络安全自学"系列文章,艰难 ...

  6. 异常处理程序和软件异常——Windows核心编程学习手札之二十四

    异常处理程序和软件异常 --Windows核心编程学习手札之二十四 CPU负责捕捉无效内存访问和用0除一个数值这种错误,并相应引发一个异常作为对错误的反应,CPU引发的异常称为硬件异常(hardwar ...

  7. 云计算设计模式(二十四)——仆人键模式

    云计算设计模式(二十四)--仆人键模式 使用一个令牌或密钥,向客户提供受限制的直接訪问特定的资源或服务,以便由应用程序代码卸载数据传输操作. 这个模式是在使用云托管的存储系统或队列的应用中特别实用,而 ...

  8. python 分数序列求和公式_Python分数序列求和,编程练习题实例二十四

    本文是关于Python分数序列求和的应用练习,适合菜鸟练习使用,python大牛绕行哦. Python练习题问题如下: 问题简述:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13 要 ...

  9. 数字图像处理领域的二十四个典型算法及vc实现、第一章

    数字图像处理领域的二十四个典型算法及vc实现.第一章 作者:July   二零一一年二月二十六日. 参考:百度百科.维基百科.vc数字图像处理. --------------------------- ...

最新文章

  1. Django 搭建CMDB系统完整[1](用户登录)
  2. jQuery属性操作
  3. asp.net mysql 事务_ASP.NET Core 1.0 使用 Dapper 操作 MySql(包含事务)
  4. linux下vi的一些简单的操作
  5. 51nod-1640--天气晴朗的魔法(简单最小生成树)
  6. SAP Spartacus 服务器端渲染编程规范
  7. JavaWeb JDBC初步连接和JDBC连接规范化
  8. android toast_Android Toast
  9. JAVA地址连接状态检测工具类
  10. vue2使用脚手架配置prettier报错:‘prettier/prettier‘: context.getPhysicalFilename is not a function
  11. redhat7配置本地yum源
  12. 网易云镜像仓库选择镜像
  13. pdf合并成一个文件,pdf合并方法
  14. VS2019 C#开发手机App环境配置和开发
  15. VSCode更改显示语言-如更改英语为中文或者将中文改为英语
  16. 高考数学解题技巧:基本不等式求最值神奇方法-神奇设k法
  17. Java回收对象的标记 和 对象的二次标记过程
  18. 双主动桥隔离双向DC-DC变换器(二) 基本特性
  19. php+html+css制作非常好看网站登录与注册界面
  20. java记录-String、StringBuilder和StringBuffer

热门文章

  1. Oracle启用、禁用角色
  2. TestNG+ReportNG+Maven优化测试报告
  3. ssh终端远程登陆主机命令--笔记
  4. RequireJS 主入口加载模块经常会加载失败的问题
  5. 关于void main()的误区
  6. CollectionView
  7. Python-快速排序算法
  8. WPF 中Frame + Page 的使用
  9. jquery一个控件绑定多个事件
  10. 【转】托管函数的挂钩(完美版)