首页
论坛
专栏
课程

[调试逆向] [系统底层] [求助]VirtualQueryEx这个函数有没有大佬知道如何读取64位的程序

2017-12-21 12:11 3703

[调试逆向] [系统底层] [求助]VirtualQueryEx这个函数有没有大佬知道如何读取64位的程序

2017-12-21 12:11
3703
最新回复 (15)
武装的蔷薇 2017-12-21 12:12
2
0
实在搜不到了  只有来看雪求助了
yeyeshun 2 2017-12-21 16:15
3
0
贴代码
czcqq 2 2017-12-23 10:19
4
0
可以自己实现这个函数嘛!我也遇到过这个问题,我都是直接重写这个函数的!
武装的蔷薇 2017-12-23 11:37
5
0
czcqq 可以自己实现这个函数嘛!我也遇到过这个问题,我都是直接重写这个函数的!
如何重写呢  能不能给一个范例  没有找到这个函数的实现源码
czcqq 2 2017-12-23 11:56
6
0
可以给你一个源码,我贴上我已经重写过的函数的调用代码,运行这个例子前请先运行任务管理器,源代码正在打包和调整结构,稍后会上传!
这是例子代码
#include  "stdafx.h"
#include  <Windows.h>
#include  <TlHelp32.h>
#include  <Shlwapi.h>
#define  NOSYSTEMBASE_EXPORTS  //取消导入BPHookFunction动态链接库,只使用SystemBase.dll动态链接库
#include  "../../SystemBase/BPHookFunction/BPHookFunction.h"
/*
重写的代码需要的结构定义在压缩包根目录的winternl.h文件中,如果这个文件没有,请自行查找WRK,WDK(都是Windows源码中直接搬过来的)
代码中使用的自定义函数和重写的函数在本代码的压缩包中附带,如果需要请自行查看。
相关的DLL库请到../../SystemBase目录中复制你程序对应的版本的DLL到你的程序所在目录


64位程序:
DEBUG版本在../../SystemBase/x64/debug目录下
Release版本在../../SystemBase/x64/Release目录下

32位程序:
DEBUG版本在../../SystemBase/debug目录下
Release版本在../../SystemBase/Release目录下

../../SystemBase/X86目录下的程序为备份,请不要删除(其实我自己也搞糊涂了,我都不知道我为什么要保留这个目录了,但既然保留了酒保留下来吧!
作者  狂VS篮
QQ:332096943
如果有疑问请联系QQ
联系QQ请说明来意
*/
/*
被替代的系统函数,这些函数都是我重写的系统函数,它和系统函数的调用参数以及方式是完全一致的
重写的函数                                          系统函数
OpenProcessByProcessId                  OpenProcess
CloseObjectHandle                            CloseHandle
MmAllocateVirtualMemoryEx            VirtualAllocEx
MmVirtualQueryEx                              VirtualQueryEx
MmFreeVirtualMemoryEx                    VirtualFreeEx
*/
//以下函数是自定义函数
/*
//////////////////////////////////////////////
函数:GetLastErrorMessageW
功能:返回错误代码的格式化字符
参数LastError  为Windows错误代码
返回值:一个指向格式化字符串的指针
/////////////////////////////////////////////
函数:FreeMemory
功能:释放内存,只能释放由我的程序重写的代码申请的内存,不能用作释放别的代码申请的内存
参数Data  为需要释放的内存地址
返回值:FALSE或者TRUE
/////////////////////////////////////////////
函数:IsAdmin
功能:检查进程释放有管理员权限
返回值:当函数返回TRUE时,进程有管理员权限,否则就返回FALSE
/////////////////////////////////////////////
函数:ShellExecuteExAs
功能:创建具有管理员权限的进程
参数  appName  //进程名(实际上需要填写进程文件的地址,编程时没有注意)
appPath//需要填写进程文件的地址,编程时没有注意
lpParameter  //指向进程创建参数的字符串
lpDirector//进程的默认目录
hwnd//填写NULL
hProcess//这个参数是一个指向HANDLE的一个指针,它返回一个已经创建成功的进程的句柄
Show//进程创建选项,默认为SW_SHOWNORMA
IsRunAs//FALSE  或者  TRUE,是否创建一个管理员进程,如果选择TRUE,将创建一个管理员进程,创建管理员进程将有可能弹出UAC
返回值:与系统函数ShellExecut的返回值相同
/////////////////////////////////////////////
*/
int  _tmain(int  argc,  _TCHAR*  argv[])
{
       BOOL  IsError=0;//定义一个错误标识
       DWORD  LastError  =  0;//定义一个错误代码
       MEMORY_BASIC_INFORMATION  lpBuffer={0};//定义一个VirtualQueryEx的参数的结构
       SIZE_T  RegionSize  =  0;
       PVOID  Address  =  0;
       HANDLE  hProcess=NULL;
       HANDLE  hSnapShot  =  CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
       PROCESSENTRY32  pe;   
       pe.dwSize  =  sizeof(PROCESSENTRY32);
if(!Process32First(hSnapShot,&pe))       
        {       
                return  0;       
        }       
  while  (Process32Next(hSnapShot,&pe))
  {
         if(::StringCompareW(pe.szExeFile,TEXT("Taskmgr.exe"),FALSE))
         {
                   hProcess=::OpenProcessByProcessId(PROCESS_ALL_ACCESS,0,pe.th32ProcessID);
                 if(hProcess==NULL)
                 {
                         LastError=GetLastError();
                         if(LastError==5)
                         {
                                 if(!::IsAdmin())
                                 {
                                 if(MessageBox(NULL,TEXT("权限不足!请提升权限!\r\n是否提升权限?"),TEXT("权限不足!"),48+MB_YESNO))
                                 {
                                           CloseHandle(hSnapShot);
                                         ::ShellExecuteExAs(argv[0],argv[0],::GetCommandLine());
                                         return  0;
                                 }
                                 }
                         }
                        
                         IsError=TRUE;
                         goto  Error;
                 }else
                 {
                         goto  Next;
                 }
         }
  }
  MessageBox(NULL,TEXT("找不到任务管理器,请运行任务管理器!"),TEXT("错误"),48);
  CloseHandle(hSnapShot);
  return  0;
Next:
  RegionSize=sizeof(PVOID);
if(  ::MmAllocateVirtualMemoryEx(hProcess,&Address,0,&RegionSize,MEM_COMMIT,PAGE_READWRITE))//向任务管理器进程申请内存
{
       if(::MmVirtualQueryEx(hProcess,Address,&lpBuffer,RegionSize)!=0)//查询申请的内存属性
       {
               MessageBox(NULL,TEXT("程序运行成功!"),TEXT("错误"),0);
       }
       ::MmFreeVirtualMemoryEx(hProcess,&Address,&RegionSize,MEM_RELEASE);//释放申请的内存属性
}else
{
       LastError=GetLastError();
       IsError=TRUE;
}
//  ::MmVirtualQueryEx(
::CloseObjectHandle(hProcess);
Error:
  CloseHandle(hSnapShot);
  if(IsError)
  {
  LPCTSTR  ErrorStr=::GetLastErrorMessageW(LastError);//返回错误代码的格式化字符
MessageBox(NULL,ErrorStr,TEXT("错误"),16);
::FreeMemory(ErrorStr);//释放内存,只能释放由我的程序重写的代码申请的内存,不能用作释放别的代码申请的内存
ErrorStr=NULL;
  }
       return  0;
}
czcqq 2 2017-12-23 12:03
7
0
源代码被我封装在DLL库上了,实在不方便分离出来(主要是编译器被安装在远程计算机上了,我封装和打包代码都是远程登录远程计算机进行的,所以,我不打算分离源代码了,直接全部打包好再上传
czcqq 2 2017-12-23 12:03
8
0
czcqq 可以自己实现这个函数嘛!我也遇到过这个问题,我都是直接重写这个函数的!
源代码被我封装在DLL库上了,实在不方便分离出来(主要是编译器被安装在远程计算机上了,我封装和打包代码都是远程登录远程计算机进行的,所以,我不打算分离源代码了,直接全部打包好再上传
czcqq 2 2017-12-23 12:04
9
0
武装的蔷薇 如何重写呢 能不能给一个范例 没有找到这个函数的实现源码
可以给你一个源码,我贴上我已经重写过的函数的调用代码,运行这个例子前请先运行任务管理器,源代码正在打包和调整结构,稍后会上传!
这是例子代码
#include    "stdafx.h"
#include    <Windows.h>
#include    <TlHelp32.h>
#include    <Shlwapi.h>
#define    NOSYSTEMBASE_EXPORTS    //取消导入BPHookFunction动态链接库,只使用SystemBase.dll动态链接库
#include    "../../SystemBase/BPHookFunction/BPHookFunction.h"
/*
重写的代码需要的结构定义在压缩包根目录的winternl.h文件中,如果这个文件没有,请自行查找WRK,WDK(都是Windows源码中直接搬过来的)
代码中使用的自定义函数和重写的函数在本代码的压缩包中附带,如果需要请自行查看。
相关的DLL库请到../../SystemBase目录中复制你程序对应的版本的DLL到你的程序所在目录


64位程序:
DEBUG版本在../../SystemBase/x64/debug目录下
Release版本在../../SystemBase/x64/Release目录下

32位程序:
DEBUG版本在../../SystemBase/debug目录下
Release版本在../../SystemBase/Release目录下

../../SystemBase/X86目录下的程序为备份,请不要删除(其实我自己也搞糊涂了,我都不知道我为什么要保留这个目录了,但既然保留了酒保留下来吧!
作者    狂VS篮
QQ:332096943
如果有疑问请联系QQ
联系QQ请说明来意
*/
/*
被替代的系统函数,这些函数都是我重写的系统函数,它和系统函数的调用参数以及方式是完全一致的
重写的函数                                                                                    系统函数
OpenProcessByProcessId                                    OpenProcess
CloseObjectHandle                                                        CloseHandle
MmAllocateVirtualMemoryEx                        VirtualAllocEx
MmVirtualQueryEx                                                            VirtualQueryEx
MmFreeVirtualMemoryEx                                        VirtualFreeEx
*/
//以下函数是自定义函数
/*
//////////////////////////////////////////////
函数:GetLastErrorMessageW
功能:返回错误代码的格式化字符
参数LastError    为Windows错误代码
返回值:一个指向格式化字符串的指针
/////////////////////////////////////////////
函数:FreeMemory
功能:释放内存,只能释放由我的程序重写的代码申请的内存,不能用作释放别的代码申请的内存
参数Data    为需要释放的内存地址
返回值:FALSE或者TRUE
/////////////////////////////////////////////
函数:IsAdmin
功能:检查进程释放有管理员权限
返回值:当函数返回TRUE时,进程有管理员权限,否则就返回FALSE
/////////////////////////////////////////////
函数:ShellExecuteExAs
功能:创建具有管理员权限的进程
参数    appName    //进程名(实际上需要填写进程文件的地址,编程时没有注意)
appPath//需要填写进程文件的地址,编程时没有注意
lpParameter    //指向进程创建参数的字符串
lpDirector//进程的默认目录
hwnd//填写NULL
hProcess//这个参数是一个指向HANDLE的一个指针,它返回一个已经创建成功的进程的句柄
Show//进程创建选项,默认为SW_SHOWNORMA
IsRunAs//FALSE    或者    TRUE,是否创建一个管理员进程,如果选择TRUE,将创建一个管理员进程,创建管理员进程将有可能弹出UAC
返回值:与系统函数ShellExecut的返回值相同
/////////////////////////////////////////////
*/
int    _tmain(int    argc,    _TCHAR*    argv[])
{
              BOOL    IsError=0;//定义一个错误标识
              DWORD    LastError    =    0;//定义一个错误代码
              MEMORY_BASIC_INFORMATION    lpBuffer={0};//定义一个VirtualQueryEx的参数的结构
              SIZE_T    RegionSize    =    0;
              PVOID    Address    =    0;
              HANDLE    hProcess=NULL;
              HANDLE    hSnapShot    =    CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
              PROCESSENTRY32    pe;       
              pe.dwSize    =    sizeof(PROCESSENTRY32);
if(!Process32First(hSnapShot,&pe))               
                {               
                                return    0;               
                }               
    while    (Process32Next(hSnapShot,&pe))
    {
                  if(::StringCompareW(pe.szExeFile,TEXT("Taskmgr.exe"),FALSE))
                  {
                                      hProcess=::OpenProcessByProcessId(PROCESS_ALL_ACCESS,0,pe.th32ProcessID);
                                  if(hProcess==NULL)
                                  {
                                                  LastError=GetLastError();
                                                  if(LastError==5)
                                                  {
                                                                  if(!::IsAdmin())
                                                                  {
                                                                  if(MessageBox(NULL,TEXT("权限不足!请提升权限!\r\n是否提升权限?"),TEXT("权限不足!"),48+MB_YESNO))
                                                                  {
                                                                                      CloseHandle(hSnapShot);
                                                                                  ::ShellExecuteExAs(argv[0],argv[0],::GetCommandLine());
                                                                                  return    0;
                                                                  }
                                                                  }
                                                  }
                                                 
                                                  IsError=TRUE;
                                                  goto    Error;
                                  }else
                                  {
                                                  goto    Next;
                                  }
                  }
    }
    MessageBox(NULL,TEXT("找不到任务管理器,请运行任务管理器!"),TEXT("错误"),48);
    CloseHandle(hSnapShot);
    return    0;
Next:
    RegionSize=sizeof(PVOID);
if(    ::MmAllocateVirtualMemoryEx(hProcess,&Address,0,&RegionSize,MEM_COMMIT,PAGE_READWRITE))//向任务管理器进程申请内存
{
              if(::MmVirtualQueryEx(hProcess,Address,&lpBuffer,RegionSize)!=0)//查询申请的内存属性
              {
                              MessageBox(NULL,TEXT("程序运行成功!"),TEXT("错误"),0);
              }
              ::MmFreeVirtualMemoryEx(hProcess,&Address,&RegionSize,MEM_RELEASE);//释放申请的内存属性
}else
{
              LastError=GetLastError();
              IsError=TRUE;
}
//    ::MmVirtualQueryEx(
::CloseObjectHandle(hProcess);
Error:
    CloseHandle(hSnapShot);
    if(IsError)
    {
    LPCTSTR    ErrorStr=::GetLastErrorMessageW(LastError);//返回错误代码的格式化字符
MessageBox(NULL,ErrorStr,TEXT("错误"),16);
::FreeMemory(ErrorStr);//释放内存,只能释放由我的程序重写的代码申请的内存,不能用作释放别的代码申请的内存
ErrorStr=NULL;
    }
              return    0;
}
czcqq 2 2017-12-23 12:19
10
0
这个是源代码的压缩包,久等了,压缩包上传在尺寸限制的,所以必须打包!远程打包需要很久的时间!
上传的附件:
czcqq 2 2017-12-23 12:24
11
0
武装的蔷薇 如何重写呢 能不能给一个范例 没有找到这个函数的实现源码
我给你的这个源代码,一次性解决了,包括权限在内的所有问题,经过了我的调试在我的机器上和虚拟机上运行正常,应该可以解决你的问题!
czcqq 2 2017-12-23 12:50
12
0
这是你需要的已经重写好的  VirtualQueryEx函数  在源代码压缩包中也提供有,那个比较全面,包含需要的函数以及结构,现在我只是说明一下
SIZE_T
WINAPI
MmVirtualQueryEx(
        __in          HANDLE  hProcess,
        __in_opt  LPCVOID  lpAddress,
        __out_bcount_part(dwLength,  return)  PMEMORY_BASIC_INFORMATION  lpBuffer,
        __in          SIZE_T  dwLength
        )
{
       SIZE_T  ReturnSize  =  0;
       NTSTATUS  Status  =  0;
       if(!::ProbeForWrite(lpBuffer,sizeof(MEMORY_BASIC_INFORMATION)))//进行参数检查,增加程序稳定性,并非必要,可以去除
               return  FALSE;
       Status=ZwQueryVirtualMemory(hProcess,(PVOID)lpAddress,MemoryBasicInformation,lpBuffer,sizeof(MEMORY_BASIC_INFORMATION),&ReturnSize);//构建参数,调用ZwQueryVirtualMemory
       if(!NT_SUCCESS(Status))//返回一个NT错误,用宏NT_SUCCESS判断错误类型,如果NT_SUCCESS判断成功,即返回true则表明系统执行正常,否则系统执行出错
       {
//系统执行出错
               ::BaseSetLastNTError(Status);//自定义函数,功能将NT错误,转换为系统错误,并且调用SetLastError来设置错误
               return  FALSE;//返回一个FALSE,也就是0;
       }
       return  ReturnSize;//调用成功,返回内存块大小,这里还应该先调用一个::BaseSetLastNTError(NOERROR);的,用来表示系统调用没有错误,我给忘了!
       /*return  VirtualQueryEx(
               hProcess,
               lpAddress,
               lpBuffer,
               dwLength);*/
}
Cohen 2017-12-24 02:23
13
0
czcqq 这是你需要的已经重写好的 VirtualQueryEx函数 在源代码压缩包中也提供有,那个比较全面,包含需要的函数以及结构,现在我只是说明一下 SIZE_T WINAPI MmVirtualQu ...
替楼主谢谢你  虽然我看不懂
czcqq 2 2017-12-24 13:18
14
0
Cohen 替楼主谢谢你 虽然我看不懂[em_16]
别说你,要不是我研究Windows泄露源码有一段时间了,不然我也看不懂!Windows泄露源码不是那么好读懂的!
武装的蔷薇 2017-12-24 14:26
15
0
czcqq 别说你,要不是我研究Windows泄露源码有一段时间了,不然我也看不懂!Windows泄露源码不是那么好读懂的!
太6了  非常感谢大佬  看来需要好好研究一番了
yakoazz 2018-11-30 15:41
16
0
真的太棒了!感谢大佬
游客
登录 | 注册 方可回帖
返回