DarkPower2 Опубликовано 5 января, 2016 Поделиться Опубликовано 5 января, 2016 Уже все перепробовал, что только мог... После выполнения в 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(); } } Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 6 января, 2016 Поделиться Опубликовано 6 января, 2016 Поиск ошибки решается 1. Пошаговой отладкой2. Логированием результатов из перменных Ссылка на комментарий Поделиться на другие сайты Поделиться
gmz Опубликовано 6 января, 2016 Поделиться Опубликовано 6 января, 2016 0xE9 - jmp? сделай mov rax,xxxxxxxxxxxxxxxx а потом jmp rax 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
DarkPower2 Опубликовано 6 января, 2016 Автор Поделиться Опубликовано 6 января, 2016 Отладкой только нашел то, что 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 байт... Ссылка на комментарий Поделиться на другие сайты Поделиться
DarkPower2 Опубликовано 6 января, 2016 Автор Поделиться Опубликовано 6 января, 2016 (изменено) 0xE9 - jmp? сделай mov rax,xxxxxxxxxxxxxxxx а потом jmp raxСейчас попробуюВроде оно... Щас еще протесю0xE9 - jmp? сделай mov rax,xxxxxxxxxxxxxxxx а потом jmp raxСпасибо, помогло! Изменено 6 января, 2016 пользователем DarkPower2 Ссылка на комментарий Поделиться на другие сайты Поделиться
DarkPower2 Опубликовано 7 января, 2016 Автор Поделиться Опубликовано 7 января, 2016 (изменено) Все таки не подходит этот 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 Изменено 7 января, 2016 пользователем NullAlex Ссылка на комментарий Поделиться на другие сайты Поделиться
Laziz Опубликовано 25 марта, 2016 Поделиться Опубликовано 25 марта, 2016 В 05.01.2016в02:26, DarkPower2 сказал: Уже все перепробовал, что только мог... После выполнения в CE пишет неверный адрес перехода... Я думаю проблема в том, что caveAddress = 0000000011223344 (пример), a addressFrom = 000007FED32A22DA (тоже). Помогите решить эту проблему! И при выполнении замененного кода возвращает тоже на неверный адрес. Проблема в том что VirtualAllocEx выделяет адрес слишком далеко от стартового адреса, из за этого "jmp адрес" не возможно, потому что шаг перехода уже не влезает на 4 байта. Что бы выделит адрес по ближе надо в ручную искать Cave адрес. Если нужно будет подробнее объясню. Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения