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

imaginary

Помогаторы
  • Постов

    319
  • Зарегистрирован

  • Посещение

  • Победитель дней

    43

Весь контент imaginary

  1. Делаю я, делаю наглядный пример, и тут до меня доходит что координаты в структуре визуальные, а сервер будет откидывать без ускорения, это произошло как раз в тот момент как моего персонажа колбасило по всей комнате из за неправильного скрипта. Мною была использована команда fprem для нахождения остатка при делении на 1. Еще была идея сделать с кучей проверок, это я могу запросто, правда вот 100% уверенность что все делается намного проще.
  2. Я конечно сделаю ради интереса, но все же не вижу смысл так изгаляться, и меня не отпускает стойкое ощущение что ты то уже знаешь как по твоему проще сделать, и задаешь мне вопрос что бы увидеть как это у меня получится, а потом написать мне свой способ и если он проще, указать на это
  3. И как по твоей схеме должны обрабатываться расстояния меньше чем 60 метров? В таком случае будет просто ускорение или замедление будет обрываться не заканчиваясь по прилету на точку, если уж ты мне условие написал то учти и этот аспект
  4. То есть ты предлагаешь не использовать ускорение? Мною были запущены fsin и fcos и с радианами и с градусами в отдельном скрипте для тестов, получалась какая то ерунда что в радианах, что в градусах, возможно я просто не правильно их использую. Вообще, спасибо за упрощённые методы, а в математике я не очень (особенно с этими градусами) То что в моём скрипте находит части не окружности а ромба, но разницы особо нету, разве что в немного неровном ускорении То что ты предлагаешь - полет с постоянной скоростью, реализовывается просто с прибавлением фиксированных значений к координатам
  5. В этой теме можно узнать как сделать управление запускаемыми снарядами в Terraria и сделать отправку их положения на сервер (Что бы другие игроки видели как летает снаряд, простая замена условия в коде) Скрипт: Видео:
  6. В этой теме можно узнать о том, как сделать полет по повороту камеры в 3D пространстве (лететь туда куда смотришь) и как сделать перевод числа в 360, если оно превышаем 360 или наоборот, ниже нуля. Перед просмотром видео лучше ознакомится с предыдущими темами, так как там показано как найти адрес персонажа. Скрипт- функция расчета ускорения из поворота: Скрип записывающий в ускорение игрока и вызывающий функцию выше: Видео: Часть 1: Часть 2: Часть 3:
  7. В этой теме можно узнать как сделать полёт на определённые координаты исходя из координат точки и координат персонажа. Для созданий этого скрипта надо иметь у себя адрес персонажа, потому лучше еще прочитать предыдущую тему. Скрипт: Видео:
  8. Terraria лицензия, потому смещения и адреса на репаках могут отличатся. Для начала, нам нужно найти все необходимые адреса, как это сделать думаю понятно, адрес игрока можно найти по здоровью и сделать указатель на него. У меня получился вот такой указатель: Для вставки в скрипт: [[[Terraria.Main::DoDraw+375]]+08+[[Terraria.Main::DoDraw+37B]]*4] Принцип такого указателя: В Terraria.Main::DoDraw+375 в коде вписан адрес структуры с игроками Таким образом в Terraria.Main::DoDraw+37B записан адрес хранящий номер активного игрока Далее идет прибавление +08 до первого элемента, потом номер игрока умножается на 4, так как 1 адрес занимает 4 байта, вот и получается адрес игрока. Теперь необходимо найти структуру содержащую адреса существ, думаю это тоже понятно как найти, у меня вот такой адрес: Для вставки в скрипт: [[Terraria.Main::UpdateAudio+4F7]], по такому же принципу как и 2 адреса сверху. Теперь мы можем начать писать скрипт коллизии, суть скрипта в организации проверок координат касания углов персонажа и координат углов существа. Вот примерная схема этого действа: Желтым изображены виртуальные полигоны коллизии, то есть промежутки в которых скрипт делает проверку, попадает ли точка игрока в них. Самый верхний желтый полигон используется для другой проверки, о которой будет сказано ниже. Итак, у нас есть адрес игрока, и предположительно адрес существа, для проверки существ нужно сделать цикл, перебирающий их и проверяющий координаты каждого: Как тут указано, тут так же проверяется совпадение адреса существа в цикле с адресом существа для которого делается коллизия, это сделано для того что бы не было самоколлизии, то есть столкновения существа с самим собой. Так же имеется проверка на активность, есть ли вообще этот объект, или он отсутствует или отключен. Теперь, так как у нас имеется цикл перебора существ, мы можем сделать вычисление крайних точек существа. Координаты существа в игре - это его крайняя левая нижняя точка. Так же у существа есть размер, и исходя из этих данных игра центрирует точку координат перед выводом существа на позицию в карте. Координаты в структуре существа отображают именно крайнюю левую нижнюю точку. Делаем вычисления после цикла и записываем в метки координаты точек и расстояние: Теперь можно написать проверки. Данный код проверяет положение точек 1 существа, относительно другого, при этом проверяется как X так и Y, иначе коллизия будет размером во всю карту, а не только по размерам существа, из за этого в каждом блоке по 4 проверки. После проверок в метку записывается состояние персонажа, слева он, сверху, справа или снизу. Следующий код делает проверку значения записанного в метку 1/2 1/2 и относительно этого выполняет действия с персонажем, убавляет его координаты или прибавляет на еденичку, создавая таким образом координатную коллизию, не пропускающую игрока сквозь существо. После выполнения данного скрипта, мы получаем коллизию, с учетом того, что если существо выше персонажа или наоборот, то персонаж или существо не будут вдавливать друг друга в землю, а вот толкнуть вверх могут. Теперь о том, зачем было использовать в скрипте полигон коллизии расположенный в самом верху. Если игрок попадает в тот полигон своей нижней стороной, то в таком случае делается проверка и в метку записывается значение: Если сделать скрипт без этой проверки, то персонаж на существе стоять не будет, то есть он будет висеть на нем с анимацией падения, и при слезании получит огромный урон, так как считается что он падает. Что бы избежать такого недоразумения находим функцию проверяющую стоит игрок на земле или нет, и вот как раз тут и пригодится нам наш полигон коллизии. В функцию делаем инъекцию кода параллельно с основным: Таким образом персонаж будет стоять на существе как на земле, и при слезании не получит огромный урон. В скрипте так же имеются проверки на тип существа, и изменение его проверочного размера. Вот такой вот получается скрипт целиком: Этот скрипт должен на входе получить адрес структуры для проверки. Он выполняется 2 раза, 1 раз делает коллизию игроку, а 2 раз делает коллизию тому адрес чего получен дальше. В моём случае этот адрес - адрес существа. Этот скрипт вызывается другим скриптом с потоком: Вот эти сложные махинации создают коллизию между игроком и существами, и между самими существами. Картинки работы: Скрипт работает - существа не могут пройти сквозь друг друга и игрока: Скрипт отключён:
  9. Minercraft 1.7.10, java x64 Проектный Для начала необходимо найти сам адрес игрока, сделать это на сервере проще всего по векторному ускорению игрока. Оно имеет тип doble. Делать мы это будем следующим образом: Встаём на земле, ищем неизвестное значение, залезаем в воду - ищем увеличилось, и так далее. Вместо залезания в воду можно прыгнуть или еще как либо изменить ускорение игрока по вертикальной оси. Предположим нам удалось найти адрес структуры игрока таким образом. У нас есть адрес игрока, делаем все так же как и при простом поиске указателя, ищем полученный адрес с помощью поиска в hex 4 байта, у нас найдет очень много значений. Отсеиваем их пока не останется около 30 Ставим бряк на доступ к найденным адресам и находим тот в котором будет инструкция со смещением. Мы находим адрес структуры в которой лежит адрес игрока, он то нам и нужен, делаем анализ структур Наш адрес игрока лежит по смещению +84. Дальше указатели искать бессмысленно, лучше вывести сигнатуру из части этой структуры, которая всегда будет одинакова и уникальна, сделать это можно из первых значений в структуре. Это - размеры отображаемого пространства, проверить можно изменив одно значение: Исходя из этого можно понять что эти адреса всегда будут уникальны, потому можно смело сделать из этого следующую сигнатуру, у меня получилась вот такая: C0 02 00 00 10 27 00 00 56 03 00 00 Осталось лишь написать скрипт который будет записывать в метки нужные нам адреса, так как 64x процесс CE думает что указатели по 8 байт, и при простом переходе по указателям получается невесть что, потому попробуем сделать запись адресов через скрипт. Получившийся у меня скрипт: Таким образом - скрипт ищет адрес структуры, потом вызывает поток который запишет адреса в метки и вернется. Как выглядит у меня: Активируем: Ваши значения в структуре могут быть иными, потому сигнатура может не работать, например из за иного разрешения экрана, потому надо найти её самостоятельно. Использовать эти адреса можно как угодно, например сделать моментальное ломание любых блоков на сервере, в том числе и коренной породы. Надо учитывать что адреса меняются после перехода в другой мир или при смерти игрока, потому надо перезапускать поиск. Я считаю что есть способы более удобные, но это пожалуй для 32 битной java, а здесь лучшего способа чем этот мне пока найти не удалось.
  10. Terraria steam версия, потому смещения на репаках могут не совпадать. Дело в том что в этой игре есть функция отправки данных на сервер "Terraria.NetMessage::SendData", которая получает на входе байты пакета и тип действия, например тип действия 11 это ломание или постройка блока. С такими параметрами вызывается функция при ломании блока, ей нужны координаты места ломания и тип действия, промежуточные байты встраиваются позже в сам пакет. Пакет о ломании блока выглядит следующим образом: 0B 00 11 00 70 10 62 02 00 00 00 0B - размер пакета 11 - тип действия 70 10 и 62 02 - координаты Проблема возникла с вызовом этой инструкции с использованием нового потока, код выглядит следующим образом: Стек после этого принимает нужный вид, регистры получают нужные значения, функция после вызова идет исправно вплоть до момента вызова функцией 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
  11. @SergBrNord Почему бы тебе просто не попробовать занопить инструкцию которая отбавляет твои ходы, или сделать в твоём скрипте создание адреса который бы указывал на количество ходов, тогда ты бы мог включить свой скрипт и вынести это значение в таблицу по указателю от твоей метки, сделать это можно примерно так: После того как ты сделал инъекцию сюда "RomeTW-BI.exe"+1817DD: D9 98 7C 02 00 00 - fstp dword ptr [eax+0000027C] Сделать такой скрипт: label(mymetka) registersymbol(mymetka) //Регистрация метки newmem: mov [mymetka],eax code: fstp dword ptr [eax+0000027C] jmp return mymetka: //Задание метке размера dd 0 [DEALLOC] unregistersymbol(mymetka) //Снятие регистрации Теперь если ты добавишь к себе в таблицу эту метку и сделаешь её pointer типа float со смещением 27C, у тебя в таблице всегда будет значение с ходами, это при условии если инструкция будет работать только с ходами чего то одного, если она работает с многими то надо сделать фильтр в зависимости от твоей цели, хочешь ты себе ходы сделать или еще что другое. Возможно такой способ может быть альтернативой записи в скрипте
  12. Ну это да, а по моему не обязательно сразу загружать значение во float, если использовать команду fild, она загрузит целое число как число float. Странно что число ходов во float, быть может это значение какое нибудь для вывода на экран, или вроде того, а настоящее другое
  13. @Garik66 по моему чистку стека еще можно организовать командой emms, но она очищает весь стек fpu
  14. @Garik66, я скорее имею ввиду то, что если просто написать скрипт после функции загрузки не выгружая, то стек будет заполнятся и заполнятся все дальше и может случится что то плохое.
  15. А если делать инъекцию в том месте где делаешь, то надо заменить нопами верхнюю инструкцию, что бы не происходило заполнения стека fpu, ведь она загружает. "RomeTW-BI.exe"+1817DA: D9 45 EC - fld dword ptr [ebp-14] Или же можно перед своим кодом сделать выгрузку из стека fstp dword ptr [eax+0000027C] Но как сказал Garik66, лучше делать инъекцию на инструкцию выше твоей иньекции.
×
×
  • Создать...

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

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