当前位置: 首页 > news >正文

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


目录

常见的断点

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
这里是检测的代码 对MessageBoxAFARPROC Uaddr ;
BYTE Mark = 0;
(FARPROC&) Uaddr = GetProcAddress (LoadLibrary("user32.dll"),"MessageBoxA");
加载 user32.dll库中的 MessageBoxA函数
Mark = *((BYTE*))Uaddr;                 把Mark 设定为 指向 Uaddr的指针
if(Mark == 0xCC)                判断第一个字节是否为0xCC 即INT3return 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窗口

 出现了 我们的数据

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

相关文章:

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

目录 常见的断点 1.INT 3 断点 检测 绕过 2.硬件断点 原理 我们给出硬件中断的例子 删除硬件断点 3.内存断点 原理 例子 删除 区别 总结 4.内存访问一次性断点 5.消息断点 例子 删除 6.条件断点 (1)按寄存器条件中断 (2&…...

【JavaScript】拾遗(5.25)

文章目录 1. JavaScript2.HTML嵌入JS的第一种方式:行间事件3.HTML嵌入JS的第二种方式:脚本块的方式4. HTML嵌入JS的第三种方式:外部式(外链式)5. 局部变量和全局变量6. 函数7.事件8.回调函数8.1 注册事件8.2 代码的执行顺序 1. JavaScript JavaScript是一门脚本语言。&#xf…...

QMI8658 - 姿态传感器学习笔记 - Ⅲ

文章目录 1.复位1.1 上电复位:1.2 推荐工作条件 2. 校准(COD)2.1 校准步骤2.2 校准注意事项:2.3 校准状态指示2.4 校准参数更新 3. 自检3.1 加速度计自检3.2 陀螺仪自检 4. Ctrl94.1 写Ctrl94.2 读Ctrl94.3 Ctrl9详细命令说明 5. 中断5.1 同步采样模式5.…...

PHP+vue二手车交易信息网站系统

原来二手车网站由于二手车网站制度的不完善,许多城市的二手车网站市场都很少,而且欺诈行文较严重,肆意提高价格,隐瞒汽车所存在的故障问题,人们买卖二手车还是经过朋友帮忙介绍的途径来实现。这就导致了很多人的想卖车…...

NTM中attr的用法

代码1 attrs class CopyTaskParams(object):name attrib(default"copy-task")controller_size attrib(default100, convertint)controller_layers attrib(default1,convertint)num_heads attrib(default1, convertint)sequence_width attrib(default8, convert…...

【python资料】pandas的条件查询

一、说明 在使用Pandas的DataFrame进行数据挖掘的时候,需要形形色色的条件查询,但是这些查询的基本语法是啥,查询的灵活性如何,本文将对他们进行详细列出,便于以后查阅。 二、Pandas条件查询方法 2.1 简单条件查询 1、…...

中间件(三)- Kafka(二)

Kafka 6. 高效读写&Zookeeper作用6.1 Kafka的高效读写6.2 Kafka中zookeeper的作用 7. 事务7.1 Producer事务7.2 Consumer事务 8. API生产者流程9. 通过python调用kafka9.1 安装插件9.2 生产者(Producer)与消费者(Consumer)9.3…...

DAY01_MySQL基础数据类型navicat使用DDL\DML\DQL语句练习

目录 1 数据库相关概念1.1 数据库1.2 数据库管理系统1.3 常见的数据库管理系统1.4 SQL 2 MySQL2.1 MySQL安装2.1.1 安装步骤 2.2 MySQL配置2.2.1 添加环境变量2.2.2 MySQL登录2.2.3 退出MySQL 2.3 MySQL数据模型2.4 MySQL目录结构2.5 MySQL一些命令2.5.1 修改默认账户密码2.5.2…...

数据安全复合治理框架和模型解读(0)

数据治理,数据安全治理行业在发展,在实践,所以很多东西是实践出来的,哪有什么神仙理论指导,即使有也是一家之说,但为了提高企业投产比,必要的认知是必须的,当前和未来更需要专业和创新。数据安全治理要充分考虑现实数据场景,强化业务安全与数据安全治理,统一来治理,…...

Java程序设计入门教程--逻辑运算符和位运算符

目录 逻辑运算符 位运算符 逻辑运算符 逻辑运算符就是表示逻辑关系的运算符。下表列出了逻辑运算符的基本运算,假设布尔变量A为真,变量B为假。 逻辑运算符表 操作符 描述 例子 && 当且仅当两个操作数都为真,条件才为真。 &…...

接口测试简介以及接口测试用例设计思路

接口测试简介 1.什么是接口 接口就是内部模块对模块,外部系统对其他服务提供的一种可调用或者连接的能力的标准,就好比usb接口,他是系统向外接提供的一种用于物理数据传输的一个接口,当然仅仅是一个接口是不能进行传输的&#x…...

C++ Qt项目实战:构建高效的代码管理器

C Qt项目实战:构建高效的代码管理器 一、项目概述(Introduction)1.1 项目背景(Project Background)1.2 项目目标(Project Goals)1.3 项目应用场景(Project Application Scenarios&am…...

【JavaScript 递归】判断两个对象的键值是否完全一致,支持深层次查询,教你玩转JavaScript脚本语言

博主:東方幻想郷 Or _LJaXi 专栏分类:JavaScript | 脚本语言 JavaScript 递归 - 判断两个对象的键值 🌕 起因🌓 代码流程⭐ 第一步 判断两个对象的长度是否一致⭐ 第二步 循环 obj 进行判断两个对象⭐ 第三步 递归条件判断两个对象…...

卷积、相关、匹配滤波、脉冲压缩以及模糊函数

文章目录 【 1. 卷积 】1.1 连续卷积1.2 离散卷积【 2.相关 】2.1 自相关2.2 互相关【 3.匹配滤波 】3.1 滤波器模型3.2 有色噪声-匹配滤波器3.3 白噪声-匹配滤波器3.3.1 原始-白噪声-匹配滤波器3.3.2 简化-白噪声-匹配滤波器3.4 动目标的匹配滤波【 4.脉冲压缩】4.1 时域脉冲压…...

C# 栈(Stack)

目录 一、概述 二、基本的用法 1.入栈 2.出栈 Pop 方法 Peek 方法 3.判断元素是否存在 4.获取 Stack 的长度 5.遍历 Stack 6.清空容器 7.Stack 泛型类 三、结束 一、概述 栈表示对象的简单后进先出 (LIFO) 非泛型集合。 Stack 和 List 一样是一种储存容器&#x…...

网络流量监控及流量异常检测

当今的企业面临着许多挑战,尤其是在监控其网络基础设施方面,需要确保随着网络规模和复杂性的增长,能够全面了解网络的运行状况和安全性。为了消除对网络性能的任何压力,组织应该采取的一项重要行动是使用随组织一起扩展的工具监控…...

六.热修复

文章目录 前言什么是热修复?如何进行热修复?热修复需要解决的问题 1.Android常用的热修复解决方案2.ClassLoader类加载机制2.1 Android类加载器2.2 双亲委托机制2.3 类查找流程 3.插桩式热修复运行期修复落地3.1 什么是字节码插桩?3.2 ASM3.3…...

2000万的行数在2023年仍然是 MySQL 表的有效软限制吗?

谣言 互联网上有传言说我们应该避免在单个 MySQL 表中有超过 2000 万行。否则,表的性能会下降,当它超过软限制时,你会发现 SQL 查询比平时慢得多。这些判断是在多年前使用HDD硬盘存储时做出的。我想知道在2023年对于基于SSD的MySQL数据库来说…...

jvm问题排查

常用工具 命令查询资源信息 top:显示系统整体资源使用情况 vmstat:监控内存和 CPU iostat:监控 IO 使用 netstat:监控网络使用 查看java进程 jps 查看运行时信息 jinfo pid gc工具 jstat: 查看jvm内存信息 GCViewer — 离线分析G…...

【Redis】浅谈Redis-集群(Cluster)

文章目录 前言1、集群实现1.1 创建cluster目录,并将redis.conf复制到该文件夹1.2 复制redis.conf,并进行配置1.3 启动redis,查看启动状态1.4 合成集群1.5 查看集群1.6 集群读写操作 2、SpringBoot整合redis集群2.1 引入包2.2 设置配置2.3 使用…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具

作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...

通过Wrangler CLI在worker中创建数据库和表

官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序

一、开发环境准备 ​​工具安装​​: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 ​​项目初始化​​: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

微服务商城-商品微服务

数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

ardupilot 开发环境eclipse 中import 缺少C++

目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

图表类系列各种样式PPT模版分享

图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

JS设计模式(4):观察者模式

JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中&#xff0…...

深度学习水论文:mamba+图像增强

🧀当前视觉领域对高效长序列建模需求激增,对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模,以及动态计算优势,在图像质量提升和细节恢复方面有难以替代的作用。 🧀因此短时间内,就有不…...

Go语言多线程问题

打印零与奇偶数(leetcode 1116) 方法1:使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...