从进程读取地址

时间:2013-12-03 21:10:21

标签: 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 个答案:

答案 0 :(得分:2)

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

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

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

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

    (如果你实际上希望从另一个进程读取一个C字符串,你需要将字符串的字节复制到你自己的内存中。然后指向它。)