首页
社区
课程
招聘
[求助]PsSetLoadImageNotifyRoutine,在回调中修改导入表蓝屏
发表于: 2015-3-11 21:44 7125

[求助]PsSetLoadImageNotifyRoutine,在回调中修改导入表蓝屏

2015-3-11 21:44
7125
系统是win8.1 x64,目前在尝试驱动中修改导入表。

在LoadImageRoutine中的相关代码如下:

  if (ImageInfo->SystemModeImage)
  {
  
  }
  else
  {
    pProcessBase = GetProcessBaseAddress(ProcessId); //获取进程基址
    if (pProcessBase == ImageInfo->ImageBase) //如果exe基址=映像基址,就修改导入表
    {
      PVOID ulImageBase = ImageInfo->ImageBase;

      pDos = (PIMAGE_DOS_HEADER)ulImageBase;
      
      ///////////////
      ProbeForRead(pDos, sizeof(IMAGE_DOS_HEADER), 1);
      pHeader = (PIMAGE_NT_HEADERS)((ULONG)uImageBase + pDos->e_lfanew);  //此行蓝屏,windbg提示访问越界
      ///////////////
      pImportDesc = (PIMAGE_IMPORT_DESCRIPTOR)((ULONG)pHeader->OptionalHeader.DataDirectory[1].VirtualAddress + ulImageBase);
      
    ............. //后面就不贴了,直接蓝在上面


这个GetProcessBaseAddress也是抄的,功底太烂试着找点代码,结果还跑不起来
PVOID GetProcessBaseAddress(IN HANDLE PID)
{
  NTSTATUS status;
  HANDLE hProcess = NULL;
  CLIENT_ID clientid;
  OBJECT_ATTRIBUTES ObjectAttributes;
  PPROCESS_BASIC_INFORMATION pProcessBaseInfo;
  ULONG returnedLength;
  PPEB Peb;
  PVOID ImageBase = NULL;

  if (KeGetCurrentIrql() >= DISPATCH_LEVEL)
  {
    return ImageBase;
  }

  InitializeObjectAttributes(&ObjectAttributes, 0, OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, 0, 0);
  clientid.UniqueProcess = PID;
  clientid.UniqueThread = 0;

  status = ZwOpenProcess(&hProcess, PROCESS_ALL_ACCESS, &ObjectAttributes, &clientid);
  if (!NT_SUCCESS(status))
  {
    return ImageBase;
  }

  pProcessBaseInfo = (PPROCESS_BASIC_INFORMATION)ExAllocatePoolWithTag(NonPagedPool, sizeof(PROCESS_BASIC_INFORMATION), 'abcd');
  if (pProcessBaseInfo == NULL)
  {
    ZwClose(hProcess);
    return ImageBase;
  }
  RtlZeroMemory(pProcessBaseInfo, sizeof(PROCESS_BASIC_INFORMATION));

  status = ZwQueryInformationProcess(hProcess, ProcessBasicInformation, pProcessBaseInfo, sizeof(PROCESS_BASIC_INFORMATION), &returnedLength);
  if (NT_SUCCESS(status))
  {
    Peb = (PPEB)pProcessBaseInfo->PebBaseAddress;
    ImageBase = Peb->ImageBaseAddress;
  }
  ZwClose(hProcess);
  ExFreePool(pProcessBaseInfo);
  return ImageBase;
}

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 8188
活跃值: (2857)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
2
你要先判断一下dll是几位的dll。。。。
ProbeForRead不处理异常的话是没用的吧。
2015-3-11 22:22
0
雪    币: 677
活跃值: (24)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
我在后面调用了PsGetProcessWow64Process检测进程平台,但是这里还没注入,只是获取导入表地址,为什么会蓝屏啊
2015-3-11 22:43
0
雪    币: 478
活跃值: (50)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
最近回调泛滥
2015-3-12 01:18
0
雪    币: 112
活跃值: (293)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
进程空间
2015-3-12 11:36
0
雪    币: 65
活跃值: (112)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
6
先Attach再read/write吧
2015-3-12 12:55
0
雪    币: 677
活跃值: (24)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
				KeStackAttachProcess((PRKPROCESS)pEprocess, &apcState);
				PVOID uImageBase = ImageInfo->ImageBase;
				pDos = (PIMAGE_DOS_HEADER)ImageInfo->ImageBase;
				pHeader = (PIMAGE_NT_HEADERS)((BYTE*)ImageInfo->ImageBase + pDos->e_lfanew + 4 + sizeof(IMAGE_FILE_HEADER));   //BSOD





还是BSOD,而且测试ring3 在程序里修改自身IAT也会出错,不知道哪出了问题
2015-3-12 15:00
0
雪    币: 78
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
X64驱动的基本数据类型和结构体类型,和x86一样吗?
反之,如果是x86的驱动,也要考虑兼容性啊
你这样定义死了PE结构,蓝也就顺理成章了
2015-3-12 15:43
0
雪    币: 677
活跃值: (24)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
手工指定了一下数据格式,这段可以跑起来了

还是要多学习啊,缺少基础真是不好学
2015-3-12 16:47
0
雪    币: 719
活跃值: (777)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
10
楼主在嘛。- -我WIN8.1x86也用这招来注入DLL,修改分配的虚拟内存就蓝屏了。
2015-4-4 14:09
0
游客
登录 | 注册 方可回帖
返回
//