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

Проблема с адресом в x64 игре c#


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

Уже все перепробовал, что только мог... После выполнения в CE пишет неверный адрес перехода...

Я думаю проблема в том, что caveAddress = 0000000011223344 (пример), a addressFrom = 000007FED32A22DA (тоже).

Помогите решить эту проблему!

И при выполнении замененного кода возвращает тоже на неверный адрес. 

var valueon = new byte[] { 0x50, 0x48, 0xA1, 0xB8, 0x08, 0xCE, 0xD6, 0xFE, 0x07, 0x00, 0x00, 0x48, 0x8B, 0x00, 0x48, 0x8B, 0x40, 0x48, 0x48, 0x05, 0x90, 0x05, 0x00, 0x00, 0x48, 0x3B, 0x18, 0x74, 0x0C, 0x90, 0x90, 0x90, 0x90, 0xF3, 0x0F, 0x11, 0xBB, 0xEC, 0x07, 0x00, 0x00, 0x58 };            var valueoff = new byte[] { 0xF3, 0x0F, 0x11, 0xBB, 0xEC, 0x07, 0x00, 0x00, 0xF3, 0x0F, 0x10, 0x8B, 0xEC, 0x07, 0x00, 0x0 }; // Байты оригинальной команды            var patern = new byte[] { 0xF3, 0x0F, 0x11, 0xBB, 0xEC, 0x07, 0x00, 0x00, 0xF3, 0x0F, 0x10, 0x8B, 0xEC, 0x07, 0x00, 0x00 };            MakeCave(valueon, valueoff, patern);            Console.ReadKey();
public static void MakeCave(byte[] valueon, byte[] valueoff, byte[] patern)        {            if (GHandle != IntPtr.Zero)            {                long caveAddress = (long)(Win32.VirtualAllocEx(GHandle, IntPtr.Zero, (IntPtr)(valueon.Length + 9), Win32.AllocationType.Commit, Win32.MemoryProtection.ExecuteReadWrite));                long addressFrom = FindWSignature(patern);                if (addressFrom != -1)                {                    Console.WriteLine(addressFrom.ToString("X"));                    //playSound("FIND.wav");                }                else                {                    Console.WriteLine("NOT FINDED");                    //playSound("NOFIND.wav");                    return;                }                long addressTo = addressFrom - caveAddress - valueon.Length;                var buffer = new byte[valueoff.Length];                buffer[0] = 0xE9;                var d = BitConverter.GetBytes(caveAddress - addressFrom);                var f = BitConverter.GetBytes(caveAddress - addressFrom - d.Length);                Array.Copy(f, 0, buffer, 1, f.Length);                for (var i = d.Length+1; i < valueoff.Length; i++)                {                    buffer[i] = 0x90;                }                var dummy = 0;                var caveBuffer = new byte[valueon.Length + 9];                Array.Copy(valueon, caveBuffer, valueon.Length);                caveBuffer[valueon.Length] = 0xE9;                var retAddress = BitConverter.GetBytes(addressTo);                Array.Copy(retAddress, 0, caveBuffer, valueon.Length + 1, retAddress.Length);                Win32.WriteProcessMemory(GHandle, (long)caveAddress, caveBuffer, (int)caveBuffer.Length, ref dummy);                var dummy1 = 0;                Win32.WriteProcessMemory(GHandle, (long)addressFrom, buffer, (int)buffer.Length, ref dummy1);                //VirtualFreeEx(handle, (IntPtr)0x09E90000, 0, FreeType.Release);                Console.ReadKey();            }        }
Ссылка на комментарий
Поделиться на другие сайты

Отладкой только нашел то, что BitConverter.GetBytes возвращает массив байтов в инверсионном порядке. Поменял порядок но проблема осталась...
Вот в чем проблема:

E9 FFFFF801           - jmp particles.dll+145BE //здеC0 7B BA 41           - sar byte ptr [rbx-46],41 //сь//должно быть так:E9 FFFFF801C07BBA41 jump server.dll+..... 

Помогите написать jump для 64 битного адреса. Переводит половину адреса в следующую команду...

Или подскажите как jmp 8 байтовый переделать в 4-х байтовый... или заставить jmp читать 8 байт...

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

0xE9 - jmp? сделай mov rax,xxxxxxxxxxxxxxxx а потом jmp rax

Сейчас попробую

Вроде оно... Щас еще протесю

0xE9 - jmp? сделай mov rax,xxxxxxxxxxxxxxxx а потом jmp rax

Спасибо, помогло!

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

Все таки не подходит этот mov rax... Из-за него игра крашится!

Пробовал разные регистры... Все равно, а если обычный переход делать, то все окей!

 

Вот допустим этот код приводит к краху игры:

newmem:originalcode://mov R13, ["server.dll"+01C508B8]//mov R13, [R13]//mov R13, [R13+48]//mov R13, rbx//add R13, 590//cmp rbx, [R13]//je exitmovss [rbx+000007EC],xmm7exit:movss xmm1, [rbx+7EC]jmp returnhere"server.dll"+884A2A:push RDImov RDI, newmemjmp RDInopnopreturnhere:pop RDI
Изменено пользователем NullAlex
Ссылка на комментарий
Поделиться на другие сайты

  • 2 месяца спустя...
В 05.01.2016в02:26, DarkPower2 сказал:

Уже все перепробовал, что только мог... После выполнения в CE пишет неверный адрес перехода...

Я думаю проблема в том, что caveAddress = 0000000011223344 (пример), a addressFrom = 000007FED32A22DA (тоже).

Помогите решить эту проблему!

И при выполнении замененного кода возвращает тоже на неверный адрес. 

Проблема в том что VirtualAllocEx выделяет адрес слишком далеко от стартового адреса, из за этого "jmp адрес" не возможно, потому что шаг перехода уже не влезает на 4 байта. Что бы выделит адрес по ближе надо в ручную искать Cave адрес. Если нужно будет подробнее объясню.

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

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

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

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