У меня странная ошибка в моем коде 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