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.mzph.cn/news/158507.shtml

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

相关文章

C语言矩阵乘积(ZZULIOJ1127:矩阵乘积)

题目描述 计算两个矩阵A和B的乘积。 输入第一行三个正整数m、p和n&#xff0c;0<m,n,p<10&#xff0c;表示矩阵A是m行p列&#xff0c;矩阵B是p行n列&#xff1b;接下来的m行是矩阵A的内容&#xff0c;每行p个整数&#xff0c;用空格隔开&#xff1b;最后的p行是矩阵B的内…

flink sqlClient提交hiveIceberg

flink sqlClient提交hiveIceberg 环境准备sqlclient启动前准备启动sqlclientinit.sqlinsert.sql 环境准备 组件名版本flink客户端1.14.4-2.12hadoop集群3.1.4hive客户端3.1.2icebergiceberg-flink-runtime-1.14-0.13.2.jariceberg-hive依赖iceberg-hive-runtime-0.13.2.jar s…

android笔记 SELinux

1.SELinux解错步骤 log信息&#xff1a; 11-20 02:25:12.526 8976 8976 W om.jzzh.setting: type1400 audit(0.0:1316): avc: denied { write } for name"com.jzzh.setting-IWLR9dkz8TWizbNujdTpWw" dev"mmcblk2p15" ino2661 scontextu:r:system_app:s0…

深兰科技多款大模型技术产品登上新闻联播!

11月20日晚&#xff0c;新闻联播报道了2023中国5G工业互联网大会&#xff0c;深兰科技metamind、汉境大型城市智能体空间等大模型技术和产品在众多参展产品中脱颖而出&#xff0c;被重点播报。 2023中国5G工业互联网大会 本届大会由工信部和湖北省人民政府联合主办&#xff0c;…

Haproxy搭建 Web 群集

一、常见的web集群调度器 1.目前常见的web集群调度器分为软件和硬件 2.软件通常使用开源的LVS、Haproxy、Nginx 3.硬件一般使用比较多的是F5&#xff0c;也有很多人使用国内的一些产品&#xff0c;如梭子鱼、绿盟等 二、Haproxy应用分析 1.LVS在企业应用中抗负载能力很强&am…

【shell】shell指令学习

仅供本人自学&#xff0c;完全从自己可以理解的角度写的&#xff0c;知识点都是copy网上已有的学习资料&#xff0c;侵权请联系本人删除&#xff0c;谢谢。 1. 文本资料学习 学习Linux&#xff0c;从掌握grep、sed、awk开始吧。 Linux文本三剑客超详细教程—grep、sed、awk …

kafka操作的一些坑

1.如果Offset Explorer能够检测到kafka中的数据&#xff0c;但是自己的kafka无法读取到&#xff0c;此时是因为kafka读取信息是有有效期的&#xff0c;有效期为七天的时间 2.如果一直报错Attempt to heart beat failed since the group is rebalancing&#xff0c;此时需要修改…

【LeetCode刷题笔记】DFSBFS(一)

51. N 皇后 解题思路: DFS + 回溯 :由于 NxN 个格子放 N 个皇后, 同一行不能放置 2 个皇后,所以皇后必然放置在不同行 。 因此,可以从第 0 行开始,逐行地尝试,在每一个 i

linux输出的重定向无效问题和解决

我们在调试程序或者打印日志时经常会遇到重定向的问题,而有时候会遇到重定向无效的问题,下面给一个简单的例子,首先写一个简单的test.c #include <stdio.h>int main(){fprintf(stdout, "hello\n");fprintf(stderr, "world\n");return 0; }编译生…

P9232 [蓝桥杯 2023 省 A] 更小的数(区间DP)

求大数字某连续部分反转后&#xff0c;比原数字小的个数 思路&#xff1a;自前向后遍历 ai是位于数字第i位的数字 aj是位于数字第j位的数字&#xff08;i<j&#xff09; ai>aj f[ai][aj]1; ai<aj f[ai][aj]0; aiaj f[ai][aj]f…

Android11 桌面默认横屏导致任务键近期任务布局UI显示错误!

/frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java 定义变量&#xff1a;private boolean stch false; keyCode KeyEvent.KEYCODE_APP_SWITCH 取消原来逻辑&#xff0c;采用广播打开近期任务后台 /*/ if (!keyguardOn…

Go语法的特殊之处

上文我们讲了GO模块引入指令Go Mod&#xff0c;本文讲述Go语法的特殊之处 : 单变量 : hello:“hello” Go 语言中新增了一个特殊的运算符:&#xff0c;这个运算符可以使变量在不声明的情况下直接被赋值使用。其使用方法和带值声明变量类似&#xff0c;只是少了var关键字&…

linux常用命令总结(通俗易懂,快速记忆版)

文章目录 ls命令echo命令cd命令head命令tail命令ps命令cp命令rm命令mkdir命令rmdir命令查看文件内容命令其他常用命令 ls命令 ls 是list的缩写list的中文是列表的意思 ls就是列出指定位置的文件夹和文件 可用参数 &#xff1a; -a, -l, -h , -R, -Q 参数含义及作用-a-a (a是…

mybatis报nvalid bound statement (not found)或者找不到xml文件

查看yml文件是否添加mybatis配置 mybatis-plus:# Mapper.xml 文件位置 Maven 多模块项目的扫描路径需以 classpath*: 开头# 实现接口绑定mapperLocations: classpath*:mybatis/xml/*Mapper.xmlclasspath*: 开头

Javaweb实现数据库简单的增删改查

JDBC介绍 JDBC &#xff08; Java Data Base Connectivity &#xff09; 是一 种 Java 访问 数据库 的技术&#xff0c;它提供 执行 SQL 语句的 Java API &#xff0c;由 一组 类 和接口组成&#xff0c;可以为 不同的 数据库提供统一访问 JDBC工作原理 JDBC应用编程 1、准备…

PMP考试

一、关于准考信下载 为确保您顺利进入考场参加xxx月份考试&#xff0c;请及时登录本网站个人系统下载并打印准考信&#xff0c;准考信下载时间为xxx-xxx。如通过以上方式无法查找准考信&#xff0c;请您及时拨打所在考点老师联系电话&#xff0c;如有特殊问题&#xff0c;请发…

1143. 最长公共子序列

给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 &#xff0c;返回 0 。 一个字符串的 子序列 是指这样一个新的字符串&#xff1a;它是由原字符串在不改变字符的相对顺序的情况下删除某些字符&#xff08;也可以…

限时开发、码力全开、2w奖金!AGI Hackathon等你挑战!

AGI时代&#xff0c;我们已不再满足于简单的产品开发&#xff0c;与大模型结合的无限想象力&#xff0c;成为开发者们新的追求。 你有能力将想法转化为现实吗&#xff1f;你有勇气接受挑战&#xff0c;创造全新的AI应用吗&#xff1f; 如果你有热情&#xff0c;有信心&#x…

老知识复盘-SQL从提交到执行到底经历了什么 | 京东云技术团队

一、什么是SQL sql(Structured Query Language: 结构化查询语言)是高级的费过程化编程语言,允许用户在高层数据结构上工作, 是一种数据查询和程序设计语言, 也是(ANSI)的一项标准的计算机语言. but… 目前仍然存在着许多不同版本的sql语言,为了与ANSI标准相兼容, 它们必须以相…

迪杰斯特拉算法(C++)

目录 介绍&#xff1a; 代码&#xff1a; 结果&#xff1a; 介绍&#xff1a; 迪杰斯特拉算法&#xff08;Dijkstras algorithm&#xff09;是一种用于计算加权图的单点最短路径的算法。它是由荷兰计算机科学家Edsger W. Dijkstra在1956年发明的。 该算法的思路是&#xf…