加密与解密 调试篇 动态调试技术 (二)-常见断点

news2024/11/23 19:14:23


目录

常见的断点

1.INT 3 断点

检测

绕过

2.硬件断点

原理

 我们给出硬件中断的例子

删除硬件断点

3.内存断点

原理

例子

删除

区别

总结

4.内存访问一次性断点

5.消息断点

例子

删除

6.条件断点

(1)按寄存器条件中断

(2)按存储器条件中断

7.条件记录断点


我们在 (一)中调试了一个程序   接着我们开始继续学习

常见的断点

这里有

INT 3断点
硬件断点
内存断点
消息断点等

1.INT 3 断点

我们在OllyDbg中 可以使用 命令 bp 或者 F12进行断点

INT3断点 就是在程序中 对该位置的代码 进行替换

替换为INT3

INT3 是一个软中断指令 
在x86框架中触发进行调试
INT3就是最常用的断点

其中软中断 是 代码触发的 而不是硬件问题触发的中断

在ollydbg中 其实我们按下F2 程序就会在这里设置 INT3 只是ollydbg进行了隐藏

显示出来的是中断前的指令

INT3 机器码是 0xCC 也叫做 CC指令

在程序执行到INT3指令导致的异常时候

调试器会捕捉到异常
从而停在断点处
然后把断点处的代码恢复为之前的代码

INT3的优点是可以设置无数个断点
缺点是改变了代码 容易被软件检测到



检测

如果软件防止API被下断点
有一些软件检测API的首地址是否为0xCC 

这里给出检测方式

用C语言检测
这个方法就是 取得检测函数的地址
然后读取第一个字节
判断是否为CC
这里是检测的代码 对MessageBoxA


FARPROC Uaddr ;
BYTE Mark = 0;
(FARPROC&) Uaddr = GetProcAddress (LoadLibrary("user32.dll"),"MessageBoxA");
加载 user32.dll库中的 MessageBoxA函数
Mark = *((BYTE*))Uaddr;                 把Mark 设定为 指向 Uaddr的指针
if(Mark == 0xCC)                判断第一个字节是否为0xCC 即INT3
    return TRUE

当程序执行后 对MessageBoxA下断点 程序就会发现

绕过

如果我们要躲过检测 就把断点设置在函数的尾部或者内部 

例如把断点设置在函数入口的下一行 这样我们就可以绕过检测

2.硬件断点

硬件断点和BRx调试寄存器有关

RBx调试寄存器中的 x可以是 0~3的数字

RBx调试寄存器用于设置硬件断点 在CPU执行到设置的地址的时候 
就会触发中断 然后交给调试器进行调试

DRx调试寄存器具有8个寄存器 (DR0~DR7) 其中 某些寄存器又有自己的特性

DR0~DR3:调试地址寄存器 用于保存需要监视的地址 例如设置硬件断点

DR4~DR5:保留 未公开作用

DR6:调试寄存器组状态寄存器

DR7:调试寄存器组控制寄存器

原理

硬件断点的原理是

使用DR0 DR1 DR2 DR3设定地址  (最多设置4个断点)
然后使用DR7 设定状态


硬件执行断点和CC指令执行断点的作用一样
但是 硬件并不会修改地址第一字节为CC 所以更难检测


在调试器检测到DR0~DR3中的地址的时候 就会触发中断 交给调试器

而不是修改代码 进行中断 

在ollydbg中也可以设置硬件中断

 我们给出硬件中断的例子

还是之前的TraceMe.exe

在CPU窗口的寄存器窗口 右键->查看调试寄存器

然后我们在004013AA处设置硬件中断

然后F9执行程序

我们发现 DR0变为中断地址

在我们设置断点后
其实OllyDbg是在DR0~DR3中的一个设置为中断地址 
然后再DR7中设置相应的控制位

当程序调试到中段地址 CPU就会向OllyDbg发送异常信息

然后可以中断

删除硬件断点

调试->硬件断点

当然也有快捷键

在地址按下F4 可以进行硬件中断 并且在中断后自动删除断点

硬件中断对比INT3中断 不容易被程序察觉 并且运行速度快
缺点是 只能设置4个断点

3.内存断点

OllyDbg 可以设置内存访问断点 或者 内存写入断点

原理

对所设置的地址 赋予不可访问 不可写 属性

就这样 当 访问和写入 就会发生异常

OllyDbg捕获异常

比较异常是不是我们设置断点地址

如果是 就中断 然后用户进行操作
因为每一次都要进行比对 来确定是否中断 所以执行速度会慢

所以OllyDbg可能出于执行考虑 内存中断 只能下一个断点

程序运行有3种状态 分别是 读取 写入 和执行

mov dword ptr [405528],edx   对内存进行写入
mov dword ptr edx,[405528]    对内存数据进行读取

例子

使用OllyDbg调试 TraceMe.exe

 我们可以看到 这个 是写入内存中的 汇编指令

我们使用这个下内存断点

我们需要进入数据面板

先对这个地址在数据面板跟随

然后F9运行

 发现他中断在这个地址

删除

如果我们要删除中断 右键->删除内存断点 即可

在这个场景中 硬件断点也可以实现和内存断点相同的效果
单个硬件写入/访断点可以设置为 1字节 2字节 4字节
而且无论选择的数据范围多大 只有前4个字节会起作用

 还是在内存地址中 对地址选择 硬件写入 然后选择 word 就是4个字节

 还是会中断在 这个地址上的下一条指令

区别

硬件写入/访问断点是在执行的下一条进行中断 
内存断点是在触发点的指令处进行中断

对代码也可以下内存访问断点

在代码处 右键 内存访问 然后运行程序 就会断在这个地方

总结

在内存执行的地方 也可以通过内存访问中断


内存访问断点不会修改代码 不会和INT3一样修改代码而被程序校验

所以如果在遇到程序校验 并且硬件断点失灵的情况下 可以使用内存断点

4.内存访问一次性断点

Windows对内存使用段分页式管理

在OllyDbg中

按ALT+M 就可以看内存

这里出现很多段 然后每个段都有不可访问 读 写 执行属性

在相应的段 右键

 这个就可以用于整个内存开设置该类断点

这个断点是一次性断点 所在段在被读取或者执行就会中断

中断以后 就会删除该断点

如果想捕捉调用 或者返回某个模块

该类断点就特别有用
其中还有断点 


设置内存访问断点 这个断点和在访问上设置断点 命令的功能大致相同

所不同的是这个 内存访问断点不是一次性的


并且这个断点是要在NT框架下使用

并且仅在这个框架下使用

5.消息断点

Windows本身就是消息驱动的  如果调试的时候没有合适的断点

可以尝试使用消息断点

当某个特定窗口接收到某个特定消息时
消息断点将程序中断

消息断点和INT3断点的区别在于:

INT3断点可以在程序启动之前设置
消息断点只有在 窗口被创建后才可以被设置 并且拦截消息

当用户单击一个按钮、移动光标或者向文本框输入文字的时候

一条消息就会发送给当前窗体
所有发送的消息都有4个参数

1个hwnd(窗口句柄)
1个msg(信息编号)
2个long(32位长的参数)

windows通过句柄 来识别他所代表的句柄

例如 点击某个按钮
Windows通过句柄识别按了哪一个按钮
然后发送相对于的消息来通知程序

我们通过例子

例子

TraceMe

我们直接F9运行程序

我们输入 用户名和序列号 随便输入 然后不点击check

 我们先进入消息窗口

 这里就是我们现在存在的窗口 也是我们进行消息窗口打断点的地方

我们找到 check这一行

 打上消息断点

 在消息 这一栏 选择 202的函数

我们check 类型是 button 按钮 所以如果我们点击了这个按钮
会发送 WM_LBUTTONUP这个消息 所以我们需要中断在这个消息处

然后我们回到程序 点击check

 他会中断在Windows系统代码中 就是传递消息

这个时候 我们是在系统领空 处于系统底层代码
不属于TraceMe程序代码 所以我们无法通过 快捷键ALT+F9 或者CTRL+F9回到程序领空

我们使用快捷键 ALT+M

 

 关注这个 TraceMe 程序 然后他的代码段 因为我们想要回到代码段 找到这个关键函数

所以我们 在这里打上断点 当程序执行完底层代码 就会返回程序 代码

意思就是 点击完check 他会发送消息给windows

然后消息传递完 返回程序 我们就重新回到了程序领空

我们在F2打上断点

 F9 进行执行

 这里的代码 是程序的消息循环处

这段代码是消息循环 
不断处理TraceMe的消息 
这个时候不会直接处理按钮事件

如果我们进行F7单步跟踪

就会重新进入系统代码

 这里就重新进入了系统代码

然后我们重复

在程序代码区设置断点 然后执行

 说明还是不是传递按钮消息

我们继续来一次

成功到了 按钮传递消息的程序内的地方了

删除

ALT+B 删除即可

6.条件断点

在调试过程中
我们经常希望能够满足什么条件猜会中断

这类 就叫做条件断点


而且OllyDbg中可以 按寄存器 存储器 消息等条件设断

条件断点是一个带有条件表达式的普通INT3断点


当调试器遇到这类断点 断点将计算表达式的值

如果结果非0 或者 表达式有效

那么断点就生效

(1)按寄存器条件中断

打开Conditional_bp.exe

查找 00401476处

然后在这里设置条件

 或者在命令行插件中

bp 401476 eax==0400000

然后程序执行到这里 如果 eax=0400000 就会发生中断

(2)按存储器条件中断

我们继续使用这个程序来

我们假设 这个程序需要打开一个文件

那么就是使用CreatFileA函数 这个函数是用于打开一个文件

这里给出函数的结构

HANDLE CreateFile{
    LPCTSTR lpFileName,                        指向文件名的指针
    DWORD dwDesireAccess,                      访问模式
    DWORD dwShareMode,                         共享模式
    LPSECURITY_ATTRIBUTES,                      指向安全属性的指针
    DWORD dwCreationDistribution,              如何创建文件
    DWORD dwFlagsAndAttribute,                 文件属性
    HANDLE hTemplateFile                        用于复制文件的句柄
};

我们了解完后 运行程序看看有没有要打开文件夹的按钮

这里我们

发现 调用了四次 CreateFileA 

所以肯定是存在这个函数 所以我们对这个函数进行断点

 然后重新执行程序

断点了在这个

然后我们到栈上

发现了函数的参数都已经入栈了 所以这里我们就可以进行断点

但是我们需要知道这个是在栈的什么地方

所以我们

 

 假设我们需要得到 filename 那么他就是在 esp+4的地址上存放

[esp+4]这个是得到第一个参数 就是filename的内存地址
[[esp+4]]这个是得到 第一个参数 就是filename在内存地址存入的字符串是多少

假设我们需要得到字符串

[STRING[esp+4]]=="c:\\1212.txt"

这就是 会返回 当 CreateFileA函数 打开 c:\\1212.txt的时候 这个函数 filename存放的是多少

使用命令行就是下面的

bp CreateFileA,[STRING[esp+4]]=="c:\\1212.txt"

重新运行程序

 这里就是当程序打开1212.txt后断点的地方了

7.条件记录断点

条件记录断点 

除了具有条件断点的作用 还能记录断点处函数表达式 或者函数的参数值
也可以通过设置断点的次数 每次符合暂停条件的时候 计数器-1

还是拿CreateFileA函数为例子

 在这个程序的第一条指令

 

 或者 SHIFT+F4

进入条件记录断点

 

 注意这个

表达式里面 如果是 [esp+4] 那么就是地址

我们就设置 指向ASCII字符串的指针


这里的功能 就和 [STRING] 功能一样

然后我们确定 开始执行

出现断点

然后快捷键 ALT+L 打开 log data窗口

 出现了 我们的数据

到这里 常见的中断 就结束了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/595432.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

渠道投放数据建设

广告投放渠道识别方式 1、渠道包:每个渠道分配不同的渠道包,用户下载APP之后根据他下载的是哪个渠道包来识别渠道来源,比较常见于应用商店的投放。但是需要注意渠道包可能会导致作弊情况,例如用虚拟机下载渠道包来模拟下载数据等…

Linux介绍和vm17pro安装 和Centos以及vm简单操作

Linux 介绍 概述 linux 怎么读, 不下10 种linux 是一个开源、免费的操作系统,其稳定性、安全性、处理多并发已经得到业界的认可,目前很多企业级的项目(c/c/php/python/java/go)都会部署到Linux/unix 系统上。常见的操作系统(windows、IOS、…

ChatGPT工作提效之使用百度地图在首都为六一儿童节献爱心(多边形覆盖物、文本标注、自动获取经纬度、爱心函数)

ChatGPT工作提效系列 ChatGPT工作提效之初探路径独孤九剑遇强则强ChatGPT工作提效之在程序开发中的巧劲和指令(创建MySQL语句、PHP语句、Javascript用法、python的交互)ChatGPT工作提效之生成开发需求和报价单并转为Excel格式ChatGPT工作提效之小鹅通二次开发批量API对接解决方…

浏览器跨域的配置

目录 1、前言 2、同源策略 3、跨源数据存储访问 4、浏览器跨域设置 4.1 版本号(49.x.x.x.x)之前的跨域设置 4.2 版本号(49.x.x.x.x)之后的跨域设置 5、批处理跨域设置 5.1 windows 操作系统。 5.2 Mac 操作系统 1、前言 …

STL库(1)

STL库(1) vectorvector介绍vector使用初始化元素访问内存扩容插入删除 listlist介绍初始化,元素访问插入删除元素 vector和list区别 vector vector介绍 vector是可以改变大小的数组的容器。其内存结构和数组一样,使用连续的存储…

我是如何精通软件工程的

软件工程是一个庞大且不断演化的领域,涉及许多创新。虽然如此,大多数技术 —— 如果不是全部 —— 在软件工程中往往最终汇聚为几个基本原则。工程师更好地掌握软件工程的方法是熟悉软件工程的基础知识,而不是那些不断变化的框架、语言或平台…

2023年Web服务器基准测试:NodeJS vs Java vs Rust vs Go

现在是2023年,是时候进行一次新的Web服务器基准测试了! 结果对我来说有些出乎意料! 一个Web服务器必须能够处理大量请求,尽管瓶颈在于IO。这次我决定比较最流行的、速度极快的现代框架的性能。 以下是有关实现细节的许多详细信息…

安装 vue-element-admin,安装报错解决

安装 vue-element-admin 克隆项目 git clone https://github.com/PanJiaChen/vue-element-admin.git //(英文的)git clone -b i18n https://github.com/PanJiaChen/vue-element-admin.git // 这个克隆出来是有中英文切换的进入项目目录 cd vue-element-admin建议不要用 cnpm…

chatgpt赋能python:Python交互编程入门指南

Python交互编程入门指南 Python是一种高级编程语言,适合初学者和专业人士使用。Python的互动式编程方式为开发人员提供了快速反馈的环境,从而实现更便捷和高效的开发过程。在本文中,我们将介绍Python的交互编程,为您提供Python编…

达梦数据库运维常用归档、sql日志、dexp与dimp操作

目录 一、归档文件配置... 3 二、sql⽇志的开启和关闭以及基本的操作... 3 三、执行计划... 5 四、工具和命令行数据库物理、逻辑备份,还原... 6 1、工具物理备份... 6 2、命令行联机备份... 8 3、命令行脱机备份... 8 4、工具物理还原... 8 5、命令行DMRM…

C++之动态分配new 删除delete 初始化memset

文章目录 1.动态分配 new1.引言2.new的实现 2.删除 delete3.初始化 memset 1.动态分配 new 1.引言 用new创建数组的优势:由于new创建的对象是在运行时确立的,所以有着具体情况具体分析的优点,那么什么叫做具体情况具体分析呢? 举…

linux led 驱动

前言 今天是儿童节,挣个奖牌给小孩玩玩。 在 linux 驱动大家庭中,LED 驱动算是个儿童,今天就写写他吧。正好之前写过他的婴儿时期《i.MX6ULL 裸机点亮 LED》,记得那时候他还穿着开裆裤呢,裸鸡嘛。 ioremap() 裸机程…

某点资讯Signature纯算逆向

本篇主要是介绍一些工作的运用熟练性,以及跟踪堆栈去看是否做一些其他操作等: 抓包: signature 为加密值; 先上trace下堆栈及加密 我们把结果base64下,看结果是否一致,来判断base64是否魔改 验证base64为标准&…

新规之下产业园区如何合理收费水电费用

一、政策背景 2018年3月30日,国家发改委发布《国家发展改革委关于降低一般工商业电价有关事项的通知》。明确提出进一步规范和降低电网环节收费,一是提高两部制电价的灵活性;二是全面清理规范电网企业在输配电价之外的收费项目,重…

三极管 场效应管

NPN 高电平导通 PNP 低电平导通 N-MOS 高电平导通 P-MOS 低电平导通 1. NPN 三极管,对于软件工程师来说,只需要关注数字电路,即: 导通还是截止,高电平还是低电平。至于三级管内部如何构成的,以及串了多少个电阻&am…

智能安全配电装置在老旧建筑防火中的应用

【摘要】现代社会的发展离不开电能,随着电能应用的广泛性,对用电安全有了更高的要求。近些年来,用电安全形式严峻,尤其是一些老旧建筑中因用电而引起的火灾事故频发,造成一系列严重的损失,严重影响着民众的…

PCout(n) -- STM32F103RCT6 位带操作

1. 使用位带操作控制GPIO口的输入、输出模式,以及输出的电平高、低 注:位带操作一般是操作单独的一个bit 位,而&,| 则可操作多个bit位,看自己的需求吧。(不懂&,| 是什么意思的自行问度…

MySQL-6-多表操作

一、复制表 格式 create table 表名 select查询语句注意:复制成新表时,键值(pri,index等等)索引不会同步复制案例 mysql> create table t2 select name,sex,age from user;二、多表查询 2.1、 多表查询–>连接查询 将2个…

Vue.js 比较重要知识点总结一

概述 谈一谈你对 Vue.js 的响应式数据的理解Vue3 出现解决了什么问题?它有哪些优势?Vue3 新特性有哪些vue2 和 vue3 的响应式有什么区别? 谈一谈你对 Vue.js 的响应式数据的理解 Vue 2.x 对象类型:通过 object.defineProperty(…

MySQL——初窥门径

前言 六一?作为一个大小孩当然是快快乐乐搞技术啦~在这篇文章中,荔枝会梳理SQL语句的基本语法以及MySQL中的函数、约束。多表关系以及查询、事务和事务隔离级别等内容,大致内容归属于MySQL基础知识,荔枝又弄了一篇万字长文哈哈哈哈…