【问题标题】:WriteProcessMemory() returns 487? Value found using CheatEngineWriteProcessMemory() 返回 487?使用 CheatEngine 找到的值
【发布时间】:2015-01-26 11:25:26
【问题描述】:

正如上面所写的 (^),我遇到了 C++ 和 WriteProcessMemory() 的问题。我打开了 Windows-Calc.exe,存储了一个数字并打开了 CheatEngine。我找到了这个数字(改变了它等)并将它放在这个程序中: (注:我是德国人;“Rechner”等于“Calculator”)

#include <iostream>
#include <Windows.h>
using namespace std;

int main (){
    int Value = 500;
    HWND hWnd = FindWindow(0, L"Rechner");

    if (!hWnd) {
        cerr << "Can't find window" << endl;
        return 0;
        }

    DWORD PID;
    GetWindowThreadProcessId(hWnd, &PID);
    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, PID);

    if (!hProcess) {
        cerr << "Process handle error" << endl;
        return 0;
        }
    int iSuccess = WriteProcessMemory(hProcess, (LPVOID)0x899FC6F60C , &Value, (DWORD)sizeof(Value), NULL);
    int i = 0;
    while (iSuccess == 0){
        i = i+1;
        cerr << "Failed " << i  << "  Error:   " << GetLastError() << endl;
        iSuccess = WriteProcessMemory(hProcess, (LPVOID)0x899FC6F60C , &Value, (DWORD)sizeof(Value), NULL);  //Here all begins
        }
    clog << "Done" << endl;
    CloseHandle(hProcess);
    return 0;
}

找到了窗口,找到了进程(那里没有错误..)但是,“//这里一切开始”行返回 0,并将 GetLastError() 设置为 487。就像以下所有内容一样。 如果你知道,我做错了什么,请描述它对菜鸟友好,我昨天开始使用 C++。

【问题讨论】:

  • 487ERROR_INVALID_ADDRESS(尝试访问无效地址)。 0x899FC6F60C 可能未在计算器进程中映射。该地址来自哪里?
  • 错误 487 等同于 ERROR_INVALID_ADDRESS。你想写的那个神奇的地址是什么(或者你认为它是什么)?
  • 硬编码地址是一种非常值得怀疑的方法。一方面,地址空间布局随机化功能旨在击败它。但最常见的故障模式是您在 32 位程序中使用 64 位地址。所以你实际上是在尝试写 0x99FC6F60C。将项目的平台目标更改为 x64,然后重试。
  • 目标 (calc.exe) 应为 x64.. 这是一个 windows 应用程序。
  • 0x899FC6F60C 绝对是 64 位地址。这当然意味着您的 calc.exe 是 64 位的。如果您的应用程序是 32 位的,您将无法使用 64 位地址,因为 WriteProcessMemory 采用 32 位地址。正如 Hans 所说,您的应用程序必须是 64 位的才能执行此操作。

标签: c++ memory memory-address writing


【解决方案1】:

请参阅此link,了解 GetLastError 代码的含义。

在这种情况下ERROR_INVALID_ADDRESS,尝试访问无效地址。

这是因为您正在写入“随机”内存地址。你不能只取一个数字就希望这个地址的其他进程有内存。

【讨论】:

  • 特别是因为每个进程都有自己的虚拟地址空间。
  • 我使用CheatEngine找到了地址,但是CE给了我899FC6F60C,所以我只是在前面放了一个0x。这行得通吗?
  • 我不知道 CheatEngine 是做什么的。而且由于现代操作系统会随机分配用户进程的虚拟地址空间,因此您无法确定地址是否正确。并且每次启动应用程序时都会/可能会有所不同。
  • @ProgrammingDonkey 您需要减去应用程序的基地址以使地址相对,然后在连续启动时写入[base + relativeAddr]。另请阅读ASLR
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-11
  • 1970-01-01
相关资源
最近更新 更多