c ++ istream error. Нарушение прав доступа - PullRequest
0 голосов
/ 24 октября 2019

У меня странная ошибка в моем коде c ++. Он находится в файле istream и говорит: «Исключено исключение, нарушение прав записи (включая снимок экрана). Точки останова даже не активируются в Visual Studio и в этом случае совершенно бесполезны. Мой код:

#include <Windows.h>
#include <TlHelp32.h>
#include <iostream>

using namespace std;

char* procName;

HANDLE GetProcessHandler(char * procName,DWORD &pid)
{
    PROCESSENTRY32 pe;
    int szpe = sizeof(pe);

    HANDLE ProcSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

    if (Process32First(ProcSnap, &pe) == true) // Skip the first process
    {
        while (Process32Next(ProcSnap, &pe) == true) // Loop through all processes
        {
            if (_stricmp(procName, pe.szExeFile) == 0)
            {
                return OpenProcess(PROCESS_ALL_ACCESS, FALSE, pe.th32ProcessID); // Return the handle of the process
            }
        }
    }
    return 0; // If fails, to detect funtion returns 0 which is invalid handle value
}

void GetProceesBaseAdress(char* procName, DWORD pid,DWORD &ProcessBaseAdress)
{
    MODULEENTRY32 me;

    int szme = sizeof(me);

    HANDLE ModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pid);

    if (Module32First(ModuleSnap, &me) == true) // Skip the first process
    {
        while (Module32Next(ModuleSnap, &me) == true) // Loop through all processes
        {
            if (_stricmp(procName, me.szModule) == 0) 
            {
                ProcessBaseAdress = (DWORD)me.modBaseAddr;
            }
        }
    }
}

void ReadMemory(HANDLE processH,DWORD &adress,DWORD ProcessBaseAdress,LPVOID buff)
{
    ReadProcessMemory(processH, &ProcessBaseAdress, buff, sizeof(DWORD), 0);
}

void WriteMemory(HANDLE processH,DWORD &adress,LPVOID buff)
{
    WriteProcessMemory(processH, &adress, buff, sizeof(DWORD), 0);
}

int main()
{
    DWORD ProcessBaseAdress,pid,adress;
    LPVOID buff = 0;
    cout << "Enter process name(With extension .exe)";
    cin >> procName;

    HANDLE processH = GetProcessHandler(procName,pid);
    GetProceesBaseAdress(procName, pid, ProcessBaseAdress);

#pragma region

    if (processH != 0 && processH > 0)
    {
        cout << "Handle is:" << processH << "\nProcessBaseAdress:" << ProcessBaseAdress << "\nPid:" << pid << endl;
        system("pause");
    }
    else
    {
        cout << "Process does not exist :(";
        system("pause");
    }
#pragma endregion debug


    int x;
    cout << "Enter choice(1=ReadMem,2=WriteMem):";
    cin >> x;
    switch (x)
    {
    case 1:
        cout << "Enter adress:";
        cin >> adress;
        ReadMemory(processH, adress, ProcessBaseAdress, buff);
        break;
    case 2:
        cout << "Enter adress:";
        cin >> adress;
        cout << "Enter new adress data:";
        cin >> buff;
        WriteMemory(processH, adress, buff);
        break;
    default:
        cout << "Invalid choice";
        break;
    }
    exit(0);
}


Никогда не видел такого поведения от базовой функции ввода, и да, я пробовал метод getline со строкой, он тоже не работает. Скриншот ошибки: ScreenShot

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...