如何准确的算出开始和结束地址呢?谢谢!
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运行下,也可以看到各模块动态装入的地址
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下不能运行。
我的作品里的进程列表。注: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的查看系统那内存地址的代码!
#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运行下,也可以看到各模块动态装入的地址
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下不能运行。
我的作品里的进程列表。注: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的查看系统那内存地址的代码!
#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啊?
有没有别的方法啊?
有没有别的方法啊?