c++ - 从进程中读取地址

标签 c++ process

我对这段 C++ 代码有疑问。当我使用普通地址时,它可以工作,但是当我使用指针地址时,它不起作用。当我输入指针地址时,它总是显示一个数字,但使用正常地址它可以正常工作。我必须添加什么才能使用指针?

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

int main()
{
HWND hwnd = FindWindow(L"MyWindow", 0);

if (hwnd){
    cout << "WINDOW FOUND" << endl;
}

else {
    cout << "WINDOW NOT FOUND" << endl;

    cout << hwnd << endl;

}

DWORD ProcessId;

ProcessId = GetProcessId(hwnd);

GetWindowThreadProcessId(hwnd, &ProcessId);

HANDLE hProcess = OpenProcess(PROCESS_VM_READ, FALSE, ProcessId);

if (!hProcess)
{
        Beep(1000, 1000);
}
else {
    int address;
redo:
    if (ReadProcessMemory(hProcess, (int *)0x733946D8, &address, 4, NULL))
    {
        cout << dec << address << endl;
        goto redo;
    }
    else  {
        MessageBox(0, TEXT("Could not Read"), TEXT("Return"), MB_OK);
    }
}
CloseHandle(hProcess);
cout << endl;
system("pause");
}

最佳答案

  1. 来自另一个进程的(有效、非空)指针仅在该进程的地址空间内才有意义。操作系统虚拟化内存,为每个进程提供自己的内存映射,因此相同的地址几乎总是指向完全不同的物理内存位置。或者可能是一个已经被换出的位置,所以它目前根本不指代物理内存。或者它甚至可能指向一个根本没有被映射的内存区域,因此当外来进程试图使用它时会触发一个段错误。

    要点是,为了在另一个进程中使用指针,该指针在几乎所有情况下都应该从另一个进程获得。而且,如果您正在查看另一个进程的指针,它们在您自己的地址空间中毫无用处,只是任意数字;它们唯一真正的用途是作为其他进程空间的索引。

  2. 在 64 位操作系统中,指针和整数的大小通常不同。如果您从其他进程读取指针,则需要复制 sizeof(your_pointer_type) 字节,而不是 4 个字节。

  3. 如果您要像使用 int 一样输出指针值,您最好确保它不是 char* -- 否则,它'将被视为一个字符串,并将触发对该地址的读取。请参阅上面的 #1,了解为什么这是一件坏事。

    (如果您确实想要从其他进程读取 C 字符串,您需要将字符串的字节复制到您自己的内存中。然后指向那个。)

关于c++ - 从进程中读取地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20361719/

相关文章:

c# - 如何从 C# 应用程序远程调用另一个进程方法

c# - 如何从 C# 启动进程?

c++ - 将 poco 静态库链接到 cmake 中的目标

c++ - Znwm和ZdlPv在汇编中是什么意思?

c++ - "Expected class-name"...析构函数实现中的问题

java - 如何从java运行cygwin脚本

python - Ruby 相当于 Python 的 subprocess.check_call/check_output

node.js - 如何从父进程中的 SIGINT 永远监视器中通知子进程?

c++ - std::vector::resize 应该默认构造多少次新元素?

C++文件读取问题