Перейти к содержанию

Программирование трейнеров на .NET языках


Рекомендуемые сообщения

Я знаю, что это извращение, но есть игры написанные на .Net такие как Eufloria.

Соответственно для игр на .Net должны быть .Net трейнеры, в том случае если нужно сделать трейнер платформанезависимым.

Вот пример компиляции Окна приветствия без среды разработки на C- подобном языке.

using System;
using System.Windows.Forms;

class HelloMessage
{
public static void Main()
{
MessageBox.Show("Hello...");
}
}

Создать bat - ник и запустить

C:WINDOWSMicrosoft.NETFrameworkv3.5csc.exe /r:System.Windows.Forms.dll HelloMsg.cs

Размер exe файла 3,50 КБ.Будет работать на всех ОС-мах поддерживающих .NET.

Ссылка на комментарий
Поделиться на другие сайты

  • 6 месяцев спустя...

Простой трейнер на C# (10 кб) для тестого приложения Test.exe

post-3-1280812041,03_thumb.png

Основная моменты следующие.

Мы просто по таймеру пишем значение в какой-то адрес. Примитивное действие правда?

-Создаём объект доступа для процесса (на самом деле он просто запоминает имя процесса):

AccessProcess_x86 accessProcess = new AccessProcess_x86("Test");

- Используем метод записи значения 9999 в адрес 0x0045B5A4 размером 4 байта 

accessProcess.ProcessWriteMem(0x0045B5A4, 4, 9999)

- Дальше создаём таймер, условие работы таймера, условие работы чекбоксов...

1. Создайте AccessProcess_x86.cs и добавьте код:


using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace AplTrainer
{
/// <summary>
/// Класс работы с процессом ОС
/// </summary>
    class AccessProcess_x86
    {
        private string processName;

        public AccessProcess_x86(string processName)
        {
            this.processName = processName;
        }
        /// <summary>
        /// Права доступа
        /// </summary>
        [Flags] //AccessRights
        public enum ProcessAccessRights
        {
            PROCESS_VM_READ = (0x0010),
            PROCESS_VM_WRITE = (0x0020),
            PROCESS_VM_OPERATION = (0x0008),
            PROCESS_ALL_ACCESS = (0x001F0FFF)
        }
        [DllImport("kernel32.dll")] //OpenProcess function
        public static extern IntPtr OpenProcess(UInt32 dwDesiredAccess, Int32 bInheiritHandle, UInt32 dwProcessId);
        [DllImport("kernel32.dll")] //CloseHandle function
        public static extern Int32 CloseHandle(IntPtr hObject);
        [DllImport("kernel32.dll")] //ReadProcessMemory function
        public static extern Int32 ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, [Out] byte[] lpBuffer, UInt32 nSize, ref UInt32 lpNumberOfBytesRead);
        [DllImport("kernel32.dll")] //WriteProcessMemory function
        public static extern Int32 WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, [In] byte[] lpBuffer, UInt32 nSize, ref UInt32 lpNumberOfBytesRead);
        [DllImport("kernel32.dll")] //GetLastError function
        public static extern UInt32 GetLastError();
        [DllImport("kernel32.dll")] //SetLastError function
        public static extern void SetLastError(UInt32 dwErrorCode);

        /// <summary>
        /// Запись значения по адресу
        /// </summary>
        /// <param name="addres">адрес</param>
        /// <param name="SizeData">размер записываемого значения</param>
        /// <param name="value">записываемое значение</param>
        public bool ProcessWriteMem(UInt32 addres, byte SizeData, UInt32 value)
        {
            Process[] MyProcess = MyProcess = Process.GetProcessesByName(processName);
            if (MyProcess.Length == 0)
               return false;

            IntPtr hprocess = OpenProcess((uint)ProcessAccessRights.PROCESS_ALL_ACCESS, 1, (uint)MyProcess[0].Id);
            if (hprocess.ToInt32() == 0)
               return false;
          
            byte[] buffer = BitConverter.GetBytes(value);
            uint num = 0;
            Int32 writeresult = WriteProcessMemory(hprocess, (IntPtr)addres, buffer, SizeData, ref num);

            if (writeresult == 0)
            {
                UInt32 lastError = GetLastError();
                MessageBox.Show(lastError.ToString());
                CloseHandle(hprocess);
                return false;
            }

            CloseHandle(hprocess);
            return true;
        }
    }
}
using System;

2. На форму бросьте "таймер" и "список чекбоксов". Введите в первое поле списка чекбоксов надпись как на скриншоте. Сформируйте автоматически обработчики событий для списка чек-боксов и таймера. Эти события увидите в коде ниже.

3. В коде основной формы (там же и обработчики) напишите:


using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;


namespace AplTrainer
{
    public partial class frmTrainer : Form
    {
        AccessProcess_x86 accessProcess = new AccessProcess_x86("Test");

        public frmTrainer()
        {
            InitializeComponent();
        }


        private void CheatListBox_ItemCheck(object sender, ItemCheckEventArgs e)
        {
            if (!FreezeTimer.Enabled)
                 FreezeTimer.Start();
        }

        private void FreezeTimer_Tick(object sender, EventArgs e)
        {
            bool mayworktimer=true;

            foreach (int indexChecked in CheatListBox.CheckedIndices)
            {
  
                switch (indexChecked)
                {
                    case 0:
                        {
                            if (!accessProcess.ProcessWriteMem(0x0045B5A4, 4, 9999))
                                mayworktimer = false;
                        }
                        break;
                }

                if (!mayworktimer)
                     FreezeTimer.Stop();
            }
        }
    }
}
using System;

Если закрыть глаза на многие вещи .NET, которые идут вразрез с тематикой создания чит-кодов и производительности, то выглядит НЕ плохо.

Также этот код можно усовершенствовать добавив поддержку записи/чтения по адресам многоуровневых указателей, что сделать не сложно и многое другое. Жаль, что нет возможности ассемблерных вставок, но ухитриться можно

Ссылка на комментарий
Поделиться на другие сайты

  • 6 месяцев спустя...

Исходник на C#

Игра: Zombie Driver (2010)

Трейнер для версии: 1.0

Опции: +8

Автор: The Hacker Within

post-3-1297648830,79_thumb.png

Автор умудрился и лицензионное соглашение замутить :)

Скачать - Zombie Driver +8 Trainer.zip

Ссылка на комментарий
Поделиться на другие сайты

live_4_ever, спасибо за исходник. Memory.cs содержит всё что может пригодиться для начальных экспериментов: подключение к процессу, чтения и запись разных данных.

Например, так будет запись байт включающих чит здоровья:

        

public partial class frmMain : Form
{
private Memory _memory;

private int _unlimitedHealth = 0x4B8F14;
private int _unlimitedRescueHealth = 0x467EEB;
//...
private void cbxHealth_CheckedChanged(object sender, EventArgs e)
{
if (cbxHealth.Checked)
_memory.WriteBuffer(_unlimitedHealth, new byte[] { 0x90, 0x90, 0x90, 0x90, 0x90 });
else
_memory.WriteBuffer(_unlimitedHealth, new byte[] { 0xF3, 0x0F, 0x11, 0x48, 0x34 });
}
}

Мои комментарии для тех кому интересно:

У него есть достоинства и недостатки.

Достоинства:

1) Класс Memory.cs имеет неплохой описанный стартовый функционал для экспериментов.

Недостатки:

1) Постоянно лицезреть в исходниках непонятные байты без ассемблерного скриптинга.

2) Двиг трейнера построен так, что жёстко привязывается к определённой версии игры и автор собирается для каждой версии игры делать трейнер.

3) Исходники требуют значительных доработок для совершенства близкого к идеалу. Пока самое близкое к идеалу это Lua-скриптинг в Cheat Engine....

Ссылка на комментарий
Поделиться на другие сайты

  • 4 года спустя...

Пример инъекции .NET library(dll) в чужой процесс.

 

ну... .NET не совсем без надежень в взломе игр.

Вот пример инеъкции в "CSGO", плюс, нахождения структуры игроков, количество игроков в игре на примере видео урока

В бинарном архиве есть ехе файл(InjectorDotNetDLL.exe) и длл файл(ExperementDll.dll). Если у Вас есть эта игра можете поэксперементировать.

DotNETinjectionBinary.7z

 

В проекте тоже самое в виде проекта

DotNETinjectionProject.7z

Инжектору есть одна требование, длл файл должен находеться там где ехе файл, иначе не инжектирует.

 

на рисунке инжектированный длл выводить консолный окно для показа всяких сообшений.

post-8512-0-64278300-1431532524_thumb.jp

Изменено пользователем Laziz
  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

Соответственно для игр на .Net должны быть .Net трейнеры, в том случае если нужно сделать трейнер платформанезависимым.

 

А что это за платформонезасимость такая, если в трейнер импортируются функции из винапи?

Или я что-то упустил? Если да, то где можно взглянуть на реализацию под Linux или Mac?

Насколько я знаю .NET относительно недавно стал open source, но конкретной реализации я пока не видел.

Ссылка на комментарий
Поделиться на другие сайты

если в трейнер импортируются функции из винапи

1. Скорее всего "платформозависимый трейнер", т.е. я имел ввиду трейнер зависимый от платформы .net или виртуальных машин на основе .net платформы (например Mono)

2. В трейнере можно вызывать не только функции винапи, а других апи ОС-м

3. Если игра написана на .net, то используя .net функции можно найти объекты, типы, функции и поля и менять их удобным образом, а не работать с функциями ОС-мы.

4. Если игра написана, используя технологию виртуальной машины будь, то Mono (или Java или другие), то вызывая функции Mono можно искать и менять поля экземпляров классов без импорта функции определенной ОС-ы.

 

Или я что-то упустил? Если да, то где можно взглянуть на реализацию под Linux или Mac?

В терии можешь проверить сам. Устанавливаешь две операционных системы (Линукс и Мак). Устанавливаешь игровой движок Unity3d. Собираешь на нем две игры под две ОС-и. Проверяешь, что обе игры работают с Mono. Если да, то ищешь способ как вызывать функции Mono, а не функции ОС.

Ссылка на комментарий
Поделиться на другие сайты

3. Если игра написана на .net, то используя .net функции можно найти объекты, типы, функции и поля и менять их удобным образом, а не работать с функциями ОС-мы.

У меня один раз было интересная случие. Я внедрил дллку написанное .NET в игру (не подозревая что игра тоже написана на .NET) и отлаживал с помощю VS "присоединиться к процессу" и на удевления мог видет все методы, классы и поля игры.

  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

  • 3 года спустя...

Всем привет...Давно меня тут не было. То в армию забрали.. то работа. В свободное время написал движок трейнера. Пока что функций там мало. Чтение да запись различных данных в память, плюс работа с многоуровневыми указателями, хук на клавиатуру, автоопределение процесса игры (неважно в каком порядке запускать игру и трейнер).  Исходный код пока выкидывать не буду..Так как я там скоро голову сам сломаю.

Вот результат моего творения.

665f0eb55598caa512f0a1ea5219ae39.jpg

Вот ссылка на трейнер. Как загрузить на форум так и не понял..Или может у меня прав нет.

http://rgho.st/7YTnvR9pP

Прошу проверить работоспособность. (Запуск,отображение элементов, проигрывание MOD). У кого есть игра могут и там проверить (функционал рабочий)

Изменено пользователем Loner
Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.