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

ИЛ-2 Штурмовик трейнер


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

Задача безобидная) Надо вытащить координаты x,y,z(double) центра масс самолёта.

Они хранятся в ячейках, следующих друг за другом (x - адрес, y - адрес + 0x8, z - адрес + 0x10).

Эти адреса обновляются после запуска игры. Но я знаю, что адрес координаты x хранится в регистре eax в момент исполнения определённой программы с постоянным адресом ("mg_snd.dll"+11BF3).

Значит надо сделать инъекцию типа mov[freeAddress],eax Сказано, сделано. Однако игра после запуска трейнера вылетает. Подозреваю, что игра после инъекции идёт куда-то не туда или имеет какую-то защиту.

Скрины:

http://ipicture.ru/G...w/26753322.html - value off

http://ipicture.ru/G...w/26753341.html - value on

http://ipicture.ru/G...w/26753351.html - jump to back

http://ipicture.ru/G...w/26753369.html - error

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Diagnostics;

using System.Runtime.InteropServices;

namespace IL_2_Get_Params

{

class Program

{

[Flags]

public enum ProcessAccessType

{

PROCESS_ALL = (0x001F0FFF),

PROCESS_TERMINATE = (0x0001),

PROCESS_CREATE_THREAD = (0x0002),

PROCESS_SET_SESSIONID = (0x0004),

PROCESS_VM_OPERATION = (0x0008),

PROCESS_VM_READ = (0x0010),

PROCESS_VM_WRITE = (0x0020),

PROCESS_DUP_HANDLE = (0x0040),

PROCESS_CREATE_PROCESS = (0x0080),

PROCESS_SET_QUOTA = (0x0100),

PROCESS_SET_INFORMATION = (0x0200),

PROCESS_QUERY_INFORMATION = (0x0400)

}

[DllImport("kernel32.dll")]

public static extern IntPtr OpenProcess(UInt32 dwDesiredAccess, Int32 bInheritHandle, UInt32 dwProcessId);

[DllImport("kernel32.dll")]

public static extern Int32 CloseHandle(IntPtr hObject);

[DllImport("kernel32.dll")]

public static extern Int32 ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, [in, Out] byte[] buffer, UInt32 size, out IntPtr lpNumberOfBytesRead);

[DllImport("kernel32.dll")]

public static extern bool WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, [in, Out] byte[] buffer, UInt32 size, out IntPtr lpNumberOfBytesWritten);

static void Main(string[] args)

{

Process readWriteProc = Process.GetProcessesByName("il2")[0];//выбор процесса

uint m_Process = (uint)readWriteProc.Id;

Console.WriteLine("Process handle id: " + m_Process.ToString());

IntPtr m_hProcess = OpenProcess(0xF, 1, m_Process);//handle

uint moduleAdress = 0; //адрес библиотеки от которой смещаемся "mg_snd.dll"

foreach (ProcessModule pm in readWriteProc.Modules)//в цикле ищем её

if (pm.ModuleName == "mg_snd.dll")

{

moduleAdress = (uint)pm.BaseAddress;

break;

}

Console.WriteLine("Address of mg_snd.dll: " + moduleAdress.ToString("X"));

uint caveAddress = moduleAdress + 0x19;//cave

byte[] valueon = new byte[] { 0x85, 0xC0, 0x89, 0x05, 0x2A,

0x00, 0x33, 0x0C, 0xDD, 0x44, 0x24, 0x0C };//код, который надо выполнять

byte[] valueoff = new byte[] { 0x85, 0xC0, 0xDD, 0x44, 0x24, 0x0C };//код, который надо отключить

uint addressFrom = moduleAdress + 0x11BF3;

uint addressTo = addressFrom + (uint)valueoff.Length;

byte[] buffer = new byte[valueoff.Length];//формируем массив байт, составляющих замену коду value off

buffer[0] = 0xE9;

byte[] jmp = BitConverter.GetBytes(caveAddress - addressFrom - 5);

Array.Copy(jmp, 0, buffer, 1, jmp.Length);

for (int i = 5; i < valueoff.Length; i++)

buffer = 0x90;

IntPtr bytesWriteSize = new IntPtr();

WriteProcessMemory(m_hProcess, (IntPtr)addressFrom, buffer, (uint)buffer.Length, out bytesWriteSize);//jmp caveAddress + nop

byte[] caveBuffer = new byte[valueon.Length + 5];//формируем массив байт нашего кода

Array.Copy(valueon, caveBuffer, valueon.Length);

caveBuffer[valueon.Length] = 0xE9;

byte[] retJmp = BitConverter.GetBytes(addressFrom - caveAddress - valueoff.Length);

WriteProcessMemory(m_hProcess, (IntPtr)caveAddress, caveBuffer, (uint)caveBuffer.Length, out bytesWriteSize);

CloseHandle(m_hProcess);

Console.WriteLine("Handle closed");

Console.ReadKey();

}

}

}

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

Указатели в моём варианте не помогают

Если кому интересно:

Мне потребовались байты, в которые могу записать свои команды и значения. Нашёл их так:

удалил близлежащие команды test, оптимизировал некоторые другие команды (например lea esi,[esi+000000] можно записать как lea esi,[esi]).

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

Примерно так:

mov ebx,[eax]

mov [0000008],ebx

jmp 0000000E

nop

nop

nop

nop

Второй mov пишет на месте нопов, а jmp, чтоб dword не прочитался, как набор команд.

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

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

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

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