所以,我一直想知道如何使用我的 c++ 代码访问不同程序的值。
我知道我必须知道内存位置并以某种方式访问它,但我真的不知道如何。
假设我有一个游戏,其中我的角色有一定的生命值,我想用我的 c++ 代码读取该生命值(类似于使用作弊引擎程序读取不同值的方式)。
我将如何做到这一点?
为清楚起见:操作系统是 windows
所以,我一直想知道如何使用我的 c++ 代码访问不同程序的值。
我知道我必须知道内存位置并以某种方式访问它,但我真的不知道如何。
假设我有一个游戏,其中我的角色有一定的生命值,我想用我的 c++ 代码读取该生命值(类似于使用作弊引擎程序读取不同值的方式)。
我将如何做到这一点?
为清楚起见:操作系统是 windows
您可以使用ReadProcessMemory / VirtualQuery(比 ReadProcessMemory 更安全)和WriteProcessMemory 函数。
如果你很聪明,你可以注入一个 DLL,然后你可以在你的代码中使用指针
int * money = 0x00400000+0x00ABCDEF;//pointer to money address
*money = 5000;//set money to 5000.
如果您需要 DLL 示例,这里有一些:
有时指针可以改变它们指向的东西,这在应用程序方面可能是“危险的”。
当您访问指向受保护内存区域、不可访问内存、而不是您想要的东西或无效位置的指针时,您的应用程序可能会崩溃。我不知道作弊引擎如何防止它,但你有几个选择,我建议的那些:
我还自己编写了指针类,它处理解引用并在遇到错误时停止(返回 null)
//null as last parameter automaticly "Dereferences"
template<class T = DWORD, class S = DWORD> struct Pointer
{
private:
std::vector<S> params;
S variable;
bool MoreThanOne;
public:
//null as last parameter automaticly "Dereferences"
template<class... Args>
Pointer(Args... args)
{
std::array<S, sizeof...(args)> list = {args...};
for( auto i : list)
params.push_back(i);
if(params.size() > 1)
MoreThanOne = true;
else
MoreThanOne = false;
}
T ResolvePointer()
{
variable = params[0];
if(!MoreThanOne)
return (T)variable;
try
{
auto it = params.begin();
++it;
for(; it != params.end(); ++it)
{
if(*reinterpret_cast<S*>(variable) == NULL)
return static_cast<T>(NULL);
variable = *reinterpret_cast<S*>(variable) + *it;
}
}
catch(...)
{
return static_cast<T>(NULL);
}
return (T)variable;
}
T operator()()
{
return ResolvePointer();
}
};
用法:
unsigned long ipaddr = htonl(Pointer<unsigned long>(0x00400000+0x008E3A74,0x04,0x38,NULL)());//pointer to players IP address
if(ipaddr != NULL)//....
如果不使用特定的IPC机制,则不应写入另一个进程的内存空间。操作系统通常会出于明显的原因阻止这种情况。相反,您需要使用目标应用程序的扩展机制,或反编译/修改/十六进制编辑来实现您想要的更改。话虽如此,这样做可能违反了您正在使用的软件的服务条款。
需要明确的是,代码可以很好地编译,让您可以设置一个指向您想要的任意地址的指针,但是一旦您尝试读取或写入该地址,操作系统就会介入并导致错误情况。
如果您这样做并没有违反软件的EULA,那么这里有一些提示可以帮助您查找您可能想要修改的内容:
您不能在另一个进程中访问变量,除非:
每个进程都有自己的地址空间[1],如果没有某种机制来访问它,就无法访问另一个进程的地址空间。
[1] 假设我们谈论的是使用适当内存管理的“真实”操作系统。在某些操作系统(例如传统 DOS)中,进程之间没有内存保护。但是,除非系统运行在非常微弱的处理器和少量内存下,否则没有理智的人可以使用这些操作系统。