怎样获得一个进程的地址

解决方案 »

  1.   

    进程的地址?
    Win32中每个进程都有独立地址空间,你这个地址是指什么?
      

  2.   

    是不是要进程的ID
    首先, 调用 CreateToolhelp32Snapshot() 获得当前运行进程的快照,这个函数返回包含正在运行进程的快照句柄。其原形是:HANDLE WINAPI CreateToolhelp32Snapshot(DWORD dwFlags,DWORD th32ProcessID);
      

  3.   

    就像一楼所说,在WIN32中每个进程都有独立的地址空间,这个地址空间是虚拟的,他和实际的物理内存之间的映射关系是有操作系统来完成的,首先得明确一下基本的概念:进程:用最简洁的话来说,进程就是一个正在执行的程序,一个或多个线程在进程中运行。 
    线程:线程是操作系统分配CPU运算时间的最小单位。 每一个进程都提供了运行一个程序所必需的资源,一个进程具有4GB的虚拟地址空间,可执行代码,数据,对象句柄,环境变量,优先权以及设置最大化最小化的功能。每一个进程都从一个主线程开始执行,但可以在它所拥有的线程中创建额外的线程。系统资源,一个线程的资源包括线程的机器寄存器设置,内核堆栈,线程环境变量和进程虚拟地址中的用户堆栈。 
    对于不同的操作系统,每个进程的虚拟地址空间的分配是不同的。Windows NT Server Enterprise Edition 及Windows 2000 Advanced Server中低3GB虚拟地址空间供进程使用,高1GB供操作系统的内核代码使用。Windows NT/2000中低2GB供进程使用,高2GB供操作系统内核代码使用。Windows9X:0——64K只读空间用来装入Microsoft DOS 信息,64K——4M装入DOS的兼容代码,4M——2GB的私有空间供进程使用,2GB——3GB的共享空间装入各种DLL代码, 3GB——4GB为共享的系统内核代码空间,其中共享的2GB——4GB的空间是99%的“内存无效页错误”、“General Protect Error(GPE)”及蓝屏的罪魁祸首。 
    当然,操作系统不会真的给每个进程分配4GB的内存空间,否则,别说内存,连虚拟内存都不够用。操作系统 
    会将需要用到的某段虚拟地址的内容映射到物理内存,这种映射操作是操作系统内核完成的,无需程序员来控制。 
    基本概念就是这样,现在我们开始学习如何操作某个所需的进程的内存(严格来讲,是操作它的虚拟地址上 的数据,下同)。 
    首先,用CreateToolhelp32Snapshot创建当前内存的一个快照,将返回的句柄传递给Process32First、Process32Next来遍历内存中的所有进程,一旦遇到所需修改的某个游戏的进程,就将其进程ID保存下来,再用 OpenProcess打开这个进程,从而获得该进程的进程句柄。最后,利用这个句柄,使用ReadProcessMemory、WriteProcessMemory来读写虚拟地址 基本的思路就是这些,具体应用就由楼主自己来发挥了!
    希望对你有所帮助!
      

  4.   

    强烈同意 vcforever(霓裳羽衣)!
      

  5.   

    好像在msdn中有一个这样的例子!
      

  6.   

    赞成 vcforever(霓裳羽衣)的
      

  7.   

    agree vcforever(霓裳羽衣)!