windows驱动开发19.断链隐藏驱动自身模块
断链隐藏自身模块方法一12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152//https://developer.aliyun.com/article/1061479//驱动开发:断链隐藏驱动程序自身#include <ntifs.h>HANDLE hThread;VOID ThreadRun(PVOID StartContext);VOID UnDriver(PDRIVER_OBJECT driver){ DbgPrint(("Uninstall Driver Is OK \n"));}NTSTATUS DriverEntry(IN PDRIVER_OBJECT Driver, PUNICODE_STRING RegistryPath){ DbgPrint(("hello lyshark \n")); PLIST_ENTRY pModuleList; ...
windows驱动开发18.断链隐藏进程
断链隐藏进程写法一12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667#include <ntifs.h>NTKERNELAPI CHAR* PsGetProcessImageFileName(PEPROCESS Process);////传入进程名字通过遍历进程得到PEPROCESSPEPROCESS GetProcessObjectByName(char* name){ if (!name)return NULL; SIZE_T temp; for (temp = 100; temp < 10000; temp += 4) { NTSTATUS status; PEPROCESS ep; status = PsLookupProcessByProcessId((HANDLE)temp, &ep); if (NT_SUCCESS(sta ...
windows驱动开发17.回调函数修改进程权限与高度拦截恢复读写权限
恢复句柄权限的方法1.使用高度拦截在回调函数中恢复句柄权限回调函数在系统中依次由高到低执行,查看回调函数的高度,此时注册一个回调函数只要高度比降低权限的回调低,就会形成先降低权限再提高权限。
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283#include<ntifs.h>PVOID RegistrationHandle = NULL;BOOLEAN is_callback = FALSE;HANDLE g_pid;VOID uninstall_callback(){ if (RegistrationHandle != NULL && is_callback) ObUnRegisterCallbacks(RegistrationHandle);}//回调提升进程权 ...
windows驱动开发16使用回调函数保护进程不被读写
编写C语言代码使用回调函数保护进程不被读写1. 驱动中注册一个回调函数,当驱动被注册时打印消息12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849#include <ntifs.h>#define Log(X) DbgPrint("qi:"X##)VOID processcreate_callback(_In_ HANDLE ParentId, _In_ HANDLE ProcessId, _In_ BOOLEAN Create);VOID TestCallback();NTSTATUS DriverUnload(PDRIVER_OBJECT pdriver){ PsSetCreateProcessNotifyRoutine(processcreate_callback, TRUE); DbgPrint("unload...\n"); return STATUS_SUCCESS;}NTSTA ...
windows驱动开发15.驱动中读取与写入内存
驱动程序中读取与写入内存数据的几种方式1.读取与写入系统虚拟内存地址数据
使用指针直接读取与写入。
使用C语言内存复制函数读取与写入,例如memcpy()函数。
使用windows驱动函数,例如,RtllCopyMemory。
使用MDL映射的方式写入系统虚拟地址
2.读取与写入物理地址的方式操作系统与驱动程序都运行在系统虚拟地址高位空间中,要想读取与写入物理地址需要将物理地址映射到系统虚拟地址中。才能在驱动程序中读取与写入数据。
映射物理地址到系统虚拟地址的方法
方法一:使用函数
方法二:使用MDL的方式使用函数
3.读取与写入应用程序虚拟内存地址的方式高位系统虚拟地址运行的是内核与驱动的指令,低位系统虚拟地址运行的是应用程序的指令。每个应用程序进程的地址空间都会通过四级页表映射到系统虚拟地址空间中。
读取与写入应用程序内存数据的方法
方法一:使用windows驱动函数MmCopyVirtualMemory.
方法二: 根据应用pid获得eprocess后挂靠就可以通过指针或者内存复制函数来读取或写入。
方法三:找到应用程序进程中虚拟地址对应的物理地址后->将物理地址 ...
windows驱动开发14.驱动与应用程序异步通信
驱动与应用程序异步通信1.驱动与应用异步通信是什么?驱动与应用程序的异步通信是指应用程序向驱动程序发送请求后,驱动程序并不立即返回响应,而是继续执行其他操作,直到请求处理完成,驱动程序才通知应用程序或提供结果。异步通信通常用于需要处理长时间操作或等待外部事件的场景,这样可以避免应用程序在等待时被阻塞。
异步通信的工作原理:
请求发送:应用程序通过调用 DeviceIoControl、ReadFile 或 WriteFile 等函数向驱动程序发送请求。
请求排队:驱动程序收到请求后,不会立即返回,而是将请求添加到请求队列中,继续处理其他任务或者立即返回,表示操作正在进行。
事件通知:当驱动程序完成请求的处理后,它会通过某种机制(如信号量、事件、I/O 完成端口等)通知应用程序,通常是通过回调机制或事件对象。
获取结果:应用程序可以使用等待(如WaitForSingleObject)或轮询的方式等待通知,或者在通知到来时继续执行后续操作。
常见的异步机制:
**I/O 完成端口 (IOCP)**:用于处理大量的并发 I/O 请求,特别适用于高性能的网络或 ...
windows驱动开发13.驱动与应用程序通信
1. windows应用程序进程间怎么互相通信?方法一:共享内存
方法二:共享内存
方法三:网络通信
方法一:管道通信的完整代码管道通信需要一个服务端与一个客户端。在服务端创建管道,在客户端读取管道。
1.server.c
1234567891011121314151617181920212223// server.c : This file contains the 'main' function. Program execution begins and ends there.#include <stdio.h>#include <windows.h>int main(){ HANDLE hPipe = CreateNamedPipe(TEXT("\\\\.\\pipe\\MyPipe"), PIPE_ACCESS_DUPLEX, PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT, 1, 1024, 1024, 0, ...
windows驱动开发12.EProcess结构体与修改进程信息
查看eprocess结构体Windows操作系统中的EPROCESS是一个关键的内核数据结构,它是Windows内核用来表示进程的执行体(Executive Process)。
EPROCESS是一个复杂的结构体,包含了与进程相关的所有信息,例如:
进程ID (PID)
父进程ID
进程创建时间
进程安全上下文
进程地址空间信息
进程拥有的对象句柄
线程列表
进程优先级
内存使用统计
各种标志和状态信息
1.windgb中查看eprocess在 WinDbg 中,你可以使用多种命令来查看和分析 EPROCESS 结构体。以下是几种常用方法:
使用 dt命令查看 EPROCESS 结构定义:
1dt nt!_EPROCESS
这会显示整个 EPROCESS 结构的布局和成员。
查看特定进程的 EPROCESS:
1!process [进程地址] 1
或者通过 PID 查看:
1!process [PID] 1
要获取当前进程的 EPROCESS 地址并查看:
12r $procdt nt!_EPROCESS @$proc
查看特定字段:
1dt nt!_EPROCESS ...
windows驱动开发11.驱动中读取内存数据
Windows中的内存地址分为几种?Windows11中内存数据分为物理内存与虚拟内存
在Windows 11(以及所有现代Windows版本)中,内存按照以下描述的方式组织:
物理内存 - 这是实际的硬件RAM,由内存条提供的实际存储空间。
虚拟内存
- 这是一个抽象层,被划分为两个主要区域:
低地址空间(用户空间):分配给应用程序使用的虚拟地址。在64位Windows系统中,用户空间通常是从0x0000000000000000到0x00007FFFFFFFFFFF,即低48位地址空间。每个进程都有自己独立的用户空间虚拟地址映射。
高地址空间(内核空间):保留给操作系统内核和驱动程序使用的虚拟地址。在64位Windows系统中,内核空间通常从0xFFFF800000000000开始,即高位地址空间。所有进程共享相同的内核空间映射。
读取物理内存地址数据1. 使用Windbg读取物理内存地址
windbg断点
输入!db命令查询地址
1!db 0x100000
带感叹号的命令读取物理内存地址,不带感叹号读取虚拟内存地址
在WinDbg中读取物理内存的常用命令:
! ...
windows驱动开发10.配置vs2022远程调试驱动环境
1.在被调试机器中安装远程工具并运行https://www.cnblogs.com/TechNomad/p/17444008.html
被调试机上也安装上 WDK 环境.
在 WDK 的安装目录下运行该工具 WDK Test Target Setup
默认路径:C:\Program Files (x86)\Windows Kits\10\Remote\x64\WDK Test Target Setup x64-x64_en-us.msi
2.在主机中添加远程机器的信息驱动项目中打开Driver install->Deployment。填入信息。
3. 编译后运行驱动项目选择远程内核调试器。
