Гость AlekseyLeb Опубликовано 17 июня, 2013 Поделиться Опубликовано 17 июня, 2013 Задача безобидная) Надо вытащить координаты 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 offhttp://ipicture.ru/G...w/26753341.html - value onhttp://ipicture.ru/G...w/26753351.html - jump to backhttp://ipicture.ru/G...w/26753369.html - errorusing 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(); } }} Ссылка на комментарий Поделиться на другие сайты Поделиться
Coder Опубликовано 17 июня, 2013 Поделиться Опубликовано 17 июня, 2013 Автор я в афиге.4 дубликата темы.UPD: 3 удалены, на первый раз дал предупреждение.UPDХоть бы тему опубликовал))//Kvazimado Ссылка на комментарий Поделиться на другие сайты Поделиться
Vlad2 Опубликовано 17 июня, 2013 Поделиться Опубликовано 17 июня, 2013 Так почему бы не найти Pointer`ы координат? Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость AlekseyLeb Опубликовано 17 июня, 2013 Поделиться Опубликовано 17 июня, 2013 Vlad2 спасибо за подсказку. Сейчас отработаю этот вариант Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость AlekseyLeb Опубликовано 21 июня, 2013 Поделиться Опубликовано 21 июня, 2013 Указатели в моём варианте не помогаютЕсли кому интересно:Мне потребовались байты, в которые могу записать свои команды и значения. Нашёл их так:удалил близлежащие команды test, оптимизировал некоторые другие команды (например lea esi,[esi+000000] можно записать как lea esi,[esi]).В результате освобождаются байты. Потом группировал их (перетаскивал другие команды, чтобы эти байты оказались рядом) и писал в них то, что мне нужноПримерно так:mov ebx,[eax]mov [0000008],ebxjmp 0000000EnopnopnopnopВторой mov пишет на месте нопов, а jmp, чтоб dword не прочитался, как набор команд. Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения