imaginary Опубликовано 18 февраля, 2018 Поделиться Опубликовано 18 февраля, 2018 Terraria steam версия, потому смещения на репаках могут не совпадать. Дело в том что в этой игре есть функция отправки данных на сервер "Terraria.NetMessage::SendData", которая получает на входе байты пакета и тип действия, например тип действия 11 это ломание или постройка блока. С такими параметрами вызывается функция при ломании блока, ей нужны координаты места ломания и тип действия, промежуточные байты встраиваются позже в сам пакет. Скрытый текст push -01 push 00 //Байт пакета push 00 //Бп push (Координаты во float X) push (Координаты во float Y) push 00 //Бп push 00 //Бп push 00 //Бп push 00 //Бп mov ecx, (назначение пакета, его действие и размер, тут - 11) edx FFFFFFFF Пакет о ломании блока выглядит следующим образом: 0B 00 11 00 70 10 62 02 00 00 00 0B - размер пакета 11 - тип действия 70 10 и 62 02 - координаты Проблема возникла с вызовом этой инструкции с использованием нового потока, код выглядит следующим образом: Скрытый текст //Вызов отправки пакета о ломании тайла на сервер push -01 push 00 push 00 fild dword [coordsp] //Координаты курсора Х sub esp,04 //Вычитаем из esp 4 fstp dword [esp] //Засовываем в стек координаты во float fild dword [coordsp+4] //Координаты курсора Y sub esp,04 //Вычитаем из esp 4 fstp dword [esp] //Засовываем в стек координаты во float push 00 push 00 push 00 push 00 mov ecx,11 mov edx,FFFFFFFF call Terraria.NetMessage::SendData Стек после этого принимает нужный вид, регистры получают нужные значения, функция после вызова идет исправно вплоть до момента вызова функцией Terraria.NetMessage::SendData+94 - E8 029ADB58 - call clr.dll+2023 В которой идет вызов clr.dll+2036 - E8 AD030000 - call clr.dll+23E8 В том вызове находится следующий код: clr.dll+23E8 - 64 A1 3C0E0000 - mov eax,fs:[00000E3C] { 3644 } clr.dll+23EE - C3 - ret Проблема в том, что после его выполнения при вызове инструкции из игры, eax приобретает какой то адрес, а при выполнении вызова с использованием нового потока eax приобретает 0, а дальше после возврата по коду идёт: clr.dll+203B - 8B F0 - mov esi,eax clr.dll+203D - 8B 46 04 - mov eax,[esi+04] clr.dll+2040 - 83 E0 5F - and eax,5F { 95 } И как понятно [00000000+04] вызывает вылет, при этом все аргументы совпадают и все выполняется отлично именно до этой функции с регистром fs, при чем мне так и не удалось разобраться что вообще делает такой код clr.dll+23E8 - 64 A1 3C0E0000 - mov eax,fs:[00000E3C] { 3644 } Регистр fs в отладчике всегда показан 53 и он никогда не меняется, потому я интересуюсь в чем может быть проблема? К тому же, другие функции этой игры удаётся вызывать без проблем, в том числе если они содержат функцию отправки данных. У меня есть лишь одна догадка, где то в стеке далеко лежит какое то значение которое по коду где то необходимо, но это вряд ли, потому что в разных функциях стек разный, и полностью возвращается после выполнения. Главный вопрос в том, что делает clr.dll+23E8 - 64 A1 3C0E0000 - mov eax,fs:[00000E3C] { 3644 } // Читаем правила форума - нарушен пункт 1.5, если не знаешь как делать спойлера - почитай ФАК Garik66 Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения