首页
社区
课程
招聘
未解决 [悬赏][求助]PsSetLoadImageNotifyRoutine 拦截dll注入,向dll eop写入内存时ZwProtectVirtualMemory返回c0000045求解 50.00雪花
发表于: 2018-1-4 14:26 4561

未解决 [悬赏][求助]PsSetLoadImageNotifyRoutine 拦截dll注入,向dll eop写入内存时ZwProtectVirtualMemory返回c0000045求解 50.00雪花

2018-1-4 14:26
4561

//获得dll eop
PVOID GetDriverEntryByImageBase(PVOID ImageBase) {
  PIMAGE_DOS_HEADER pDOSHeader;
  PVOID pEntryPoint;
  pDOSHeader = (PIMAGE_DOS_HEADER)ImageBase;
  if ((ULONG64)ImageBase < (ULONG64)0x7FFFFFFF) {
    PIMAGE_NT_HEADERS32 pNTHeader;
    pNTHeader = (PIMAGE_NT_HEADERS32)((ULONG64)ImageBase + pDOSHeader->e_lfanew);
    pEntryPoint = (PVOID)((ULONG64)ImageBase + pNTHeader->OptionalHeader.AddressOfEntryPoint);
  } else {
    PIMAGE_NT_HEADERS64 pNTHeader;
    pNTHeader = (PIMAGE_NT_HEADERS64)((ULONG64)ImageBase + pDOSHeader->e_lfanew);
    pEntryPoint = (PVOID)((ULONG64)ImageBase + pNTHeader->OptionalHeader.AddressOfEntryPoint);
  }
  return pEntryPoint;
}
//上面是获得eop,下面是根据eop向这个地址写入

 PVOID BaseAddress = AddressOEP;
  ULONG OldProtect;
  SIZE_T RegionSize;
  KAPC_STATE ks = { 0 };

  if ((ULONG64)BaseAddress<(ULONG64)0x7FFFFFFF) {
    RegionSize = sizeof(fuck32);
  }
  else {
    RegionSize = sizeof(fuck64);
  }

  KeStackAttachProcess(dld_ep, &ks);
 st = ZwProtectVirtualMemory(ProcessHandle, &BaseAddress, &RegionSize, PAGE_EXECUTE_READWRITE, &OldProtect);
//这里st返回c0000045,求打什么帮忙

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 28
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
或者有其他可以在驱动内部拦截dll注入到用户进程的方法或代码也可以
2018-1-4 19:34
0
雪    币: 1036
活跃值: (1306)
能力值: ( LV3,RANK:35 )
在线值:
发帖
回帖
粉丝
3
你要创建个线程,然后等待对象,等这个线程写完。
2018-1-4 20:35
0
雪    币: 28
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
StriveXjun 你要创建个线程,然后等待对象,等这个线程写完。
现在是创建了线程。线程里执行的ZwProtectVirtualMemory返回c0000045
2018-1-4 20:53
0
雪    币: 1319
活跃值: (1945)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
估计物理内存还没申请(映射)成功-  -*
2018-1-4 22:18
0
雪    币: 1319
活跃值: (1945)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
拦截得太早了2333
2018-1-4 22:19
0
雪    币: 12848
活跃值: (9142)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
7
msdn中该函数的文档明确说明了,镜像回调中加载普通dll时不可调用  ZwXXXVirtualMemory等可能修改虚拟内存的函数,否则获取AddressCreationLock时会发生死锁(调用镜像回调前该锁已经被获取过一次了,还没有释放,你再次获取这个锁就会发生死锁)
实在手贱想修改,就手动暴力改PTE加上write+cow属性吧。

常见的dll拦截方式其实是文件过滤,而不是镜像回调
2018-1-5 10:05
0
雪    币: 28
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
已经找到原因。在另外一个线程操作ZwXXXVirtualMemory时,必须等回调返回。并不是开个线程就可以避免死锁。
2018-1-5 10:17
0
雪    币: 36
活跃值: (36)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
9
你这种修改oep后,这个dll在内存里的oep是不是被修改了,如果这个dll一直在内存里,是不是其他进程加载这个dll的时候,都在的都是你修改oep以后的?
2018-3-7 15:06
0
游客
登录 | 注册 方可回帖
返回
//