访问另一个程序的值

Sam*_*nen 1 c++ windows reverse-engineering

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

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

假设我有一个游戏,其中我有一个具有一定健康状态的角色,我想用我的c ++代码读取该健康状况(类似于如何使用作弊引擎程序读取不同的值).

我怎么做到这一点?

为清楚起见:操作系统是窗口

小智 7

您可以使用ReadProcessMemory/VirtualQuery(比ReadProcessMemory更安全)和WriteProcessMemory 函数.

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

int * money = 0x00400000+0x00ABCDEF;//pointer to money address
*money = 5000;//set money to 5000.
Run Code Online (Sandbox Code Playgroud)

如果你需要DLL的例子,这里有一些:

红色警报3玩家信息Mod

极品飞车:Underground 2作弊mod

有时指针可以改变他们所指向的内容,就应用程序而言,这可能是"危险的".

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

  • 正常退出应用程序并让用户知道您无法处理它
  • 改为使用try/catch块处理问题?(一定要捕获正确的错误)
  • 硬退出应用程序
  • 什么都不做,让应用程序表现得很奇怪/崩溃
  • ... 越来越多

我自己也编写了指针类来处理解除引用并在遇到错误时停止(返回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();
    }
};
Run Code Online (Sandbox Code Playgroud)

用法:

unsigned long ipaddr = htonl(Pointer<unsigned long>(0x00400000+0x008E3A74,0x04,0x38,NULL)());//pointer to players IP address
if(ipaddr != NULL)//....
Run Code Online (Sandbox Code Playgroud)