!Fox не предоставил(а) никакой дополнительной информации.
Создание тренера
1.Создать Проект -> С# -> WinForms -> Дали название и создали.
2.Перед нами форма. Жмём по имени проекта ПКМ -> Добавить -> Класс (или Shift + Alt + C) -> называем Memory.cs -> Нажали "Добавить".
Банально заменили всё содержимое файла классом (аналогом вамемори только без функций которыми у вас не хватит мозгов воспользоваться)
Код класса:
Зависимости :
3. Как всё сделали, перешли обратно к форме, в констукторе объявляем указатель на наш класс:
Конструктор, это область кода, которая находиться под:
и над:
4.(если кто в танке)
Продолжим. Возвращаемся к форме, кидаем на нее таймер из панели элементов. Если панель элементов отсутствует на экране, ее можно вызвать сочетанием клавиш CTRL + W + X. Или обратить внимание на верхнюю часть программы и вызвать панель инструментов которую можно найти во вкладке "Вид".
Таймер стартуем при инициализации нашей программы:
На Таймер Пишем Следующее:
Вот и все, теперь мы можем нормально патчить любые участки памяти.
Пример:
кинули мы чекбокс на форму, обозвали как то функцию(допустим антиотдача, это не принципиально)
В конструкторе заводим переменную: (адресс нашей антиотдачи)
На чекбокс пишем:
Как это работает? спросите вы) я вам расскажу:
А вообще, можно по разному хукать, это я показал как самый простой пример.
Всем удачи
1.Создать Проект -> С# -> WinForms -> Дали название и создали.
2.Перед нами форма. Жмём по имени проекта ПКМ -> Добавить -> Класс (или Shift + Alt + C) -> называем Memory.cs -> Нажали "Добавить".
Банально заменили всё содержимое файла классом (аналогом вамемори только без функций которыми у вас не хватит мозгов воспользоваться)
Код класса:
Код:
public class Memory
{
public Memory(string pProcessName)
{
this.pName = pProcessName;
}
[DllImport("kernel32.dll")]
private static extern bool VirtualProtectEx(IntPtr hProcess, IntPtr lpAddress, UIntPtr dwSize, uint flNewProtect, out uint lpflOldProtect);
[DllImport("kernel32.dll", SetLastError = true)]
public static extern bool ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, byte[] lpBuffer, uint dwSize, uint lpNumberOfBytesRead);
[DllImport("kernel32.dll")]
private static extern bool WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, byte[] lpBuffer, uint nSize, uint lpNumberOfBytesWritten);
[DllImport("kernel32.dll")]
private static extern IntPtr OpenProcess(uint dwDesiredAccess, bool bInheritHandle, int dwProcessId);
uint PAGE_READWRITE = 4, PROCESS_ALL_ACCESS = 0x1F0FFF, NumFunc;
public string pName { get; set; }
private Process[] m_pProcess;
private IntPtr pHandle;
public bool GetProcess()
{
m_pProcess = Process.GetProcessesByName(pName);
if (m_pProcess.Length != 0)
{
pHandle = OpenProcess(PROCESS_ALL_ACCESS, false, m_pProcess[0].Id);
if (pHandle != IntPtr.Zero)
return true;
else
return false;
}
return false;
}
public bool PatchMemory(IntPtr dAdress, byte[] pBytes)
{
if (pHandle == IntPtr.Zero)
GetProcess();
bool MemResult;
try
{
uint flNewProtect;
VirtualProtectEx(pHandle, dAdress, (UIntPtr)((ulong)((long)pBytes.Length)), PAGE_READWRITE, out flNewProtect);
bool flag = WriteProcessMemory(pHandle, dAdress, pBytes, (uint)pBytes.Length, 0u);
VirtualProtectEx(pHandle, dAdress, (UIntPtr)((ulong)((long)pBytes.Length)), flNewProtect, out flNewProtect);
MemResult = flag;
}
catch (Exception Exclude)
{
Console.WriteLine("Error: PatchMemory " + Exclude.ToString());
MemResult = false;
}
return MemResult;
}
}
Зависимости :
Код:
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
3. Как всё сделали, перешли обратно к форме, в констукторе объявляем указатель на наш класс:
Конструктор, это область кода, которая находиться под:
Код:
public partial class Form1 : Form
Код:
public Form1()
Продолжим. Возвращаемся к форме, кидаем на нее таймер из панели элементов. Если панель элементов отсутствует на экране, ее можно вызвать сочетанием клавиш CTRL + W + X. Или обратить внимание на верхнюю часть программы и вызвать панель инструментов которую можно найти во вкладке "Вид".
Таймер стартуем при инициализации нашей программы:
Код:
timer1.Start();
На Таймер Пишем Следующее:
Код:
cMem = new Memory("Game");//инициализируем класс полностью
if(cMem.GetProcess())
{
//Если процесс игры запущен
//обход
timer1.Stop();
}
else
{
//иначе
}
Вот и все, теперь мы можем нормально патчить любые участки памяти.
Пример:
кинули мы чекбокс на форму, обозвали как то функцию(допустим антиотдача, это не принципиально)
В конструкторе заводим переменную: (адресс нашей антиотдачи)
Код:
int NoRecoil = 0x5FBE26;
На чекбокс пишем:
Код:
cMem.PatchMemory((IntPtr)NoRecoil, (checkBox1.Checked ? new byte[] { 0x90, 0x90, 0x90, 0x90, 0x90 } : new byte[] { 0xE8, 0xE5, 0x68, 0xB7, 0x00 }));
Как это работает? спросите вы) я вам расскажу:
Код:
cMem.PatchMemory((IntPtr)Адресс, (параметр bool (допустим checkBox1.Checked)? new byte[] {/*Байты включения*/} : new byte[] {/*Байты выключения*/}));
А вообще, можно по разному хукать, это я показал как самый простой пример.
Всем удачи