1. Для того, что бы просматривать ссылки и темы в разделах, Вам необходимо зарегистрироваться.

    Зайдите ( Сюда и Зарегистрируйтесь )

Скрыть объявление
На рынке у вас есть возможность купить товар аккаунт или клан игры пб в рассрочку Покупая в рассрочку вы всего оплачиваете половину суммы и начинаете играть с него, как только вы оплатите вторую часть вы сможете перевязать на себя товар. Успевайте попасть под эту категорию!!!

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

Тема в разделе "C#", создана пользователем !Fox, 9 авг 2015.

  1. пост админа
    !Fox

    !Fox Проектировщик Портала Команда форума PREMIUM Администратор
    • 84/558410

    12
    14
    84
    Репутация:
    9
    Создание тренера

    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[] {/*Байты выключения*/}));

    А вообще, можно по разному хукать, это я показал как самый простой пример.
    Всем удачи :)
     
    • Like Like x 1