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

Terraria v1.3.5.3 Вызов функции SendData


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

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

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

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

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

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