驱动读写进程内存R3,R0通信

 1 stdafx.h 头文件代码
 2
 3 #ifndef _WIN32_WINNT        // Allow use of features specific to Windows XP or later.
 4 #define _WIN32_WINNT 0x0501    // Change this to the appropriate value to target other versions of Windows.
 5 #endif
 6
 7 #ifdef __cplusplus
 8 extern "C"
 9 {
10
11 #endif
12
13 #include <ntddk.h>
14 #include <ntddstor.h>
15 #include <mountdev.h>
16 #include <ntddvol.h>
17
18
19 #ifdef __cplusplus
20 }
21 #endif
  1 驱动读写 C++代码
  2
  3 #include <ntifs.h>
  4 #include <ntddk.h>
  5 #include "stdafx.h"
  6
  7
  8 extern "C" NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING  RegistryPath);
  9
 10
 11 #define arraysize(p) (sizeof(p)/sizeof((p)[0]))
 12 NTSTATUS ControlCode(IN PDEVICE_OBJECT pDevObj, IN PIRP pIrp);
 13 NTSTATUS CreateMyDevice(IN PDRIVER_OBJECT pDriverObject);
 14 NTSTATUS NtCreateMessage(IN PDEVICE_OBJECT pDevObj, IN PIRP pIrp);
 15 int ReadProcessMemory(PVOID Address, SIZE_T BYTE_size, int PID);
 16 int WriteProcessMemory(VOID* Address, SIZE_T BYTE_size, VOID *VirtualAddress, int PID);
 17 #define READPROCESSMEMORY CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800, METHOD_BUFFERED, FILE_ANY_ACCESS)
 18 #define WRITEPROCESSMEMORY CTL_CODE(FILE_DEVICE_UNKNOWN, 0x801, METHOD_BUFFERED, FILE_ANY_ACCESS)
 19 #define WRITEPROCESSMEMORY_BYTE CTL_CODE(FILE_DEVICE_UNKNOWN, 0x802, METHOD_BUFFERED, FILE_ANY_ACCESS)
 20
 21 //卸载回调
 22 void UnloadDriver(PDRIVER_OBJECT pDriverObject)
 23 {
 24     //用来取得要删除设备对象
 25     PDEVICE_OBJECT pDev;
 26     UNICODE_STRING symLinkName;
 27     pDev = pDriverObject->DeviceObject;
 28     //删除设备
 29     IoDeleteDevice(pDev);
 30
 31     //取符号链接名字
 32     RtlInitUnicodeString(&symLinkName, L"\\??\\My_DriverLinkName");
 33     //删除符号链接
 34     IoDeleteSymbolicLink(&symLinkName);
 35     KdPrint(("驱动成功卸载\n"));
 36 }
 37
 38 NTSTATUS DriverEntry(PDRIVER_OBJECT  pDriverObject,PUNICODE_STRING  RegistryPath)
 39 {
 40     //设置卸载函数
 41     pDriverObject->DriverUnload = UnloadDriver;
 42     //处理R3的CreateFile操作不然会失败
 43     pDriverObject->MajorFunction[IRP_MJ_CREATE] = NtCreateMessage;
 44     //处理R3的控制代码
 45     pDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = ControlCode;
 46     //创建相应的设备
 47     CreateMyDevice(pDriverObject);
 48     KdPrint(("驱动成功加载\n"));
 49     return STATUS_SUCCESS;
 50 }
 51 //处理控制IO代码
 52 NTSTATUS ControlCode(IN PDEVICE_OBJECT pDevObj, IN PIRP pIrp)
 53 {
 54     NTSTATUS status = STATUS_SUCCESS;
 55     KdPrint(("Enter HelloDDKDeviceIOControl\n"));
 56
 57     //得到当前堆栈
 58     PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(pIrp);
 59     //得到输入缓冲区大小
 60     ULONG cbin = stack->Parameters.DeviceIoControl.InputBufferLength;
 61     //得到输出缓冲区大小
 62     ULONG cbout = stack->Parameters.DeviceIoControl.OutputBufferLength;
 63     //得到IOCTL码
 64     ULONG code = stack->Parameters.DeviceIoControl.IoControlCode;
 65
 66     ULONG info = 0;
 67
 68     switch (code)
 69     {
 70     case  READPROCESSMEMORY://读4字节整数型
 71         {
 72             //显示输入缓冲区数据
 73             int PID = 0, Address = 0, BYTE_size=0;
 74             int *InputBuffer = (int*)pIrp->AssociatedIrp.SystemBuffer;
 75             _asm
 76             {
 77                 MOV EAX,InputBuffer
 78                     MOV EBX, DWORD PTR DS : [EAX]
 79                 MOV PID,EBX
 80                     MOV EBX, DWORD PTR DS : [EAX + 4]
 81                 MOV Address,EBX
 82                     MOV EBX,DWORD PTR DS:[EAX + 8]
 83                 MOV BYTE_size, EBX
 84             }
 85             //操作输出缓冲区
 86             int *OutputBuffer = (int*)pIrp->AssociatedIrp.SystemBuffer;
 87             *OutputBuffer = ReadProcessMemory((VOID*)Address, BYTE_size, PID);
 88             //设置实际操作输出缓冲区长度
 89             info = 4;
 90             break;
 91         }
 92     case  WRITEPROCESSMEMORY://写4字节整数型
 93         {
 94             //显示输入缓冲区数据
 95             int PID = 0, Address = 0,buff ,BYTE_size = 0;
 96             int *InputBuffer = (int*)pIrp->AssociatedIrp.SystemBuffer;
 97             _asm
 98             {
 99                 MOV EAX, InputBuffer
100                     MOV EBX, DWORD PTR DS : [EAX]
101                 MOV PID, EBX
102                     MOV EBX, DWORD PTR DS : [EAX + 4]
103                 MOV Address, EBX
104                     MOV EBX, DWORD PTR DS : [EAX + 8]
105                 MOV buff, EBX
106                     MOV EBX, DWORD PTR DS : [EAX + 0xC]
107                 MOV BYTE_size, EBX
108             }
109             //操作输出缓冲区
110             int *OutputBuffer = (int*)pIrp->AssociatedIrp.SystemBuffer;
111             *OutputBuffer = WriteProcessMemory((VOID*)Address, BYTE_size, &buff, PID);
112             //设置实际操作输出缓冲区长度
113             info = 4;
114             break;
115         }
116     case  WRITEPROCESSMEMORY_BYTE://写字节集
117         {
118             //显示输入缓冲区数据
119             int PID = 0, Address = 0, buff, BYTE_size = 0;
120             int *InputBuffer = (int*)pIrp->AssociatedIrp.SystemBuffer;
121             _asm
122             {
123                 MOV EAX, InputBuffer
124                     MOV EBX, DWORD PTR DS : [EAX]
125                 MOV PID, EBX
126                     MOV EBX, DWORD PTR DS : [EAX + 4]
127                 MOV Address, EBX
128                     MOV EBX, DWORD PTR DS : [EAX + 8]
129                 MOV buff, EBX
130                     MOV EBX, DWORD PTR DS : [EAX + 0xC]
131                 MOV BYTE_size, EBX
132             }
133             //操作输出缓冲区
134             int *OutputBuffer = (int*)pIrp->AssociatedIrp.SystemBuffer;
135             *OutputBuffer = WriteProcessMemory((VOID*)Address, BYTE_size, (VOID*)buff, PID);
136             //设置实际操作输出缓冲区长度
137             info = 4;
138             break;
139         }
140     default:
141         status = STATUS_INVALID_VARIANT;
142     }
143     // 完成IRP
144     pIrp->IoStatus.Status = status;
145     pIrp->IoStatus.Information = info;
146     IoCompleteRequest(pIrp, IO_NO_INCREMENT);
147     return status;
148 }
149
150 typedef struct _DEVICE_EXTENSION {
151     PDEVICE_OBJECT pDevice;
152     UNICODE_STRING ustrDeviceName;    //设备名称
153     UNICODE_STRING ustrSymLinkName;    //符号链接名
154
155     PUCHAR buffer;//缓冲区
156     ULONG file_length;//模拟的文件长度,必须小于MAX_FILE_LENGTH
157 } DEVICE_EXTENSION, *PDEVICE_EXTENSION;
158 #pragma INITCODE /*指的代码运行后 就从内存释放掉*/
159 //创建符号链接
160 NTSTATUS CreateMyDevice(IN PDRIVER_OBJECT pDriverObject)
161 {
162     NTSTATUS status;
163     PDEVICE_OBJECT pDevObj;
164     PDEVICE_EXTENSION pDevExt;
165
166     //创建设备名称
167     UNICODE_STRING devName;
168     RtlInitUnicodeString(&devName, L"\\Device\\My_DriverLinkName");
169
170     //创建设备
171     status = IoCreateDevice(pDriverObject,sizeof(DEVICE_EXTENSION),&devName,FILE_DEVICE_UNKNOWN,0, FALSE,&pDevObj);
172     if (!NT_SUCCESS(status))
173         return status;
174
175     pDevObj->Flags |= DO_DIRECT_IO;
176     pDevExt = (PDEVICE_EXTENSION)pDevObj->DeviceExtension;
177     pDevExt->pDevice = pDevObj;
178     pDevExt->ustrDeviceName = devName;
179
180     //申请模拟文件的缓冲区
181     pDevExt->buffer = (PUCHAR)ExAllocatePool(PagedPool, 1024);
182     //设置模拟文件大小
183     pDevExt->file_length = 0;
184
185     //创建符号链接
186     UNICODE_STRING symLinkName;
187     RtlInitUnicodeString(&symLinkName, L"\\??\\My_DriverLinkName");
188     pDevExt->ustrSymLinkName = symLinkName;
189     status = IoCreateSymbolicLink(&symLinkName, &devName);
190
191     if (!NT_SUCCESS(status))
192     {
193         IoDeleteDevice(pDevObj);
194         return status;
195     }
196     return STATUS_SUCCESS;
197 }
198
199 //处理其他IO消息直接返回成功
200 #pragma PAGEDCODE
201 NTSTATUS NtCreateMessage(IN PDEVICE_OBJECT pDevObj, IN PIRP pIrp)
202 {
203
204     NTSTATUS status = STATUS_SUCCESS;
205     // 完成IRP
206     pIrp->IoStatus.Status = status;
207     pIrp->IoStatus.Information = 0;    // bytes xfered
208     IoCompleteRequest(pIrp, IO_NO_INCREMENT);
209     return status;
210 }
211
212 //读内存整数型
213 int ReadProcessMemory(VOID* Address, SIZE_T BYTE_size, int PID)
214 {
215     PEPROCESS pEProcess;
216     PVOID buff1;
217     VOID *buff2;
218     int MemoryNumerical =0;
219     KAPC_STATE   KAPC = { 0 };
220     __try
221     {
222         //得到进程EPROCESS
223         PsLookupProcessByProcessId((HANDLE)PID, &pEProcess);
224         //分配内存
225         buff1 = ExAllocatePoolWithTag((POOL_TYPE)0, BYTE_size, 1222);
226         buff2 = buff1;
227         *(int*)buff1 = 1;
228         //附加到要读写的进程
229         KeStackAttachProcess((PRKPROCESS)pEProcess, &KAPC);
230         // 判断内存是否可读
231         ProbeForRead(Address, BYTE_size, 1);
232         //复制内存
233         memcpy(buff2, Address, BYTE_size);
234         // 剥离附加的进程
235         KeUnstackDetachProcess(&KAPC);
236         //读内存
237         MemoryNumerical = *(int*)buff2;
238         // 释放申请的内存
239         ExFreePoolWithTag(buff2, 1222);
240     }
241     __except (EXCEPTION_EXECUTE_HANDLER)
242     {
243         KdPrint(("错误\n"));
244     }
245     return MemoryNumerical;
246
247 }
248 //写内存整数型
249 int WriteProcessMemory(VOID* Address, SIZE_T BYTE_size, VOID *VirtualAddress,int PID)
250 {
251     PEPROCESS pEProcess;
252     PVOID buff1;
253     VOID *buff2;
254     int MemoryNumerical = 0;
255     KAPC_STATE   KAPC = { 0 };
256     __try
257     {
258         //得到进程EPROCESS
259         PsLookupProcessByProcessId((HANDLE)PID, &pEProcess);
260         //分配内存
261         buff1 = ExAllocatePoolWithTag((POOL_TYPE)0, BYTE_size, 1111);
262         buff2 = buff1;
263         *(int*)buff1 = 1;
264         if (MmIsAddressValid((PVOID)VirtualAddress))
265         {
266             //复制内存
267             memcpy(buff2, VirtualAddress, BYTE_size);
268         }
269         else
270         {
271             return 0;
272         }
273         //附加到要读写的进程
274         KeStackAttachProcess((PRKPROCESS)pEProcess, &KAPC);
275         if (MmIsAddressValid((PVOID)Address))
276         {
277             //判断地址是否可写
278             ProbeForWrite(Address, BYTE_size, 1);
279             //复制内存
280             memcpy(Address, buff2, BYTE_size);
281         }
282         else
283         {
284             return 0;
285         }
286         // 剥离附加的进程
287         KeUnstackDetachProcess(&KAPC);
288         ExFreePoolWithTag(buff2, 1111);
289     }
290     __except (EXCEPTION_EXECUTE_HANDLER)
291     {
292         KdPrint(("错误\n"));
293     }
294     return 1;
295 }
 1 R3通信代码
 2
 3 #include <stdio.h>
 4 #include <windows.h>
 5 #include<winioctl.h>
 6 #define READPROCESSMEMORY CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800, METHOD_BUFFERED, FILE_ANY_ACCESS)
 7 #define WRITEPROCESSMEMORY CTL_CODE(FILE_DEVICE_UNKNOWN, 0x801, METHOD_BUFFERED, FILE_ANY_ACCESS)
 8 #define WRITEPROCESSMEMORY_BYTE CTL_CODE(FILE_DEVICE_UNKNOWN, 0x802, METHOD_BUFFERED, FILE_ANY_ACCESS)
 9 int ReadMemory(HANDLE hDevice, int PID,int Address,int size)//读内存
10 {
11
12     int port[3];
13     int bufret;
14     DWORD dwWrite;
15     port[0]=PID;
16     port[1]=Address;
17     port[2]=size;
18     DeviceIoControl(hDevice,READPROCESSMEMORY, &port, 12, &bufret, 4, &dwWrite, NULL);
19     return bufret;
20
21 }
22
23 int WriteMemory_int(HANDLE hDevice, int PID,int Address,int buff,int size)//写内存整数型
24 {
25
26     int port[4];
27     int bufret;
28     DWORD dwWrite;
29     port[0]=PID;
30     port[1]=Address;
31     port[2]=buff;
32     port[3]=size;
33     DeviceIoControl(hDevice,WRITEPROCESSMEMORY, &port, 16, &bufret, 4, &dwWrite, NULL);
34     return bufret;
35
36 }
37
38 int WriteMemory_byte(HANDLE hDevice, int PID,int Address,BYTE *buff,int size)//写内存字节集
39 {
40     int port[4];
41     int bufret;
42     DWORD dwWrite;
43     port[0]=PID;
44     port[1]=Address;
45     port[2]=(int)buff;
46     port[3]=size;
47     DeviceIoControl(hDevice,WRITEPROCESSMEMORY_BYTE, &port, 16, &bufret, 4, &dwWrite, NULL);
48     return bufret;
49
50 }
51 int main(int argc, char* argv[])
52 {
53     HANDLE hDevice = CreateFileW(L"\\\\.\\My_DriverLinkName", GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL );
54     if (hDevice == INVALID_HANDLE_VALUE)
55     {
56         printf("获取驱动失败: %s with Win32 error code: %d\n","MyDriver", GetLastError() );
57         getchar();
58         return -1;
59     }
60     int PID=0;
61     printf("输入进程ID!\n");
62     scanf("%d",&PID);
63     BYTE a[]={0x01,0x02,0x03,0x04,0x05};
64   int r=WriteMemory_byte(hDevice,PID,9165792,a,5);//写内存字节集
65   printf("0x8BDBE0=%d\n",r);
66    getchar();
67    getchar();
68     return 0;
69 }
时间: 2024-11-13 07:57:37

驱动读写进程内存R3,R0通信的相关文章

强制读写进程的内存

某些时候我们需要读写别的进程的内存,某些时候别的进程已经对自己的内存读写做了保护,这里说四个思路(两个R3的,两个R0的). 方案1(R3):直接修改别人内存 最基本的也最简单的就是直接通过WriteProcessMemory 和 ReadProcessMemory对没有进行保护的程序的内存进行修改,一些单机游戏辅助什么的可能会有这种简单方式修改其他进程内存. 方案2(R3): 注入 通过注入的方式想办法进入宿主进程,然后修改他的内存.这里的话姿势就很多了,远程代码注入,APC注入,输入法注入,

基于AFD驱动的进程流量控制

基于AFD驱动的进程流量控制 摘要:目前有些软件可以监控进程流量,功能实现的都很多错的.对于进程流量的控制很很多种方案,每一种方案也都有其缺点.比如有应用层基于LSP来做的,也有通过TDI和NDIS中间层来做的.其实现的效果和复杂度也各不相同.而我们要讨论的是一种基于AFD驱动来做的一种进程流量控制方案.     关键词:AFD 进程流量  控制驱动 1.   总述 目前有些软件可以监控进程流量,功能实现的都很多错的.对于进程流量的控制很很多种方案,每一种方案也都有其缺点.比如有应用层基于LSP

进程的同步与通信,进程与线程同步的区别,进程与线程通信的区别【转】

本文转载自:http://www.cnblogs.com/youngforever/p/3250270.html 这两天看进程的同步与通信,看了几本书上的介绍,也从网上搜了很多资料,越看越迷惑,被这几个问题搞得很纠结. 进程同步与互斥的区别? 进程的同步方式有哪些? 进程的通信方式有哪些? 进程同步与通信的区别是什么? 线程的同步/通信与进程的同步/通信有区别吗? 在好多教材上(包括国内与国外的)也没有明确这些概念,现在对每个问题还没有准确的答案,下面将自己的理解记下来,以后再补充. 参考资料:

进程内存和内存损坏

本教程的这一部分的先决条件是对ARM汇编的基本了解(在第一个教程系列" ARM汇编基础 "中有介绍).在本章中,您将了解32位Linux环境中进程的内存布局.之后,您将学习堆栈和堆相关的内存损坏的基本原理,以及它们在调试器中的样子. 缓冲区溢出 堆栈溢出 堆溢出 摇摇欲坠的指针 格式字符串 本教程中使用的示例是在ARMv6 32位处理器上编译的.如果您无法访问ARM设备,则可以按照以下教程创建自己的实验室并在VM中模拟Raspberry Pi发行版:使用QEMU模拟Raspberry

一个基于共享内存的ipc通信框架

一个基于共享内存的ipc通信框架 与共享内存相关的操作主要包括共享内存的初始化, 共享内存的释放, 共享内存的锁的相关操作, 在这里操作共享内存的环境是: 1 多个进程没有亲缘关系, 也没有server/client关系, 是多个不相关进程并发操作共享内存 2 共享内存一开始不存在, 由第一个访问他的进程创建 3 当共享内存退出时, 由最后一个离开的进程释放共享内存, 并清除信号量 在这个问题之中, 主要有两个比较大的问题: 1 怎样新建并初始化共享内存 新建共享内存的数据都可以用信号量来控制,

YJX_Driver_033_驱动中的内存管理

1. 驱动中的内存管理 A. 物理内存 B. 虚拟内存 C. Ring0地址和Ring3地址 D. 驱动程序和进程的关系 E. 分页和非分页内存 F. 分配内核内存 [120]了解两个概念:物理内存  虚拟内存 [140]以下概念针对 32位Windows操作系统(32位及以上的CPU)(32位 / 64位 CPU) [210]64位下的这些概念 略有区别 [240] “ A.物理内存:(Physical Memory Address) 目前主流的操作系统还是32位的XP,而32位的系统提供的寻

linux进程内存到底怎么看 剖析top命令显示的VIRT RES SHR值

引 言: top命令作为Linux下最常用的性能分析工具之一,可以监控.收集进程的CPU.IO.内存使用情况.比如我们可以通过top命令获得一个进程使用了多少虚拟内存(VIRT).物理内存(RES).共享内存(SHR). 最近遇到一个咨询问题,某产品做性能分析需要获取进程占用物理内存的实际大小(不包括和其他进程共享的部分),看似很简单的问题,但经过研究分析后,发现背后有很多故事-- 1 VIRT RES SHR的准确含义 三个内存指标,VRIT,RES,SHR准确含义是什么?谁能告诉我们?MAN

进程线程之间的通信

多进程之间有各自的内存空间,多线程是共享同一个线程的空间 多进程之间的通信 from multiprocessing import Process, Manager def func(li): li.append(1) if __name__ == "__main__": mgr = Manager() #(共享内存)管理器接口 # 代理 shared_list = mgr.list() # 在公共进程Manage中开启一个list空间,用来进程通信 # mgr.dict() # mg

驱动读写超时处理

关于驱动读写异步超时的处理,网络上的资料相对稀少,正好最近在工作上遇到了这个问题,所以就研究了一下,发现还是有些门道的.如果完全按照应用层读写超时的处理逻辑来处理驱动层的话就会出现蓝屏等问题 只要涉及到读写超时,那么我们第一印象肯定会想到事件和事件等待相关操作与函数的调用,那么我们来看一下驱动的几个文件操作函数声明: 首先是打开操作 NTSTATUS ZwCreateFile( _Out_ PHANDLE FileHandle, _In_ ACCESS_MASK DesiredAccess, _