ВНИМАНИЕ! Наша конференция посвящена космической тематике и компьютерным играм. Политические вопросы и происходящие в мире события в данный момент на нашем сайте не обсуждаются!
|
» Структура данных X-Tension | страница 6 |
|
|
|
Канал X-Tension/X-BTF: «Структура данных X-Tension» |
|
|
Blueboar
|
|
Всем, кто пишет письма я отвечаю.
В ящике было одно письмо. Ответ уже отправил.
Кстати, никто не знает, почему я не
могу завести свой "аккаунт"? Все время
получаю сообщение, что пароль сильно простой,
хотя уж и символов 10 и буквы и цифры...
|
|
|
CheckerTwo
550 EGP
     Рейтинг канала: 4(90) Репутация: 103 Сообщения: 412 Откуда: Tomsk Зарегистрирован: 18.08.2004
 |
|
Цитата: |
Ответ уже отправил.
|
Спасибо.
Цитата: |
Они действительно начинаются
с SE_ (правда не все, еще встречается
gs_Debug, SFX_ и другие). А вы откуда знаете?
Что, в X2 тоже такие же?
|
Они такие еще с XBTF. Но доковырять времени не хватило...
Этот раскодированный файл вы как получили?
Цитата: |
Кстати, никто не знает, почему я не
могу завести свой "аккаунт"?
|
Пароль должен содержать буквы И цифры.
|
|
|
Blueboar
|
|
Загрузил файл под отладчиком и посмотрел
прямо в памяти после раскодирования.
Больше всего интересует две вещи
1) Как декодировать
2) Где храняться адреса перехода для
этих подпрограмм (по идее раз подпрограммы
в XTension.EXE, то и смещения должны быть
там же. Так вроде и есть, но до конца еще
не разобрался. Чувствую себя как на пороге
еще не сделанного открытия ...)
Я так понимаю, что если информация важная,
ее можно постить в форум в любых количествах?
|
|
|
CheckerTwo
550 EGP
     Рейтинг канала: 4(90) Репутация: 103 Сообщения: 412 Откуда: Tomsk Зарегистрирован: 18.08.2004
 |
|
Цитата: |
Загрузил файл под отладчиком и посмотрел
прямо в памяти после раскодирования.
|
1. А в памяти все что до STRG - так и есть в неизменном виде?
Странно. Что-то я видимо не так делал...
2. Первой строкой после STRG идет SetVolumeMaster, а в exe эта метка встречается с префиксом SFX_.
Такое ощущение, что после расшифровки и настройки адресов эти
данные на каком-то этапе подзатерлись. Может такое быть?
Впрочем, это может быть имя локальной функции, а не системной.
Потому как есть некоторые имена, не встречаемые в EXE.
А может и просто строки сообщения (отладочного)...
Цитата: |
Я так понимаю, что если информация важная,
ее можно постить в форум в любых количествах?
|
В общем случае это зависит от того, как модератор посмотрит на это дело.
Как правило для полезной и нужной информации это почти так.
|
|
|
Blueboar
|
|
Насчет подпрограмм ассемблера. Выяснено, что они делятся по типу (по первым буквам названия – MOV_, SE_, SFX_ и т.д.), причем для каждой такой группы обработчик один!
Например, для MOV_ - в самом начале файла – 00401000. То есть, если встретится подпрограмма, начинающаяся на MOV_, управление перейдет туда, как бы она не называлась. Для того, чтобы различить требуемые подпрограммы, по адресу [EBP+08] подпрограмме передается номер процедуры MOV_, которую нужно выполнить. Процедура, естественно, ее читает и понимает, что ей делать.
Как определить номер процедуры? Например, для MOV_, открываем X-TENSION.EXE по адресу 000FF218, там список из указателей: 00875D00; E0865D00, переворачиваем их, получаем 005D8700, 005D86E0. Это адреса ИМЕН подпрограмм в порядке возрастания.
Объясняю: Первым идет адрес 005D8700. Тут можно рассказывать про ассемблер и организацию секций в файле, но можно проще. Просто от этого числа нужно (в 16-ричном виде)
1. Отнять 00400000 = 001D8700
2. Отнять 001D1000 = 00007700
3. Прибавить 00115000 = 0011С700
Особо интересующимся могу объяснить, откуда взялись данные числа, но это уже дебри ассемблера. По данному адресу написано MOV_LOADMOVIE. Это означает, что данная подпрограмма имеет номер 0. Следующая будет иметь 1, и так далее. Номер имеется ввиду тот, что передается подпрограмме в [EBP+08]
Итак, далее данные: Сначала адреса подпрограмм для разных начал имен
B3D_ - 000FF060
P_ - 000FF160
MOV_ – 000FF218
D_ - 000FFB18
SFX_ - 000FFEE0
P_ - 000FFF80 (Еще один список для P_?)
SE_ - 000FFFE0
Теперь список, по какому адресу переходит подпрограмма при обнаружении данных типов подпрограмм (выяснить, откуда берутся не удалось, потому привожу лишь те, адрес которых подсмотрел во время выполнения загрузочных скриптов в отладчике). Адреса два. Первый в памяти, второй – если смотреть файл.
SE_ - 004BBA90; 000BBA90
SFX_ - 004BA290; 000BA290
MOV_ - 00401000; 00001000
Итак, теперь вопросы. Первый – если адреса жестко записаны в X-TENSION.EXE, то означает ли это, что новые подпрограммы невозможны без его патча? Но ведь разработчики придумывают новые квесты? Или они это делают, не прибегая к ассемблерным подпрограммам?
Второй – где DF, который первый начал всем этим заниматься, и который вполне мог бы мне помочь. (А может среди пилотов есть еще ассемблерщики?)
Третий – Как уже наконец декодировать эту область STRG?
Четвертый – Теперь, собственно, можно декодировать каждую программу ассемблера по отдельности. Если кто захочет, запостю соответствие номера и названия для каждой подпрограммы.
|
|
|
Blueboar
|
|
To CheckerTwo: Это две совершенно разные подпрограммы!
SetVolumeMaster без SFX_ это видимо подпрограмма скрипта
(кстати, может и из файла .PCH (так вроде?)), а
SFX_SetVolumeMaster - стадартная из X-TENSION.EXE.
И в файле OBJ она тоже есть, но несколько ниже.
|
|
|
Blueboar
|
|
Теперь уже собственно, первые результаты декодирования подпрограмм (оперативно, правда? Я сам не ожидал, честно говоря…).
Для подпрограмм MOV_ по смещению 115DB0 в файле X-TENSION.EXE хранится смещение для каждой подпрограммы. Например, первая запись 00401034 (уже перевернутая). В файле это 00001034. Первое имя для MOV_ - MOV_LOADMOVIE (смотри предыдущий пост). Вот вы уже и имеете адрес подпрограммы. Теперь требуются специалисты для их разбора, видимо.
Для подпрограмм SFX_ - по смещению 1185A0
Для подпрограмм SE_ - по смещению 1186A0
|
|
|
Blueboar
|
|
Точно! Эти адреса ж близко друг с другом находятся. А если посмотреть, что между ними находится. Может найдем входы и для других начал имен?
И точно, нашли. Пишу по порядку (к сожалению, не известно, какая группа какому названию соответствует, но точно какому-то соответствует)
1) Адрес обработчика данной группы
2) Адрес таблицы с адресами подпрограмм
00450700 – 11600C
00451270 – 116040
Вполне возможно, что это неизвестные пока группы D_, P_ или B3D.
|
|
|
DF
300 EGP
   Рейтинг канала: 5(118) Репутация: 47 Сообщения: 478
Зарегистрирован: 06.09.2003
 |
|
Цитата: |
Первый – если адреса жестко записаны в X- TENSION.EXE, то означает ли это, что новые подпрограммы невозможны без его патча? Но ведь разработчики придумывают новые квесты? Или они это делают, не прибегая к ассемблерным подпрограммам?
|
А зачем им еще что-то дописывать?, Нормальный язык програмирования должен позволять реализовать все что хочешь без использования средств других языков.
Цитата: |
Второй – где DF, который первый начал всем этим заниматься, и который вполне мог бы мне помочь.
|
Да тут я, никуда не делся, просто у меня мало времени чтобы заниматься всем этим.
Цитата: |
А может среди пилотов есть еще ассемблерщики?
|
Это вряд ли, нас только двое
Цитата: |
Как уже наконец декодировать эту область STRG?
|
Вряд ли она серьезно закодирована, наверняка просто какое-то нелепое преобразование делается, например у скриптов при загрузке меняются между собой четные и нечетные байты. В любом случае можно посмотреты что делает x-t.exe с этим сегментом при загрузке.
Еще посмотри, если не видел, вот это:
http://www.elite-games.ru/conference/viewtopic.php?t=14670
http://www.elite-games.ru/conference/viewtopic.php?t=17760
http://www.elite-games.ru/conference/viewtopic.php?t=21858
|
|
|
Blueboar
|
|
Да, видимо DF прав, ассемблерщиков тут мало.
Вот вам алгоритм дешифровки STRG. Разобрался через полчаса после того, как пришла гениальная мысля – найти в файле EXE строку 'STRG’, а затем участок программы, который к ней обращается. Гениальное просто (Спасибо DF за наводки).
Итак, алгоритм:
1. Алгоритм идет ОТ КОНЦА К НАЧАЛУ!
2. Берется следующий байт, который нужно расшифровать (сначала последний, потом предпоследний, и т.п.)
3. В нем инвертируются все биты (например из 08 станет F7)
4. Из него вычитается предыдущий байт (который будет распаковываться следующим). Обратите внимание, вычитается байт, который мы еще не распаковали!
5. Все, полученное значение записывается на место зашифрованного
6. Все повторяется с пункта 2
7. Для числа в самом начале, которое не имеет предыдущего операция 4 не производится (но операцию 3 сделать нужно)
|
|
|
Blueboar
|
|
Выяснилось, почему заголовок каждой секции (типа STO2, STRG, SYMB и т.д.) занимает по 8 байт (как вы помните, в команде перехода в скрипте нужно было добавлять к адресу 8, что означает, что 8 байт отведено под заголовок – см. более мои более ранние посты по командам скрипта)
Дело в том, что первые четыре байта занимает название (например STO2), еще 4 – длина секции! Но не в байтах, и даже не в словах, а в некоторых единицах, специфичных для каждой секции (кроме секции CTIM, она занимает 4 байта, и там скорее всего хранится время создания скриптов, а также STRG – она дешифруется как указано выше и идет вплоть до конца файла).
Что это нам дает? Посмотрим на файл 002.OBJ поподробнее (у меня от версии 1.1, у вас наверное другой). В начале:
'STO2'+000043DA
Это начало секции скриптов. Смотрим, следующая секция – по адресу 87BC – CTIM.
Итак, секция всего занимает 87BC-0(начало секции в начале файла)-8(размер заголовка) = 87B4. Поделим наше число на указанное в заголовке, получим ровно 0002! Это означает, что данные из данной секции читаются по 2 байта (естественно, мы это уже знаем). Но теперь определим таким же образом длина для остальных секций
· Для секции SYMB – 12 байт
· Для секции VARS – 12 байт
То есть в данных секциях идут наборы данных по 12 байт. Осталось узнать, что они означают…
|
|
|
Blueboar
|
|
Как справедливо заметил DF, при входе
в обработчик скрипта под отладчиком
[EBP-3C] - указатель на стек
[EBP-08] - указатель на данные
Нужно позарез узнать, что означает [EBP-20]!
Очень надо! Если узнаю, напишу все остальные
команды скриптов.
И вообще, народ, вы где? На работе все, что ли?
|
|
|
DF
300 EGP
   Рейтинг канала: 5(118) Репутация: 47 Сообщения: 478
Зарегистрирован: 06.09.2003
 |
|
Если считата, что команда 2F создает объект и инициализирует его значениями из стека, то:
08 - Получить данные из объекта SP[1]=[obj(SP[0])+SP[1]]; SP-1
2D - Записать данные в объект [obj(SP[0])+SP[1]]=SP[2]; SP-2
Обозначения:
obj(x) - получить адрес объекта с идентификатором x
И еще до кучи алгоритм шифровки STRG:
0167:00418000 MOVZX EAX,BYTE PTR [ECX+EDX]
0167:00418004 MOVZX EBX,BYTE PTR [ECX+EDX-01]
0167:00418009 XOR EAX,-01
0167:0041800C SUB EAX,EBX
0167:0041800E MOV [ECX+EDX],AL
0167:00418011 DEC EDX
0167:00418012 JNZ 00418000
|
|
|
Shaddie
556 EGP
      Рейтинг канала: 6(438) Репутация: 118 Сообщения: 261 Откуда: Томск Зарегистрирован: 09.09.2004
 |
|
В свете новых данных поступивших от Blueboar, уточняю структуру записей данных объектов.
Буду использовать следующие сокращения: П - параметр; ИО - идентификатор объекта (он же еще один параметр); КП - количество параметров; Р - разделитель (002F).
1. Идентификатор сектора: ПД + П1 + П2 + П3 + ИО + КП + Р.
П1 - ворота; П2 - координата X; П3 - координата Y.
ПД - дополнительные параметры. Для идентификатора сектора дополнительными параметрами являются следующие объекты (один объект это один параметр): текстура космоса; солнце; планета; станция; корабль охранения сектора (корабль у которого владельцем является сектор); астероид.
2. Текстура космоса: П1 + ИО + КП + Р.
П1 - текстура.
3. Солнце: П1 + П2 + П3 + П4 + П5 + П6 + ИО + КП + Р.
П1,П2,П3 - составляющая B,G,R; П4,П5,П6 - YZX.
4. Планета: П1 + П2 + П3 + П4 + П5 + ИО + КП + Р.
П1,П2 - вид планеты; П3,П4,П5 - YZX.
5. Для станций: ПД + П1 + П2 + П3 + П4 + П5 + П6 + ИО + КП + Р.
П1 - тип станции; П2 - раса-владелец; П3 - класс станции; П4,П5,П6 - YZX.
ПД - дополнительные параметры (количество кратно 2) - она же метка, одна пара параметров состоит из двух параметров: количество объектов и их тип. Таких пар может быть от 1 до 4: товары (продукция) - всегда есть; ресурсы 1; ресурсы 2; корабли.
6. Корабль: ПД + П1 + П2 + П3 + П4 + П5 + П6 + ИО + КП + Р.
П1 - тип корабля (???); П2 - раса-владелец; П3 - класс корабля; П4,П5,П6 - YZX.
ПД - дополнительные параметры (количество кратно 2) - она же метка, одна пара параметров состоит из двух параметров: количество объектов и их тип. Таких пар может быть от 0 (нет) до 2: корабли "In Space"; корабли "Landed".
7. Товар: П1 + ИО + КП + Р.
П1 - группа товара.
8. Астероид: П1 + П2 + П3 + П4 + П5 + П6 + ИО + КП + Р.
П1 - количество ресурса (Yield); П2 - тип ресурса; П3 - вид астероида; П4,П5,П6 - YZX.
Объект__________________Идентиф. объекта___Количество параметров
Идентификатор сектора 1 (000A) Переменно
Текстура космоса 2 (000B) 2 (000B)
Солнце 3 (000C) 7 (0010)
Планета 4 (000D) 6 (000F)
Станция тип 1 5 (000E) 9,11 (0012,0014)
Станция тип 2 6 (000F) 9,11,13,15 (0012,0014,0016,0018)
Корабль 7 (0010) 7,9,11 (0010,0012,0014)
Товар 8-16 (0011-0019) 2 (000B)
Астероид 17 (001A) 7 (0010)
Пример для идентификатора сектора Ore Belt:
Количество параметров = $0001006F = 111.
В секторе находится: 1 текстура космоса; 2 солнца; 2 планеты; 11 станций; 3 корабля; 88 астероидов.
Итого: 107 параметров (объектов) + 4 параметра (ворота, X, Y, идентиф. объекта) = 111 параметров.
Что и требовалось доказать (проверил для всех секторов).
Очень интересно выглядит следующий фрагмент данных:
0001 005A 002F - он находится сразу за блоком данных секторов (offset 00093B32-00093B37).
Получается, что данный скрипт сохраняет в стеке значение 0000 005A (в десятичном виде это 90) и потом выполняет команду 002F.
Цитата: |
Последним значением в стеке является количество параметров. Записывает их куда-то, взамен выдает на стеке идентификатор, позволяющий их адресовать.
|
А в блоке данных секторов как раз и есть данные для 90 секторов .
Ту же решил проверить возможность добавления нового сектора.
Создал новый сектор (южнее Шахт Императора), добавил данные по текстуре, одному солнцу и одной планете. Для сектора указал, что количество параметров равно 7. Указал, что секторов 91. Получилось новых данных на 80 байт. Выровнял размер блока данных по секторам: удалил 80 байт данных из других секторов. Выгрузил данные в файл 001.obj. Запустил X-tension. Подлетел к южным воротам в секторе Шахты Императора и с замиранием сердца , вдавил в пол Tab. И о чудо, я оказался в новом секторе. Солнце и планета присутствовали. Вот так вот .
Надо сразу сказать что, к сожалению, сектор на галактической карте не отображался (но это старая песня, может CheckerTwo что подскажет ). А так же когда я попытался вставлять новые данные без выравнивания общего размера данных по секторам, новая игра вообще запускаться отказалась. Похоже, изменение размера данных смещает адреса точек входа в последующие подпрограммы.
001.obj с новым сектором
|
|
|
Blueboar
|
|
DF: Насчет подпрограммы расшифровки области STRG
А я разве не то же самое написал двумя постами выше
(правда словами, а не программой). Интересно,
почему именно от конца к началу, а не наоборот?
Спасибо за новые команды, пойду проверять
Shaddie: Ну что ж, я рад, осталось только выяснить
от чего зависит показывать сектор или нет.
|
|
|
CheckerTwo
550 EGP
     Рейтинг канала: 4(90) Репутация: 103 Сообщения: 412 Откуда: Tomsk Зарегистрирован: 18.08.2004
 |
|
Shaddie:
Цитата: |
Надо сразу сказать что, к сожалению, сектор на галактической карте не отображался
|
Блин, работой завалили, делом некогда занятся...
Щас еще раз перепроверю с твоим obj и отправлю тебе файлик
почтой... Либо резюме, если не получится... )
|
|
|
Blueboar
|
|
Удалось немного разобраться с частью
OBJ-файла под названием SYMB
Она состоит из блоков по 12 байт, которые
в свою очередь делятся на 3 группы по 4 байта:
4 байта - адрес подпрограммы
4 байта - полунеизвестно
4 байта - неизвестно
Итак, первые 4 байта определяют адрес подпрограммы.
Там (в SYMB) описываются, видимо ВСЕ подпрограммы,
которые вообще могут вызываться из OBJ-файла (прошу
понять правильно, командой 0031-GOTO можно попасть
на любую точку скрипта, имелось в виду, что
X-TENSION.EXE если захочет выполнить скрипт из OBJ
файла, то скорее всего читает его начало из сектора
SYMB и переходит туда).
Адрес вычисляется по обычным правилам (см. пред. посты)
Второй параметр. Его назначение неизвестно, но кое-что
про него выяснить удалось:
Есть такая команда 0059. По смыслу она полностью ана-
логична 0057 - перейти на подпрограмму, вот только
параметров у нее больше. 4 байта с началом подпрограммы
и 4 байта с вот этими неизвестными данными. То есть
последние 4 байта всегда совпадают с теми, что имеет
данная подпрограмма в секции SYMB.
Про третий параметр сказать пока ничего не могу.
|
|
|
Blueboar
|
|
Дошло!
Первые 4 байта - адрес подпрограммы
Вторые 4 байта - смещение в 'STRG'-область с названием
подпрограммы
Третьи 4 байта - неизвестно, но возможно - необходимое
число ячеек со стеком или условия вызова подпрограммы
То есть в области 'STRG' описываются НЕ ИМЕНА ПОДПРОГРАММ
АССЕМБЛЕРА, а вообще все имена подпрограмм (а может
быть не только подпрограмм) - и ассемблерных, и скриптовых.
То есть просмотрев область 'SYMB' можно определить
адреса начала и имена всех подпрограмм, и заранее немножко
по названию узнать, что делает подпрограмма.
Только остается вопрос - теперь понятно, что команда
0059 переходит по адресу в скрипте, и кроме того, указывается
ее смещение в 'STRG', ну, то есть, имя. ЗАЧЕМ?
Если указать имя, то иожно по SYMB найти ее адрес. А если
указать адрес, то зачем знать ее имя?
|
|
|
CheckerTwo
550 EGP
     Рейтинг канала: 4(90) Репутация: 103 Сообщения: 412 Откуда: Tomsk Зарегистрирован: 18.08.2004
 |
|
2Blueboar:
Цитата: |
Только остается вопрос
|
Может для отладки скриптов? Чтобы работал символьный отладчик...
2Shaddie:
По поводу карты - добавить новые сектора на галактическую карту можно.
Технология та же, что и в Х2. Сейчас разберусь с масштабными коэффициеньами и сделаю.
Настораживает только одно - похоже в ХТ есть лимит на размер
bod-файлов. Потому что при каком-то числе добавленных секторов
карта вообще перестает отображаться. Ладно, разберемся.
Может я и ошибаюсь.
|
|
|
Blueboar
|
|
Кстати, а нельзя сделать так: в последний адрес
подпрограммы, отвечающей за наполнение
секторов поставить команду 0031 (goto) куда-
нибудь в конец сегмента со скриптами, туда
данных можно, видимо добавлять сколько угодно,
так как тогда уже никакие скрипты не сдвинутся,
и работе мешать не будут.
|
|
|
|
|
|
Канал X-Tension/X-BTF: «Структура данных X-Tension» |
|
К списку каналов | Наверх страницы |
Цитата не в тему: С чего-то нужно начинать. Добрым ты уже был - это не помогает. (donald)
|
» Структура данных X-Tension | страница 6 |
|