[Windows驱动开发]-BlackBone实现内存读取的三种方式

news2025/2/21 21:30:49

文章目录

    • 🛫 导读
      • 需求
      • 开发环境
    • 升级优化(vs2019)
      • 相关地址
      • Blackbone工程中的lib库添加
      • Blackbone工程修改
      • tools工程修改
    • 旧文章整理(vs2017)
      • 功能描述
      • 内存读取-BlackBone库的集成
      • 内存读取-检测参数
      • 内存读取-ReadProcessMemory
      • 内存读取-BlackBone_R3
      • 内存读取-BlackBone_R0
      • 内存读取-BlackBone_R0-测试
      • 内存读取-三种方式比较
    • 📖 参考资料

🛫 导读

需求

驱动一直没有系统的学习过,每次用到的时候总得折腾下安装环境,现在整理下,避免以后再各种查资料。

经常遇到一些软件被保护起来,无法读取其内存数据,今天将基于开源库BlackBone,编写一个简单的内存读写工具。

课程目标

  • 编写工具,实现内存读写
  • BlackBone库的集成
  • 比较常见内存读取的方式

开发环境

版本号描述
文章日期2019-05-21最早发布在看雪上,现在整理一下
操作系统win7-x64虚拟机
VS2017 community
无签名驱动加载工具win64udl_exe.exe
WDK10.0.17763.1
32位应用程序(开发的目标程序是32位的,所以暂时只支持32位)
64位的驱动程序

升级优化(vs2019)

相关地址

之前代码放在github上,每次下载都不方便,所以将代码移到了gitcode上了。

  • 本工具工程gitcode代码地址:https://gitcode.net/yemao/kernel-win/MyOpen
  • 本工具工程代码上传了BlackBone的VS2017版本的代码,地址为https://gitcode.net/yemao/kernel-win/MyOpen/third/Blackbone/Blackbone.sln。
  • 本工具工程代码地址为https://gitcode.net/yemao/kernel-win/MyOpen/course/WinDriver/tools/tools.sln。

Blackbone工程中的lib库添加

之前的项目,为了节省项目空间,lib和dll等库都未提交到git上,这次补上了,包含BeaEngineDIA相关的资源。

Blackbone工程修改

  1. 升级工具集到2019、C++语言标准为C++17(其他版本会报错)
    在这里插入图片描述
  1. 警告等级从4降到3
    在这里插入图片描述
  1. 生成后事件中的路径有问题,需要调整下,如下图:
    在这里插入图片描述
  1. 修复error C2039: “inserter”: 不是“std”的成员报错。
    third/Blackbone/src/BlackBone/Process/ProcessModules.cpp中需要增加头文件#include <iterator>

注意事项: 所有修改只更改了Debug-Win32的选项,所以编译的时候,需要选择该项目。
而且vs2019不再支持XP,所以Debug(XP)选项已经失效了。
在这里插入图片描述

tools工程修改

  1. 升级工具集到2019、C++语言标准为C++17(其他版本会报错)
    在这里插入图片描述

2.引用的lib库中, (XP)已经没有了,去掉。
在这里插入图片描述

旧文章整理(vs2017)

功能描述

这里写了个工具,界面如下图所示:

九分工具箱-主界面

主要功能:

  • 工具启动的时候会填充进程列表Combo控件
  • 点击进程列表Combo控件,会更新进程列表
  • 进程列表中的项格式为:[pid][进程类型:x86/x64] 进程全路径
  • 选中进程,更新控件地址(0x)对应的地址内容
  • 设置读取方式:ReadProcessMemory、BlackBone_R3、BlackBone_R0
  • 读取并以16进制显示内存内容

工具会根据“读取方式”,分别执行Windows API、BlackBone API、BlackBone驱动三种方式的内存读取,满足不同的使用场景。

内存读取-BlackBone库的集成

本工具工程github代码地址:https://github.com/ninecents/MyOpen

本工具工程代码上传了BlackBone的VS2017版本的代码,地址为https://github.com/ninecents/MyOpen/third/Blackbone。

本工具工程代码地址为https://github.com/ninecents/MyOpen/course/WinDriver/tools/tools.sln。

不了解BlackBone的,可以参考BlackBone介绍。

驱动环境搭建可参考 [Windows驱动开发] 00_环境搭建 。

集成步骤:

  • 打开工程BlackBone.sln和BlackBoneDrv.sln并编译,可以获得相应的库文件和驱动文件。这里编译选项选择Debug(XP)的,用来支持XP系统。

  • tools-MFC工程中“C/C++ -> 命令行”,添加Blackbone路径/I"../../../../third/Blackbone/src"

  • 代码中引用相关头文件,如下所示:

#include <BlackBone/Config.h>
#include <BlackBone/Process/Process.h>
#include <BlackBone/Process/MultPtr.hpp>
#include <BlackBone/Process/RPC/RemoteFunction.hpp>
#include <BlackBone/PE/PEImage.h>
#include <BlackBone/Misc/Utils.h>
#include <BlackBone/Misc/DynImport.h>
#include <BlackBone/Syscalls/Syscall.h>
#include <BlackBone/Patterns/PatternSearch.h>
#include <BlackBone/Asm/LDasm.h>
#include <BlackBone/localHook/VTableHook.hpp>
#include <BlackBone/DriverControl/DriverControl.h>

#ifdef _DEBUG
#pragma comment(lib, "../../../../third/Blackbone/build/Win32/Debug(XP)/BlackBone.lib")
#else
#pragma comment(lib, "../../../../third/Blackbone/build/Win32/Release(XP)/BlackBone.lib")
#endif
  • 调用BlackBone库函数,下面为枚举进程列表的代码
void CtoolsMFCDlg::OnCbnDropdownComboProcess()
{
	m_combo_process.ResetContent();
	blackbone::Process process;

	std::vector<DWORD> vct_pids = blackbone::Process::EnumByName(L"");
	for (auto pid : vct_pids)
	{
		NTSTATUS status = process.Attach(pid);
		CString msg;

		if (NT_SUCCESS(status))
		{
			if (process.modules().GetMainModule())
			{
				CString str_64 = process.core().isWow64() ? _T("x86") : _T("x64");
				msg.Format(_T("[%05d][%s] %s"), process.pid(), str_64.GetBuffer(), process.modules().GetMainModule()->fullPath.data());
			}
			else
			{
				msg.Format(_T("[%d] %s"), process.pid(), _T("failed_get_path"));
			}
		}
		else
		{
			msg.Format(_T("[%d] %s"), pid, _T("failed_Attach"));
		}
		m_combo_process.AddString(msg);
		int nIndex = m_combo_process.GetCount() - 1;
		m_combo_process.SetItemData(nIndex, pid);
	}
}

内存读取-检测参数

点击读取按钮,先检测参数,具体代码如下所示:

void CtoolsMFCDlg::OnBnClickedButtonRead()
{
	// 更新控件数据,清空16进制显示控件内容
	UpdateData();
	m_mem_data.SetString(_T(""));

	// 获取目标进程内存地址:ll_address
	CString str_address;
	m_mem_address.GetWindowText(str_address);
	str_address = _T("0x") + str_address;
	LONGLONG ll_address = _tcstoull_l(str_address.GetBuffer(), NULL, 16, 0);

	// 获取目标进程ID:pid
	int nIndex = m_combo_process.GetCurSel();
	DWORD pid = m_combo_process.GetItemData(nIndex);

	// 获取读取方式:str_read_type
	CString str_read_type;
	m_combo_read_type.GetWindowText(str_read_type);

	// 打开目标进程
	BlackBone::Process process;
	process.Attach(pid);
	if (!process.valid())
	{
		AfxMessageBox(_T("打开进程失败。"));
		return;
	}

    ......
}

内存读取-ReadProcessMemory

ReadProcessMemory实现很简单,直接调用该函数即可:

    SIZE_T byte_read;
	BOOL result = ReadProcessMemory(process.core().handle(), (LPCVOID)ll_address, (LPVOID)bytes, (SIZE_T)m_mem_length, &byte_read);

查看ReadProcessMemory函数原型:

WINBASEAPI
BOOL
WINAPI
WriteProcessMemory(
    __in      HANDLE hProcess,
    __in      LPVOID lpBaseAddress,
    __in_bcount(nSize) LPCVOID lpBuffer,
    __in      SIZE_T nSize,
    __out_opt SIZE_T * lpNumberOfBytesWritten
    );

参数 lpBaseAddress 的类型是LPVOID,对于32位程序,该值只有4字节,读取64位进程就只能看运气了,如果地址大于4字节,读取的结果是错的(也可能直接失败)。比如,我们读取64位的chrome进程,由于chrome.exe模块地址0x13F630000大于4字节,ReadProcessMemory显示错误的内容。

ReadProcessMemory方式读取结果

BlackBone_R3方式读取结果

内存读取-BlackBone_R3

BlackBone_R3方式实现也很简单,直接调用BlackBone的api函数即可:

NTSTATUS status = process.memory().Read(ll_address, m_mem_length, (PVOID)bytes);

BlackBone_R3方式最终调用了Nt函数NtWow64ReadVirtualMemory64(32位的Windows操作系统不知道是不是下面的调用关系),调用关系如下:

BlackBone_R3读取内存函数调用关系

内存读取-BlackBone_R0

BlackBone_R0方式实现如下:

// 加载驱动
NTSTATUS status = blackbone::Driver().EnsureLoaded();
// 驱动内存读取
status = blackbone::Driver().ReadMem(pid, ll_address, m_mem_length, (PVOID)bytes);

最终R3层调用了DriverControl::ReadMem函数,对应控制码是IOCTL_BLACKBONE_COPY_MEMORY。

而R0层调用了BBCopyMemory函数,而该函数调用了内核API函数MmCopyVirtualMemory实现内存读写。

内存读取-BlackBone_R0-测试

打开虚拟机,将win64udl_exe.exe、tools-MFC.exe、BlackBoneDrv7.sys拷贝到虚拟机中,运行win64udl_exe.exe程序(不要关闭,保证未签名的BlackBoneDrv7.sys可以正常加载):

虚拟机中tools需要的软件

打开tools-MFC.exe,选择任意进程,选择读取方式为“blackbone_R0”,点击读取按钮:运行结果如下图所示:

BlackBone_R0方式读取结果

内存读取-三种方式比较

读取方式缺陷备注
ReadProcessMemory32位进程调用该api不能读取64位进程内存
BlackBone_R3权限问题
BlackBone_R0完美(稳定性、防检测)

📖 参考资料

  • 本工具工程gitcode代码地址:https://gitcode.net/yemao/kernel-win/MyOpen
  • Tesla.Angela大神的WIN64驱动编程基础教程
  • 纯C++编写Win32/X64通用Shellcode注入csrss进程

ps: 文章中内容仅用于技术交流,请勿用于违规违法行为。

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

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

相关文章

【 数据处理系统 】(草稿)

文章目录 第3章 总体设计3.1 系统设计目标和原则3.2 系统架构设计3.3 数据采集模块设计3.4 数据预处理模块设计3.4.1 业务数据预处理模块设计3.4.2 日志数据预处理模块设计 3.5 数据存储设计3.6 数据仓库设计3.7 可视化模块设计 第4章 详细设计与实现4.1 数据采集模块4.1.1 数据…

一、11.C内存分配/堆栈

C内存分配/堆栈 01.C内存分配❤️ #include <stdio.h>const int g_A = 10; //常量区 int g_B = 20; //数据段 static<

【小菜鸡刷题记】----双指针篇

【小菜鸡刷题记】----双指针篇 剑指 Offer 18. 删除链表的节点剑指 Offer 22. 链表中倒数第k个节点剑指 Offer 25. 合并两个排序的链表剑指 Offer 52. 两个链表的第一个公共节点剑指 Offer 21. 调整数组顺序使奇数位于偶数前面剑指 Offer 57. 和为s的两个数字剑指 Offer 57 - I…

《斯坦福数据挖掘教程·第三版》读书笔记(英文版) Chapter 6 Frequent Itemsets

来源&#xff1a;《斯坦福数据挖掘教程第三版》对应的公开英文书和PPT Chapter 6 Frequent Itemsets The market-basket model of data is used to describe a common form of many-many relationship between two kinds of objects. On the one hand, we have items, and on…

YOLOv8 独家原创改进:独家首发最新原创EfficiCLNMS改进点,改进有效可以直接当做自己的原创改进点来写,新的增强预测帧

💡该教程为属于《芒果书》📚系列,包含大量的原创首发改进方式, 所有文章都是全网首发原创改进内容🚀 💡本篇文章为YOLOv8改进:独家首发最新EfficiCL-NMS改进点,新的增强预测帧率。 💡对自己数据集改进有效的话,可以直接当做自己的原创改进点来写!!!改进点先到…

小白量化《穿云箭集群量化》(7) 巡航导弹策略

小白量化《穿云箭集群量化》&#xff08;7&#xff09; 巡航导弹策略 量化交易策略比较有名的是网格策略&#xff0c;网格策略的缺点是对网格定义不容易&#xff0c;另外通过网格穿越交易也不是最优价格。 穿云箭量化平台提供了巡航导弹策略&#xff0c;可以利用巡航导弹技术自…

无效数据大揭秘——你不知道的那些坑!

进行数据管理时&#xff0c;无效数据可能会对生产力和决策质量造成严重的影响。如何发现和处理无效数据变得愈发重要。一起来唠唠各位大佬是如何处理的&#xff1f; ⭐ 什么是无效数据&#xff1f;⭐ 如何处理无效数据&#xff1f;⭐ 如何减少无效数据&#xff1f;⭐ 无效数据管…

Python入门(十一)while循环(一)

while循环&#xff08;一&#xff09; 1.简介2.使用while循环3.让用户选择何时退出4.使用标志5.使用break退出循环6.在循环中使用continue7.避免无限循环 作者&#xff1a;xiou 1.简介 for循环用于针对集合中的每个元素都执行一个代码块&#xff0c;而while循环则不断运行&am…

css3:精灵图sprite的使用

文章目录 精灵图sprite简介原理优缺点实例通过精灵图实现一个导航栏 精灵图sprite 简介 CSS精灵技术&#xff08;也称CSS Sprites、CSS雪碧&#xff09;&#xff0c;简单来说就是从一张有各种小图标的大图上截取下来一个小图标来使用。 正因为只要加载一张大图片&#xff0c;…

Restful路径下编写controller层及其增删改查

前置&#xff1a;需要先创建好项目&#xff0c;并且使用mabtis根据数据表生成好代码 mybatis plus自动生成代码&#xff08;代码生成器&#xff09;_wa1ttinG的博客-CSDN博客 一、controller层定义 controller层就是和用户打交道&#xff0c;直接与前端进行交互。可调用service…

安全中级1-nginx_host与php处理不同绕过

一、nginx配置证书 1.生成一个ssl.key密钥 openssl genrsa -des3 -out ssl.key 2096 2.创建一个key的目录,并将ssl.key放入到key目录下 mkdir key mv ssl.key key/ cd key 3.将ssl.key修改为xxx.key mv ssl.key xxx.key 4.创建ssl.key密钥 openssl rsa -in xxx.key -out ssl.…

【计算机组成原理】实验二

文章目录 实验二 运算器实验一、实验目的二、实验原理三、运算器功能编码四、设置初始状态任务一 算术运算任务二 逻辑运算任务三 移位运算任务四 进位控制与零标志 实验二 运算器实验 一、实验目的 完成算术、逻辑、移位运算实验&#xff0c;熟悉ALU运算类型的控制位运用。…

华为OD机试真题 Java 实现【硬件产品销售方案】【2023Q1 200分】

一、题目描述 某公司目前推出了AI开发者套件、AI加速卡、AI加速模块、AI服务器、智能边缘多种硬件产品&#xff0c;每种产品包含若干个型号。 现某合作厂商要采购金额为amount元的硬件产品搭建自己的AI基座。 假设当前库存有N种产品&#xff0c;每种产品的库存量充足&#x…

Python爬虫urllib的基础使用详解

文章目录 1、urllib的使用response 服务器返回的数据&#xff1a;一个类型&#xff0c;六个方法urllib.request.urlretrieve(url,filename) 请求下载网页 请求下载图片 请求下载视频 2、请求对象的定制3.编解码post请求方式ajax的get请求ajax的post请求cookie模拟登录使用handl…

策略模式+单例模式(go)

《设计模式&#xff1a;可复用面向对象软件的基础》 策略允许算法独立于使用它的客户端而变化。 算法可以互相替换&#xff0c;不影响客户端 一个类定义多种行为&#xff0c;并且这些行为在这个类操作中以多个条件形式出现。将相关的条件移入它们各自的Strategy类中以替代这些…

Tomcat 的maxConnections、maxThreads、acceptCount 之间的关系

1. 在springboot 项目配置方式 server:port: 8081servlet:context-path: "/account"tomcat:threads:max: 200min-spare: 10max-connections: 8192accept-count: 100connection-timeout: 10000min-spare &#xff1a;最小线程数 最小工作空闲线程数&#xff0c;默认1…

ChatGPT 自定义提示词模板提升使用效率

相关文章推荐&#xff1a; 《提问的艺术&#xff1a;如何通过提示词让 ChatGPT 更准确地理解你的问题&#xff1f;》 《这些免费插件&#xff0c;让你的 ChatGPT 效率爆炸》 一、背景 现在 ChatGPT 异常火爆&#xff0c;很多人都在体验甚至购买 ChatGPT Plus。 现在使用 ChatG…

ProtoBuf之启航

"How do we do we do go refarming~" 如何理解序列化和反序列化? 序列化: 把 对象 转换为 字节序列 的过程 称为对象的序列化。 反序列化: 把 字节序列 恢复为 对象 的过程 称为对象的反序列化。 这两对反义词从概念上来说并不难理解&#xff0c;但是为什么有事没…

Xcode 14.3 和 iOS 16.4 为 SwiftUI 带来了哪些新的功能?

0. 概览 今年年初&#xff0c;Apple 推出了最新的 Xcode 14.3 以及对应的 iOS 16.4 。 与此同时&#xff0c;它们对目前最新的 SwiftUI 4.0 也添加了一些新功能&#xff1a; sheet 弹窗后部视图&#xff08;Interact with a view Behind a sheet&#xff09;可交互&#xff…