现有硬件断点和内存断点失效的原因

news/2025/1/5 15:33:57/文章来源:https://www.cnblogs.com/czlnb/p/18649898

现象及原因

像 ReadFile 和 ReadProcessMemory 这种需要缓冲区,并且通过 SysEnter 指令进入内核的,
在内核中向指定的缓冲区写入数据,使用硬件断点和内存断点设置内存写入断点是无效的。

主要是因为 Ring3 调试器无法接收内核中产生的异常。内核中产生的异常会被内核异常处理器处理,并以 API 的返回值作为错误码返回

#include <windows.h>
#include <iostream>
#include <string>
#include <vector>
#include <thread>
#include <atomic>void readFileWithReadFileEx(const std::string& fileName,char * fileBuffer) {HANDLE hFile = CreateFileA(fileName.c_str(),GENERIC_READ,FILE_SHARE_READ,nullptr,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,nullptr);if (hFile == INVALID_HANDLE_VALUE) {std::cerr << "无法打开文件: " << fileName << ", 错误码: " << GetLastError() << std::endl;return;}LARGE_INTEGER fileSize;if (!GetFileSizeEx(hFile, &fileSize)) {std::cerr << "获取文件大小失败, 错误码: " << GetLastError() << std::endl;CloseHandle(hFile);return;}OVERLAPPED overlapped = {};if (!ReadFileEx(hFile,fileBuffer,0x1000,&overlapped,0)) {std::cerr << "异步读取失败, 错误码: " << GetLastError() << std::endl;CloseHandle(hFile);return;}CloseHandle(hFile);
}int main() {std::string fileName = R"(D:\learn\kanxue.vmp\checkVM\ConsoleApplication5\example.txt)"; // 替换为你的文件名char  fileBuffer[0x1000] = { 0, };            // 存储文件内容readFileWithReadFileEx(fileName, fileBuffer);// 打印文件内容std::cout << "文件内容:\n" << fileBuffer << std::endl;return 0;
}

fileBuffer 下硬件写入断点和内存写入断点是无法中断的。硬件写入断点会被内核忽略,而内存写入断点会造成 ReadFileEx 失败,返回错误码

微软官方的说明

数据断点在下列情况下无效:

  • 将未经调试的进程写入内存位置。
  • 在两个或多个进程间共享内存位置。
  • 内存位置在内核内更新。例如,如果内存传递给 32 位 Windows ReadFile 函数,则内存将从内核模式进行更新,因此调试器不会在更新时中断。
  • 其中,监视表达式在 32 位硬件上大于 4 字节,在 64 位硬件上大于 8 字节。这是 x 86 体系结构的一个限制。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.Net程序员机会来了,微软官方新推出一个面向Windows开发者本地运行AI模型的开源工具

想要开发AI产品的.Net程序员机会来了,这个项目应该好好研究。 虽然说大模型基本都有提供网络API,但肯定没有直接使用本地模型速度快。 最近微软官方新推出AI Dev Gallery开源项目,可以帮助Windows开发人员学习如何将具有本地模型和API的AI添加到Windows应用程序中。01 项目简…

ABB工业机器人SIB-V板维修细节分享

要判断ABB机器人SIB-v板是否需要更换,可以从以下几个方面进行评估: - 检查SIB-v板的状态:查看SIB-v板是否有明显的物理损坏,如烧焦、裂纹或其他损坏迹象。 - 检查连接情况:确保SIB-v板与其他组件的连接牢固,没有松动或腐蚀。 - 检查电池状态:如果SIB-v板上有…

KUKA机械臂驱动器600-20 1X64 UL故障维修细节

库卡机器人作为工业自动化的重要设备,其稳定性和可靠性对于生产线的正常运转至关重要。然而,在使用过程中,KUKA机械臂驱动器故障是不可避免的问题之一。 一、常见KUKA机械手驱动器故障及原因分析 1. 过热故障 过热是常见的库卡工业机器人驱动器600-20 1X64 UL故障之一。这通…

PostgreSQL技术大讲堂 - 第77讲:DB4AI 搭建PG向量数据库AI机器人

PostgreSQL技术大讲堂 - 第77讲,主题:DB4AI 搭建PG向量数据库AI机器人 讲课内容: 1、 向量搜索引擎(PGVector)介绍 2、 向量与Embeddings的定义 3、 向量间的相似度计算方法演示 4、检索增强生成模型(RAG)介绍 5、PG向量数据库+通义千问大模型实现AI机器人 目前主流的关系型…

ABAP excel上传时,数字带文本逗号 转ABAP数量QUAN金额CURR 格式

主要使用 函数MOVE_CHAR_TO_NUM 或者 UNITS_STRING_CONVERT 第二个需要限制客户SU3 参数配置X 或者函数入参默认X, excel导出默认时X格式, 样例参考代码*&---------------------------------------------------------------------* *& Report YWWZ_TEST57 *&…

11 个必备 Docker 工具

​ 1. LazyDocker命令行下的 Docker 管理利器LazyDocker 是一个为命令行用户设计的友好型终端工具,用于管理 Docker 容器、镜像和存储卷。它适合那些习惯于命令行操作但又希望拥有直观界面的用户。 通过 LazyDocker,你可以一站式查看容器的状态、资源消耗、日志等详细信息,并…

大语言模型提示技巧(三)-迭代式提示

大语言模型还没有达到能够准确猜测人类意图的程度,此时它不能立即反馈出令人满意的答复,我们需要做的是对大语言模型进行迭代式提示,反复推进,直至大语言模型给出了令人满意的答案。我们与大语言模型交互时,往往给出的提示过于简略,而大语言模型还没有达到能够准确猜测你…

spring 中 Bean 的生命周期

spring 中 Bean 的生命周期是怎样的?原文 连环18问 https://mp.weixin.qq.com/s/liWn2Dn91cmuiqHSxVO_fASpringBean 生命周期大致分为4个阶段:1.「实例化」,实例化该 Bean 对象2.「填充属性」,给该 Bean 赋值3.「初始化」如果实现了 Aware 接口,会通过其接口获取容器资源如…

一步一步构建RAG智能问答系统

一步一步基于LangChain构建智能问答系统(Construct intelligent question answering system based on LangChain)虽然LLM(大语言模型)非常强大,但它们对于它们未经训练的信息一无所知。如果想使用LLM来回答它未经训练的文档相关问题,我们需要向其提供这些文档的信息。最常…

VSCode开发uni-app环境搭建

为什么选择VS Code?1, HbuilderX对TS类型支持暂不完善2, 前端程序员最熟悉的编辑器3, 支持各种AI插件(比如国内的阿里云通义灵码、百度comate、豆包MarsCode等,国外的也有很多)。安装uni-aap插件(快速创建页面、uni-app代码提示、鼠标悬停查看文档)1, uni-create-vie…

函子

函子在C#中,函数式编程的函子(Functor)是一种实现特定接口或模式的结构,它能够将函数应用于数据结构中的值。函子的核心概念源自数学中的范畴理论,但在编程中更倾向于实际操作。 函子的特点包装一个值:函子是一个容器,能够存储某种类型的值。 提供一个方法来应用函数:它…