怎样获取进程地址

BloodAndIron33 2004-09-13 02:30:50
怎样在VC中列举正在运行的程序并获取其起始地址和结束地址?
...全文
321 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
BloodAndIron33 2004-09-14
  • 打赏
  • 举报
回复
谢谢各位,更要谢谢XLT123,希望以后还能得到各位的指导
xlt123 2004-09-13
  • 打赏
  • 举报
回复
补充一下,以上方法适用win2000后版本
nt下不支持 ToolHelp,得用 PSAPI.DLL 中的
EnumProcesses ,EnumProcessModules

9X不支持 EXECUTE 属性,不过,系统
将自动转换为 PAGE_READWRITE,保险起见,传 PAGE_READWRITE
xlt123 2004-09-13
  • 打赏
  • 举报
回复
用HANDLE hProcess = OpenProcess(...)取得进程句柄
用Module32First,Module32Next列举进程使用的模块
当PROCESSENTRY32.th32ProcessID == MODULEENTRY32.th32ProcessID
时,该 MODULEENTRY32.hModule即为进程的载入地址
通过ReadProcessMemory,WriteProcessMemory即可读写该进程的内存地址
不过,OpenProcess 传递的权限必须是Read/Write:
PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE |
PROCESS_QUERY_INFORMATION

如果某段内存仍然无法读写,(ReadProcessMemory/WriteProcessMemory返回0)
用VirtualProtectEx修改该段内存的保护属性即可
保护属性改为 PAGE_EXECUTE_READWRITE

具体函数调用方法参看 msdn
rfa 2004-09-13
  • 打赏
  • 举报
回复
32位环境下的每个进程都有自己的虚拟地址空间(线性空间),这个空间在逻辑上是每个进程所私有的,并且这个空间最大可以有4.06GB。我想搂住的意思大概是想取出某个进程在物理内存的实际位置吧,这在DOS时代,或者是16位Windows下是可行的,但是在32位Windows平台下这是被严格禁止的(因为这样不安全)。
其实就是无论你的计算机是否真的具备4GB的实际物理内存,对于每个进程来说它都回认为自己所运行的计算机有4GB的内存,并且是被自己所独占的。
BloodAndIron33 2004-09-13
  • 打赏
  • 举报
回复
各位,Process32First和Process32Next用法我已经知道我急需的是得到正运行的进程在内存中的地址
yuantao 2004-09-13
  • 打赏
  • 举报
回复
枚举进程可以用toolhelp函数,也就是楼上的CreateToolhelp32Snapshot
Process32First
Process32Next


至于取得进程地址吗,就没什么办法了,因为每个进程的地址都是0x0 - 0xffffffff
oyljerry 2004-09-13
  • 打赏
  • 举报
回复
CreateToolhelp32Snapshot
Process32First
Process32Next
Mr-Chen 2004-09-13
  • 打赏
  • 举报
回复
http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=198597
BloodAndIron33 2004-09-13
  • 打赏
  • 举报
回复
接受准则

15,471

社区成员

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

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