В игре Source SDK
-
Автор темы
- #1
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Работа с памятью 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
);
Опишем стандартную конструкцию
Код:
#include <Windows.h>
#include <TlHelp32.h>
#include <string>
#include <conio.h>
#include <iostream>
int main(){
return 0;
}
Код:
HANDLE _hProc = NULL;
DWORD _pID = NULL;
Код:
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* var;
int i = 5;
var = &i;
while (true)
{
cout << var << " - " << *var << endl;
Sleep(200);
if (GetAsyncKeyState(VK_SPACE) & 0x1)
{
*var += 5;
}
}
}
Запустите её, и пусть она работает.
Перейдём обратно к написанию основной программы.
В Main функции находим пид и открываем процесс
Код:
_pID = FindProcessId("testprogram.exe");
_hProc = OpenProcess(PROCESS_ALL_ACCES, NULL, _pID);
В тестовой программе мы видем это -
Приступаем к чтению
Добавляем буффер
Код:
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);
Ну вот и всё. Не забываем закрыть HANDLE.
Код:
CloseHandle(_hProc);