如何知道一个进程在虚拟地址空间中的开始和结束地址?

时间:2022-08-28 21:18:12
我知道开始地址一般在0x00400000,但有时在别的电脑上也会变动
如何准确的算出开始和结束地址呢?谢谢!

16 个解决方案

#1


关注中~~

#2


这个分数可能归我了,解释看你满意不?
1. Win32应用程序就是由一个个模块dll构成的,每次程序运行时,由loader装入组装成应用程序.所以说它是动态的,不过,每个模块装入的地址一般都是固定的
2. 这个地址由谁指定呢?在模块的export项中,把以loader在装入dll时,这些dll的指定的装入地址不会有冲突,loader就会把dll模块装入指定区域,否则loader必须重装入,并且修改其它模块的import项,这样,很耽误时间呀.
3. VC编译器生成的exe模块的输出地址:0x00400000
4. VC编译器生成的dll模块的输出地址:0x10000000
5. 系统dll的地址一般为:0x770000000
6. 每个编译器可以改变缺省输出地址,可以指定另外的一个输出装入地址
7. 想知道每个模块装入的起始地址及结束地址,可以用depends查看.
8. 在Debug运行下,也可以看到各模块动态装入的地址

#3


我想在我的程序中得到这些数据

#4


我觉得你可以用ToolHelp函数来枚举进程地址空间中的每一个模块,查看它们加载的地址。

#5


我知道这个进程本身就够了

#6


用什么API,有人知道吗?

#7


到www.myvc.net 或www.easthot.net去看看,有你要的答案

#8


WinMain()的第一个参数就是hIntance,它被叫做当前句柄,其实它就是你的.exe文件装入进程虚拟地址空间的起始地址。

#9


http://nowcan.yeah.net
我的作品里的进程列表。注:win9X下不能运行。

#10


我的问题是:一个进程在虚拟地址空间中的开始和结束地址
比如运行中的"记事本",用什么方法能得到,希望不要离题再次感谢!

#11


我想知道

#12


我的程序可以看到开始地址,不过结束地址好像不行。

#13


难道这也没人知道吗?

#14


用VirtualQueryEx可以查询该进程所有使用的内存及其模式。

#15


可能要用Vxd;
#define DEVICE_MAIN
#include "heap.h"
Declare_Virtual_Device(HEAP)
#undef DEVICE_MAIN

HeapVM::HeapVM(VMHANDLE hVM) : VVirtualMachine(hVM) {}

HeapThread::HeapThread(THREADHANDLE hThread) : VThread(hThread) {}

BOOL HeapDevice::OnSysDynamicDeviceInit()
{
   PVOID plin=0;
   MEMHANDLE hMem=0;
   hMem=GetNulPageHandle();
   dout<<"NULL page Handle: "<<hMem<<endl;
   if(!(plin=HeapAllocate(100,HEAPZEROINIT)))
   {
    dout<<"HeapAllocate Error"<<endl;
    return FALSE;
   }
   dout<<"HeapAllocate Address: "<<(DWORD)plin<<endl;
   MEMORY_BASIC_INFORMATION mbi;
   memset(&mbi,0,sizeof(mbi));
   if(!(PageQuery((DWORD)plin,&mbi,sizeof(mbi))))
   {
      dout<<"PageQuery Error"<<endl;
      return FALSE;
   }
   Show_Mem_Info(&mbi);
   char *srcdata="123456789";
   char *desdata=0;
   memset(desdata,0,10);
   _asm
    {
      pushad
      mov eax,plin
      mov edi,eax
      mov eax,srcdata
      mov esi,eax
      mov ecx,10
      rep movsb
      mov eax,plin
      mov esi,eax
      mov eax,desdata
      mov edi,eax
      mov ecx,10
      rep movsb
      popad
    }
   dout<<"srcdata: "<<srcdata<<endl;
   dout<<"desdata: "<<desdata<<endl;
    if(!(HeapFree(plin,0)))
   {
    dout<<"HeapFree Error"<<endl;
    return FALSE;
   } 
return TRUE;
}

void HeapDevice::Show_Mem_Info(PMEMORY_BASIC_INFORMATION mbi)
{
   dout<<"Basic_Address: "<<mbi->mbi_BaseAddress<<endl;
   dout<<"AllocationBase: "<<mbi->mbi_AllocationBase<<endl;
   dout<<"AllocationProtect: ";
   Show_Info(mbi->mbi_AllocationProtect);
   dout<<"RegionSize: "<<mbi->mbi_RegionSize<<endl;
   dout<<"State: ";
   Show_Info(mbi->mbi_State);
   dout<<"Protect: ";
   Show_Info(mbi->mbi_Protect);
   dout<<"Type: ";
   Show_Info(mbi->mbi_Type);
}

void HeapDevice::Show_Info(DWORD info)
{
   if(info&MEM_COMMIT) dout<<"Memory Commited"<<endl;
   if(info&MEM_FREE)   dout<<"Memory Free"<<endl;
   if(info&MEM_RESERVE) dout<<"Memory Reserve"<<endl;
   if(info&MEM_PRIVATE) dout<<"Memory Private"<<endl;
   if(info&PAGE_NOACCESS) dout<<"Memory NoAccess"<<endl;
   if(info&PAGE_READONLY) dout<<"Memory ReadOnly"<<endl;
   if(info&PAGE_READWRITE) dout<<"Memory ReadWrite"<<endl;
}


这是Vxd的查看系统那内存地址的代码!

#16


vxd不适于nt/2k啊?
有没有别的方法啊?

#1


关注中~~

#2


这个分数可能归我了,解释看你满意不?
1. Win32应用程序就是由一个个模块dll构成的,每次程序运行时,由loader装入组装成应用程序.所以说它是动态的,不过,每个模块装入的地址一般都是固定的
2. 这个地址由谁指定呢?在模块的export项中,把以loader在装入dll时,这些dll的指定的装入地址不会有冲突,loader就会把dll模块装入指定区域,否则loader必须重装入,并且修改其它模块的import项,这样,很耽误时间呀.
3. VC编译器生成的exe模块的输出地址:0x00400000
4. VC编译器生成的dll模块的输出地址:0x10000000
5. 系统dll的地址一般为:0x770000000
6. 每个编译器可以改变缺省输出地址,可以指定另外的一个输出装入地址
7. 想知道每个模块装入的起始地址及结束地址,可以用depends查看.
8. 在Debug运行下,也可以看到各模块动态装入的地址

#3


我想在我的程序中得到这些数据

#4


我觉得你可以用ToolHelp函数来枚举进程地址空间中的每一个模块,查看它们加载的地址。

#5


我知道这个进程本身就够了

#6


用什么API,有人知道吗?

#7


到www.myvc.net 或www.easthot.net去看看,有你要的答案

#8


WinMain()的第一个参数就是hIntance,它被叫做当前句柄,其实它就是你的.exe文件装入进程虚拟地址空间的起始地址。

#9


http://nowcan.yeah.net
我的作品里的进程列表。注:win9X下不能运行。

#10


我的问题是:一个进程在虚拟地址空间中的开始和结束地址
比如运行中的"记事本",用什么方法能得到,希望不要离题再次感谢!

#11


我想知道

#12


我的程序可以看到开始地址,不过结束地址好像不行。

#13


难道这也没人知道吗?

#14


用VirtualQueryEx可以查询该进程所有使用的内存及其模式。

#15


可能要用Vxd;
#define DEVICE_MAIN
#include "heap.h"
Declare_Virtual_Device(HEAP)
#undef DEVICE_MAIN

HeapVM::HeapVM(VMHANDLE hVM) : VVirtualMachine(hVM) {}

HeapThread::HeapThread(THREADHANDLE hThread) : VThread(hThread) {}

BOOL HeapDevice::OnSysDynamicDeviceInit()
{
   PVOID plin=0;
   MEMHANDLE hMem=0;
   hMem=GetNulPageHandle();
   dout<<"NULL page Handle: "<<hMem<<endl;
   if(!(plin=HeapAllocate(100,HEAPZEROINIT)))
   {
    dout<<"HeapAllocate Error"<<endl;
    return FALSE;
   }
   dout<<"HeapAllocate Address: "<<(DWORD)plin<<endl;
   MEMORY_BASIC_INFORMATION mbi;
   memset(&mbi,0,sizeof(mbi));
   if(!(PageQuery((DWORD)plin,&mbi,sizeof(mbi))))
   {
      dout<<"PageQuery Error"<<endl;
      return FALSE;
   }
   Show_Mem_Info(&mbi);
   char *srcdata="123456789";
   char *desdata=0;
   memset(desdata,0,10);
   _asm
    {
      pushad
      mov eax,plin
      mov edi,eax
      mov eax,srcdata
      mov esi,eax
      mov ecx,10
      rep movsb
      mov eax,plin
      mov esi,eax
      mov eax,desdata
      mov edi,eax
      mov ecx,10
      rep movsb
      popad
    }
   dout<<"srcdata: "<<srcdata<<endl;
   dout<<"desdata: "<<desdata<<endl;
    if(!(HeapFree(plin,0)))
   {
    dout<<"HeapFree Error"<<endl;
    return FALSE;
   } 
return TRUE;
}

void HeapDevice::Show_Mem_Info(PMEMORY_BASIC_INFORMATION mbi)
{
   dout<<"Basic_Address: "<<mbi->mbi_BaseAddress<<endl;
   dout<<"AllocationBase: "<<mbi->mbi_AllocationBase<<endl;
   dout<<"AllocationProtect: ";
   Show_Info(mbi->mbi_AllocationProtect);
   dout<<"RegionSize: "<<mbi->mbi_RegionSize<<endl;
   dout<<"State: ";
   Show_Info(mbi->mbi_State);
   dout<<"Protect: ";
   Show_Info(mbi->mbi_Protect);
   dout<<"Type: ";
   Show_Info(mbi->mbi_Type);
}

void HeapDevice::Show_Info(DWORD info)
{
   if(info&MEM_COMMIT) dout<<"Memory Commited"<<endl;
   if(info&MEM_FREE)   dout<<"Memory Free"<<endl;
   if(info&MEM_RESERVE) dout<<"Memory Reserve"<<endl;
   if(info&MEM_PRIVATE) dout<<"Memory Private"<<endl;
   if(info&PAGE_NOACCESS) dout<<"Memory NoAccess"<<endl;
   if(info&PAGE_READONLY) dout<<"Memory ReadOnly"<<endl;
   if(info&PAGE_READWRITE) dout<<"Memory ReadWrite"<<endl;
}


这是Vxd的查看系统那内存地址的代码!

#16


vxd不适于nt/2k啊?
有没有别的方法啊?