Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 试图取消对字节aka(无符号字符)的非空指针的引用时,程序崩溃_C++_C++11_Dereference_Unsigned Char - Fatal编程技术网

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*
aka
unsigned 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一样。这有点像在路灯下寻找钥匙-不是因为你把钥匙丢在那里了,而是因为那里有灯光,所以搜索更容易。