gpt4 book ai didi

c++ - 访问另一个程序的值

转载 作者:可可西里 更新时间:2023-11-01 10:59:02 25 4
gpt4 key购买 nike

所以,我一直想知道如何使用我的 C++ 代码访问不同程序的值。

我知道我必须知道内存位置并以某种方式访问​​它,但我真的不知道如何访问。

假设我有一个游戏,其中我有一个具有一定健康值的角色,我想用我的 C++ 代码读取该健康值(类似于您可以使用 Cheat Engine 程序读取不同值的方式)。

我将如何做到这一点?

为清楚起见:操作系统是windows

最佳答案

您可以使用 ReadProcessMemory/VirtualQuery (比 ReadProcessMemory 更安全)和 WriteProcessMemory功能。

如果你很聪明,你可以注入(inject)一个 DLL,然后你就可以在你的代码中使用指针

int * money = 0x00400000+0x00ABCDEF;//pointer to money address
*money = 5000;//set money to 5000.

如果您需要 DLL 示例,这里有一些:

Red Alert 3 Player Information Mod

Need for Speed: Underground 2 cheat mod

有时指针可以改变它们指向的内容,这对应用程序来说可能是“危险的”。

当您访问指向 protected 内存区域、不可访问内存、而不是您想要的内容或无效位置的指针时,您的应用程序可能会崩溃。我不知道 Cheat Engine 如何阻止它,但你有几个选择,我建议的那些:

  • 优雅地退出应用程序并让用户知道你无法处理它
  • 改用 try/catch block 处理问题? (一定要捕捉到正确的错误)
  • 硬退出应用
  • 什么也不做,让应用程序表现怪异/崩溃
  • ...越来越多

我还自己编写了指针类,它处理取消引用并在遇到错误时停止(返回 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)//....

关于c++ - 访问另一个程序的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15649926/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com