Как в OllyDBG найти какой экспортируемой функции принадлежит просматриваемый код?
Как найти, открыть и поставить бряк на нужной экспортируемой функции нашел.
Но например, начинаю отладку, возвращаюсь по retn в вызывающую функцию и уже не знаю где я. Нет пометок границ функций как в IDA даже экспортируемых или я не там смотрю.
Как в OllyDBG найти какой экспортируемой функции принадлежит просматриваемый код?
Как найти, открыть и поставить бряк на нужной экспортируемой функции нашел.
Но например, начинаю отладку, возвращаюсь по retn в вызывающую функцию и уже не знаю где я. Нет пометок границ функций как в IDA даже экспортируемых или я не там смотрю.
врядли такое есть.
А как узнать версию протокола клиента?
Последний раз редактировалось Smwr, 26.08.2016 в 20:49.
Версия протокола используется только на пакетном уровне и только для OOG ботов (пакет клиент->сервер 0x0E=ProtocolVersion), зачем оно тебе?
PS. Тут недавно проскакивал вопрос про Asterios - действительно прикольный сервак, либо я безумно туплю, либо ребята хорошо над защитой поработали. На диске валяется engine.dll от последних хроник (Одиссей), но потом в памяти все это дело каким-то образом подменяется на библиотеку от GoD. Ну и плюс подчищается возможность работать с библиотекой: как минимум удаляется таблица экспорта, может еще что-то делают. Веселая зараза.
100% гарантированного варианта не знаю, вполне возможно что в клиенте где-то эта инфа зашита (встречал упоминания, что можно клиент вызывать с параметром L2ProtocolVersion и типа в ответ получишь версию клиента/протокола - не знаю на сколько это правда).
Один из вариантов который мне советовали - создавать базу с engine.dll (отличать их друг от друга можно по размеру файла/кода).
Наш вариант определения озвучивать не буду по личным причинам.
Можешь для начала все клиенты считать HF5 (как наиболее распространенный клиент), а можешь отдавать настройку на откуп пользователю.
Разобрал почти все, что хотел.
А вопрос с баффами и скилллистом так и остался нерешенным DD
Нигде, кроме как в UI их нет, походу.
Точнее баффы юзера нашёл в двух экземплярах(как и писал), первый можно получить путём хитрых смещений, правда endtime там на момент приема пакета. но это впринципе не такая большая проблема, т.к. проверять, изменились ли баффы(сравнивая это самое время с предыдущим) не проблема.
А вот с баффами сопартийцев всё очень плохо.
Они хранятся в виде 2-мерного массива в классе NCIconTabCtrl который в свою очередь лежит в классе UWindowHandle, который лежит в классе UUIScript и вроде как рядом лежит OID обьекта. Дальше стало лень искать, откуда ноги растут. Ситуацию осложняет то, что в NWindow не экспортируется ничего полезного, а тамошний код сложнее поддается анализу.
Скиллист тоже нашёл только ввиде массива айдишников.
В итоге сижу и думаю, а стоило ли вообще заморачиваться с такой реализацией, т.к. всё равно без хуков не обойтись...
Назрел вопрос - при юзе скилла клиент сам считает его откат? Потому что пакет C7=SkillCoolTime:d(listSize:Loop.01.0004)d(skillID :Get.Skill)d(skillLvl)d(reuseDelay)d(timeRemain) приходит только при открытии скилллиста, мб есть еще что то?
Последний раз редактировалось Smwr, 26.09.2016 в 18:39.
Smwr, на сколько помню, если у перса есть неактивные скиллы, то SkillCoolTime автоматически приходит при входе в игру; если этого пакета не пришло, то считаем, что любой скилл можно юзать.
И после каждого использования скилла приходит пакет 48=MagicSkillUse, где указано время каста и время отката.
Дальше клиент сам считает, но и сервер параллельно тоже считает и не позволит раньше времени использовать скилл.
Smwr, на сколько помню, если у перса есть неактивные скиллы, то SkillCoolTime автоматически приходит при входе в игру; если этого пакета не пришло, то считаем, что любой скилл можно юзать.
И после каждого использования скилла приходит пакет 48=MagicSkillUse, где указано время каста и время отката.
Дальше клиент сам считает, но и сервер параллельно тоже считает и не позволит раньше времени использовать скилл.
Большое спасибо, почему то не додумался посмотреть, что в magicskilluse есть время отката
Поковырял обработчик, и нашёл то, что искал.
А не находил ранее, потому что ожидал увидеть целое, а оказалось, что время в л2 в float/double.