Перейти к содержанию
Опубликовано
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 =)

02a1fd3cc9ed.png

 

 

Рекомендуемые сообщения

Опубликовано
comment_279

И я в процессе написания столкнулся с проблемами

1. Отсутствует ; после после свойств FindProcessId

2.FindProcessId недопустимое определение функций


P.S также были ошибки с string нужно подписать std:: , и не объявленный HANDLE _hSnap

Гость
Эта тема закрыта для публикации ответов.