C++ 试图取消对字节aka(无符号字符)的非空指针的引用时,程序崩溃
我试图在C++ 试图取消对字节aka(无符号字符)的非空指针的引用时,程序崩溃,c++,c++11,dereference,unsigned-char,C++,C++11,Dereference,Unsigned Char,我试图在tlhelp32.h中取消引用结构的modBaseAddr(BYTE*akaunsigned char*)成员。但当我试图取消引用它时,我的程序崩溃了。我做了一个if语句,以确保它不是nullptr。不是,但我的程序仍然崩溃。这是我的密码: #include <windows.h> #include <tlhelp32.h> #include <iostream> using namespace std; int main() { DWORD
tlhelp32.h
中取消引用结构的modBaseAddr
(BYTE*
akaunsigned char*
)成员。但当我试图取消引用它时,我的程序崩溃了。我做了一个if
语句,以确保它不是nullptr
。不是,但我的程序仍然崩溃。这是我的密码:
#include <windows.h>
#include <tlhelp32.h>
#include <iostream>
using namespace std;
int main()
{
DWORD pid = 0xFFFFFFFF;
MODULEENTRY32 mod_entry;
mod_entry.dwSize = sizeof(MODULEENTRY32);
HANDLE procH;
cout << "PID: " << flush;
cin >> pid;
procH = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE|TH32CS_SNAPMODULE32, pid);
if(procH == INVALID_HANDLE_VALUE)
{
cout << "Failed to retrieve process handle" << endl;
CloseHandle(procH);
return 1;
}
if(!(Module32First(procH, &mod_entry))){cout << "Mod32 1st failed\n";CloseHandle(procH);return 1;}
if(mod_entry.modBaseAddr == nullptr){cout << "modBaseAddr is empty\n";CloseHandle(procH);return 1;}
BYTE mod_baseaddr = *mod_entry.modBaseAddr; //<-------------------Causes program to crash.
return 0;
}
#包括
#包括
#包括
使用名称空间std;
int main()
{
DWORD pid=0xFFFFFF;
MODULEENTRY32模块输入;
mod_entry.dwSize=sizeof(MODULEENTRY32);
处理过程;
cout-pid;
procH=CreateToolhelp32Snapshot(TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32,pid);
if(procH==无效的句柄值)
{
这可能是其他进程地址空间中的地址,而不是您的地址。您可能正在寻找有效的ReadProcessMemory
@igortandtnik。非常感谢!如果您将此评论作为答案,我将接受它。@igortandtnik仔细考虑后,如果modBaseAddr
引用了另一个进程不应该只是将地址解释为它自己进程的一部分吗?因为两个程序可以有相同的虚拟地址(都有0x1地址等等)?@Jdoggy-是的。显然是另一个进程(也是)有一些地址在此进程中未使用。因此,您知道,在进程X中,某些模块加载在地址modBaseAddr
。在一个不相关的进程Y中读取地址modBaseAddr
,您到底希望实现什么?是的,您可能会很幸运:该地址可能在Y中有效,因此您可以读取一个字节的memory-那又怎样?那字节的内存没有任何意义,因为它对Y没有任何特别的意义,就像它对X一样。这有点像在路灯下寻找钥匙-不是因为你把钥匙丢在那里了,而是因为那里有灯,所以搜索更容易。这就是地址中的地址其他进程的空间,而不是您的。您可能正在寻找有效的ReadProcessMemory
@igortandtnik。非常感谢!如果您将此评论作为答案,我将接受它。@igortandtnik仔细考虑后,如果modBaseAddr
引用了另一个进程的虚拟地址空间,它不应该只是交互吗将地址作为它自己进程的一部分进行预处理,因为两个程序可以有相同的虚拟地址(都有0x1地址等等)?@Jdoggy-是的。显然,另一个进程(也有)有一些地址在此进程中未使用。因此,您知道,在进程X中,某些模块加载在地址modBaseAddr
。在一个不相关的进程Y中读取地址modBaseAddr
,您到底希望实现什么?是的,您可能会很幸运:该地址可能在Y中有效,因此您可以读取一个字节的memory-那又怎样?那字节的内存没有任何意义,因为它对Y没有任何特别的意义,就像它对X一样。这有点像在路灯下寻找钥匙-不是因为你把钥匙丢在那里了,而是因为那里有灯光,所以搜索更容易。