Перейти к содержанию
Авторизация  
Гость AlekseyLeb

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

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

Гость AlekseyLeb

Задача безобидная) Надо вытащить координаты 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();

}

}

}

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


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

Автор я в афиге.

4 дубликата темы.

UPD: 3 удалены, на первый раз дал предупреждение.

UPD

Хоть бы тему опубликовал))

//Kvazimado

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


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

Так почему бы не найти Pointer`ы координат?

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


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

Vlad2 спасибо за подсказку. Сейчас отработаю этот вариант

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


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

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

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

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

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

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

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

mov ebx,[eax]

mov [0000008],ebx

jmp 0000000E

nop

nop

nop

nop

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

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


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

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

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация  

×

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

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