Tutorial memory hacking, або пишемо трейнер архів - братство чітера cheaton

В даному уроці будуть разглянути 2 способи мем хакинга - із зовні (exe), і зсередини процесу (dll). Також буде роз'яснено як працювати з покажчиками в обох випадках.

III. Список функцій:


HWND WINAPI FindWindow (
_In_opt_ LPCTSTR lpClassName,
_In_opt_ LPCTSTR lpWindowName
);

DWORD WINAPI GetWindowThreadProcessId (
_In_ HWND hWnd,
_Out_opt_ LPDWORD lpdwProcessId
);

HANDLE WINAPI OpenProcess (
_In_ DWORD dwDesiredAccess,
_In_ BOOL bInheritHandle,
_In_ DWORD dwProcessId
);

BOOL WINAPI ReadProcessMemory (
_In_ HANDLE hProcess,
_In_ LPCVOID lpBaseAddress,
_Out_ LPVOID lpBuffer,
_In_ SIZE_T nSize,
_Out_ SIZE_T * lpNumberOfBytesRead
);

BOOL WINAPI WriteProcessMemory (
_In_ HANDLE hProcess,
_In_ LPVOID lpBaseAddress,
_In_ LPCVOID lpBuffer,
_In_ SIZE_T nSize,
_Out_ SIZE_T * lpNumberOfBytesWritten
);

BOOL WINAPI VirtualProtect (
_In_ LPVOID lpAddress,
_In_ SIZE_T dwSize,
_In_ DWORD flNewProtect,
_Out_ PDWORD lpflOldProtect
);
IV. Метод із зовні.

Створимо порожній консольний додаток без заголовком, і відразу ж напишемо наступний код (базова структура):

#include
#include

int main () // створюємо точку входу в процес трейнера

> Потім описуємо потрібні нам змінні:


HWND hWnd = NULL; // заголовок вікна потрібного процесу
HANDLE process = NULL;
DWORD pid = 0; // номер процесу в списку Переходимо безпосередньо до пошуку:


if (FindWindow (NULL, "Game")) // перевіряємо наявність вікна з заголовком Game

> Якщо вікно було знайдено - присвоюємо нашому вікна знайдене


hWnd = FindWindowA (NULL, "Game"); дізнаємося номер процесу в списку:


if (pid == 0)
GetWindowThreadProcessId (hWnd, pid); // запам'ятовуємо номер в змінну pid і потім отримуємо доступ до процесу

Додамо пару змінних:

if (Health <5000)
WriteProcessMemory (process, (LPCVOID) (0x55555555), PatchHealth, 4, NULL) заходимо в гру і дивимося, якщо життя менше 5000, то ми їх Перезаписуємо


DWORD GetModuleBase (LPSTR lpModuleName, DWORD dwProcessId)
MODULEENTRY32 lpModuleEntry =;
HANDLE hSnapShot = CreateToolhelp32Snapshot (TH32CS_SNAPMODULE, dwProcessId);
if (! hSnapShot)
return NULL;
lpModuleEntry.dwSize = sizeof (lpModuleEntry);
BOOL bModule = Module32First (hSnapShot, lpModuleEntry);
while (bModule)
if (! strcmp (lpModuleEntry.szModule, lpModuleName))
CloseHandle (hSnapShot);
return (DWORD) lpModuleEntry.modBaseAddr;
>
bModule = Module32Next (hSnapShot, lpModuleEntry);
>
CloseHandle (hSnapShot);
return NULL;
>

оскільки ми не перебуваємо всередині процесу - ми не можемо використовувати стандартну функцію GetModuleHandleA, по-цьому використовую вище запропоновану проробляємо вже знайому комбінацію:

"Game.dll" + 00111111 + 09 + 45 + 49 + DFТогда:


if (Health <5000)
WriteProcessMemory (process, (LPCVOID) p4, PatchHealth, 4, NULL) і на цьому ми закінчуємо з методом із зовні (тнейнерамі) і переходимо до dll

V. Метод "в процесі".

Ну, оскільки наша dll довантажуючи до процесу, то власне ми вже маємо доступ до "ресурсів" ігри, ніякої хендл, номер процесу нам дізнаватися не потрібно, і відслідковувати вікно теж.

Створимо новий порожній проект dll проект, і пишемо такі (знову ж, базова структура):

void onAttach ()
// тут буде відбуватися *: cool: магія: cool: *
>

BOOL WINAPI DllMain (HMODULE hModule, DWORD dwReason, LPVOID lpReserved)
if (dwReason == DLL_PROCESS_ATTACH) // якщо dll довантажити вдало
onAttach (); // працює Девід Блейн: D
return TRUE;
> Описуємо змінні:

HMODULE dll = GetModuleHandleA ( "Game.dll"); Опишемо функцію вище:

Уявімо ту ж ланцюжок, що і в попередньому прикладі:

"Game.dll" + 00111111 + 09 + 45 + 49 + DFІ виглядати це буде так:

Вихідні тексти:
<<Вот гадство! А здесь HIDE-тег. Обойти не получится. -) Злобный Шэдоу. -)>>