• Покупай и довольствуйся функциями и нагибай задоненых геймеров в игре! Лучшие приват читы Купи и разорви сервак Донатеров!
  • Участвуйте и получайте активации , следить за конкурсами тут Конкурсы Если конкурс активный значит конкурс в самом разгаре. Успей испытать удачу и получить приз
             
Реклама, выключите ADblock для просмотра. Цена 150 руб./неделя. Оплата автоматическая.
 

Пишем Трейнер Для Warface

!Fox

Фарт
Команда форума
Администратор
PREMIUM
Создание тренера

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()
4.(если кто в танке)
Продолжим. Возвращаемся к форме, кидаем на нее таймер из панели элементов. Если панель элементов отсутствует на экране, ее можно вызвать сочетанием клавиш 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[] {/*Байты выключения*/}));


А вообще, можно по разному хукать, это я показал как самый простой пример.
Всем удачи :)
 
Яндекс.Метрика Top.Mail.Ru
Приватные разговоры
Помощь Пользователи
    Вы не присоединились ни к одной комнате.
    Сверху