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

Любая версия Как достать структуру elements.data из gs

Тема в разделе 'PW Документация', создана пользователем #define, 26 сен 2013.

  1. TopicStarter Overlay

    #define Пользователи

    Сообщения:
    61
    Лайки:
    36
    Репутация:
    0
    Команда:
    PP
    Китайцы - добрые люди. В каждом (шаровом) билде своего PW сервера оставляют кучу полезной и не совсем дебаг информации. И мы можем ее достать! Если читатель этой темы захочет написать свой собственный и инновационный редактор - будет полезно тут прочитать.

    Будем мы пользоваться программой GDB (GNU Debugger). Вообще эта программа предназначена для отладки приложений, но мы будем только доставать информацию из таблицы символов исполняемых файлов.

    1. Установим GDB (8-12 МБ)
    Код:
    apt-get install gdb
    2. Откроем GDB
    Код:
    gdb
    3. Загрузим наш файл геймсервера
    Код:
    (gdb) file /server/gamed/gs
    Появится:
    Код:
    (gdb) Reading symbols from /server/gamed/gs...done.
    Придется подождать.

    3.1 Добавим вывод в файл всего, что выведется на экран
    Код:
    (gdb) set logging file /путь к файлу
    (gdb) set logging on
    4. Дальше нам нужно найти тип "elementdataman"
    Код:
    (gdb) ptype elementdataman
    Появится очень много строк, нажимаем Enter до конца вывода.

    5. Ищем наш файл из пункта 3.1. Открываем.
    В этом файле представлен листинг структуры elementsdataman. Находим public часть этого файла.
    В ней будут упорядочены все листы этого файла.
    Пример public части elementsdataman(Версия 1.4.6 v80)

    Код:
    public:
        elementdataman(void);
        ~elementdataman(int);
        void add_structure(unsigned int, EQUIPMENT_ADDON &);
        void add_structure(unsigned int, WEAPON_MAJOR_TYPE &);
        void add_structure(unsigned int, WEAPON_SUB_TYPE &);
        void add_structure(unsigned int, WEAPON_ESSENCE &);
        void add_structure(unsigned int, ARMOR_MAJOR_TYPE &);
       <...>
        void add_structure(unsigned int, FASHION_WEAPON_CONFIG &);
        void add_structure(unsigned int, PET_EVOLVE_CONFIG &);
        void add_structure(unsigned int, PET_EVOLVED_SKILL_CONFIG &);
        void add_structure(unsigned int, MONEY_CONVERTIBLE_ESSENCE &);
        void add_structure(unsigned int, STONE_CHANGE_RECIPE_TYPE &);
        unsigned int get_data_id(ID_SPACE, unsigned int, DATA_TYPE &);
        unsigned int get_first_data_id(ID_SPACE, DATA_TYPE &);
        unsigned int get_cur_data_id(ID_SPACE, DATA_TYPE &);
        unsigned int get_next_data_id(ID_SPACE, DATA_TYPE &);
        unsigned int get_data_num(ID_SPACE);
        DATA_TYPE get_data_type(unsigned int, ID_SPACE);
        const void * get_data_ptr(unsigned int, ID_SPACE, DATA_TYPE &);
        int save_data(const char *);
        int load_data(const char *);
    6. Из этого всего нам нужно только то, что находится в функциях
    Код:
    add_structure(int, listdef)
    Где listdef - структура листа. Например, listdef EQUIPMENT_ADDON (Самый первый лист доп статов).
    Они находятся в правильном порядке (как ни странно).

    7. Выписываем все listdef по порядку в блокнот:
    Код:
    EQUIPMENT_ADDON
    WEAPON_MAJOR_TYPE
    ...
    8. Снова заходим в GDB
    И для каждого listdef набираем
    Код:
    (gdb) ptype EQUIPMENT_ADDON
    В выводе будет структура этого листа. Более того, если вы не закрывали GDB, она будет экспортироваться в файлик из п. 3.1.

    Дальше проделываем для каждого листа
    Код:
    (gdb) ptype WEAPON_MAJOR_TYPE - экспортируется структура второго листа
    И так далее для каждого листа из п.6.

    9. Финишная прямая.
    Теперь напоминаю, что первым восьми байтам файла соответствует структура:
    Код:
    short version; - версия файла
    short hashtag; - точно не знаю. Кажется контрольная сумма. Отпишитесь, кто знает.
    int timestamp; вспомогательное значение для последнего изменения файла.
    10. На последок. Не забудьте также, что перед каждым листом в файле стоит int число с количеством итемов в листе.

    Вуаля! Соединив все воедино сначала начало файла (п. 9), затем все листы из п.8 мы получим готовую структуру файла elements.data.

    Гайд написан для mmorpg-devs by DEFiNE. Лицензия: Beerware.
    Denis-root, DeadTime, skastafew и 13 другим нравится это.
  2. salitypw Программист Пользователи

    Сообщения:
    673
    Лайки:
    458
    Пол:
    Мужской
    Репутация:
    8
    Команда:
    Easy Game Protection
    Страна:
    Japan Japan
    elementdataman это для элика, а для остальных файлов можно названия привести?)
  3. pdev 14:23 Команда форума Администратор Программист Open Source Contributor

    Сообщения:
    1.409
    Лайки:
    1.407
    Пол:
    Мужской
    Репутация:
    7
    Команда:
    Indy
    Страна:
    Turkey Turkey
    Такое чувство, будто это уже публиковалось кем-то)
  4. Kn1fe12 B L A C K    L I S T Пользователи

    Сообщения:
    211
    Лайки:
    24
    Пол:
    Мужской
    Репутация:
    0
    Команда:
    Лучше не знать
    Только смысла от этой статьи? проще в исходниках pw tools посмотреть
    lukacho нравится это.
  5. pdev 14:23 Команда форума Администратор Программист Open Source Contributor

    Сообщения:
    1.409
    Лайки:
    1.407
    Пол:
    Мужской
    Репутация:
    7
    Команда:
    Indy
    Страна:
    Turkey Turkey
    весь гайд можно ужать до man gdb
    rodrigooow нравится это.
  6. nom1nal Moderator Команда форума Модератор Программист Пользователи

    Сообщения:
    356
    Лайки:
    117
    Пол:
    Мужской
    Репутация:
    0
    Гуарангой на pwemu если не ошибаюсь
  7. dpakon1 Пользователи

    Сообщения:
    101
    Лайки:
    14
    Пол:
    Мужской
    Репутация:
    0
    Команда:
    myself
    Об этом уже знали с первой шарой 1.2.4 ядра - 2008 год, боян... Уже все кому не лень достали структуры. Название других классов (структур) ищется в ida.

    Версия это все 4 байта, погляди в чтение элемента в ядре, он сверяет именно 4 байта,а не 2. Это для простоты люди договорились считать, что версия - байт или шорт.
    Последнее редактирование: 27 сен 2013
  8. gam1ng Эксперт MmoDev Пользователи White List

    Сообщения:
    299
    Лайки:
    432
    Репутация:
    1
    Команда:
    GG
    А что вы скажите на это? Вся эта конструкция занимает 4 байта, а вот гибкось языка С++ позволяет читать и так, и так.

    Код:
    union
    {
    int signature;
    struct
      {
      short version;
      short hashtag;
      };
    };
    ПафоС, #define и dpakon1 нравится это.
  9. Электрон B L A C K    L I S T

    Сообщения:
    188
    Лайки:
    124
    Пол:
    Мужской
    Репутация:
    -1
    Команда:
    ElDev
    Лол. Ты не думаешь, что рони тоже юзал этот способ?
  10. rodrigooow Пользователи

    Сообщения:
    2
    Лайки:
    0
    Пол:
    Мужской
    Репутация:
    0
    Команда:
    suportgm
    Как вытащить RAW байт в конце конфигурации?

    [​IMG]
Черновик сохранён Черновик удалён
Similar Threads
  1. marcusx
    Ответов:
    3
    Просмотров:
    2.367
  2. InTeam
    Ответов:
    2
    Просмотров:
    2.427
  3. Mr.Fleks
    Ответов:
    4
    Просмотров:
    3.154
  4. tyrikmen
    Ответов:
    3
    Просмотров:
    2.083
  5. Rody66
    Ответов:
    10
    Просмотров:
    6.533
Загрузка...

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