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

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

Поиск | Правила конференции | Фотоальбом | Регистрация | Список пилотов | Профиль | Войти и проверить личные сообщения | Вход

   Страница 6 из 15
На страницу: Пред.  1, 2, 3 ... 5, 6, 7 ... 13, 14, 15  След.    Перейти:   Все страницы
Поиск в этой теме:
Канал X-Tension/X-BTF: «Структура данных X-Tension»
Blueboar
 





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

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


Рейтинг канала: 4(90)
Репутация: 103
Сообщения: 412
Откуда: Tomsk
Зарегистрирован: 18.08.2004
Цитата:
Ответ уже отправил.

Спасибо.

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

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

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

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

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





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

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

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

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


Рейтинг канала: 4(90)
Репутация: 103
Сообщения: 412
Откуда: Tomsk
Зарегистрирован: 18.08.2004
Цитата:
Загрузил файл под отладчиком и посмотрел
прямо в памяти после раскодирования.


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

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

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


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





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





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





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

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

00450700 – 11600C
00451270 – 116040

Вполне возможно, что это неизвестные пока группы D_, P_ или B3D.
    Добавлено: 20:40 28-11-2004   
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
    Добавлено: 09:17 29-11-2004   
Blueboar
 





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





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

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

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

И вообще, народ, вы где? На работе все, что ли?
    Добавлено: 13:26 29-11-2004   
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
    Добавлено: 22:27 29-11-2004   
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 с новым сектором
    Добавлено: 09:00 30-11-2004   
Blueboar
 





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

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

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


Рейтинг канала: 4(90)
Репутация: 103
Сообщения: 412
Откуда: Tomsk
Зарегистрирован: 18.08.2004
Shaddie:
Цитата:
Надо сразу сказать что, к сожалению, сектор на галактической карте не отображался


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





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

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

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


Рейтинг канала: 4(90)
Репутация: 103
Сообщения: 412
Откуда: Tomsk
Зарегистрирован: 18.08.2004
2Blueboar:
Цитата:
Только остается вопрос


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

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





Кстати, а нельзя сделать так: в последний адрес
подпрограммы, отвечающей за наполнение
секторов поставить команду 0031 (goto) куда-
нибудь в конец сегмента со скриптами, туда
данных можно, видимо добавлять сколько угодно,
так как тогда уже никакие скрипты не сдвинутся,
и работе мешать не будут.
    Добавлено: 17:52 30-11-2004   
Канал X-Tension/X-BTF: «Структура данных X-Tension»
На страницу: Пред.  1, 2, 3 ... 5, 6, 7 ... 13, 14, 15  След.    Перейти:   Все страницы
  
Показать: 
Предыдущая тема | Следующая тема |
К списку каналов | Наверх страницы
Цитата не в тему: С чего-то нужно начинать. Добрым ты уже был - это не помогает. (donald)

  » Структура данных X-Tension | страница 6
Каналы: Новости | 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