进程挂起和运行时的内存比较

dir541541 2008-10-24 01:41:33
1. 先创建一个进程并挂起
BOOL bCreate = CreateProcess(NULL, (LPTSTR)(LPCTSTR)strExeFile, NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, NULL, &si, &pi);

2. 这时用VirtualQueryEx查询内存,得到已提交的内存块和可写的内存块.

3. 恢复进程ResumeThread

4. 这时再查询内存块,怎么得到在挂起基础上新增的内存块?

望指点!
...全文
187 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
dir541541 2008-10-24
  • 打赏
  • 举报
回复
我用list试下
WinEggDrop 2008-10-24
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 dir541541 的回复:]
现在就在是想怎么存储这个地址的问题.
这个地址是页的起始地址,每个页具有相同的属性.
地址的起始大小可以通过

C/C++ code
SYSTEM_INFO sinfo; // 系统信息的结构体
DWORD pStartAddress = NULL; // 进程在内存中的起始地址
DWORD pEndAddress = NULL; // 进程在内存中的结束地址

GetSystemInfo(&sinfo);
pStartAddress = (DWORD)sinfo.lpMinimumApplicationAddress;
pEndAd…
[/Quote]

随便弄个链表,读内存成功后,将读了的起始地址和结果地址都记录就是,每个链表只是两个DWORD变量.
WinEggDrop 2008-10-24
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 dir541541 的回复:]
现在就在是想怎么存储这个地址的问题.
这个地址是页的起始地址,每个页具有相同的属性.
地址的起始大小可以通过

C/C++ code
SYSTEM_INFO sinfo; // 系统信息的结构体
DWORD pStartAddress = NULL; // 进程在内存中的起始地址
DWORD pEndAddress = NULL; // 进程在内存中的结束地址

GetSystemInfo(&sinfo);
pStartAddress = (DWORD)sinfo.lpMinimumApplicationAddress;
pEndAd…
[/Quote]

随便弄个链表,读内存成功后,将读了的起始地址和结果地址都记录就是,每个链表只是两个DWORD变量.
WinEggDrop 2008-10-24
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 dir541541 的回复:]
现在就在是想怎么存储这个地址的问题.
这个地址是页的起始地址,每个页具有相同的属性.
地址的起始大小可以通过

C/C++ code
SYSTEM_INFO sinfo; // 系统信息的结构体
DWORD pStartAddress = NULL; // 进程在内存中的起始地址
DWORD pEndAddress = NULL; // 进程在内存中的结束地址

GetSystemInfo(&sinfo);
pStartAddress = (DWORD)sinfo.lpMinimumApplicationAddress;
pEndAd…
[/Quote]

随便弄个链表,读内存成功后,将读了的起始地址和结果地址都记录就是,每个链表只是两个DWORD变量.
dir541541 2008-10-24
  • 打赏
  • 举报
回复
现在就在是想怎么存储这个地址的问题.
这个地址是页的起始地址,每个页具有相同的属性.
地址的起始大小可以通过

SYSTEM_INFO sinfo; // 系统信息的结构体
DWORD pStartAddress = NULL; // 进程在内存中的起始地址
DWORD pEndAddress = NULL; // 进程在内存中的结束地址

GetSystemInfo(&sinfo);
pStartAddress = (DWORD)sinfo.lpMinimumApplicationAddress;
pEndAddress = (DWORD)sinfo.lpMaximumApplicationAddress;

来获得,大概大小是2GB的内存

用数组记录又不知道数组的大小,如果先扫描一次看看一共有多少个页面,然后设置一个N个页面大小的数组
例如:
DWORD *array, n;
array = new DWORD[n];
.....
delete [] array;

这种会不会太影响速度?
WinEggDrop 2008-10-24
  • 打赏
  • 举报
回复
每一次读进程内存都有个地址呀,记录这个内存地址就是一个标识去区别是否读过.
dir541541 2008-10-24
  • 打赏
  • 举报
回复
你说的方法我想过,我是想通过数组来设置一个标志位,如果为true则为访问过的.
但是这个数组应该是未知的.
我并不知道有多少页是已提交并且可读写的.
这个数组怎么创建?
阿呆_ 2008-10-24
  • 打赏
  • 举报
回复
好像不难
建立两个排序的数组,分别记录下分配各个内存块的起始和终止地址,然后在第二个数组中搜索第一个数组中的每一项(可以用二分),找不到时停留在最靠近元素上,然后比较看是否存在包含或相等关系。

这样就可以过滤出所有新增加的内存块了。

15,466

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧