精易论坛

标题: 大神啊,你在哪啊?获取NtQuerVirtualMemory………………地址问题 [打印本页]

作者: niulin1    时间: 2014-9-4 04:27
标题: 大神啊,你在哪啊?获取NtQuerVirtualMemory………………地址问题
大神啊,不知道你是否能路过这里,拜托帮下我这幼儿园的学生……
NtQuerVirtualMemory
NtWriteVirtualMemory
NtReadVirtualMemory
NtLoadDriver
这4个函数的原始地址怎么在获得啊(在内核中)?
尽量有源码,我好看看,{:soso_e121:}



补充内容 (2014-9-5 13:42):
http://125.confly.eu.org/thread-13742326-1-1.html

补充内容 (2014-9-7 14:14):
我想秋来源码看看,(我最喜欢研究源码了,哈哈)

补充内容 (2014-9-8 21:57):
那么多被解决的,没什么每人解决我的?

补充内容 (2014-9-9 14:47):
观看不回不是好学生,回复有JB奖励啊!
作者: 870844869    时间: 2014-9-4 09:00
路过,等待大神出现
作者: 新新月    时间: 2014-9-4 09:20
提示: 作者被禁止或删除 内容自动屏蔽
作者: niulin1    时间: 2014-9-4 11:24
等待大神出现
作者: niulin1    时间: 2014-9-4 11:43
大神怎么还不来啊
作者: niulin1    时间: 2014-9-4 11:53
大声喊道:大神啊,你去哪了?等你回来 来  来    来     来       来         ………………(回音)
作者: niulin1    时间: 2014-9-4 12:21
大声喊道:大神啊,你去哪了?等你回来 来  来    来     来       来         ………………(回音)
作者: niulin1    时间: 2014-9-4 12:25
大声喊道:大神啊,你去哪了?等你回来 来  来    来     来       来         ………………(回音)
作者: niulin1    时间: 2014-9-4 12:28
http://125.confly.eu.org/thread-13742175-1-1.html
还有这功能!{:soso_e121:}
作者: niulin1    时间: 2014-9-4 20:23
大声喊道:大神啊,你去哪了?等你回来 来  来    来     来       来         ………………(回音)
http://125.confly.eu.org/forum.php?mod= ... 175&pid=7018159
作者: niulin1    时间: 2014-9-4 20:42
大声喊道:大神啊,你去哪了?等你回来 来  来    来     来       来         ………………(回音)
作者: niulin1    时间: 2014-9-4 21:15
大神,你在哪 啊 《请你腾出宝贵的时间看看?
作者: niulin1    时间: 2014-9-4 21:42
坐等大神路过啊    11111
作者: 真的很疼    时间: 2014-9-5 00:28
通过NTDLL 里面的到导出函数、、
你百度找下 DLL函数查看器的源码就知道了。。。。。我只有VC的。。
作者: niulin1    时间: 2014-9-5 13:35
真的很疼 发表于 2014-9-5 00:28
通过NTDLL 里面的到导出函数、、
你百度找下 DLL函数查看器的源码就知道了。。。。。我只有VC的。。

关键是他们是未公开函数,所以是导不出的,我你说的那个源码
作者: 无名侠    时间: 2014-9-6 08:54
原始地址很简单,不进入内核都可以获取。
首先你要自己解析导出表,然后在导出表里找到相应的表项,最后的到代码的RVA。
然后搞到内核加载基址,把这个基址 + RVA 就是原始地址
作者: niulin1    时间: 2014-9-6 14:27
无名侠 发表于 2014-9-6 08:54
原始地址很简单,不进入内核都可以获取。
首先你要自己解析导出表,然后在导出表里找到相应的表项,最后的 ...

我是说在内核里获取,不进内核的我知道!
作者: 无名侠    时间: 2014-9-6 14:42
niulin1 发表于 2014-9-6 14:27
我是说在内核里获取,不进内核的我知道!

这个也可以在内核里用啊
作者: niulin1    时间: 2014-9-6 14:48
可是相对应的内核函数呢?
作者: 无名侠    时间: 2014-9-6 14:51
这个是我以前发在 梦之未来的帖子 , 给你复制关键的地方过来。 // 获取步骤// 获取SSDT表基址
// 获取ntkrnlpa.exe基址
// ZwCreateFile打开ntkrnlpa.exe
// ReadFile 读入到 缓冲区 pFilebuf
// SSDT表基址-ntkrnlpa.exe载入基址 = SSDT表RVA
// 计算RVA在ntkrnlpa.exe文件中的 FileOffet
// 原始函数地址 = pFileBuf + SSDT的FileOffset + 索引号*4




C代码如下:
ULONG GetReallySSDTFunctionAddress(ULONG index,ULONG _SSDT)  // 第一个参数是函数索引,第二个参数是KeServiceDescriptorTable 基址
{
// 获取步骤
// 获取SSDT表基址
// 获取ntkrnlpa.exe载入基址
// SSDT表基址-ntkrnlpa.exe载入基址 = SSDT表RVA
// 计算RVA在ntkrnlpa.exe文件中的 FileOffet
// 读入保存在硬盘上的SSDT表
// By 无名侠
  ULONG needlen;
  ULONG i;
  PVOID buf;
  ULONG ntkrnlpaBase=0;
  ULONG MemorySSDT; // 内存中SSDT表基址
  ULONG SSDT_RVA=0;
  PSYSTEM_MODULE_INFORMATION pModules;
  HANDLE handle=NULL;
  UNICODE_STRING FileName;
  OBJECT_ATTRIBUTES fileInfo={0};
  NTSTATUS status;
  IO_STATUS_BLOCK ioStatus;
  FILE_STANDARD_INFORMATION fsi={0};
  unsigned char *pFileBuff=NULL;
  ULONG NumberOfSection=0; //区块数目
  PIMAGE_DOS_HEADER pDosHead=NULL;
  PIMAGE_NT_HEADERS pNtHead=NULL;
  PIMAGE_SECTION_HEADER pSection=NULL; //所有区段
  ULONG addr2=0;
  ULONG addr1=0;
  ULONG ret_address;
  ULONG ssa;
  PWCHAR kernelName;
  ZwQuerySystemInformation(SystemModuleInformation,NULL,0,&needlen);
  buf=(PVOID)ExAllocatePoolWithTag(NonPagedPool,needlen,1448);
  if (buf==NULL){ DbgPrint("分配内存失败!!\n");return STATUS_UNSUCCESSFUL;}
  ZwQuerySystemInformation(SystemModuleInformation,(PVOID)buf,needlen,&needlen);
  pModules=(PSYSTEM_MODULE_INFORMATION)buf;
  ntkrnlpaBase=(ULONG)pModules->Module[0].Base;
  if (ntkrnlpaBase==0)
  {
    DbgPrint("内核基址获取失败!\n");
    return STATUS_UNSUCCESSFUL;
  }
  //DbgPrint("ntkrnlpaBase:%x",ntkrnlpaBase);
  MemorySSDT=*(ULONG*)_SSDT;
  if (MemorySSDT==0)
  {
    DbgPrint("获取SSDT表地址失败。\n");
    return STATUS_UNSUCCESSFUL;
  }else if (MemorySSDT<ntkrnlpaBase || MemorySSDT>(ntkrnlpaBase+pModules->Module[0].Size)) //SSDT表不再ntkrnlpa模块中
  {
    DbgPrint("SSDT表地址无效!\n");
    return STATUS_UNSUCCESSFUL;
  }

  SSDT_RVA = MemorySSDT-ntkrnlpaBase;
  if (SSDT_RVA==0)
  {
    DbgPrint("SSDT RVA未取到!\n");
    return STATUS_UNSUCCESSFUL;
  }
  //DbgPrint("SSDT RVA:%x",SSDT_RVA);
  __asm
  {
    pushad
      _emit 0x0f
      _emit 0x20
      _emit 0xe0    //mov eax,cr4
      shr eax,4
      and eax,1
      mov ssa,eax
      popad
  }
  kernelName = ssa?L"\\SystemRoot\\system32\\ntkrnlpa.exe" : L"\\SystemRoot\\system32\\ntoskrnl.exe";
  RtlInitUnicodeString(&FileName,kernelName);
  InitializeObjectAttributes(&fileInfo,&FileName,OBJ_CASE_INSENSITIVE,NULL,NULL);
  status=ZwCreateFile(&handle,GENERIC_READ,&fileInfo,&ioStatus,NULL,FILE_ATTRIBUTE_NORMAL,FILE_SHARE_READ|FILE_SHARE_WRITE,FILE_OPEN,FILE_SYNCHRONOUS_IO_NONALERT,NULL,0);
  if (ioStatus.Information!=1)
  {
    DbgPrint("文件打开失败!\n");
    return STATUS_UNSUCCESSFUL;
  }
  ZwQueryInformationFile(handle,&ioStatus,&fsi,sizeof(FILE_STANDARD_INFORMATION),FileStandardInformation);
  if ((LONG)fsi.EndOfFile.QuadPart==0)
  {
    DbgPrint("获取文件大小失败!\n");
    return STATUS_UNSUCCESSFUL;
  }
  pFileBuff=(unsigned char *)ExAllocatePoolWithTag(NonPagedPool,(size_t)fsi.EndOfFile.QuadPart,1449);
  if (pFileBuff==NULL)
  {
    DbgPrint("为文件分配缓冲区失败!!\n");
    return STATUS_UNSUCCESSFUL;
  }

  ZwReadFile(handle,NULL,NULL,NULL,&ioStatus,pFileBuff,(size_t)fsi.EndOfFile.QuadPart,0,NULL);

  pDosHead=(PIMAGE_DOS_HEADER)pFileBuff;
  pNtHead=(PIMAGE_NT_HEADERS)((ULONG)pDosHead+(ULONG)(pDosHead->e_lfanew));
  NumberOfSection=pNtHead->FileHeader.NumberOfSections;
  pSection=(PIMAGE_SECTION_HEADER)((ULONG)pNtHead+sizeof(IMAGE_NT_HEADERS));
  for(i=0;i<NumberOfSection;i++)
  {
    if ((SSDT_RVA>pSection.VirtualAddress) && (SSDT_RVA<(pSection.VirtualAddress+pSection.SizeOfRawData)))  //判断是否位于某个区块之简
    {
      //数据的文件偏移=(数据RVA - 节RVA) + 节的文件偏移
      //DbgPrint("RVA :%x   %d ",SSDT_RVA,i);
      //DbgPrint("RVA %d",pSection.VirtualAddress);
      addr2=SSDT_RVA-pSection.VirtualAddress;
      addr1=addr2+pSection.PointerToRawData;
      break;
    }
  }
  //DbgPrint("File Offset:%x",addr1);
  ret_address=addr1+index*4;
  _asm
  {
    pushad
      mov ecx,pFileBuff
      mov ebx,ret_address
      mov eax,[ebx+ecx]
      mov ret_address,eax
    popad
  }
  // 重定位
  ret_address-=pNtHead->OptionalHeader.ImageBase;
  ret_address+=ntkrnlpaBase;
  //释放资源
  ExFreePool(pFileBuff);
  ExFreePool(buf);
  ZwClose(handle);
return ret_address;
}

索引号相关的东西略,你自己去原帖查看
【SSDT】通过函数名获取索引和原始函数地址
http://www.mengwuji.net/forum.php?mod=viewthread&tid=1367
(出处: 梦织未来)




作者: niulin1    时间: 2014-9-6 16:16
无名侠 发表于 2014-9-6 14:51
这个是我以前发在 梦之未来的帖子 , 给你复制关键的地方过来。 // 获取步骤// 获取SSDT表基址
// 获取nt ...

关键是在易语言中内核函数的调用,无法确定在那个库里,接口是什么
作者: niulin1    时间: 2014-9-6 16:17
无名侠 发表于 2014-9-6 14:51
这个是我以前发在 梦之未来的帖子 , 给你复制关键的地方过来。 // 获取步骤// 获取SSDT表基址
// 获取nt ...

不在内核里我已办到,关键是在易语言中内核函数的调用,无法确定在那个库里,接口是什么,,,
作者: niulin1    时间: 2014-9-6 21:50
无名侠 发表于 2014-9-6 14:51
这个是我以前发在 梦之未来的帖子 , 给你复制关键的地方过来。 // 获取步骤// 获取SSDT表基址
// 获取nt ...

你的这些我看过了,不过很难转成易的,就是某些核心函数不知道在哪个库里,接口有事啥,麻烦你给转一下

补充内容 (2014-9-6 21:50):
不要汇编的,
作者: niulin1    时间: 2014-9-6 21:51
无名侠 发表于 2014-9-6 14:51
这个是我以前发在 梦之未来的帖子 , 给你复制关键的地方过来。 // 获取步骤// 获取SSDT表基址
// 获取nt ...

不要汇编的啊
作者: 无名侠    时间: 2014-9-6 22:17

那个好像是取内核基址的ssa这个变量里保存的基址
你自己用自己的方法取把
作者: 无名侠    时间: 2014-9-6 22:17
这个函数好像没有公开
作者: niulin1    时间: 2014-9-6 22:34
无名侠 发表于 2014-9-6 22:17
这个函数好像没有公开


作者: niulin1    时间: 2014-9-6 22:36
无名侠 发表于 2014-9-6 22:17
那个好像是取内核基址的ssa这个变量里保存的基址
你自己用自己的方法取把

InitializeObjectAttributes
这个函数在那个库里,在易语言里接口是啥?
作者: じ农夫三拳    时间: 2014-9-6 22:44
提示: 作者被禁止或删除 内容自动屏蔽
作者: じ农夫三拳    时间: 2014-9-6 22:47
提示: 作者被禁止或删除 内容自动屏蔽
作者: niulin1    时间: 2014-9-6 23:45
じ农夫三拳 发表于 2014-9-6 22:47
1)从System.map文件中直接得到地址:
      $ grep sys_open /usr/src/linux/System.map
   

你这我没用
作者: 无名侠    时间: 2014-9-7 09:38
你特征码搜索把,找到地址后字节调用
作者: niulin1    时间: 2014-9-7 14:11
无名侠 发表于 2014-9-7 09:38
你特征码搜索把,找到地址后字节调用

搜索者不是解决问题的根本
作者: niulin1    时间: 2014-9-7 14:13
我的问题怎么不在第一页了呢
作者: 无名侠    时间: 2014-9-7 15:38
niulin1 发表于 2014-9-7 14:11
搜索者不是解决问题的根本

这玩意就在ntoskrnl.exe里面。对了吧
只是没公开。

作者: niulin1    时间: 2014-9-7 15:43
无名侠 发表于 2014-9-7 15:38
这玩意就在ntoskrnl.exe里面。对了吧
只是没公开。

拜托大神,不用特征码给写一个源码发来看看,
作者: 无名侠    时间: 2014-9-7 15:49
niulin1 发表于 2014-9-7 15:43
拜托大神,不用特征码给写一个源码发来看看,

这玩意又没导出,你让我怎么找、
作者: 无名侠    时间: 2014-9-7 15:53
niulin1 发表于 2014-9-7 15:43
拜托大神,不用特征码给写一个源码发来看看,

还有 我不会用易语言写驱动
作者: niulin1    时间: 2014-9-7 16:58
无名侠 发表于 2014-9-7 15:53
还有 我不会用易语言写驱动


作者: niulin1    时间: 2014-9-9 13:04
快来大神、大鸟啊!!
作者: niulin1    时间: 2014-9-9 14:04
大鸟,你在哪里啊?
作者: niulin1    时间: 2014-9-9 14:49
观看不回不是好学生,回复有JB奖励啊!
作者: niulin1    时间: 2014-9-9 19:52
观看不回不是好学生,回复有JB奖励啊!
作者: niulin1    时间: 2014-9-9 19:53
观看不回不是好学生,回复有JB奖励啊!
作者: niulin1    时间: 2014-9-9 19:54
观看不回不是好学生,回复有JB奖励啊!看看
作者: niulin1    时间: 2014-9-30 19:10
还有人能解答吗




欢迎光临 精易论坛 (https://125.confly.eu.org/) Powered by Discuz! X3.4