1. Гость, мы просим Вас ознакомиться с Правилами Форума и Отказом от ответственности!

1.5.1 (101) Вытаскивание структуры пакетов

Тема в разделе 'PW Вопросник', создана пользователем Neron, 13 июн 2016.

  1. TopicStarter Overlay

    Neron Пользователи

    Сообщения:
    322
    Лайки:
    12
    Репутация:
    0
    Столкнулся с небольшой проблемой. У меня есть сервер и из гделивери хочу через gdb тянуть пакеты.
    Ну все идет не плохо с ключем и получением списка итд. Но вот вопрос у пакета опкод допустим 0x02
    ну это пакет KeyExchange как я заметил в gdb пакеты тянутся только по названию, как тянуть пакеты по опкоду? Что то типа gdb 0x02 и мне показывает пакет, названия у всех пакетов увы не знаю, ну или же тогда по опкоду узнать название пакета.
  2. alexdnepro Эксперт AngeliCore Пользователи Open Source Contributor White List

    Сообщения:
    754
    Лайки:
    1.313
    Пол:
    Мужской
    Репутация:
    6
    ptype
    CallID, ProtocolType
  3. int 3 Программист Пользователи Open Source Contributor

    Сообщения:
    342
    Лайки:
    531
    Пол:
    Мужской
    Репутация:
    10
    Страна:
    Russian Federation Russian Federation
    // Пока писал, Алекс уже выдал названия enum'ов. Но раз уж написал сообщение..
    Через gdb - никак. Опкоды вшиты в конструкторы соответствующих классов. Алгоритм получения опкода по названию пакета:
    1. Берем название пакета (пусть KeyExchange)
    2. Ищем в IDA функцию GNET::KeyExchange::KeyExchange
    3. Смотрим второй аргумент функции GNET::Рrotocol::Рrotocol(..., 0x2)
    4. PROFIT
  4. TopicStarter Overlay

    Neron Пользователи

    Сообщения:
    322
    Лайки:
    12
    Репутация:
    0

    Ты говорил про это? Если да то как ту понять где тот же KeyExchange?
  5. apfilipp AngeliCore Пользователи

    Сообщения:
    66
    Лайки:
    53
    Пол:
    Мужской
    Репутация:
    1
    А тут его и нет, т.к. обменом ключами занимается линк. А по теме, бери сниффер и "нюхай".
  6. TopicStarter Overlay

    Neron Пользователи

    Сообщения:
    322
    Лайки:
    12
    Репутация:
    0
    Уже взял сижу копаю, разбирать стараюсь пакеты. Но все таки легче когда знаешь название и уже тащишь структуру.
    А есть еще предложения по тому как таскать структуры из гделивери? Я немного не понял то что писал int, может ищу не так.
  7. apfilipp AngeliCore Пользователи

    Сообщения:
    66
    Лайки:
    53
    Пол:
    Мужской
    Репутация:
    1
    Структуру пакетов, в том виде в каком в серверных файлах присутствуют структуры элементов или квестов, ты не найдёшь. Все структуры пакетов разбираются методом тыка с помощью сниффера. Так же есть сайтик, на котором есть большинство структур пакетов.(ссылка)
  8. TopicStarter Overlay

    Neron Пользователи

    Сообщения:
    322
    Лайки:
    12
    Репутация:
    0
    Слушай я копался копался и никак не могу найти это значение 0x2, ты можешь показать пример где оно хранится.
    Быстренько написал программу, вытащила мне все структуры, но хочу туда добавить и опкод.
    Как ты вот писал я искал и не одно значение не подходит к тому чтобы быть опкодом
    [​IMG]
  9. JoLan Команда форума Администратор AngeliCore Программист

    Сообщения:
    1.061
    Лайки:
    948
    Пол:
    Мужской
    Репутация:
    6
    Команда:
    AngeliCore
    Страна:
    Russian Federation Russian Federation
    Ты ищешь в упорядоченном списке отладочной информации, где содержатся только юзер-френдли данные. Если вдруг я правильно понял, о чем писал тов. in3, то для того, чтобы провернуть сей план нужно:
    1. Запустить приложение с отладкой
    2. Поставить точку останова на функции, опкод которой необходимо узнать
    3. У функции GNET:: Protocol:: Protocol исследовать память на аргументы
    4. PROFIT
    Unix нравится это.
  10. int 3 Программист Пользователи Open Source Contributor

    Сообщения:
    342
    Лайки:
    531
    Пол:
    Мужской
    Репутация:
    10
    Страна:
    Russian Federation Russian Federation
    Я имел ввиду, что искать надо в списке функций, а не в бинарных данных.
    Подробно:
    1. Установить IDA Pro - можно даже без Hex-Rays, любую стабильную версию
    2. Открыть в ней gdeliveryd и дождаться полного анализа - просто протыкать "Да", "Да", "Ок" и прочее
    3. Полный анализ завершится, когда в левом нижнем углу программы перестанут мелькать цифры и останется надпись AU: idle
    4. Слева, в окне Functions window нажать Alt-T и ввести GNET::KeyExchange::KeyExchange, нажать ОК. Если такого окна нет, нажать View/Open subviews/Functions.
    5. Нажать дважды на найденное значение и увидеть код
    6.1. Опкод пакета - число, являющееся аргументом первого push.
    6.2. Вместо этого можно кликнуть F5 при наличии hex-rays и увидеть это же число в аргументе функции
  11. TopicStarter Overlay

    Neron Пользователи

    Сообщения:
    322
    Лайки:
    12
    Репутация:
    0
    Вновь взялся за работу. Спасибо что помог на счет ptype CallID.
    Вообщем там выводится название пакета и его опкод. Из названия мы удаляем PROTOCOL_ получаем название которое должно быть
    Ну и опкод самого пакета конвертим в инт к примеру и выводим "X" и получаем что то типа 0x48 так уже что то можно разобрать через пандору к примеру.
    Естественно после того как ты узнаем в пандоре опкод в нашем файле ищем этот покод, получаем наше название пакета и смотрим стректуру.

    Но все же остается вопрос: как тащить так же структуру из пакета 0x22?
  12. JonMagon Программист Пользователи Open Source Contributor

    Сообщения:
    805
    Лайки:
    809
    Пол:
    Мужской
    Репутация:
    5
    Страна:
    Germany Germany
    Ты издеваешься? На вики всё есть. Что тебе ещё надо?
    --- добавлено: 9 июл 2016 в 10:54 ---
    Код:
    <PacketInfo Type="0x02" Direction="C2S" Container="False" Name="CMKey">
      <PacketField Type="Byte" Name="KeyLen" />
      <PacketField Type="Bytes" Length="KeyLen.Value" Name="Key" />
      <PacketField Type="Byte" Name="Force" />
    </PacketInfo>
    Последнее редактирование модератором: 17 июл 2016
    wsok нравится это.
  13. TopicStarter Overlay

    Neron Пользователи

    Сообщения:
    322
    Лайки:
    12
    Репутация:
    0
    Да зачем мне этот пакет. У меня эти все уже есть. Я говорю про пакеты 0х00 и 0х22.
    У них тоже должна быть структура как бы чтобы понимать что пришло и что отвечать.
    Последнее редактирование модератором: 17 июл 2016
  14. apfilipp AngeliCore Пользователи

    Сообщения:
    66
    Лайки:
    53
    Пол:
    Мужской
    Репутация:
    1
    Все пакеты в пв имеют одинаковую структуру.
    1. CUInt - опкод, в нашем случае 0x22 или 0x00.
    2. CUInt - длина пакета
    3. Byte[] - данные.

    В пакетах контейнерах в части данных может быть несколько пакетов.
    В итоге структура пакета в контейнере.
    1. CUInt - длина пакета.
    2. Ushort - опкод, в контейнерах опкод у пакета записывается в виде ushort.
    3. Byte[] - данные.
    PS. Могу немного ошибиться, т.к. пишу по памяти, а подглядеть негде.
  15. JonMagon Программист Пользователи Open Source Contributor

    Сообщения:
    805
    Лайки:
    809
    Пол:
    Мужской
    Репутация:
    5
    Страна:
    Germany Germany
    Это контейнеры. Какая структура нахрен? Там несколько сотен пакетов GS.
  16. int 3 Программист Пользователи Open Source Contributor

    Сообщения:
    342
    Лайки:
    531
    Пол:
    Мужской
    Репутация:
    10
    Страна:
    Russian Federation Russian Federation
    Подытоживая:
    И мои ответы с соседней темы
    Все структуры есть в отладочной информации, но сопоставление opcode <-> структура уже наугад идёт. Смотри gplayer_controller::CommandHandler, там switch по опкоду, а логику уже из кода вытащить можно.
Черновик сохранён Черновик удалён
Similar Threads
  1. Supreme
    Ответов:
    1
    Просмотров:
    3.116
  2. Joslian
    Ответов:
    7
    Просмотров:
    2.700
  3. djneo0066
    Ответов:
    3
    Просмотров:
    2.927
  4. wsok
    Ответов:
    23
    Просмотров:
    3.235
  5. Neron
    Ответов:
    5
    Просмотров:
    2.085
Загрузка...

Поделиться этой страницей