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

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

本贴由 #define2013-09-26 发布. 版块名称: PW Документация

  1. TopicStarter Overlay

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

    帖子:
    61
    支持:
    37
    Репутация:
    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.
    已获得Bengard, Denis-root, DeadTime另外14人的支持.
  2. salitypw Программист Пользователи

    帖子:
    673
    支持:
    460
    性别:
    Репутация:
    8
    Команда:
    Easy Game Protection
    Страна:
    Japan Japan
    elementdataman это для элика, а для остальных файлов можно названия привести?)
  3. pdev Команда форума Администратор Программист 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 Команда форума Администратор Программист 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. Это для простоты люди договорились считать, что версия - байт или шорт.
    Последнее редактирование: 2013-09-27
  8. gam1ng Эксперт MmoDev Пользователи White List

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

    代码:
    union
    {
    int signature;
    struct
      {
      short version;
      short hashtag;
      };
    };
    已获得ПафоС#definedpakon1的支持.
  9. Электрон B L A C K    L I S T

    帖子:
    188
    支持:
    124
    性别:
    Репутация:
    -1
    Команда:
    ElDev
    Лол. Ты не думаешь, что рони тоже юзал этот способ?
    已获得SineDMerfy(删除的用户)的支持.
  10. rodrigooow Пользователи

    帖子:
    2
    支持:
    0
    性别:
    Репутация:
    0
    Команда:
    suportgm
    Как вытащить RAW байт в конце конфигурации?

    [​IMG]
Черновик сохранён Черновик удалён

分享此页面