temtriss Опубликовано 8 ноября, 2020 Поделиться Опубликовано 8 ноября, 2020 (изменено) Ох, как давно меня тут небыло) Всем здарово, кто меня помнит В общем дело такое, занимаюсь в данный момент игрой, расширяю функционал клиентской и серверной части. Столкнулся с некой проблемой: Игра работает с ХП/МП/Стаминой с int32, как клиентская так и серверная часть. Но какого-то беса разрабы решили, в пакетах отправлять int16. Исходников естесвенно нету, но есть ИДА и желание этим заниматся :)) Я нашел функцию в клиентской и серверной части. Переписал полностью клиентскую, и чуток изменил серверную. Ниже по спойлером серверная функция. С которой возникли некоторые проблемы. Спойлер Сервер прекрасно работает и отправляет мне пакет с int32 параметрами. Клиент так же на ура их принимает и всё работает. И на моей машине проблем нету. Так же держатель сервера тестил на своей локальной машине и так же не каких проблем. А вот при запуске на сервере, при смене локации падает сервак.(после этого тестили ещё на 3-4 машинах под WIn10, на всех работает нормально, сервер под Win2012 Server) В общем что я сделал в данной функции. Я иньекчу кусочек кода __declsepc(naked) функцию в получение параметров movzx eax, word ptr [ecx+1D8h] Вот пример моей функции. Спойлер Увиличивая стэк, что бы влезла структура с х3 int32(12), оригинальная структура х3 int16(6), но компилятор вырвнял ее до 8)) sub esp, 4 достаточно Далее вношу полные параметры и пушу параметр для new и соответственно прыгаю обратно на new Таже делаю 2 патча небольших, а именно патчу размер структуры тут: push 6 ; size lea ecx, [esp+0Ch] ; Load Effective Address push ecx ; tTD_UPDATE_SIMPLE_STATUS mov ecx, eax ; this call ??0MCommandParameterSingleBlob@minet@@QAE@PBXG@Z вместо 6 пушу 12, можно конечно и бинарник пропатчить, но я в любом случае иньекчусь в процесс, так что без разницы. Ну и поменял пару смешений относительно стека далее по коду и очистку стека. Как я и говорил выше, это прекрасно отработало на всех компах, которых мы тестили под управлением Windows10. Самый интересный момент, сервер плюет exception по адресу, на котором он быть не должен, да и сам exception code странный, не смог его не нагуглить, не error lookup не чего не выдал: 40010006 Так же самая большая странность, если открыть на сервере Вижал студию и присоеденить её как отладчик до ексепшена или во время, то студия не выдаёт ошибок или чего-то еще, а просто продолжает процесс без каких либо проблем. И сервер спокойно работает и проблема исчезает. Но как по мне странно запускать сервер и вешать на него студию в дебаг моде :DDD Может у кого-то вылезал подобный ексепшн или кто-то сталкивался с такой дичью? Всем спс :)) P.s. отлаживать постоянно сервак возможности нету. p.s.s свой Exception handler писал, устанавливал и хукал SetUnhandledExceptionFilter что бы не переставили) Но почему-то результата это не дало. Он не отработал, хотя на Access Violation(специально подстроеный) плюнул мой обработчик. Изменено 8 ноября, 2020 пользователем temtriss P.s.s добавил :) Ссылка на комментарий Поделиться на другие сайты Поделиться
roma912 Опубликовано 8 ноября, 2020 Поделиться Опубликовано 8 ноября, 2020 2 часа назад, temtriss сказал: Вот пример моей функции. Ну вот такие хуки как раз довольно сложно отлаживать. Переписал бы ты хук на detours 1.5, или же 3 версию. Там хотя бы точно не накосячишь со стеком и прочим. Ссылка на комментарий Поделиться на другие сайты Поделиться
temtriss Опубликовано 8 ноября, 2020 Автор Поделиться Опубликовано 8 ноября, 2020 (изменено) 13 минут назад, roma912 сказал: накосячишь со стеком Я и так не накосячил со стеком))) я проверял) Да и сложно ошибится, расширил стэк на 4 и почистил на 4 больше)) всё) Темболее, что функция работает. Проблемы с стэком точно нет) 13 минут назад, roma912 сказал: Ну вот такие хуки Это не совсем хук, я просто внедряю кусок кода. Мне не нужно переписывать всю функцию. Мне нужен маленький кусочек. 13 минут назад, roma912 сказал: detours 1.5, или же 3 Когда я переписываю полностью функцию, я так и делаю. А так же какая разница? Я могу так же юзануть detours только вот нечего не поменяется... у меня нету конвенции вызова у функции т.к. она мне не нужна... мне нужно записать из есх(GAntityActor) + HP, MP, STA offset значение)) все... изобретать велосипед не хочется функция и так готовая) И ей абсолютно паралельно сколько байт отправлять(структура кладётся в SingleBlob, функция просто выделяет память и с помощью memcpy копирует то, что ей скормили с проверкой размера < 1024) Изменено 8 ноября, 2020 пользователем temtriss Ссылка на комментарий Поделиться на другие сайты Поделиться
temtriss Опубликовано 9 ноября, 2020 Автор Поделиться Опубликовано 9 ноября, 2020 Всем спасибо, решение нашел сам. Если кому-то интересно: Я расширял стэк в своей функции и по хз какой причине на Win 10 это работало нормально, а на win 2012 Server нет. Я сделал патч на расширение стека в оригинальной функции вместо sub esp, 0c пропатчил на sub esp, 10 А в своей функции соответсвенно убрал расширение стека. И всё заработало))) больше 2х недель мучался :DDD В общем тему можно закрыть! Всем спс :))) 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения