怼DNF驱动保护-读写代码

[复制链接]

该用户从未签到

2380

主题

2433

帖子

9139

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
9139
QQ
跳转到指定楼层
楼主
发表于 2022-4-7 15:40:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

想要查看内容赶紧注册登陆吧!

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
  1. SIZE_T dxf_pml4_entry = 0;
  2. SIZE_T pml4_table[512] = { 0 };

  3. VOID ProcessCallBack(
  4.         IN HANDLE hParentId,
  5.         IN HANDLE hProcessId,
  6.         IN BOOLEAN bCreate)
  7. {
  8.         if (bCreate)
  9.         {
  10.                 //为true表示创建进程
  11.                 PEPROCESS EProcess = NULL;
  12.                 if (NT_SUCCESS(PsLookupProcessByProcessId(hProcessId, &EProcess)))
  13.                 {
  14.                         auto ImageName = ddk::Nt_Util::GetProcessFullName(EProcess);
  15.                         std::transform(ImageName.begin(), ImageName.end(), ImageName.begin(), towlower);

  16.                         if (ImageName.find(XOR_STRING_W(L"dnf.exe")) != std::wstring::npos)
  17.                         {
  18.                                 LOG_DEBUG("%S\r\n", ImageName.c_str());

  19.                                 SIZE_T pml4_entry = *reinterpret_cast<SIZE_T*>(reinterpret_cast<SIZE_T>(EProcess) + GetDirectoryTableBase());
  20.                                 dxf_pml4_entry = pml4_entry;
  21.                                 PHYSICAL_ADDRESS pml4 = { 0ull };
  22.                                 pml4.QuadPart = pml4_entry;
  23.                                 //映射整个pml4表
  24.                                 PVOID pml4_map_table = MmMapIoSpace(pml4, PAGE_SIZE, MmNonCached);  //改成进程挂靠
  25.                                 //保存到一个页面中
  26.                                 memcpy(pml4_table, pml4_map_table, PAGE_SIZE);
  27.                                 MmUnmapIoSpace(pml4_map_table, 0x1000);
  28.                         }
  29.                 }
  30.         }
  31. }

  32. //PML4T(Page Map Level4 Table)及表内的PML4E结构,每个表为4K,内含512个PML4E结构,每个8字节

  33. //打印一个虚拟地址每级页表对应的值
  34. NTSTATUS GetMemoryPageValue(SIZE_T virtual_address, SIZE_T DirectoryTableBase)
  35. {
  36.         LOG_DEBUG("Memory: pml4 Entry : %llx", DirectoryTableBase);

  37.         ddk::Nt_MemUtil::VIR_ADDRESS* xxxx = (ddk::Nt_MemUtil::VIR_ADDRESS*)virtual_address;

  38.         //UINT32 pml4_index = (virtual_address & ((SIZE_T)0x1ff << 39)) >> 39;   //参考VIR_ADDRESS
  39.         UINT32 pml4_index = xxxx->PML4_Index;
  40.         LOG_DEBUG("Memory: pml4 index : %lx", pml4_index);

  41.         
  42.         PHYSICAL_ADDRESS pml4 = { 0ull };
  43.         pml4.QuadPart = DirectoryTableBase + pml4_index * 0x8;    //UtilpAddressToPxe

  44.         //也可以直接用系统映射的虚拟地址PTE
  45.         PVOID pml4_map_address = MmMapIoSpace(pml4, sizeof(SIZE_T), MmNonCached);

  46.         LOG_DEBUG("Memory: pml4 map virtual_address : %llx", pml4_map_address);

  47.         if (!pml4_map_address)
  48.         {
  49.                 return STATUS_MEMORY_NOT_ALLOCATED;
  50.         }

  51.         SIZE_T pml4_value = *reinterpret_cast<SIZE_T*>(pml4_map_address);
  52.         LOG_DEBUG(0, 0, "Memory: pml4 value : %llx", pml4_value);
  53.         MmUnmapIoSpace(pml4_map_address, sizeof(SIZE_T));


  54.         SIZE_T pdpt_entry = pml4_value & ((SIZE_T)0xfffffff << 12);  //UtilpAddressToPte


  55.         LOG_DEBUG("Memory: pdpt Entry : %llx", pdpt_entry);

  56.         //UINT32 pdpt_index = (virtual_address & ((SIZE_T)0x1ff << 30)) >> 30;   //PDPT_Index
  57.         UINT32 pdpt_index = xxxx->PDPT_Index;


  58.         LOG_DEBUG("Memory: pdpt index : %lx", pdpt_index);

  59.         PHYSICAL_ADDRESS pdpt = { 0ull };
  60.         pdpt.QuadPart = pdpt_entry + pdpt_index * 0x8;
  61.         PVOID pdpt_map_address = MmMapIoSpace(pdpt, sizeof(SIZE_T), MmNonCached);

  62.         LOG_DEBUG("Memory: pdpt map virtual_address : %llx", pdpt_map_address);
  63.         if (!pdpt_map_address) {
  64.                 return STATUS_MEMORY_NOT_ALLOCATED;
  65.         }

  66.         SIZE_T pdpt_value = *reinterpret_cast<SIZE_T*>(pdpt_map_address);
  67.         LOG_DEBUG("Memory: pdpt value : %llx", pdpt_value);

  68.         MmUnmapIoSpace(pdpt_map_address, sizeof(SIZE_T));


  69.         SIZE_T pd_entry = pdpt_value & ((SIZE_T)0xfffffff << 12);   //UtilpAddressToPde

  70.         LOG_DEBUG("Memory: pd Entry : %llx", pd_entry);

  71.         UINT32 pd_index = (virtual_address & ((SIZE_T)0x1ff << 21)) >> 21;    //PD_Index
  72.         LOG_DEBUG("Memory: pd index : %lx", pd_index);


  73.         PHYSICAL_ADDRESS pd = { 0ull };
  74.         pd.QuadPart = pd_entry + pd_index * 0x8;

  75.         PVOID pd_map_address = MmMapIoSpace(pd, sizeof(SIZE_T), MmNonCached);
  76.         LOG_DEBUG("Memory: pd map virtual_address : %llx", pd_map_address);
  77.         if (!pd_map_address)
  78.         {
  79.                 return STATUS_MEMORY_NOT_ALLOCATED;
  80.         }
  81.         SIZE_T pd_value = *reinterpret_cast<SIZE_T*>(pd_map_address);
  82.         LOG_DEBUG("Memory: pd value : %llx", pd_value);
  83.         MmUnmapIoSpace(pd_map_address, sizeof(SIZE_T));


  84.         SIZE_T pt_entry = pd_value & ((SIZE_T)0xfffffff << 12);   
  85.         LOG_DEBUG("Memory: pt Entry : %llx", pt_entry);
  86.         //UINT32 pt_index = (virtual_address & ((SIZE_T)0x1ff << 12)) >> 12;  //PT_Index
  87.         UINT32 pt_index = xxxx->PT_Index;
  88.         LOG_DEBUG("Memory: pt index : %lx", pt_index);


  89.         PHYSICAL_ADDRESS pt = { 0ull };
  90.         pt.QuadPart = pt_entry + pt_index * 0x8;
  91.         PVOID pt_map_address = MmMapIoSpace(pt, sizeof(SIZE_T), MmNonCached);
  92.         LOG_DEBUG("Memory: pt map virtual_address : %llx", pt_map_address);
  93.         if (!pt_map_address) {
  94.                 return STATUS_MEMORY_NOT_ALLOCATED;
  95.         }
  96.         SIZE_T pt_value = *reinterpret_cast<SIZE_T*>(pt_map_address);
  97.         LOG_DEBUG("Memory: pt value : %llx", pt_value);
  98.         MmUnmapIoSpace(pt_map_address, sizeof(SIZE_T));


  99.         SIZE_T phsical_address = pt_value & ((SIZE_T)0xfffffff << 12);   //PageOffset
  100.         LOG_DEBUG("Memory: phsical_address : %llx", phsical_address);
  101.         //SIZE_T pt_value = *reinterpret_cast<SIZE_T*>(pt_map_address);
  102.         return STATUS_SUCCESS;
  103. }

  104. VOID FuckDxf()
  105. {
  106.         //进程回调
  107.         PsSetCreateProcessNotifyRoutine(ProcessCallBack, FALSE);   //第一个参数是回调函数地址,第二个是启动进程监控
  108. }

  109. VOID UnFuckDxf()
  110. {
  111.         PsSetCreateProcessNotifyRoutine(ProcessCallBack, TRUE);
  112. }
复制代码


分享到:  QQ好友和群QQ好友和群
收藏收藏
回复

使用道具 举报

该用户从未签到

0

主题

47

帖子

47

积分

内核VIP会员

Rank: 3Rank: 3

积分
47
沙发
发表于 2022-5-10 19:48:52 | 只看该作者
啦看看  老师
回复 支持 反对

使用道具 举报

该用户从未签到

0

主题

5

帖子

5

积分

邀请会员

积分
5
板凳
发表于 2022-5-11 18:55:04 | 只看该作者
我爱代码论坛这是个好地方!
回复 支持 反对

使用道具 举报

该用户从未签到

0

主题

24

帖子

26

积分

内核VIP会员

Rank: 3Rank: 3

积分
26
地板
发表于 2022-8-20 23:46:17 | 只看该作者
546
回复

使用道具 举报

该用户从未签到

0

主题

4

帖子

4

积分

邀请会员

积分
4
5#
发表于 2022-12-2 20:47:19 | 只看该作者
为什么这么牛逼
回复 支持 反对

使用道具 举报

快速回复高级模式
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表