5.3 Windows驱动开发:内核取应用层模块基址

在上一篇文章《内核取ntoskrnl模块基地址》中我们通过调用内核API函数获取到了内核进程ntoskrnl.exe的基址,当在某些场景中,我们不仅需要得到内核的基地址,也需要得到特定进程内某个模块的基地址,显然上篇文章中的方法是做不到的,本篇文章将实现内核层读取32位应用层中特定进程模块基址功能。

上一篇文章中的PPEB32,PLIST_ENTRY32等结构体定义依然需要保留,此处只保留核心代码,定义部分请看前一篇文章,自定义读取模块基址核心代码如下,调用GetModuleBaseWow64()用户需传入进程的PROCESS结构该结构可通过内核函数PsLookupProcessByProcessId获取到。

对于函数内部执行过程如下:

  • 1.根据传入的EProcess结构调用KeStackAttachProcess附加到该进程内。
  • 2.调用内核函数PsGetProcessWow64Process此函数可得到该进程空间内PEB结构数据。
  • 3.通过for循环遍历整个pPeb->Ldr链表,并在遍历过程中通过RtlEqualUnicodeString判断是否是我们需要的模块。
  • 4.如果判断是我们需要取出的模块名,则将LdrEntry->DllBase取出,此处取出的基地址也即是我们所需要的。
  • 5.比较结束后,通过调用KeUnstackDetachProcess这个内核模块脱离进程空间。
ULONGLONG GetModuleBaseWow64(_In_ PEPROCESS pEProcess, _In_ UNICODE_STRING usModuleName)
{ULONGLONG BaseAddr = 0;KAPC_STATE KAPC = { 0 };KeStackAttachProcess(pEProcess, &KAPC);PPEB32 pPeb = (PPEB32)PsGetProcessWow64Process(pEProcess);if (pPeb == NULL || pPeb->Ldr == 0){KeUnstackDetachProcess(&KAPC);return 0;}for (PLIST_ENTRY32 pListEntry = (PLIST_ENTRY32)((PPEB_LDR_DATA32)pPeb->Ldr)->InLoadOrderModuleList.Flink;pListEntry != &((PPEB_LDR_DATA32)pPeb->Ldr)->InLoadOrderModuleList; pListEntry = (PLIST_ENTRY32)pListEntry->Flink){PLDR_DATA_TABLE_ENTRY32 LdrEntry = CONTAINING_RECORD(pListEntry, LDR_DATA_TABLE_ENTRY32, InLoadOrderLinks);if (LdrEntry->BaseDllName.Buffer == NULL){continue;}// 当前模块名链表UNICODE_STRING usCurrentName = { 0 };RtlInitUnicodeString(&usCurrentName, (PWCHAR)LdrEntry->BaseDllName.Buffer);// 比较模块名是否一致if (RtlEqualUnicodeString(&usModuleName, &usCurrentName, TRUE)){BaseAddr = (ULONGLONG)LdrEntry->DllBase;KeUnstackDetachProcess(&KAPC);return BaseAddr;}}KeUnstackDetachProcess(&KAPC);return 0;
}

如上就是如何得到特定模块基址的方法,如下是入口函数的调用方法,首先通过传入6164这个PID号,得到进程EProcess结构,其次使用RtlInitUnicodeString(&unicode, wchar_string)初始化得到kernel32.dll字符串,最终调用GetModuleBaseWow64函数获取到进程6164kernel32.dll的模块基地址信息。

VOID UnDriver(PDRIVER_OBJECT driver)
{DbgPrint("驱动卸载成功 \n");
}NTSTATUS DriverEntry(IN PDRIVER_OBJECT Driver, PUNICODE_STRING RegistryPath)
{DbgPrint(("hello lyshark \n"));PEPROCESS pEProcess;HANDLE PID = (HANDLE)6164;// 初始化字符串UNICODE_STRING unicode;wchar_t *wchar_string = L"kernel32.dll";RtlInitUnicodeString(&unicode, wchar_string);// 取模块句柄PsLookupProcessByProcessId((HANDLE)PID, &pEProcess);ULONGLONG base32 = GetModuleBaseWow64(pEProcess, unicode);DbgPrint("ModuleBaseAddress: 0x%X \n", base32);Driver->DriverUnload = UnDriver;return STATUS_SUCCESS;
}

这段代码输出效果如下所示:

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

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

相关文章

【Java Spring】SpringBoot常用插件

文章目录 1、Lombok1.1 IDEA社区版安装Lombok1.2 IDEA专业版安装Lombok1.3 Lombok的基本使用 2、EditStarters2.1 IDEA安装EditStarters2.2 EditStarters基本使用方法 1、Lombok 是简化Java开发的一个必要工具,lombok的原理是编译过程中将lombok的注解给去掉并翻译…

基于SpringBoot的公益慈善平台

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取项目下载方式🍅 一、项目背景介绍: 基于SpringBoot的公益…

sqli-labs靶场详解(less29-less31)

less-29 提示有最好的防火墙 小白原因 这种题型没见过 先自己测试一下 ?id1 to use near 1 预计可以使用报错注入 和单引号有关的注入点 ?id1 and 11 成功 ?id1 and 12 失败 确实是单引号字符型注入点 ?id1;%00 id1%27;%00 获取到了%00空字符(原因就是服务器获取…

手把手教你:基于python+Django的英文数据分析与可视化系统

系列文章 手把手教你:基于Django的新闻文本分类可视化系统(文本分类由bert实现)手把手教你:基于python的文本分类(sklearn-决策树和随机森林实现)手把手教你:基于TensorFlow的语音识别系统 目录…

LeetCode-面试题08.01 三步问题 C/C++实现 超详细思路及过程[E]

🎈归属专栏:深夜咖啡配算法 🚗个人主页:Jammingpro 🐟记录一句:摆了一个周末了,不能摆了,努力起来!! 文章目录 LeetCode-面试题08.01 三步问题🚗题…

大语言模型(LLMs)在 Amazon SageMaker 上的动手实践(一)

本期文章,我们将通过三个动手实验从浅到深地解读和演示大语言模型(LLMs),如何结合 Amazon SageMaker 的模型部署、模型编译优化、模型分布式训练等。 实验一:使用 Amazon SageMaker 构建基于开源 GPT-J 模型的对话机器…

Vue3的项目创建到启动

Vue3的项目创建 检查node版本创建 npm init vuelatest 安装依赖 项目启动 启动成功

初识《树》

目录 前言: 树的概念及结构: 1.概念 2.结构 3.树的相关概念 4.树的表示 5.树的实际应用 二叉树的概念及结构: 1.概念 2.特殊二叉树 ​编辑 3.二叉树的性质 对于满二叉树 对于完全二叉树: 4.二叉树的存储结构 堆 …

从零带你底层实现unordered_map (2)

💯 博客内容:从零带你实现unordered_map 😀 作  者:陈大大陈 🚀 个人简介:一个正在努力学技术的准C后端工程师,专注基础和实战分享 ,欢迎私信! 💖 欢迎大家…

webgoat-Cross Site Scripting XSS 跨站脚本攻击

01 概念 本节课讲述了什么是XSS,并使用XSS执行那些非开发者本意的任务。 目标 了解什么是XSS,XSS如何工作? 学习反射型XSS及注入,基于DOM的XSS注入 02 What is XSS? Cross-Site Scripting也叫XSS是一种漏洞,允许…

Pytorch-gpu环境篇

最最最头疼的就是配环境了 包之间的版本匹配问题 INSTALLING PREVIOUS VERSIONS OF PYTORCH 要考虑到pytorch和torchvision之间的匹配关系 显卡版本匹配问题

一篇博客带你了解TCP网络传输协议

Transmission Control Protocol(TCP,传输控制协议)是互联网协议套件中的一种主要协议之一,负责在网络上可靠地传输数据。下面是TCP协议的详细讲解: 1. 基本概念: 面向连接: TCP是一种面向连接的…