Один мой зритель на ютубе подметил, что трейнер наш не совсем полноценен. Исправим это недоразумение!
В этом видеоуроке вы узнаете, как можно создавать инъекции кода, используя для этого свободную память игры.
[Ссылка].
Исходный код:
static void MakeCave()
{
if (pID != 0)
{
Console.WriteLine("Process Id: " + pID);
var handle = OpenProcess(ProcessAccessFlags.All, false, pID);
if (handle != IntPtr.Zero)
{
Console.WriteLine("Process handle: " + handle.ToString());
var caveAddress = 0x004002A8;
var valueon = new byte[] { 0xD9, 0x9E, 0x5C, 0x43, 0x0F, 0x00 };
var valueoff = new byte[] { 0xD9, 0x9E, 0x5C, 0x43, 0x0F, 0x00 };
var addressFrom = 0x00416494;
var addressTo = addressFrom + valueoff.Length;
var buffer = new byte[valueoff.Length];
buffer[0] = 0xE9;
var f = BitConverter.GetBytes(caveAddress-addressFrom-5);
Array.Copy(f, 0, buffer, 1, f.Length);
for (var i = 5; i < valueoff.Length; i++)
{
buffer[i] = 0x90;
}
var dummy = new UIntPtr();
WriteProcessMemory(handle, (IntPtr)addressFrom, buffer, (uint)buffer.Length, out dummy);
var caveBuffer = new byte[valueon.Length + 5];
Array.Copy(valueon, caveBuffer, valueon.Length);
caveBuffer[valueon.Length] = 0xE9;
var retAddress = BitConverter.GetBytes(addressFrom-caveAddress-valueoff.Length);
Array.Copy(retAddress, 0, caveBuffer, valueon.Length + 1, retAddress.Length);
WriteProcessMemory(handle, (IntPtr)caveAddress, caveBuffer, (uint)caveBuffer.Length, out dummy);
CloseHandle(handle);
Console.WriteLine("Handle closed.");
Console.ReadKey();
}
}
}
ВНИМАНИЕ! В коде допущена логическая ошибка - сначала нужно записывать кейв, а только потом - прыжок на него. Ошибка допущена сознательно и исправляется простой перестановкой нескольких строчек, так что это будет домашним заданием.
В этом видеоуроке вы узнаете, как можно создавать инъекции кода, используя для этого свободную память игры.
[Ссылка].
Исходный код:
static void MakeCave()
{
if (pID != 0)
{
Console.WriteLine("Process Id: " + pID);
var handle = OpenProcess(ProcessAccessFlags.All, false, pID);
if (handle != IntPtr.Zero)
{
Console.WriteLine("Process handle: " + handle.ToString());
var caveAddress = 0x004002A8;
var valueon = new byte[] { 0xD9, 0x9E, 0x5C, 0x43, 0x0F, 0x00 };
var valueoff = new byte[] { 0xD9, 0x9E, 0x5C, 0x43, 0x0F, 0x00 };
var addressFrom = 0x00416494;
var addressTo = addressFrom + valueoff.Length;
var buffer = new byte[valueoff.Length];
buffer[0] = 0xE9;
var f = BitConverter.GetBytes(caveAddress-addressFrom-5);
Array.Copy(f, 0, buffer, 1, f.Length);
for (var i = 5; i < valueoff.Length; i++)
{
buffer[i] = 0x90;
}
var dummy = new UIntPtr();
WriteProcessMemory(handle, (IntPtr)addressFrom, buffer, (uint)buffer.Length, out dummy);
var caveBuffer = new byte[valueon.Length + 5];
Array.Copy(valueon, caveBuffer, valueon.Length);
caveBuffer[valueon.Length] = 0xE9;
var retAddress = BitConverter.GetBytes(addressFrom-caveAddress-valueoff.Length);
Array.Copy(retAddress, 0, caveBuffer, valueon.Length + 1, retAddress.Length);
WriteProcessMemory(handle, (IntPtr)caveAddress, caveBuffer, (uint)caveBuffer.Length, out dummy);
CloseHandle(handle);
Console.WriteLine("Handle closed.");
Console.ReadKey();
}
}
}
ВНИМАНИЕ! В коде допущена логическая ошибка - сначала нужно записывать кейв, а только потом - прыжок на него. Ошибка допущена сознательно и исправляется простой перестановкой нескольких строчек, так что это будет домашним заданием.
Привет Кенг! Все это я понимаю, но не знаю как искать сигнатуру например такую как F3 A1 D9 99 01 4F D0 00 60 и изменять значение например Double хоткеями, Вы не могли бы снять видео урок по такой шляпе, буду очень благодарен! : )
ОтветитьУдалитьПривет!
УдалитьВидеоурок по сканеру сигнатур уже записан: http://adf.ly/AUDsT
А вот как читать и записывать разные типы данных - что-нибудь придумаю, хорошая тема для урока.
Привет, Михаил! Сделайте, пожалуйста, урок на тему создания трейнера на WinAPI (инъекция кода), с использованием ассемблерных инструкций. Так как в CE lua-скрипты более-менее понятны, но не понятно как написать такой же код на WinAPI. Или может уже есть такой урок у вас? (Я не нашел, если честно :( )
ОтветитьУдалитьБуду очень признателен! :)