内核上项目【获取模块】

目的:

在Win7 64位系统编写驱动获取目标进程的模块地址

操作步骤:

1.打开目标进程
2.附加到目标进程
3.根据PsGetProcessWow64Process获取目标进程版本
3.根据不同的位数遍历相应的进程链表结构LDR寻找目标模块,匹配成功则返回模块地址

注意事项

在64位很多宏默认为64位需要进行调整修改为特定长度,这样寻找到的LDR等值才能与32位程序适配

实现代码:

代码如下:
头文件“GetModule.h”

#pragma once
#include<ntifs.h>
HANDLE GetObjectModule(HANDLE pid,CHAR* ModuleName);
EXTERN_C PVOID NTAPI PsGetProcessWow64Process(PEPROCESS Process);
typedef PPEB(__stdcall* PFNPsGetProcessPeb)(PEPROCESS pEProcess);typedef struct _PEB32 {UCHAR InheritedAddressSpace;UCHAR ReadImageFileExecOptions;UCHAR BeingDebugged;UCHAR Spare;ULONG Mutant;ULONG ImageBaseAddress;ULONG/*PPEB_LDR_DATA32*/ Ldr;
} PEB32, * PPEB32;typedef struct _PEB64
{UCHAR InheritedAddressSpace;                                            //0x0UCHAR ReadImageFileExecOptions;                                         //0x1UCHAR BeingDebugged;                                                    //0x2union{UCHAR BitField;                                                     //0x3struct{UCHAR ImageUsesLargePages : 1;                                    //0x3UCHAR IsProtectedProcess : 1;                                     //0x3UCHAR IsLegacyProcess : 1;                                        //0x3UCHAR IsImageDynamicallyRelocated : 1;                            //0x3UCHAR SkipPatchingUser32Forwarders : 1;                           //0x3UCHAR SpareBits : 3;                                              //0x3};};ULONGLONG Mutant;                                                       //0x8ULONGLONG ImageBaseAddress;                                             //0x10ULONGLONG Ldr;                                                          //0x18
}PEB64, * PPEB64;//0x58 bytes (sizeof)
typedef struct _PEB_LDR_DATA64
{ULONG Length;                                                           //0x0UCHAR Initialized;                                                      //0x4VOID* SsHandle;                                                         //0x8struct _LIST_ENTRY InLoadOrderModuleList;                               //0x10struct _LIST_ENTRY InMemoryOrderModuleList;                             //0x20struct _LIST_ENTRY InInitializationOrderModuleList;                     //0x30VOID* EntryInProgress;                                                  //0x40UCHAR ShutdownInProgress;                                               //0x48VOID* ShutdownThreadId;                                                 //0x50
}PEB_LDR_DATA64,*PPEB_LDR_DATA64;typedef struct _PEB_LDR_DATA32
{ULONG Length;                                                           //0x0UCHAR Initialized;                                                      //0x4ULONG SsHandle;                                                         //0x8LIST_ENTRY32 InLoadOrderModuleList;                               //0xcLIST_ENTRY32 InMemoryOrderModuleList;                             //0x14LIST_ENTRY32 InInitializationOrderModuleList;                     //0x1cULONG EntryInProgress;                                                  //0x24UCHAR ShutdownInProgress;                                               //0x28ULONG ShutdownThreadId;                                                 //0x2c
}PEB_LDR_DATA32,*PPEB_LDR_DATA32;//0x78 bytes (sizeof)
typedef struct _LDR_DATA_TABLE_ENTRY32
{LIST_ENTRY32 InLoadOrderLinks;                                    //0x0LIST_ENTRY32 InMemoryOrderLinks;                                  //0x8LIST_ENTRY32 InInitializationOrderLinks;                          //0x10ULONG DllBase;                                                          //0x18ULONG EntryPoint;                                                       //0x1cULONG SizeOfImage;                                                      //0x20UNICODE_STRING32 FullDllName;                                     //0x24UNICODE_STRING32 BaseDllName;                                     //0x2cULONG Flags;                                                            //0x34USHORT LoadCount;                                                       //0x38USHORT TlsIndex;                                                        //0x3a
}LDR_DATA_TABLE_ENTRY32,* PLDR_DATA_TABLE_ENTRY32;//0xe0 bytes (sizeof)
typedef struct _LDR_DATA_TABLE_ENTRY64
{struct _LIST_ENTRY InLoadOrderLinks;                                    //0x0struct _LIST_ENTRY InMemoryOrderLinks;                                  //0x10struct _LIST_ENTRY InInitializationOrderLinks;                          //0x20VOID* DllBase;                                                          //0x30VOID* EntryPoint;                                                       //0x38LONGLONG SizeOfImage;                                                      //0x40struct _UNICODE_STRING FullDllName;                                     //0x48struct _UNICODE_STRING BaseDllName;                                     //0x58
}LDR_DATA_TABLE_ENTRY64, * PLDR_DATA_TABLE_ENTRY64;

实现函数文件function.c

#include<ntifs.h>
#include<ntstrsafe.h>
#include"GetModule.h"NTSTATUS ConvertCharToUnicodeString(char* charString, UNICODE_STRING* unicodeString)
{ANSI_STRING ansiString = {0};RtlInitAnsiString(&ansiString, charString);return RtlAnsiStringToUnicodeString(unicodeString, &ansiString, TRUE);
}/*
功能:获取目标进程的模块的DllBase
参数一:目标进程的PID
参数二:需要寻找的模块名称
返回:寻找到的模块DllBase
*/
HANDLE GetObjectModule(HANDLE pid, CHAR* ModuleName)
{PEPROCESS Process = 0;PLDR_DATA_TABLE_ENTRY32 pBase32, pNext32;PLDR_DATA_TABLE_ENTRY64 pBase64, pNext64;UNICODE_STRING CompareModuleName = {0};BOOLEAN FindIs = FALSE;HANDLE return_handle = 0;UNICODE_STRING uniFunctionName;ConvertCharToUnicodeString(ModuleName,&CompareModuleName);PFNPsGetProcessPeb  PsGetProcessPeb = NULL;NTSTATUS is = PsLookupProcessByProcessId(pid, &Process);if (!NT_SUCCESS(is)){return 0;}KAPC_STATE stack = { 0 };KeStackAttachProcess(Process, &stack);PPEB32 peb32  = PsGetProcessWow64Process(Process);if (peb32 == NULL) //如果为64位进程{RtlInitUnicodeString(&uniFunctionName, L"PsGetProcessPeb");PsGetProcessPeb = (PFNPsGetProcessPeb)MmGetSystemRoutineAddress(&uniFunctionName);PPEB64 peb64 = PsGetProcessPeb(Process);PPEB_LDR_DATA64 peb64ldr = (PPEB_LDR_DATA64)peb64->Ldr;pBase64 = (PLDR_DATA_TABLE_ENTRY64)(peb64ldr->InLoadOrderModuleList.Flink);pNext64 = pBase64;do{UNICODE_STRING UnicodeString = { 0 };RtlUnicodeStringInit(&UnicodeString, pNext64->BaseDllName.Buffer);if (!RtlCompareUnicodeString(&UnicodeString, &CompareModuleName, TRUE)){FindIs = TRUE;return_handle = pNext64->DllBase;break;}else{pNext64 = pNext64->InLoadOrderLinks.Flink;}} while (pNext64 != pBase64);KeUnstackDetachProcess(&stack);ObDereferenceObject(Process);RtlFreeUnicodeString(&CompareModuleName);}else //如果为32位进程{PPEB_LDR_DATA32 peb32ldr = (PPEB_LDR_DATA32)peb32->Ldr;pBase32 = (PLDR_DATA_TABLE_ENTRY32)(peb32ldr->InLoadOrderModuleList.Flink);pNext32 = pBase32;do{UNICODE_STRING UnicodeString = { 0 };RtlUnicodeStringInit(&UnicodeString, (PWCH)pNext32->BaseDllName.Buffer);if (!RtlCompareUnicodeString(&UnicodeString, &CompareModuleName, TRUE)){FindIs = TRUE;return_handle = pNext32->DllBase;break;}else{pNext32 = pNext32->InLoadOrderLinks.Flink;}} while (pNext32 != pBase32);KeUnstackDetachProcess(&stack);ObDereferenceObject(Process);RtlFreeUnicodeString(&CompareModuleName);}if (FindIs == TRUE){return return_handle;}return 0;
}

驱动主文件main.c

#include<ntifs.h>
#include"GetModule.h"VOID DriverUnload(_In_ struct _DRIVER_OBJECT* DriverObject)
{DbgPrint("--------------DRIVER_UNLOAD-----------------");
}NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING pRegistryPath)
{HANDLE address;DbgBreakPoint();address = GetObjectModule(1140,"ntdll.dll");pDriverObject->DriverUnload = DriverUnload;return STATUS_SUCCESS;
}

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

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

相关文章

react如何进行项目配置代理

目录 一、前言 二、配置方法 三、总结 前言&#xff1a; 在使用React创建应用程序时&#xff0c;配置代理的目的是为了解决跨域请求的问题。跨域请求是指在浏览器中&#xff0c;一个站点的Web应用程序向另一个不同域名的站点发送请求。由于浏览器的安全策略&#xff0c;这些…

uniapp开发小程序接入阿里云TTS语音合成(RESTful API)

流程 首先小程序后台配置白名单 1.1 路径&#xff1a;开发-开发管理-开发设置-服务器域名-request合法域名 1.2 request合法域名参数&#xff1a; https://nls-meta.cn-shanghai.aliyuncs.com https://nls-gateway-cn-shanghai.aliyuncs.com引入alitts.js页面使用…

解决方案中word中分节符的使用

解决方案中必不可少的两个“符号”&#xff0c;分页符&#xff0c;分节符 有了分节符&#xff0c;可以为不同节设置不同的页眉页脚、分栏格式、纸张大小及方向、页边距、不同节间采用不同的页码序号&#xff0c;常用的功能主要是把word下一次的由原来的“竖版”&#xff0c;变…

Tomcat10 简单地enable Https

通常来讲&#xff0c; 建站后要启用https 有下面3个步骤 1.购买域名 2.绑定域名和 服务器的外部IP地址 3.为这域名购买SSL 证书 &#xff08;还有其密码&#xff09; 4.在Tomcat上启用https 和安装这个证书 但是其实没有域名也可以在tomcat 中enable https的&#xff0c; 至于…

VSIX:C#项目 重命名所有标识符(Visual Studio扩展开发)

出于某种目的&#xff08;合法的&#xff0c;真的合法的&#xff0c;合同上明确指出可以这样做&#xff09;&#xff0c;我准备了一个重命名所有标识符的VS扩展&#xff0c;用来把一个C#库改头换面&#xff0c;在简单的测试项目上工作很满意&#xff0c;所有标识符都被准确替换…

angular、 react、vue框架对比

借鉴&#xff1a;Web前端开发&#xff1a;三大主流框架 (baidu.com) AngularReactVue公司ChromeFaceBook尤雨溪写法有指令、模板的概念比较灵活&#xff0c;没有要求使用特定的架构和模式有指令和模板的概念性能低有虚拟Dom,性能高有虚拟Dome&#xff0c;性能高学习门槛 高&am…

SpringBoot-SpringCache缓存

文章目录 Spring Cache 介绍常用注解 Spring Cache 介绍 Spring Cache 是一个框架&#xff0c;实现了基于注解的缓存功能&#xff0c;只需要简单地加一个注解&#xff0c;就能实现缓存功能。 Spring Cache 提供了一层抽象&#xff0c;底层可以切换不同的缓存实现&#xff0c;…

产品经理入门学习(一):认识产品经理

参考引用 黑马-产品经理入门基础课程 1. 合格的产品经理 1.1 什么是产品 上述产品的共性&#xff1a;解决某个问题的东西上述产品的区别 有形&#xff08;上图左&#xff09;&#xff1a;颜色、形状、质地和尺寸无形&#xff08;上图右&#xff09;&#xff1a;脑力劳动成果、…

STM32WB55开发(6)----FUS更新

STM32WB55开发.6--FUS更新 概述视频教学硬件准备存储器映射FLASH安全区设置SRAM安全区设置通过USB进行下载注意事项 概述 在 STM32WB 微控制器中&#xff0c;FUS&#xff08;Firmware Upgrade Services&#xff09;是用于固件升级的一种服务。这项服务可以让你更新设备上的无…

vue3视频大小适配浏览器窗口大小

目标&#xff1a;按浏览器窗口的大小&#xff0c;平铺视频&#xff0c;来适配屏幕的大小。 考虑使用 DPlayer.js、video.js、vue-video-player等视频插件&#xff0c;但报了各种各样的错&#xff1b;试过使用 js 对视频进行同比例放大&#xff0c;再判断其与窗口的大小取最小值…

按键精灵中常用的命令

1. 声明变量&#xff1a; Dim 2. 注释语句 (1). 单行注释&#xff1a;这是一行注释&#xff0c;使用一个单引号进行注释&#xff1b; (2). 单行注释&#xff1a;// 这是一行注释&#xff0c;使用一对反斜杠进行注释; (3). 多行注释&#xff1a;/*这是多行注释&#xff0c;中…

R语言_RColorBrewer包--全平台可用

R语言_RColorBrewer包–全平台可用

springboot整合redis+lua实现getdel操作保证原子性

原始代码 脚本逻辑先获取redis的值&#xff0c;判断是否等于期望值。 条件成立则删除&#xff0c;不成立则返回0 if redis.call(get, KEYS[1]) ARGV[1] thenreturn redis.call(del, KEYS[1]) end return 0 测试代码 根据上面的逻辑加了测试&#xff0c; 在判断成功后等待5…

送你几款开源IDC资产管理系统

更多运维技术&#xff0c;请关注微信公众号“运维之美” 送你几款开源IDC资产管理系统 1.phpIPAM2.NetBox3.IPPlan4.GestiIP5.RackTables 对于公司机房运维人员来说&#xff0c;你的idc资产管理清单可能还记录在各种excel表格中&#xff0c;当设备和ip变动的时候进行手动更新&a…

解锁无限可能:ON1 Photo RAW的新功能与优势forMac/win

作为摄影师&#xff0c;您是否曾为繁琐的照片编辑过程而感到困扰&#xff1f;是否希望有一种工具&#xff0c;能将您的照片编辑过程变得更加高效、灵活&#xff0c;同时不损失画质&#xff1f;如果是&#xff0c;那么您一定不能错过ON1 Photo RAW。 ON1 Photo RAW是一款全新的…

Spring Boot整合Swagger

&#x1f648;作者简介&#xff1a;练习时长两年半的Java up主 &#x1f649;个人主页&#xff1a;程序员老茶 &#x1f64a; ps:点赞&#x1f44d;是免费的&#xff0c;却可以让写博客的作者开心好久好久&#x1f60e; &#x1f4da;系列专栏&#xff1a;Java全栈&#xff0c;…

奇元大模型通过备案 360自研两大模型均获批

11月4日&#xff0c;三六零(601360.SH&#xff0c;下称“360”)大模型“奇元大模型”通过备案落地。今年9月&#xff0c;“360智脑大模型”已获批面向公众开放。360公司也成为国内首家两个大模型均通过备案的科技企业。 从大模型定位和应用角度来看&#xff0c;奇元大模型具备…

单目标应用:粒子群优化算法(PSO)求解微电网优化MATLAB

一、微网系统运行优化模型 微电网优化模型介绍&#xff1a; 微电网多目标优化调度模型简介_IT猿手的博客-CSDN博客 二、粒子群优化算法&#xff08;PSO&#xff09;求解微电网优化 &#xff08;1&#xff09;部分代码 close all; clear ; clc; global P_load; %电负荷 gl…

蓝桥杯官网填空题(黄金连分数)

题目描述 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 黄金分割数 0.61803... 是个无理数&#xff0c;这个常数十分重要&#xff0c;在许多工程问题中会出现。有时需要把这个数字求得很精确。 对于某些精密工程&#xf…

Android Gldie复用只取之前decode过的缓存resource,Kotlin

Android Gldie复用只取之前decode过的缓存resource&#xff0c;Kotlin import android.graphics.Bitmap import android.os.Bundle import android.util.Log import android.widget.ImageView import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.life…