Почему я не могу писать в память процесса (WriteProcessMemory)?
Краткое содержание:
Итак, в основном я пытаюсь читать/записывать целевой процесс ConsoleApplication1.exe, используяReadProcessMemory
и функции в winapi. Я могу читать из памяти целевого процесса, но не могу записывать в память.
Подробности:
(Процесс, используемый для чтения/записи в память)
Код:
// GetBaseAddress.cpp : This file contains the 'main' function. Program execution begins and ends there.
//
#include <sstream>
#include <iostream>
#include <windows.h>
#include <psapi.h>
#include <processthreadsapi.h>
#include <tlhelp32.h>
#include <string.h>
using namespace std;
DWORD FindID(char *name );
void errExit(const char msg[50], HANDLE handle = 0);
int main()
{
std::cout << "Hello World!\n";
/*Find Process ID by Name*/
char name[] = "ConsoleApplication1.exe";
DWORD processID = FindID(name);
HANDLE processHandle = OpenProcess(PROCESS_ALL_ACCESS, false, processID);
HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, processID);
if (snapshot == INVALID_HANDLE_VALUE || processHandle == NULL||processHandle == INVALID_HANDLE_VALUE) {
errExit("Counldn't create snapshot exiting...", snapshot);
}
cout << "[+]Snapshot created for PID:" << processID << endl;
cout << "[+]Retriving Module Info..." << endl;
MODULEENTRY32 moduleEntry ;
moduleEntry.dwSize = sizeof(MODULEENTRY32);
if (Module32First(snapshot, &moduleEntry) == FALSE) {
errExit("Counldn't retrive entry exiting...",processHandle);
}
//stringstream address;
//
char buff[12] = "Hello World";
DWORD offset = 0x19B44; //HelloWorld - [H]
//
//BYTE word = *moduleEntry.modBaseAddr;
DWORD_PTR dwModuleBaseAddress = (DWORD_PTR)moduleEntry.modBaseAddr+offset;
std::stringstream stream;
stream << std::hex << dwModuleBaseAddress;
std::string hexAddress = stream.str();
cout << "[+]Base Address of the module is:" << hexAddress << endl;
cout << "[+]Reading Memory..." << endl;
BOOL rslt = ReadProcessMemory(processHandle, moduleEntry.modBaseAddr + offset, buff, sizeof(buff) - 1, NULL);
if (rslt == FALSE) {
errExit("Couldn't read memory region exiting...");
}
//char buff2[] = "Hacked ";
cout << "[+]Memory Data:" << buff << endl;
cout << endl;
rslt= WriteProcessMemory(processHandle, moduleEntry.modBaseAddr + offset,buff,sizeof(buff)-1,NULL);
if (rslt == FALSE) {
errExit("Couldn't write to the Memory Address");
}
}
DWORD FindID(char *name) {
cout << name << endl;
DWORD procIDs[1024],needed=0;
std::wstring str = L"ConsoleApplication1.exe";
int rslt = EnumProcesses(procIDs, sizeof(procIDs), &needed);
if (rslt==0) {
errExit("Procees IDs list couldn't be retrived exiting...");
}
cout << "[+]Process IDs List Retrived..." << endl;
cout << "[+]Bytes Returned:" << needed << endl;
cout << "[+]sizeof(DWORD):" << sizeof(DWORD) << endl;
cout << "[+]Number of Process Retrived:" << needed / sizeof(DWORD) << endl;
for (int i = 0;i <= needed / sizeof(DWORD); i++) {
HANDLE processHandle = OpenProcess(PROCESS_ALL_ACCESS, false, procIDs[i]);
if (processHandle == NULL) {
//CloseHandle(processHandle);
continue;
}
wchar_t processFileName[MAX_PATH];
GetModuleBaseNameW(processHandle, NULL, processFileName, sizeof(processFileName));
if (std::wstring(processFileName) == str) {
cout << "[+]Found:" << procIDs[i] << endl;
cout << "[+]Process " <<":" << i << endl;
wcout << "[+]Process Name" << ":" << processFileName << endl;
return procIDs[i];
}
CloseHandle(processHandle);
}
}
void errExit(const char msg[50], HANDLE handle) {
cout << "[-]"<<msg << endl;
cout << "[-]Retriving Last Error:" << GetLastError() << endl;
CloseHandle(handle);
system("pause");
exit(1);
}
Здесь я использую для чтения и записи в область памяти целевого процесса.
modEntry.modBaseAddr
содержит базовый адрес первого модуля процесса иmodEntry.modBaseAddr + offset
— это местоположение первого символа строки «Hello World» , расположенной в целевом процессе.
Это ошибка, с которой я получаюWriteProcessMemory
:
998 - ERROR_NOACCESS
Invalid access to memory location.
Вещи, которые я уже пробовал:
1. Использование
VirtualProtect
функция для изменения возврата защищенной области
FALSE
со Old Protect:
-PAGE_NOACCESS
0x01
По данным Microsoft:
СТРАНИЦА_NOACCESS0x01
Отключает любой доступ к выделенной области страниц. Попытка чтения, записи или выполнения зафиксированной области приводит к нарушению прав доступа. Этот флаг не поддерживается функцией CreateFileMapping.
2. Попытка несколько раз - возвращает ту же ошибку.
3. Использование жестко запрограммированного адреса — возвращает ту же ошибку,
которую я пытался установить адрес напрямую, как(LPVOID)0x619b44
Здесь,modEntry.modBaseAddr + offset = 0x619b44
4. Попытка CloseHandle и повторно открыть процесс с помощью OpenProcess с использованием ограничения PROCESS_VM_WRITE - возвращает ту же ошибку.
Вот код ConsoleApplication.exe (целевой процесс, в котором я пытаюсь перезаписать данные):
#include<Windows.h>
//#include<unistd.h>
#include <iostream>
using namespace std;
int main()
{
HANDLE d = GetModuleHandle(NULL);
cout << "Module Handle:"<<d<<endl;
int gold = 0;
int* ptr = &gold;
char buff[] = "Hello World\n";
std::cout << buff;
system("title hackme");
std::cout << "Enter something:";
std::cin >> gold;
for (;;) {
std::cout << buff;
//gold++;
std::cout << "Address:";
std::cout << &gold<< std::endl;
std::cout << gold << std::endl;
Sleep(1000);
}
cout << "Congrats Pro!!!" << endl;
}
ВЫХОД для
GetBaseAddress
:
ВЫВОД для ConsoleApplication1.exe
Детали программного обеспечения:
- Сообщество Microsoft Visual Studio 2019
- Версия
16.11.23
- Оптимизация: отключена
- ОС: Окно 10