我想写修改器
计划让用户选择要修改的程序(进程)
然后让用户输入数值(例如游戏里的角色血量)
然后用指针去扫描这个进程例如
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(..)。
计划让用户选择要修改的程序(进程)
然后让用户输入数值(例如游戏里的角色血量)
然后用指针去扫描这个进程例如
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(..)。