Elite Games - Свобода среди звезд!
.
ВНИМАНИЕ!
Наша конференция посвящена космической тематике и компьютерным играм.
Политические вопросы и происходящие в мире события в данный момент на нашем сайте не обсуждаются!

  » Структура данных X-Tension |
Конференция предназначена для общения пилотов. Для удобства она разделена на каналы, каждый из которых посвящен определенной игре. Пожалуйста, открывайте темы только в соответствующих каналах и после того, как убедитесь, что данный вопрос не обсуждался ранее.

Search | Conference rules | Album | Register | Pilots list | Profile | Log in to check your private messages | Log in

   Page 6 of 15
Go to page: Previous  1, 2, 3 ... 5, 6, 7 ... 13, 14, 15  Next    Перейти:   All pages
Поиск в этой теме:
Канал X-Tension/X-BTF: «Структура данных X-Tension»
Blueboar
 





Всем, кто пишет письма я отвечаю.
В ящике было одно письмо. Ответ уже отправил.

Кстати, никто не знает, почему я не
могу завести свой "аккаунт"? Все время
получаю сообщение, что пароль сильно простой,
хотя уж и символов 10 и буквы и цифры...
    Posted: 17:59 28-11-2004   
CheckerTwo
 550 EGP


Рейтинг канала: 4(90)
: 103
Posts: 412
Location: Tomsk
Joined: 18 Aug 2004
Quote:
Ответ уже отправил.

Спасибо.

Quote:
Они действительно начинаются
с SE_ (правда не все, еще встречается
gs_Debug, SFX_ и другие). А вы откуда знаете?
Что, в X2 тоже такие же?

Они такие еще с XBTF. Улыбка Но доковырять времени не хватило...

Этот раскодированный файл вы как получили?

Quote:
Кстати, никто не знает, почему я не
могу завести свой "аккаунт"?

Пароль должен содержать буквы И цифры. Улыбка
    Posted: 18:27 28-11-2004   
Blueboar
 





Загрузил файл под отладчиком и посмотрел
прямо в памяти после раскодирования.

Больше всего интересует две вещи

1) Как декодировать
2) Где храняться адреса перехода для
этих подпрограмм (по идее раз подпрограммы
в XTension.EXE, то и смещения должны быть
там же. Так вроде и есть, но до конца еще
не разобрался. Чувствую себя как на пороге
еще не сделанного открытия ...)

Я так понимаю, что если информация важная,
ее можно постить в форум в любых количествах?
    Posted: 18:58 28-11-2004   
CheckerTwo
 550 EGP


Рейтинг канала: 4(90)
: 103
Posts: 412
Location: Tomsk
Joined: 18 Aug 2004
Quote:
Загрузил файл под отладчиком и посмотрел
прямо в памяти после раскодирования.


1. А в памяти все что до STRG - так и есть в неизменном виде?
Странно. Что-то я видимо не так делал...

2. Первой строкой после STRG идет SetVolumeMaster, а в exe эта метка встречается с префиксом SFX_.
Такое ощущение, что после расшифровки и настройки адресов эти
данные на каком-то этапе подзатерлись. Может такое быть?
Впрочем, это может быть имя локальной функции, а не системной.
Потому как есть некоторые имена, не встречаемые в EXE.
А может и просто строки сообщения (отладочного)...

Quote:
Я так понимаю, что если информация важная,
ее можно постить в форум в любых количествах?


В общем случае это зависит от того, как модератор посмотрит на это дело. Подмигиваю
Как правило для полезной и нужной информации это почти так.
    Posted: 19:26 28-11-2004   
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?
Четвертый – Теперь, собственно, можно декодировать каждую программу ассемблера по отдельности. Если кто захочет, запостю соответствие номера и названия для каждой подпрограммы.
    Posted: 20:06 28-11-2004   
Blueboar
 





To CheckerTwo: Это две совершенно разные подпрограммы!
SetVolumeMaster без SFX_ это видимо подпрограмма скрипта
(кстати, может и из файла .PCH (так вроде?)), а
SFX_SetVolumeMaster - стадартная из X-TENSION.EXE.
И в файле OBJ она тоже есть, но несколько ниже.
    Posted: 20:10 28-11-2004   
Blueboar
 





Теперь уже собственно, первые результаты декодирования подпрограмм (оперативно, правда? Я сам не ожидал, честно говоря…).
Для подпрограмм MOV_ по смещению 115DB0 в файле X-TENSION.EXE хранится смещение для каждой подпрограммы. Например, первая запись 00401034 (уже перевернутая). В файле это 00001034. Первое имя для MOV_ - MOV_LOADMOVIE (смотри предыдущий пост). Вот вы уже и имеете адрес подпрограммы. Теперь требуются специалисты для их разбора, видимо.
Для подпрограмм SFX_ - по смещению 1185A0
Для подпрограмм SE_ - по смещению 1186A0
    Posted: 20:22 28-11-2004   
Blueboar
 





Точно! Эти адреса ж близко друг с другом находятся. А если посмотреть, что между ними находится. Может найдем входы и для других начал имен?
И точно, нашли. Пишу по порядку (к сожалению, не известно, какая группа какому названию соответствует, но точно какому-то соответствует)

1) Адрес обработчика данной группы
2) Адрес таблицы с адресами подпрограмм

00450700 – 11600C
00451270 – 116040

Вполне возможно, что это неизвестные пока группы D_, P_ или B3D.
    Posted: 20:40 28-11-2004   
DF
 300 EGP


Рейтинг канала: 5(118)
: 47
Posts: 478

Joined: 06 Sep 2003
Quote:
Первый – если адреса жестко записаны в X- TENSION.EXE, то означает ли это, что новые подпрограммы невозможны без его патча? Но ведь разработчики придумывают новые квесты? Или они это делают, не прибегая к ассемблерным подпрограммам?

А зачем им еще что-то дописывать?, Нормальный язык програмирования должен позволять реализовать все что хочешь без использования средств других языков.
Quote:
Второй – где DF, который первый начал всем этим заниматься, и который вполне мог бы мне помочь.

Да тут я, никуда не делся, просто у меня мало времени чтобы заниматься всем этим.
Quote:
А может среди пилотов есть еще ассемблерщики?

Это вряд ли, нас только двое Расстроен
Quote:
Как уже наконец декодировать эту область 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
    Posted: 09:17 29-11-2004   
Blueboar
 





Да, видимо DF прав, ассемблерщиков тут мало.
Вот вам алгоритм дешифровки STRG. Разобрался через полчаса после того, как пришла гениальная мысля – найти в файле EXE строку 'STRG’, а затем участок программы, который к ней обращается. Гениальное просто (Спасибо DF за наводки).
Итак, алгоритм:
1. Алгоритм идет ОТ КОНЦА К НАЧАЛУ!
2. Берется следующий байт, который нужно расшифровать (сначала последний, потом предпоследний, и т.п.)
3. В нем инвертируются все биты (например из 08 станет F7)
4. Из него вычитается предыдущий байт (который будет распаковываться следующим). Обратите внимание, вычитается байт, который мы еще не распаковали!
5. Все, полученное значение записывается на место зашифрованного
6. Все повторяется с пункта 2
7. Для числа в самом начале, которое не имеет предыдущего операция 4 не производится (но операцию 3 сделать нужно)
    Posted: 10:12 29-11-2004   
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 байт. Осталось узнать, что они означают…
    Posted: 11:23 29-11-2004   
Blueboar
 





Как справедливо заметил DF, при входе
в обработчик скрипта под отладчиком

[EBP-3C] - указатель на стек
[EBP-08] - указатель на данные

Нужно позарез узнать, что означает [EBP-20]!
Очень надо! Если узнаю, напишу все остальные
команды скриптов.

И вообще, народ, вы где? На работе все, что ли?
    Posted: 13:26 29-11-2004   
DF
 300 EGP


Рейтинг канала: 5(118)
: 47
Posts: 478

Joined: 06 Sep 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
    Posted: 22:27 29-11-2004   
Shaddie
 556 EGP


Рейтинг канала: 6(438)
: 118
Posts: 261
Location: Томск
Joined: 09 Sep 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.
Quote:
Последним значением в стеке является количество параметров. Записывает их куда-то, взамен выдает на стеке идентификатор, позволяющий их адресовать.

А в блоке данных секторов как раз и есть данные для 90 секторов Прыгаю от радости.

Ту же решил проверить возможность добавления нового сектора.
Создал новый сектор (южнее Шахт Императора), добавил данные по текстуре, одному солнцу и одной планете. Для сектора указал, что количество параметров равно 7. Указал, что секторов 91. Получилось новых данных на 80 байт. Выровнял размер блока данных по секторам: удалил 80 байт данных из других секторов. Выгрузил данные в файл 001.obj. Запустил X-tension. Подлетел к южным воротам в секторе Шахты Императора и с замиранием сердца Хы..., вдавил в пол Tab. И о чудо, я оказался в новом секторе. Солнце и планета присутствовали. Вот так вот Аж в пляс тянет....

Надо сразу сказать что, к сожалению, сектор на галактической карте не отображался (но это старая песня, может CheckerTwo что подскажет Подозрение.). А так же когда я попытался вставлять новые данные без выравнивания общего размера данных по секторам, новая игра вообще запускаться отказалась. Похоже, изменение размера данных смещает адреса точек входа в последующие подпрограммы.

001.obj с новым сектором
    Posted: 09:00 30-11-2004   
Blueboar
 





DF: Насчет подпрограммы расшифровки области STRG
А я разве не то же самое написал двумя постами выше
(правда словами, а не программой). Интересно,
почему именно от конца к началу, а не наоборот?

Спасибо за новые команды, пойду проверять

Shaddie: Ну что ж, я рад, осталось только выяснить
от чего зависит показывать сектор или нет.
    Posted: 16:12 30-11-2004   
CheckerTwo
 550 EGP


Рейтинг канала: 4(90)
: 103
Posts: 412
Location: Tomsk
Joined: 18 Aug 2004
Shaddie:
Quote:
Надо сразу сказать что, к сожалению, сектор на галактической карте не отображался


Блин, работой завалили, делом некогда занятся...
Щас еще раз перепроверю с твоим obj и отправлю тебе файлик
почтой... Либо резюме, если не получится... Улыбка)
    Posted: 16:26 30-11-2004   
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.
Про третий параметр сказать пока ничего не могу.
    Posted: 17:13 30-11-2004   
Blueboar
 





Дошло!
Первые 4 байта - адрес подпрограммы
Вторые 4 байта - смещение в 'STRG'-область с названием
подпрограммы
Третьи 4 байта - неизвестно, но возможно - необходимое
число ячеек со стеком или условия вызова подпрограммы

То есть в области 'STRG' описываются НЕ ИМЕНА ПОДПРОГРАММ
АССЕМБЛЕРА, а вообще все имена подпрограмм (а может
быть не только подпрограмм) - и ассемблерных, и скриптовых.
То есть просмотрев область 'SYMB' можно определить
адреса начала и имена всех подпрограмм, и заранее немножко
по названию узнать, что делает подпрограмма.

Только остается вопрос - теперь понятно, что команда
0059 переходит по адресу в скрипте, и кроме того, указывается
ее смещение в 'STRG', ну, то есть, имя. ЗАЧЕМ?
Если указать имя, то иожно по SYMB найти ее адрес. А если
указать адрес, то зачем знать ее имя?
    Posted: 17:28 30-11-2004   
CheckerTwo
 550 EGP


Рейтинг канала: 4(90)
: 103
Posts: 412
Location: Tomsk
Joined: 18 Aug 2004
2Blueboar:
Quote:
Только остается вопрос


Может для отладки скриптов? Чтобы работал символьный отладчик...

2Shaddie:
По поводу карты - добавить новые сектора на галактическую карту можно.
Технология та же, что и в Х2. Сейчас разберусь с масштабными коэффициеньами и сделаю.
Настораживает только одно - похоже в ХТ есть лимит на размер
bod-файлов. Потому что при каком-то числе добавленных секторов
карта вообще перестает отображаться. Ладно, разберемся.
Может я и ошибаюсь.
Улыбка
    Posted: 17:40 30-11-2004   
Blueboar
 





Кстати, а нельзя сделать так: в последний адрес
подпрограммы, отвечающей за наполнение
секторов поставить команду 0031 (goto) куда-
нибудь в конец сегмента со скриптами, туда
данных можно, видимо добавлять сколько угодно,
так как тогда уже никакие скрипты не сдвинутся,
и работе мешать не будут.
    Posted: 17:52 30-11-2004   
Канал X-Tension/X-BTF: «Структура данных X-Tension»
Go to page: Previous  1, 2, 3 ... 5, 6, 7 ... 13, 14, 15  Next    Перейти:   All pages
  
Display posts from previous: 
View previous topic | View next topic |
К списку каналов | Наверх страницы
Цитата не в тему: Это ОЧЕНЬ неочевидно. Настолько неочевидно, что я прям не берусь это описать. (SunnyGale)

  » Структура данных X-Tension |
Каналы: Новости | Elite | Elite: Dangerous | Freelancer | Star Citizen | X-Tension/X-BTF | X2: The Threat | X3: Reunion | X3: Terran Conflict | X Rebirth | X4: Foundations | EVE Online | Orbiter | Kerbal Space Program | Evochron | VoidExpanse | Космические Миры | Онлайновые игры | Другие игры | Цифровая дистрибуция | play.elite-games.ru | ЗВ 2: Гражданская война | Творчество | Железо | Игра Мечты | Сайт
   Дизайн Elite Games V5 beta.18