从进程读取地址
Read Address from 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");
}
-
来自另一个进程的(有效、非null)指针只在该进程的地址空间内有意义。操作系统虚拟化内存,为每个进程提供自己的内存映射,因此相同的地址几乎总是指向完全不同的物理内存位置。或者可能指向一个已经换掉的位置,所以它目前根本不涉及物理内存。或者它甚至指向一个从未映射过的内存区域,因此当外星进程试图使用它时,它会触发segfault
要点是,为了在另一个进程中使用指针,该指针在几乎所有情况下都应该是从另一个过程中获得的。如果你正在查看另一个进程的指针,它们在你自己的地址空间中除了任意数字之外毫无用处;它们唯一真正的用途是作为索引进入其他进程的空间。
-
在64位操作系统中,指针和int的大小通常不同。如果您正在从另一个进程读取指针,则需要复制
sizeof(your_pointer_type)
字节,而不是4字节。 -
如果要像对待int那样输出指针值,最好确保它不是
char*
——否则,它将被视为字符串,并将触发对该地址的读取。请参阅上面的#1,了解为什么这是一件坏事。(如果你真的想从另一个进程中读取C字符串,你需要将字符串的字节复制到你自己的内存中。然后指向它。)
相关文章:
- 如何读取特定地址的进程内存?
- Valgrind 大小为 8 且地址 0x5b7e520 的读取无效,在大小为 16 的块内为 0 字节 free'd
- 从二进制流中读取时,将双精度变量的地址转换为 char* 意味着什么?
- 面临分段故障 使用 ffmpeg 读取视频时,因为"pFormatCtx-> streams [i]-> codecpar"的地址0x00
- 如何运行外部程序,向其传递内存地址以读取/写入?
- 读取 MAC 地址时文件读取异常
- C++ - 使用代码块从文件中读取 IP 地址
- 使用来自 C 的内存地址的 Julia 读取/写入结构数据
- C++/CPP 读取添加的十六进制地址
- exc_bad_access(代码= 1,地址= 0x68)在第二个读取方法中
- C++如何使用读取进程内存查找进程内存中使用的最后一个(偏移量 - 地址)
- 读取字符 * 始终具有相同的地址
- 使用 ReadProcessMemory 从进程读取相对于基址的地址
- 从蓝牙地址读取 3 个字节
- EXCEPTION_ACCESS_VIOLATION(从地址 0xffffffffffffffff 读取)
- process_vm_writev无法写入我能够读取的同一地址
- C++无法读取内存地址
- 将二进制文件读取到向量元素的地址中
- 从任何内存地址读取UInt32的最有效方法
- 使用变量的地址读取另一个进程的内存