程序进程地址查询(网上搜到的答案)

来源:互联网 发布:现在php不好找工作 编辑:程序博客网 时间:2024/04/28 00:45
我想写修改器
计划让用户选择要修改的程序(进程)
然后让用户输入数值(例如游戏里的角色血量)
然后用指针去扫描这个进程例如
void * p;
if (*((double*)p) == 用户输入的数)//也可能是别的数据类型
把所有符合的 数据的地址记下
然后用户故意让怪物打一下,使血量发生变化
再把变化后的血量输入,再扫描一次
这次扫描结果与上次扫描结果中,数据地址相同的保留
这样几次下来就能确定下血量这个数据的地址了
然后再用指针去修改
求怎么样找到一个进程在内存中的起始地址
用WIN32函数也可以
顺便说下它的结束地址


Module32First中MODULEENTRY32结构里modBaseAddr就是主程序模块的起始地址
追问:
求具体代码,示例一下,还有顺便说下求它的结束地址
追答:
最简单的方法是使用进程快照CreateToolhelp32Snapshot,列举所有的进程,然后枚举找到你所需要的进程,用Module32First获取其起始地址,然后用Module32Next获取下一个进程的基址也就是上一个进程的结束地址。
具体还是自己查一下MSDN,或者百度一下枚举所有进程的方法




看MSDN。。。。。。


CreateToolhelp32Snapshot


Header   Declared in Tlhelp32.h.


Library   Use Kernel32.lib.  


DLL       Requires Kernel32.dll.
这是win32函数。在 Kernel32.dll.




程序执行时在内存中有代码段和堆,动态数据在堆中存放,代码段中是没有你要的数据的。
基本上的过程是这样的:
1。枚举系统所有进程,找到你需要的进程id
2。对该进程进行快照,得到该进程的堆信息
3。在堆中查找你要的信息




//获取模块基址可以使用windows api函数GetModuleHandle
 
#include "stdafx.h"
#include "windows.h"
#include "process.h"
int main(int argc, char* argv[])
{   //获取模块基址
    HMODULE hmou = ::GetModuleHandle(NULL);
    long int addr = (long int)hmou;
    printf("进程基址:0X%0X\n", addr);
    system("pause");
    return 0;
}
HMODULE GetModuleHandle (LPCTSTR  lpModuleName);
▲功能说明:获取一个应用程序或动态链接库的模块句柄
▲参数说明:lpModuleName 模块名称
▲返回值:如执行成功成功,则返回模块句柄。零表示失败。通过GetLastError获得错误信息
如:
GetModuleHandle(NULL);
这将返回自身应用程序句柄
▲注意:
前提是:只有欲获取的模块已映射到调用该函数的进程内,才会正确得到模块句柄。常用模块映射函数:LoadLibrary(..)。
0 0