【问题标题】:How to WriteProcessMemory with multipointers如何使用多指针编写ProcessMemory
【发布时间】:2014-12-21 14:24:12
【问题描述】:

首先,我想做的是改变游戏记忆中的一个值。 为了写入该变量,我需要添加以下指针和偏移量,因为这样我总是会得到一个有效的地址:

baseAddr + offset1 + offset2 + offset3 = myDesiredAddr

现在,这就是我试图做的......

ReadProcessMemory(
hProc, (LPVOID)(BaseAddr + offset1), &myDesiredAddr, sizeof(myDesiredAddr), 0
);
ReadProcessMemory(
hProc, (LPVOID)(myDesiredAddr + offset2), &myDesiredAddr, sizeof(myDesiredAddr), 0
);
ReadProcessMemory(
hProc, (LPVOID)(myDesiredAddr + offset3), &myDesiredAddr, sizeof(myDesiredAddr), 0
);

我已经厌倦了在我得到的最终地址上写入进程内存,但它没有成功读取和写入。任何建议都会有所帮助。

【问题讨论】:

  • ReadProcessMemory 提供返回值和获取读取数据量的方法,您可以忽略这两者。添加一些错误检查。
  • 不,我会检查它是否成功。这只是一个简单的例子。
  • 如果您不发布真实代码,很难给出阅读答案。如果您遇到错误,那是什么?非常重要的信息。
  • 我想知道在添加偏移量时我是否走在正确的方向,或者它是否做错了......
  • 我猜想最终地址 (myDesiredAddr + offset3) 不是hProc 中的有效地址。在我看来,您正试图将指向/指向该进程对象的指针跟踪到最终内存位置。我怀疑这是否可行,因为在您阅读时其他进程的内存可能会发生变化,从而导致您的最终地址无效。

标签: c++ pointers memory offset


【解决方案1】:

你可以这样做:

unsigned long offset1 =  /* your value              */
unsigned long offset2 =  /* your value              */
unsigned long offset3 =  /* your value              */
unsigned long BaseAddr = /* your value              */
unsigned long Pointer;   /* to hold the final value */
unsigned long temp;      /* hold the temp values    */
unsigned value =         /* value to write          */

上面显示了您的声明。我假设你检查读写函数是否返回成功,否则我建议你这样做。

ReadProcessMemory(
hProc, reinterpret_cast<LPVOID>(BaseAddr), &temp, sizeof(temp), 0);
Pointer = temp + offset1;

ReadProcessMemory(
hProc, reinterpret_cast<LPVOID>(Pointer), &temp, sizeof(temp), 0);
Pointer = temp + offset2;

ReadProcessMemory(
hProc, reinterpret_cast<LPVOID>(Pointer), &temp, sizeof(temp), 0);
Pointer = temp + offset3;

/* Now Pointer stores the final address and *
 * you can write to it                      */
WriteProcessMemory(
hProc, reinterpret_cast<unsigned*>(Pointer), &value, sizeof(value), 0);

通过添加内存地址和偏移量并将值存储在 Pointer 中,您可以继续从 Pointer 中读取并将临时地址存储在 temp 变量,直到你到达你想要的最终地址。

我建议您在循环中执行此操作以提高效率和更整洁的代码。

【讨论】:

    【解决方案2】:

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

    对于这个例子,我将使用我制作的一个简单的突击魔方作弊

    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的更完整版本

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多