• Объявления

    • Garik66

      Пользователям форума   05.11.2017

      Прошу обратить внимание на эту тему (чтобы увидеть ссылку, войдите в объявление - нажмите на заголовок):   
MasterGH

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

9 сообщений в этой теме

Я знаю, что это извращение, но есть игры написанные на .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.

0

Поделиться сообщением


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

Простой трейнер на 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, которые идут вразрез с тематикой создания чит-кодов и производительности, то выглядит НЕ плохо.

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

0

Поделиться сообщением


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

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

Игра: Zombie Driver (2010)

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

Опции: +8

Автор: The Hacker Within

post-3-1297648830,79_thumb.png

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

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

0

Поделиться сообщением


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

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....

0

Поделиться сообщением


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

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

 

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

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

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

DotNETinjectionBinary.7z

 

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

DotNETinjectionProject.7z

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

 

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

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

Изменено пользователем Laziz
1

Поделиться сообщением


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

Можете скинуть мне пару уроков по созданию ВХ на c# ? ( Если возможно )

0

Поделиться сообщением


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

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

 

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

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

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

0

Поделиться сообщением


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

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

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

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

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

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

 

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

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

0

Поделиться сообщением


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

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

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

1

Поделиться сообщением


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

Создайте аккаунт или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!


Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.


Войти сейчас