【问题标题】:C++ WriteProcessMemory Doesn't work in 32 bitC++ WriteProcessMemory 在 32 位中不起作用
【发布时间】:2013-03-25 21:15:26
【问题描述】:

问题在标题中 我使用写进程内存来改变内存中的一些值 我在 64 位窗口中尝试过,它的工作原理很完美 但问题出在 32 位窗口中,它没有写入我想要的值 读取进程内存在 64 位窗口和 32 位窗口中工作,但问题在于写入 请帮帮我(:

编辑: 代码是:

    #include "stdafx.h"
    #include <iostream>
    #include <fstream>
    #include <windows.h>
int _tmain(int argc, _TCHAR* argv[])
{
    cout << "Loading..."<< endl;
    int address = 0x3458CBC0; 
    int address2 = 0x3458CBC4; 
    int value = 20;
    DWORD pid;
    HWND hwnd = FindWindowA(NULL,"some window");
    GetWindowThreadProcessId(hwnd,&pid);
    HANDLE phandle;
    cout << "Found Proccess ID:" << pid << endl;
    phandle = OpenProcess(0x1F0FFF,0,pid);
    cout << "Loaded Successfully."<< endl ;
    ReadProcessMemory(phandle,(LPVOID)address,&value,4,0);
    cout << "Readed Value:" << value << endl;
    ReadProcessMemory(phandle,(LPVOID)address2,&value,4,0);
    cout << "Readed Value:" << value << endl;
    address = 0x3458CBC0; 
    address2 = 0x3458CBC4; 
    value = 20;
    WriteProcessMemory(phandle,(LPVOID)address,&value,4,0);
    WriteProcessMemory(phandle,(LPVOID)address2,&value,4,0);
    cin.get();
    return 0;
}

解决方案:

应用程序在内核中hook了写入内存的api 该钩子在 64 位 Windows 中不起作用,因此我可以写入内存

谢谢大家!

【问题讨论】:

  • 32 位进程正在尝试写入 64 位进程?
  • 您是在问WriteProcessMemory 是否有问题?或者如果你的代码有问题?
  • 我在询问是否有一种方法可以使写入进程内存在 32 位窗口中工作
  • 如何在 64 位中工作但在 32 位中无法工作的代码示例。同样,如果您是从/向 32 位、64 位等写入数据,请提供更多信息。
  • @H2CO3 WinAPI 运行良好。你在说什么?

标签: c++ winapi memory


【解决方案1】:

在 Windows 下运行的 32 位应用程序实际上使用了特殊的 32 位仿真包装器 (WOW64)。您不能从那里写入 64 位应用程序的地址空间。

Here's a page that explains it better than I can.

编辑添加:

如果您要在 32 位 Windows 上运行 32 位构建,它应该可以工作。如果没有,请发布您的代码。

编辑添加:

测试WriteProcessMemory()的返回值。如果它为零(这似乎很可能),请致电GetLastError()——这应该会给你一个线索。

【讨论】:

  • 我要改内存的应用是32位的,windows也是32位的
  • 它的 win 32 控制台应用程序使用 VS 2010 使用 windows 7 x64 构建
  • 当我将它复制到另一台使用 win xp x32 写入的计算机上时不起作用。
  • 你是对的它返回 0,GetLastError ??它返回 4294967295
  • 您绝对可以将进程内存从 32 位进程写入 64 位进程。您只限于在该 64 位进程的 4GB 可寻址范围内写入(即仅写入小于 0x00000000`ffffffff 的指针)。 64 位进程可以写入 x64 和 WOW64(32 位)进程。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-29
  • 2013-09-21
  • 1970-01-01
相关资源
最近更新 更多