Подведи собственные итоги года совместно с YOUGAME и забери ценные призы! Перейти

Чтение/запись в память C++

  • Автор темы Автор темы P45H3
  • Дата начала Дата начала
В игре Source SDK
Забаненный
Забаненный
Статус
Оффлайн
Регистрация
10 Янв 2017
Сообщения
2,188
Реакции
806
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Работа с памятью C++
В этом уроке я расскажу про использование методов
Код:
Expand Collapse Copy
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 читает из неё.

Опишем стандартную конструкцию
Код:
Expand Collapse Copy
#include <Windows.h>
#include <TlHelp32.h>
#include <string>
#include <conio.h>
#include <iostream>

int main(){

return 0;
}

Добавим переменные для работы
Код:
Expand Collapse Copy
HANDLE _hProc = NULL;
DWORD _pID = NULL;

Добавим функцию получения ID процесса
Код:
Expand Collapse Copy
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;
}


Теперь давайте напишем подопытную программу
Код:
Expand Collapse Copy
#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 функции находим пид и открываем процесс
Код:
Expand Collapse Copy
_pID = FindProcessId("testprogram.exe");
_hProc = OpenProcess(PROCESS_ALL_ACCES, NULL, _pID);

Теперь можем приступать к чтению памяти.
В тестовой программе мы видем это -
6b35890f0eab.png
0019FF30 - адрес ячейки памяти.

Приступаем к чтению
Добавляем буффер
Код:
Expand Collapse Copy
int read = 0;
 //Добавляем адрес
DWORD offset= 0x0019FF30;
//читаем  

ReadProcessMemory(_hProc, (PBYTE*)offset, &read, sizeof(int), 0);
//выводим на экран
std::cout << read << std::endl;


Запускаем и видим что вывело то-же самое, что и в тестовой программе.
Вот мы и прочитали память.

Теперь запишем в память
Код:
Expand Collapse Copy
int write = 5555;
WriteProcessMemory(_hProc, (PBYTE*)offset, &write, sizeof(int), 0);

После запуска значение в тестовой программе изменится на 5555.

Ну вот и всё. Не забываем закрыть HANDLE.
Код:
Expand Collapse Copy
CloseHandle(_hProc);




 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Годно, поможет новичкам, которые хотят научиться писать читы.
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Делать ли гайд по чтению указателей? Использование адресов выделенных динамически. Получение элементов массива и т.д.?
 
Делать ли гайд по чтению указателей? Использование адресов выделенных динамически. Получение элементов массива и т.д.?
Гайл как компилить через замана без хайда:)
 
Код:
Expand Collapse Copy
int iValue = 5;
    while (true)
    {
        printf_s("\rAdress: 0x%X   Value = %i", &iValue, iValue);   
        if (GetAsyncKeyState(VK_SPACE) & 0x1)
            iValue += 5;   
        Sleep(200);
    }
Код:
Expand Collapse Copy
ReadProcessMemory(.... (LPVOID)offset, .......);
WriteProcessMemory(.... (LPVOID)offset, .......);
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Код:
Expand Collapse Copy
int iValue = 5;
    while (true)
    {
        printf_s("\rAdress: 0x%X   Value = %i", &iValue, iValue);  
        if (GetAsyncKeyState(VK_SPACE) & 0x1)
            iValue += 5;  
        Sleep(200);
    }
Код:
Expand Collapse Copy
ReadProcessMemory(.... (LPVOID)offset, .......);
WriteProcessMemory(.... (LPVOID)offset, .......);
А какая разница?
 
А какая разница?
в первом случаи меньше танцев с бубном + более верная реализация необходимого.
во втором просто более верное приведение типов согласно прототипу функции. не критично, но иногда может мозго*бить
 
То есть, это я могу добавить ячейку памяти, ну допустим на hp, что бы получать от туда значения, и при каждом перезапуске допустим си эс гоу, мне не придётся искать hp в памяти заново?
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
То есть, это я могу добавить ячейку памяти, ну допустим на hp, что бы получать от туда значения, и при каждом перезапуске допустим си эс гоу, мне не придётся искать hp в памяти заново?
Придётся, т.к. память выделена динамически. Надо искать класс хранения
 
Назад
Сверху Снизу