Опубликовано 3 декабря, 20178 г. comment_145 Работа с памятью C++ В этом уроке я расскажу про использование методов BOOL WINAPI WriteProcessMemory( _In_ HANDLE hProcess, _In_ LPVOID lpBaseAddress, _In_ LPCVOID lpBuffer, _In_ SIZE_T nSize, _Out_ SIZE_T *lpNumberOfBytesWritten ); BOOL WINAPI ReadProcessMemory( _In_ HANDLE hProcess, _In_ LPCVOID lpBaseAddress, _Out_ LPVOID lpBuffer, _In_ SIZE_T nSize, _Out_ SIZE_T *lpNumberOfBytesRead ); Собственно 1 метод пишет в память, а 2 читает из неё. Опишем стандартную конструкцию #include <Windows.h> #include <TlHelp32.h> #include <string> #include <conio.h> #include <iostream> int main(){ return 0; } Добавим переменные для работы HANDLE _hProc = NULL; DWORD _pID = NULL; Добавим функцию получения ID процесса DWORD FindProcessId(string processName) { PROCESSENTRY32 peInfo; peInfo.dwSize = sizeof(peInfo); HANDLE _hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL); if (_hSnap== INVALID_HANDLE_VALUE) return 0; Process32First(_hSnap, &peInfo); if (!processName.compare(peInfo.szExeFile)) { CloseHandle(_hSnap); return peInfo.th32ProcessID; } while (Process32Next(_hSnap, &peInfo)) { if (!processName.compare(peInfo.szExeFile)) { CloseHandle(_hSnap); return peInfo.th32ProcessID; } } CloseHandle(_hSnap); return 0; } Теперь давайте напишем подопытную программу #include <Windows.h> #include <iostream> using namespace std; int main() { int iValue = 5; while (true) { printf_s("\rAdress: 0x%X Value = %i", &iValue, iValue); if (GetAsyncKeyState(VK_SPACE) & 0x1) iValue += 5; Sleep(200); } } Запустите её, и пусть она работает. Перейдём обратно к написанию основной программы. В Main функции находим пид и открываем процесс _pID = FindProcessId("testprogram.exe"); _hProc = OpenProcess(PROCESS_ALL_ACCES, NULL, _pID); Теперь можем приступать к чтению памяти. В тестовой программе мы видем это - http://s019.radikal.ru/i619/1709/0d/6b35890f0eab.png 0019FF30 - адрес ячейки памяти. Приступаем к чтению Добавляем буффер int read = 0; //Добавляем адрес DWORD offset= 0x0019FF30; //читаем ReadProcessMemory(_hProc, (PBYTE*)offset, &read, sizeof(int), 0); //выводим на экран std::cout << read << std::endl; Запускаем и видим что вывело то-же самое, что и в тестовой программе. Вот мы и прочитали память. Теперь запишем в память int write = 5555; WriteProcessMemory(_hProc, (PBYTE*)offset, &write, sizeof(int), 0); После запуска значение в тестовой программе изменится на 5555. Ну вот и всё. Не забываем закрыть HANDLE. CloseHandle(_hProc); With love by P45H3 =)
Опубликовано 10 февраля, 20188 г. comment_279 И я в процессе написания столкнулся с проблемами1. Отсутствует ; после после свойств FindProcessId2.FindProcessId недопустимое определение функцийP.S также были ошибки с string нужно подписать std:: , и не объявленный HANDLE _hSnap
comment_145http://s019.radikal.ru/i619/1709/0d/6b35890f0eab.png
With love by P45H3 =)