Все манипуляции будут происходить на WinForm С++.
1) Создаем проект C++ ->WinForm
2) Для начала опишем класс для патча памяти и определения процеса:
- Создаем новый класс внутри проекта: ПКМ -> Добавить -> Класс -> Далее -> Даем имя нашему классу(я назвал "cMemoryEdit") -> ОК.
cMemoryEdit.h
Код:
#pragma once
#include <Windows.h>
#include <TlHelp32.h>
#include <psapi.h>
ref class cMemoryEdit
{
public:
cMemoryEdit(char* ProcessName);
bool GetProcess();
void ExWriteMemory(DWORD dwAddress, char *Patch_Bts);
template <class cData>
void Write(DWORD dwAddress, cData Value)
{
WriteProcessMemory(hProcess, (LPVOID)dwAddress, &Value, sizeof(cData), NULL);
}
private:
char* ProcessName;
HANDLE hProcess;
DWORD dwPID;
__int32 СharLength(char *chArray);
};
cMemoryEdit.cpp
Код:
#include "stdafx.h"
#include "cMemoryEdit.h"
cMemoryEdit::cMemoryEdit(char* ProcessName)
{
this->ProcessName = ProcessName;
}
void cMemoryEdit::ExWriteMemory(DWORD dAdress, char *pBYTE)
{
__int32 iSize = СharLength(pBYTE);
for (__int32 i = 0; i < iSize; i++)
Write<BYTE>(dAdress + i, pBYTE[i]);
}
__int32 cMemoryEdit::СharLength(char *chArray)
{
for (__int32 iLength = 1; iLength < MAX_PATH; iLength++)
if (chArray[iLength] == '\0')
return iLength;
return 0;
}
bool cMemoryEdit::GetProcess()
{
HANDLE hPID = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
PROCESSENTRY32 pEntry;
pEntry.dwSize = sizeof(pEntry);
do
if (!strcmp(pEntry.szExeFile, ProcessName))
{
dwPID = pEntry.th32ProcessID;
CloseHandle(hPID);
hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPID);
return true;
}
while (Process32Next(hPID, &pEntry));
return false;
}
Как видим тут я описал только открытие процесса на полный доступ + запись данных в память.
Подключаем класс к форме(у меня это фаил Form1.h)
Код:
#include "cMemoryEdit.h"
Внутри класса формы создаем новый экземпляр класса:
Код:
cMemoryEdit^ MemHack = gcnew cMemoryEdit("Game.exe");
Общий код:
Код:
public ref class Form1 : public System::Windows::Forms::Form
{
public:
cMemoryEdit^ MemHack = gcnew cMemoryEdit("Game.exe");
Form1(void)
{
InitializeComponent();
//
//TODO: добавьте код конструктора
//
}
Первым делом нам нужно вызвать:
Код:
MemHack->GetProcess()
Эта функция определит запущен ли процесс и если запущен "иницализирует весь класс")
Код:
if (!MemHack->GetProcess())
{
//Find Game
}
else
{
//Found Game
}
Как только процесс найден мы можем свободно патчить нужные нам участки памяти:
Код:
DWORD dwSprint = 0x11AC807;
MemHack->ExWriteMemory(dwSprint, "\x75\x06");
На этом все)))
ЗЫ: Исходный код решил не сливать) Если будут вопросы - задавайте)