从作弊引擎到C ++的指针

时间:2017-07-23 06:00:16

标签: c++ cheat-engine

我正在寻找一种方法将指针地址从作弊引擎传递到一行代码。

作弊引擎地址是P-> 0C86D240。

代码行如下:

WriteProcessMemory(handle,(LPVOID)P->0C86D240,).

最后我想改变指针地址'的值。

更新:我改变了P->到0x0C86D240,我能够为游戏的THAT会话写入内存。当关闭然后再次打开时,十六进制数字是不同的

5 个答案:

答案 0 :(得分:3)

Cheat Engine中的

P->0C86D240表示该条目是一个指针链,最终解析为地址0x0C86D240。如果在Cheat Engine中双击此部件,您将看到一个弹出对话框,显示此指针链的组成部分。例如,让我们调用起始指针P0和一系列名为offset0, offset1, offset2, ...的偏移量。指针链是取地址P0 + offset0的值,将其用作下一个指针P1,然后取地址P1 + offset1的值,将其用作下一个指针{{ 1}} ...这个链最终会给你一个地址P2。如果您重置游戏,则希望0C86D240不会发生变化,但之后的所有内容都会动态变化(即P0 ...)并一直追踪到所需的值。

如果你知道指针链是如何工作的,那么将它转换为C ++是微不足道的。您只需要记下基本指针和所有偏移量(如弹出对话框中双击P1, P2, P3,部分所示)。然后,向下追踪直到您用完所有偏移值。

答案 1 :(得分:1)

第1步:使用作弊引擎搜索您想要更改的值。

第2步:如果找到了正确的地址,请右键单击该地址并对该地址进行指针扫描。现在你应该得到许多具有一些偏移量的基地址。

第3步:关闭游戏并重复步骤1.现在复制新地址并单击重新扫描指针扫描(在步骤2中打开的窗口中)。在重新扫描地址中粘贴新地址现场和重新扫描。那么你应该只得到正确的基址+偏移量。

第4步:总是找到正确的地址:readprocessmemory(baseaddress + offset)

答案 2 :(得分:0)

首先,我无法弄清楚P->是什么?意味着可能删除它并使值为十六进制的

  

关闭后再次打开十六进制数字

如果我错了,我猜你正在谈论游戏然后再继续阅读

所以你从作弊引擎获得的地址可能是动态的,这意味着每次你关闭或打开它时该值会改变意义,程序将被分配到内存中的另一个地方

那你该怎么做.....

你可以找到静态地址这个过程有点复杂我会建议你看一个教程https://www.youtube.com/watch?v=hfWOAFsYnFA

答案 3 :(得分:0)

程序中内置的

作弊引擎教程涵盖了多级指​​针。先做你的工作。如果已经找到指针,那么您正在寻找的地址:一个静态地址,指向包含您要修改的值的地址。

答案 4 :(得分:0)

您编写了一个遍历多级指针的函数,该函数取消引用指针的每一步并添加相对偏移量。

在此示例中,我将使用我制作的简单的攻击立方体作弊

FindDMAAddy函数(查找动态内存分配地址):

uintptr_t FindDMAAddy(HANDLE hProc, uintptr_t ptr, std::vector<unsigned int> offsets)
{
    uintptr_t addr = ptr;
    for (unsigned int i = 0; i < offsets.size(); ++i)
    {
        ReadProcessMemory(hProc, (BYTE*)addr, &addr, sizeof(addr), 0);
        addr += offsets[i];
    }
    return addr;
}

主要代码:

    uintptr_t moduleBase = GetModuleBaseAddress(procId, L"ac_client.exe");

    //Get Handle to Process
    HANDLE hProcess = 0;
    hProcess = OpenProcess(PROCESS_ALL_ACCESS, NULL, procId);

    //Resolve base address of the pointer chain
    uintptr_t dynamicPtrBaseAddr = moduleBase + 0x10f4f4;

    std::cout << "DynamicPtrBaseAddr = " << "0x" << std::hex << dynamicPtrBaseAddr << std::endl;

    //Resolve our ammo pointer chain
    std::vector<unsigned int> ammoOffsets = { 0x374, 0x14, 0x0 };
    uintptr_t ammoAddr = FindDMAAddy(hProcess, dynamicPtrBaseAddr, ammoOffsets);

    std::cout << "ammoAddr = " << "0x" << std::hex << ammoAddr << std::endl;

您可以找到我的答案here的更完整版本,但您似乎已经知道其余的内容。