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

В игре Source SDK
Забаненный
Статус
Оффлайн
Регистрация
10 Янв 2017
Сообщения
2,148
Реакции[?]
806
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Работа с памятью 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* 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);
Теперь можем приступать к чтению памяти.
В тестовой программе мы видем это -
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);



 
Забаненный
Статус
Оффлайн
Регистрация
22 Сен 2017
Сообщения
73
Реакции[?]
12
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Годно, поможет новичкам, которые хотят научиться писать читы.
 
В игре Source SDK
Забаненный
Статус
Оффлайн
Регистрация
10 Янв 2017
Сообщения
2,148
Реакции[?]
806
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Делать ли гайд по чтению указателей? Использование адресов выделенных динамически. Получение элементов массива и т.д.?
 
Начинающий
Статус
Оффлайн
Регистрация
8 Май 2017
Сообщения
102
Реакции[?]
6
Поинты[?]
0
Делать ли гайд по чтению указателей? Использование адресов выделенных динамически. Получение элементов массива и т.д.?
Гайл как компилить через замана без хайда:)
 
Эксперт
Статус
Оффлайн
Регистрация
12 Июн 2014
Сообщения
991
Реакции[?]
1,209
Поинты[?]
3K
Код:
int iValue = 5;
    while (true)
    {
        printf_s("\rAdress: 0x%X   Value = %i", &iValue, iValue);   
        if (GetAsyncKeyState(VK_SPACE) & 0x1)
            iValue += 5;   
        Sleep(200);
    }
Код:
ReadProcessMemory(.... (LPVOID)offset, .......);
WriteProcessMemory(.... (LPVOID)offset, .......);
 
В игре Source SDK
Забаненный
Статус
Оффлайн
Регистрация
10 Янв 2017
Сообщения
2,148
Реакции[?]
806
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Эксперт
Статус
Оффлайн
Регистрация
12 Июн 2014
Сообщения
991
Реакции[?]
1,209
Поинты[?]
3K
А какая разница?
в первом случаи меньше танцев с бубном + более верная реализация необходимого.
во втором просто более верное приведение типов согласно прототипу функции. не критично, но иногда может мозго*бить
 
Пользователь
Статус
Оффлайн
Регистрация
10 Фев 2017
Сообщения
195
Реакции[?]
42
Поинты[?]
0
То есть, это я могу добавить ячейку памяти, ну допустим на hp, что бы получать от туда значения, и при каждом перезапуске допустим си эс гоу, мне не придётся искать hp в памяти заново?
 
В игре Source SDK
Забаненный
Статус
Оффлайн
Регистрация
10 Янв 2017
Сообщения
2,148
Реакции[?]
806
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
То есть, это я могу добавить ячейку памяти, ну допустим на hp, что бы получать от туда значения, и при каждом перезапуске допустим си эс гоу, мне не придётся искать hp в памяти заново?
Придётся, т.к. память выделена динамически. Надо искать класс хранения
 
Сверху Снизу