本文为看雪论坛优秀文章
看雪论坛作者ID:不对
0x01 前言
0x02 正常的流程
#include "stdio.h"
int main() {
unsigned char* pUserBuffer = (unsigned char *)"Hello World!n";
printf("0x%pn", pUserBuffer);
getchar();
printf("%sn", pUserBuffer);
getchar();
}
0x03 驱动代码的实现
#include "ntddk.h"
void DriverUnload(PDRIVER_OBJECT pDriverObject) {
}
extern "C" NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pUnicodeString) {
pDriverObject->DriverUnload = DriverUnload;
KIRQL kIrql = KeRaiseIrqlToDpcLevel();
ULONG_PTR PTE_BASE = 0xFFFFF68000000000;
ULONG_PTR pReadPhysicalAddress = 0x708c6EC;
PHYSICAL_ADDRESS dtPhysical;
dtPhysical.QuadPart = -1;
unsigned char* p = (unsigned char *)MmAllocateContiguousMemory(0x1000, dtPhysical);
if (p)
{
KdPrint(("MmAllocateContiguousMemory Address : 0x%pn", p));
ULONG_PTR* pPte = (ULONG_PTR *)(PTE_BASE + (((ULONG_PTR)p & 0xFFFFFFFFF000) >> 12) * 8);
ULONG_PTR nOldValue = *pPte; //保存原来的值
*pPte = (nOldValue & ~(0xFFFFFFFFF000)) | (pReadPhysicalAddress & 0xFFFFFFFFF000);
unsigned char* pReadStart = p + (pReadPhysicalAddress & 0xFFF);
for (size_t i = 0; i < 16; i++)
{
KdPrint(("%c", pReadStart[i]));
}
KdPrint(("n"));
*pPte = nOldValue; //恢复原来的值
MmFreeContiguousMemory(p);
}
KeLowerIrql(kIrql);
return STATUS_SUCCESS;
}
运行结果:
参考文章:
看雪ID:不对
https://bbs.pediy.com/user-home-572364.htm
# 往期推荐
球分享
球点赞
球在看
点击“阅读原文”,了解更多!
本文始发于微信公众号(看雪学院):Win10 DiSPATCH_LEVEL下读取物理内存
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论