开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

楼主: niulin1
收起左侧

[求助] 大神啊,你在哪啊?获取NtQuerVirtualMemory………………地址问题

[复制链接]
结帖率:47% (16/34)
 楼主| 发表于 2014-9-4 20:42:46 | 显示全部楼层   山东省济南市
大声喊道:大神啊,你去哪了?等你回来 来  来    来     来       来         ………………(回音)
回复 支持 反对

使用道具 举报

结帖率:47% (16/34)

签到天数: 1 天

 楼主| 发表于 2014-9-4 21:15:49 | 显示全部楼层   山东省济南市
大神,你在哪 啊 《请你腾出宝贵的时间看看?
回复 支持 反对

使用道具 举报

结帖率:47% (16/34)

签到天数: 1 天

 楼主| 发表于 2014-9-4 21:42:15 | 显示全部楼层   山东省济南市
坐等大神路过啊    11111
回复 支持 反对

使用道具 举报

结帖率:50% (1/2)
发表于 2014-9-5 00:28:12 | 显示全部楼层   湖南省郴州市
通过NTDLL 里面的到导出函数、、
你百度找下 DLL函数查看器的源码就知道了。。。。。我只有VC的。。
回复 支持 反对

使用道具 举报

结帖率:47% (16/34)

签到天数: 1 天

 楼主| 发表于 2014-9-5 13:35:05 | 显示全部楼层   山东省济南市
真的很疼 发表于 2014-9-5 00:28
通过NTDLL 里面的到导出函数、、
你百度找下 DLL函数查看器的源码就知道了。。。。。我只有VC的。。

关键是他们是未公开函数,所以是导不出的,我你说的那个源码
回复 支持 反对

使用道具 举报

结帖率:40% (31/78)
发表于 2014-9-6 08:54:06 | 显示全部楼层   四川省成都市
原始地址很简单,不进入内核都可以获取。
首先你要自己解析导出表,然后在导出表里找到相应的表项,最后的到代码的RVA。
然后搞到内核加载基址,把这个基址 + RVA 就是原始地址
回复 支持 反对

使用道具 举报

结帖率:47% (16/34)

签到天数: 1 天

 楼主| 发表于 2014-9-6 14:27:26 | 显示全部楼层   山东省济南市
无名侠 发表于 2014-9-6 08:54
原始地址很简单,不进入内核都可以获取。
首先你要自己解析导出表,然后在导出表里找到相应的表项,最后的 ...

我是说在内核里获取,不进内核的我知道!
回复 支持 反对

使用道具 举报

结帖率:40% (31/78)
发表于 2014-9-6 14:42:13 | 显示全部楼层   四川省乐山市
niulin1 发表于 2014-9-6 14:27
我是说在内核里获取,不进内核的我知道!

这个也可以在内核里用啊
回复 支持 反对

使用道具 举报

结帖率:47% (16/34)

签到天数: 1 天

 楼主| 发表于 2014-9-6 14:48:42 | 显示全部楼层   山东省济南市
可是相对应的内核函数呢?
回复 支持 反对

使用道具 举报

结帖率:40% (31/78)
发表于 2014-9-6 14:51:20 | 显示全部楼层   四川省成都市
这个是我以前发在 梦之未来的帖子 , 给你复制关键的地方过来。 // 获取步骤// 获取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
(出处: 梦织未来)



回复 支持 反对

使用道具 举报

  高级模式
B Color Image Link Quote Code Smilies |上传

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

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