C语言怎么让找到一个进程在内存中的起始地址
我想写修改器计划让用户选择要修改的程序(进程)然后让用户输入数值(例如游戏里的角色血量)然后用指针去扫描这个进程例如void*p;if(*((double*)p)==用户...
我想写修改器
计划让用户选择要修改的程序(进程)
然后让用户输入数值(例如游戏里的角色血量)
然后用指针去扫描这个进程例如
void * p;
if (*((double*)p) == 用户输入的数)//也可能是别的数据类型
把所有符合的 数据的地址记下
然后用户故意让怪物打一下,使血量发生变化
再把变化后的血量输入,再扫描一次
这次扫描结果与上次扫描结果中,数据地址相同的保留
这样几次下来就能确定下血量这个数据的地址了
然后再用指针去修改
求怎么样找到一个进程在内存中的起始地址
用WIN32函数也可以
顺便说下它的结束地址
求破,求解,求大神,求赐教 展开
计划让用户选择要修改的程序(进程)
然后让用户输入数值(例如游戏里的角色血量)
然后用指针去扫描这个进程例如
void * p;
if (*((double*)p) == 用户输入的数)//也可能是别的数据类型
把所有符合的 数据的地址记下
然后用户故意让怪物打一下,使血量发生变化
再把变化后的血量输入,再扫描一次
这次扫描结果与上次扫描结果中,数据地址相同的保留
这样几次下来就能确定下血量这个数据的地址了
然后再用指针去修改
求怎么样找到一个进程在内存中的起始地址
用WIN32函数也可以
顺便说下它的结束地址
求破,求解,求大神,求赐教 展开
6个回答
展开全部
//获取模块基址可以使用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(..)。
展开全部
程序执行时在内存中有代码段和堆,动态数据在堆中存放,代码段中是没有你要的数据的。
基本上的过程是这样的:
1。枚举系统所有进程,找到你需要的进程id
2。对该进程进行快照,得到该进程的堆信息
3。在堆中查找你要的信息
基本上的过程是这样的:
1。枚举系统所有进程,找到你需要的进程id
2。对该进程进行快照,得到该进程的堆信息
3。在堆中查找你要的信息
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
Module32First中MODULEENTRY32结构里modBaseAddr就是主程序模块的起始地址
更多追问追答
追问
求具体代码,示例一下,还有顺便说下求它的结束地址
追答
最简单的方法是使用进程快照CreateToolhelp32Snapshot,列举所有的进程,然后枚举找到你所需要的进程,用Module32First获取其起始地址,然后用Module32Next获取下一个进程的基址也就是上一个进程的结束地址。
具体还是自己查一下MSDN,或者百度一下枚举所有进程的方法
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这应该是不可行的,操作系统的内存管理中会提供内存保护,你用c语言写一个程序运行之后,你定义的指针只能操作分配给你的那部分空间,不是所有空间都能操作的。也就说,你的c程序里面访问的所有变量,操作系统都会做一个检查,如果逻辑地址超出界地址寄存器的数值,是不可能的被执行的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
高深的问题,占位,同求大神
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询