-
c++驱动源码文件目录
-
易语言调用驱动示例代码
-
-
Windows驱动程序是一种特殊的系统程序,它可以访问和控制系统资源,并且不受其他应用程序的限制。它可以获取系统资源,进行更深入的系统控制,包括读取其他进程的内存以及修改其他进程内存。Windows驱动程序可以被用于不少有用的操作,例如实现系统的高级安全性保护、增强系统的性能、自动执行某些指定的任务,甚至还可以实现一些资源的共享。其中,读取其他进程内存以及修改其他进程内存是Windows驱动程序的一项重要功能。Windows驱动程序可以使用系统API来读取其他进程的内存,也可以使用系统API来修改其他进程的内存。使用系统API来读取其他进程的内存,可以获取进程的信息,例如进程的句柄、线程的ID、进程的ID,以及系统提供的其他信息。使用系统API来修改其他进程的内存,可以更改进程的状态,例如修改进程的优先级,改变进程的代码段和数据段,以及系统提供的其他功能。Windows驱动程序可以使用系统API来读取其他进程的内存以及修改其他进程的内存,从而达到实现一些特殊功能的目的,例如实现系统的高级安全性保护、增强系统的性能、自动执行某些指定的任务,甚至还可以实现一些资源的共享。同时,使用Windows驱动程序来读取和修改其他进程的内存也需要严格遵守系统安全规则,以避免发生安全漏洞。
1.加载驱动:
extern "C" NTSTATUS DriverEntry(PDRIVER_OBJECT pDriver, PUNICODE_STRING path) {
/*关闭未引用参数的警告*/
UNREFERENCED_PARAMETER(path);
/*指向创建的卸载函数*/
pDriver->DriverUnload = DriverUnload;
UNICODE_STRING NotExportedFunctionAddress = { 0 }, altitude = { 0 };
/*获取未导出函数的地址*/
RtlInitUnicodeString(&NotExportedFunctionAddress, L"PsGetProcessWow64Process");
pPsGetProcessWow64Process = (PsGetProcessWow64Process)MmGetSystemRoutineAddress(&NotExportedFunctionAddress);
RtlInitUnicodeString(&NotExportedFunctionAddress, L"PsGetProcessPeb");
pPsGetProcessPeb = (PsGetProcessPeb)MmGetSystemRoutineAddress(&NotExportedFunctionAddress);
/*创建注册表回调*/
NTSTATUS Status = STATUS_SUCCESS;
RtlInitUnicodeString(&altitude, L"321000");
Status = CmRegisterCallbackEx((PEX_CALLBACK_FUNCTION)Callback, &altitude, pDriver, NULL, &Cookie, NULL);
if (!NT_SUCCESS(Status)) DbgPrint("创建注册表回调失败.\n"); else DbgPrint("驱动已加载.\n");
return STATUS_SUCCESS;
}
2.卸载驱动:
extern "C" VOID DriverUnload(PDRIVER_OBJECT pDriver) {
UNREFERENCED_PARAMETER(pDriver);
/*卸载注册表回调*/
CmUnRegisterCallback(Cookie);
DbgPrint("驱动已卸载.\n");
}
3.读物理内存:厉害的点在于不修改本身程序的完整性实现写内存
NTSTATUS ReadPhysicalAddress(PVOID address, PVOID buffer, SIZE_T size, SIZE_T* BytesTransferred)
{
MM_COPY_ADDRESS Read = { 0 };
Read.PhysicalAddress.QuadPart = (LONG64)address;
return MmCopyMemory(buffer, Read, size, MM_COPY_MEMORY_PHYSICAL, BytesTransferred);
}
4.写物理内存:
/*写入物理内存*/
NTSTATUS WritePhysicalAddress(PVOID address, PVOID buffer, SIZE_T size, SIZE_T* BytesTransferred)
{
if (!address) return STATUS_UNSUCCESSFUL;
PHYSICAL_ADDRESS Write = { 0 };
Write.QuadPart = (LONG64)address;
PVOID map = MmMapIoSpaceEx(Write, size, PAGE_READWRITE);
if (!map) return STATUS_UNSUCCESSFUL;
RtlCopyMemory(map, buffer, size);
*BytesTransferred = size;
MmUnmapIoSpace(map, size);
return STATUS_SUCCESS;
}
4.切换R3 R3模式已经很牛逼了 最主要的是无痕。
ULONG64 TransformationCR3(ULONG64 cr3, ULONG64 VirtualAddress) {
cr3 &= ~0xf;
ULONG64 PAGE_OFFSET = VirtualAddress & ~(~0ul << 12);
SIZE_T BytesTransferred = 0;
ULONG64 a = 0,b = 0,c = 0;
ReadPhysicalAddress((PVOID)(cr3 + 8 * ((VirtualAddress >> 39) & (0x1ffll))), &a, sizeof(a), &BytesTransferred);
if (~a & 1) return 0;
ReadPhysicalAddress((PVOID)((a & ((~0xfull << 8) & 0xfffffffffull)) + 8 * ((VirtualAddress >> 30) & (0x1ffll))), &b, sizeof(b), &BytesTransferred);
if (~b & 1) return 0;
if (b & 0x80) return (b & (~0ull << 42 >> 12)) + (VirtualAddress & ~(~0ull << 30));
ReadPhysicalAddress((PVOID)((b & ((~0xfull << 8) & 0xfffffffffull)) + 8 * ((VirtualAddress >> 21) & (0x1ffll))), &c, sizeof(c), &BytesTransferred);
if (~c & 1) return 0;
if (c & 0x80) return (c & ((~0xfull << 8) & 0xfffffffffull)) + (VirtualAddress & ~(~0ull << 21));
ULONG64 address = 0;
ReadPhysicalAddress((PVOID)((c & ((~0xfull << 8) & 0xfffffffffull)) + 8 * ((VirtualAddress >> 12) & (0x1ffll))), &address, sizeof(address), &BytesTransferred);
address &= ((~0xfull << 8) & 0xfffffffffull);
if (!address) return 0;
return address + PAGE_OFFSET;
}
易语言代码示例:
有感兴趣的私聊源码开源(包含c++ 易语言调用驱动方法,以及易语言操作sys程序示例代码)