ВНИМАНИЕ! Наша конференция посвящена космической тематике и компьютерным играм. Политические вопросы и происходящие в мире события в данный момент на нашем сайте не обсуждаются!
|
» X3TC Моддинг: obj-файлы и маленькие утилитки | страница 5 |
|
|
|
Канал X3: Terran Conflict »
Модовый и скриптовый отсек X3: Terran Conflict: «X3TC Моддинг: obj-файлы и маленькие утилитки» |
|
|
Dimmell
88 EGP
![Ветеран Elite-Games (10 лет)](/conference/images/ranks/medals/veteran10.png) Рейтинг канала: 4(95) Репутация: 10 Сообщения: 772 Откуда: Минск Зарегистрирован: 31.01.2010
![Вы не можете голосовать](images/tool_cool.gif) |
|
ULiX
держи оригинальный
x3story.7z |
Описание: |
|
Имя файла: |
x3story.7z |
Размер файла: |
584.74 KB |
Скачано: |
461 раз(а) |
|
|
|
vivere
230 EGP
![Бронзовая звезда (+25 EGP)](/conference/images/ranks/medals/bronze.gif) ![Ветеран Elite-Games (10 лет)](/conference/images/ranks/medals/veteran10.png) ![Разработчик аддона к X3: Terran Conflict (+50 EGP)](/conference/images/ranks/medals/x3tcaddon.png) Рейтинг канала: 4(57) Репутация: 56 Сообщения: 171
Зарегистрирован: 17.02.2011
![Вы не можете голосовать](images/tool_cool.gif) |
|
шифрование секции текста там элементарное до неприличия.
вот мои функции на C#
Код: |
static void DecryptSTRG(ref byte[] data)
{
for(uint a = (uint)data.LongLength-1;a>0;a--)
{
data[a] = (byte)(~data[a] - data[a - 1]);
}
data[0] = (byte)(~data[0]);
}
static void EncryptSTRG(ref byte[] data)
{
uint len = (uint)data.LongLength;
data[0] = (byte)(~data[0]);
for (uint a = 1; a < len; a++)
{
data[a] = (byte)(~(data[a] + data[a - 1]));
}
} |
|
|
|
CheckerTwo
550 EGP
![Золотая звезда (+100 EGP)](/conference/images/ranks/medals/gold.gif) ![Ветеран Elite-Games (15 лет)](/conference/images/ranks/medals/veteran15.png) ![Автор программы под X-Tension (+25 EGP)](/conference/images/ranks/medals/xt_prog.gif) ![Автор программы под Х2 (+25 EGP)](/conference/images/ranks/medals/x2_prog.gif) ![Автор программы под Х3: Reunion (+25 EGP)](/conference/images/ranks/medals/x3_prog.gif) Рейтинг канала: 6(486) Репутация: 103 Сообщения: 412 Откуда: Tomsk Зарегистрирован: 18.08.2004
![Вы не можете голосовать](images/tool_cool.gif) |
|
ULiX : |
Может поделишься вкратце, как находятся границы секций в obj файле и информацией по структуру секций. И о методе шифровки секций. Надеюсь шифровка производится не использованием XOR с фиксированным числом, как в dat файлах
|
Там все просто:
Код: |
Структура obj-файла
<stor> :=
STOR
ver : long; // версия движка
date : long; // дата сборки/компиляции
<code> // секция кода
<symb> // секция глобальных функций
<vars> // секция глобальных переменных
<clas> // секция классов
<ptch> // секция информации для патчей
<strg> // секция строковых констант
/STO
<code> := {
CODE
size : long; // размер секции в байтах
<commands> // скрипт-команды
}
<symb> := {
SYMB
size : long; // размер секции в байтах
cnt_prc : long; // число глобальных функций
for (i = 0; i < cnt_prc; i++) {
addr : long; // адрес функции
strg : long; // указатель на строку в STRG
stack : long; // размер стека для функции
npar : long; // число аргументов
};
}
<vars> := {
VARS
size : long; // размер секции в байтах
cnt_var : long; // число глобальных переменных
for (i = 0; i < cnt_var; i++) {
addr : long; // порядковый номер переменной
inival : long; // инициализирующее значение
typval : long; // тип переменной
strg : long; // указатель на имя переменной
};
}
<clas> := {
CLAS
size : long; // размер секции в байтах
cnt_cls : long; // число классов
for (i = 0; i < cnt_cls; i++) {
ident : long; // идентификатор класса
parent : long; // идентификатор родитель класса
strg : long; // ссылка на STRG
cnt_prc : long; // число процедур
for (j = 0; j < cnt_prc; j++) {
addr : long; // адрес функции
strg : long; // указатель на строку в STRG
stack : long; // размер стека для функции
npar : long; // число аргументов
};
cnt_var : long; // число переменных
for (j = 0; j < cnt_var; j++) {
addr : long; // порядковый номер переменной в текущем классе
inival : long; // инициализирующее значение
typval : long; // тип переменной
strg : long; // указатель на имя переменной
};
};
}
<ptch> := {
PTCH
size : long; // размер секции в байтах
cnt_sec : long; // число секций
for (i = 0; i < cnt_sec; i++) {
date : long; // дата компиляции секции
cnt : long; // число записей
for (j = 0; j < cnt; j++) {
addr1 : long; // ???
addr2 : long; // ???
};
};
}
<strg> := {
STRG
size : long; // размер секции в байтах
{
строка,\0
};
}
|
|
|
|
mistaqur
|
|
CheckerTwo
Несколько замечаний по поводу стёковой машины X3TC и структуры obj-файла:
В SP[0] и SP[1] расположены адрес возврата и указатель на объект, которые имеют собственный тип, с которым нельзя работать.
В структуре obj-файла X3TC уже нет поля имя переменной, на его месте поле, в котором хранится версия obj-файла, начиная с которой эта переменная появилась. Сделано, чтобы поддерживать сохранения, сделанные в более старых версиях. С этой же целью существует секция PTCH, в которой для каждой версии obj-файла указано, как изменились адреса возврата (наверное поэтому в коде есть участки, на которые управление никогда не передастся).
|
|
|
CheckerTwo
550 EGP
![Золотая звезда (+100 EGP)](/conference/images/ranks/medals/gold.gif) ![Ветеран Elite-Games (15 лет)](/conference/images/ranks/medals/veteran15.png) ![Автор программы под X-Tension (+25 EGP)](/conference/images/ranks/medals/xt_prog.gif) ![Автор программы под Х2 (+25 EGP)](/conference/images/ranks/medals/x2_prog.gif) ![Автор программы под Х3: Reunion (+25 EGP)](/conference/images/ranks/medals/x3_prog.gif) Рейтинг канала: 6(486) Репутация: 103 Сообщения: 412 Откуда: Tomsk Зарегистрирован: 18.08.2004
![Вы не можете голосовать](images/tool_cool.gif) |
|
mistaqur : |
В SP[0] и SP[1] расположены адрес возврата и указатель на объект, которые имеют собственный тип, с которым нельзя работать.
|
М-м-м. Откуда инфа?
А ведь похоже ты прав.
Манипуляция с этими двумя приводит к краху...
mistaqur : |
В структуре obj-файла X3TC уже нет поля имя переменной, на его месте поле,
|
Да я вроде везде говорил, что имена переменных убрали из обжей.
mistaqur : |
в котором хранится версия obj-файла, начиная с которой эта переменная появилась.
|
Ну не совсем версия - там дата компиляции модуля, хотя сути не меняет.
mistaqur : |
Сделано, чтобы поддерживать сохранения, сделанные в более старых версиях.
|
Зачем имена убрали - на самом деле фиг знает. Может быть и для поддержки патчей. А может - чтоб обжи не удобно изучать было.
mistaqur : |
С этой же целью существует секция PTCH, в которой для каждой версии obj-файла указано, как изменились адреса возврата
|
Ну и...продолжай.. ?
|
|
|
mistaqur
|
|
CheckerTwo : |
М-м-м. Откуда инфа?
|
Частично основана на анализе структуры сейв файла (а частично на основе того, как игра считывает файл сохранения и obj-файл) там есть секция TASK, в ней хранятся все задачи, которые обрабатываются стековой машиной игры. Каждая задача имеет свой стек, который можно прочесть.
Небольшая статистика одного сейва (до двоеточия идет описание адреса инструкции, которая будет выполнятся при возрате управления данной задаче, после двоеточия число задач с данным адресом возрата)
Код: |
{'<class "X3Story_ReturnIP" [Obj_0.InfiniteLoop+20](0000b735)>': 1,
'<class "X3Story_ReturnIP" [Obj_200.PlaySample+18](0000d974)>': 1,
'<class "X3Story_ReturnIP" [Obj_2001.DoGalaxyTake+384](00081a78)>': 1,
'<class "X3Story_ReturnIP" [Obj_2004.JumpToSector+1218](000b1d83)>': 7,
'<class "X3Story_ReturnIP" [Obj_2004.JumpToSector+1295](000b1dd0)>': 2,
'<class "X3Story_ReturnIP" [Obj_2004.__EnterHyperspace+687](000b0e45)>': 9,
'<class "X3Story_ReturnIP" [Obj_2004.__EnterHyperspace+798](000b0eb4)>': 1,
'<class "X3Story_ReturnIP" [Obj_2004.__EnterHyperspace+879](000b0f05)>': 1,
'<class "X3Story_ReturnIP" [Obj_2004.__EscortObject+1007](000ad19a)>': 98,
'<class "X3Story_ReturnIP" [Obj_2004.__EscortObject+734](000ad089)>': 41,
'<class "X3Story_ReturnIP" [Obj_2004.__Idle+208](000ac7e4)>': 3,
'<class "X3Story_ReturnIP" [Obj_2004.__Idle+263](000ac81b)>': 21,
'<class "X3Story_ReturnIP" [Obj_2004.__Idle+749](000aca01)>': 934,
'<class "X3Story_ReturnIP" [Obj_2004.__MovePos+339](000acb76)>': 1,
'<class "X3Story_ReturnIP" [Obj_2004.__galaxyFlightStep+487](000ab337)>': 3889,
'<class "X3Story_ReturnIP" [Obj_2004.__galaxyFlightStep+756](000ab444)>': 1262,
'<class "X3Story_ReturnIP" [Obj_2006.Production+1079](000961ca)>': 234,
'<class "X3Story_ReturnIP" [Obj_2006.Production+1635](000963f6)>': 735,
'<class "X3Story_ReturnIP" [Obj_2006.Production+913](00096124)>': 211,
'<class "X3Story_ReturnIP" [Obj_2006.Trade+887](00096f36)>': 1184,
'<class "X3Story_ReturnIP" [Obj_2007.Trade+430](00093dbc)>': 1,
'<class "X3Story_ReturnIP" [Obj_2007.Trade+984](00093fe6)>': 288,
'<class "X3Story_ReturnIP" [Obj_2011.___startDefendThread+89](000d251a)>': 54,
'<class "X3Story_ReturnIP" [Obj_2016.RunTraining+46](0008b61c)>': 2,
'<class "X3Story_ReturnIP" [Obj_2021.StartControlTask+68](000c8ee6)>': 124,
'<class "X3Story_ReturnIP" [Obj_2027.StartControlTask+68](000ca2d6)>': 120,
'<class "X3Story_ReturnIP" [Obj_2066.___startActiveThread+81](000d1174)>': 54,
'<class "X3Story_ReturnIP" [Obj_2067.Create2+216](000d2c8f)>': 9,
'<class "X3Story_ReturnIP" [Obj_301.Run+44](0014f2e3)>': 1,
'<class "X3Story_ReturnIP" [Obj_302.ControlJobShipTask+84](001553b9)>': 1,
'<class "X3Story_ReturnIP" [Obj_302.GodControlTask+58](00153fc7)>': 1,
'<class "X3Story_ReturnIP" [Obj_302.InspectSectorTask+52](00155bff)>': 1,
'<class "X3Story_ReturnIP" [Obj_302.RebuildControlTask+53](0015850a)>': 1,
'<class "X3Story_ReturnIP" [Obj_302.RebuildJobShipTask+51](00155773)>': 1,
'<class "X3Story_ReturnIP" [Obj_302.RebuildLogicTask+51](001571d2)>': 1,
'<class "X3Story_ReturnIP" [Obj_302.RemoveLocalShipTask+46](00155232)>': 1,
'<class "X3Story_ReturnIP" [Obj_302.RunCheckAlertsTask+174](001542f8)>': 1,
'<class "X3Story_ReturnIP" [Obj_302.RunRandomEventTask+63](001590cc)>': 1,
'<class "X3Story_ReturnIP" [Obj_303.Init+495](0007cd26)>': 1,
'<class "X3Story_ReturnIP" [Obj_304.Init+49](0007e05b)>': 1,
'<class "X3Story_ReturnIP" [Obj_305.Init+49](0007e4c5)>': 1,
'<class "X3Story_ReturnIP" [Obj_605.OverlayLoop+1967](000df6cf)>': 1,
'<class "X3Story_ReturnIP" [Obj_6103.StartConfictControl+56](00187c88)>': 2,
'<class "X3Story_ReturnIP" [Obj_702.__runScript+157204](0005c5e1)>': 75,
'<class "X3Story_ReturnIP" [Obj_702.__runScript+2679](00036a44)>': 761,
'<class "X3Story_ReturnIP" [Obj_702.__runScript+5897](000376d6)>': 583,
'<class "X3Story_ReturnIP" [TKHAAK.Logic+55](000d8803)>': 1,
'<class "X3Story_ReturnIP" [TPIRATES.Logic+213](000d4dde)>': 1,
'<class "X3Story_ReturnIP" [TPLAYER.Logic+53](000d663b)>': 1}
|
Рассмотрим стек на примере одной задачи:
Код: |
[1, 3600000, <class '_X3Save_INST' clsid:402>, <class "X3Story_ReturnIP" [TPLAYER.Create+269](000d5e0a)>, 0, <class '_X3Save_OBJE' clsid:300>, <class "X3Story_ReturnIP" (0)>, 1, 10]
|
Адрес возврата: <class "X3Story_ReturnIP" [TPLAYER.Logic+53](000d663b)>
Смотрим что в X3story.obj:
Код: |
;
; === Create ====================================================
; function TPLAYER.Create(arg1);
;
.........
000D5E03: 01 | 0 push 0
000D5E04: 2E | 1 get_object
000D5E05: 85 0000FBA4 | 2 call85 Logic ; 0000FBA4
000D5E0A: 24 | 1 pop
.........
;
; === Logic =====================================================
; function TPLAYER.Logic();
;
.........
000D6630: 07 0036EE80 | 0 pushd 3600000d ; 0036EE80h
000D6635: 02 | 1 push 1
000D6636: 82 00002561 | 2 callasm TI_Delay ; 00002561
000D663B: 24 | 1 pop
.........
|
Смотрим стек, смотрим последовательность вызовов, делаем вывод.
Для чтения сохранений игры был написан модуль для Python 3.2, который позволяет прочесть большинство данных, необходимых для того, чтобы полностью загрузить все объекты\массивы\таблицы\задачи в память. С его помощью я могу в моей программе загрузить любое сохранение, выполнить поиск необходимых объектов (станции с определенным кол-вом определенного товара, корабль определенного SubType\определенной расы, и т.д.). В идеале с его помощью можно написать хорошую утилиту для отладки модов, но я этим не занимался, т.к. до сих пор оригинал прохожу.
CheckerTwo : |
Ну и...продолжай.. ?
|
Продолжить не могу, т.к. подробно этим вопросом не занимался (я знаю как игра с этой информацией поступает, но на практике проверить не было возможности, т.к. у меня нет другой версии игры, а экспериментировать было лень).
P.S.:В obj-файле можно вместо храненения строк в кодированном виде в разделе "STRG" хранить их в обычном виде, но в разделе "STRU", причем порядок разделов может быть произвольным.
|
|
|
by.@ztek
315 EGP
![Серебряная звезда (+50 EGP)](/conference/images/ranks/medals/silver.gif) ![Ветеран Elite-Games (10 лет)](/conference/images/ranks/medals/veteran10.png) ![Разработчик аддона к X3: Terran Conflict (+50 EGP)](/conference/images/ranks/medals/x3tcaddon.png) ![Переводчик X Rebirth на русский язык (+25 EGP)](/conference/images/ranks/medals/xr_rus.png) Рейтинг канала: 5(218) Репутация: 50 Сообщения: 795 Откуда: Минск, Беларусь Зарегистрирован: 21.04.2010
![Вы не можете голосовать](images/tool_cool.gif) |
|
Архив с лицами всех актеров. Имя файла соответствует ИД актера. Просто БД.
faces.rar |
Описание: |
|
Имя файла: |
faces.rar |
Размер файла: |
538.66 KB |
Скачано: |
685 раз(а) |
_________________ Совершенству нет предела... |
|
|
Whiskas
137 EGP
![Бронзовая звезда (+25 EGP)](/conference/images/ranks/medals/bronze.gif) ![Ветеран Elite-Games (10 лет)](/conference/images/ranks/medals/veteran10.png) Рейтинг канала: 3(36) Репутация: 5 Сообщения: 139
Зарегистрирован: 28.04.2011
![Вы не можете голосовать](images/tool_cool.gif) |
|
Так, к x3ap дизасм подошел.
Парочка интересных, HasJumpableJumpbeacon, DrawMaximiseButton
Собственно, теперь вопрос, а если перепихнуть с x3ap на x3tc пару функций, заработают? Просто тут exe новый, факт что всякие с SA_ не прокатят, но остальные вот... Кто уже опыты проводил? Признавайтесь, и как найти фондовую биржу среди всего этого....
Блин, сидишь дэфки да симки разбираешь, все джампы сменились, аут в бьонде весь в красном, реально hellp...
mistaqur : |
{'<class "X3Story_ReturnIP" [Obj_0.InfiniteLoop+20](0000b735)>': 1,
'<class "X3Story_ReturnIP" [Obj_200.PlaySample+18](0000d974)>': 1,
|
А откуда декомпилятор сэйвов? Или че это вообще за лог такой?
______________________________________
зы
По exe, кстати. Никто хуков не делал? Типа плагинов, подхватывают значение с оффсета, в памяти правят. Для фрила дофига сделали(( Интересно, вот, например, как SA_SetDesiredSpeed поменять(скорость при стыковки, кажись)
Последний раз редактировалось: Whiskas (05:23 26-12-2011), всего редактировалось 5 раз(а) |
|
|
mistaqur
|
|
Whiskas T-Mech : |
А откуда декомпилятор сэйвов? Или че это вообще за лог такой?
|
Сам написал, в виде модуля для Python. Собственно тот лог просто строковое представление объектов, для наглядности. И слово декомпилятор неуместно, тогда уж парсер.
Надо будет где нибудь найти Albion Prelude, и посмотреть, как там формат сейва поменялся или нет, и добавились ли новые встроенные функции.
|
|
|
Whiskas
137 EGP
![Бронзовая звезда (+25 EGP)](/conference/images/ranks/medals/bronze.gif) ![Ветеран Elite-Games (10 лет)](/conference/images/ranks/medals/veteran10.png) Рейтинг канала: 3(36) Репутация: 5 Сообщения: 139
Зарегистрирован: 28.04.2011
![Вы не можете голосовать](images/tool_cool.gif) |
|
mistaqur : |
Сам написал, в виде модуля для Python. Собственно тот лог просто строковое представление объектов, для наглядности. И слово декомпилятор неуместно, тогда уж парсер.
|
А я уж надеялся редактор сэйвов будет
Короче, STRU не работает. Либо внутри обжа должна быть лишь одна подобная секция либо не знаю. Потому как, например, GetAmmoResupply ссылается на 0000A46B в STRG, и каким образом мне перенаправить, чтобы название бралось не из STRG, а из STRU? Банальное добавление STRU логически ничего не дает.
В том же примере, что я делал:
Цитата: |
0019D430 07 E6 00 00 .æ..
0019D440 07 E3 48 C4 72 D9 00 00 00 06 00 0C 95 95 00 00 .ãHÄrÙ......••..
0019D450 00 81 00 00 00 07 00 00 00 05 00 0C 96 0D 00 00 ...........–...
0019D460 F9 26 00 00 00 07 00 00 00 05 00 0C 96 3E 00 00 ù&..........–>..
0019D470 EE 64 00 00 00 08 00 00 00 02 00 0C 98 F6 00 00 îd..........˜ö..
0019D480 39 95 00 00 00 06 00 00 00 04 00 0C 99 B6 00 00 9•..........™¶..
0019D490 97 95 00 00 00 02 00 00 00 00 00 18 D2 FE 00 00 —•..........Òþ..
0019D4A0 A5 CE 00 00 00 02 00 00 00 00 00 00 00 00 00 00 ¥Î..............
0019D4B0 07 EA 00 00 07 F1 48 C4 72 D9 .ê...ñHÄrÙ
|
00A5CE = GetMaxMarines, но там ни слова о том, что нужно брать из STRG. Все автоматически.
vivere : |
шифрование секции текста там элементарное до неприличия.
вот мои функции на C#
Код: |
static void DecryptSTRG(ref byte[] data)
{
for(uint a = (uint)data.LongLength-1;a>0;a--)
{
data[a] = (byte)(~data[a] - data[a - 1]);
}
data[0] = (byte)(~data[0]);
}
static void EncryptSTRG(ref byte[] data)
{
uint len = (uint)data.LongLength;
data[0] = (byte)(~data[0]);
for (uint a = 1; a < len; a++)
{
data[a] = (byte)(~(data[a] + data[a - 1]));
}
} |
|
А как вручную дешифровать всю STRG? Хочу полностью перекинуть STRG на STRU,ну, или хотя бы попытаться. Впрочем, пока не разобрался с самой секцией...
____________________________________________
mistaqur : |
При чтение obj'а, происходит парсинг секций, если какая либо секция встречается второй раз, то содержимое предыдущей теряется. Секция STRU и STRG различаются только в том, что после чтения STRG происходит декодирование по указанному вами алгоритму, если встречаются обе секции, то последняя из прочитанных считается за секцию текстовых данных.
|
Кажется понял, нужно иметь полную STRU со всем, что было в STRG, только тогда все будет норм... А я ранее просто добавил stru и одну запись в неё))
mistaqur : |
Специально для таких целей существует ряд языков программирования, которые позволяют быстро написать и отладить программу (например на Python'е программа, открывающая x3story.obj, и конвертирующая STRG в STRU, получается очень маленькая, могу потом выложить).
|
Как раз кстати она пригодилась бы
Хотя я привык чисто в WinHEX-е, так сказать понимая природу манипуляций
Последний раз редактировалось: Whiskas (03:03 31-12-2011), всего редактировалось 2 раз(а) |
|
|
mistaqur
|
|
Whiskas T-Mech : |
Короче, STRU не работает. Либо внутри обжа должна быть лишь одна подобная секция либо не знаю. Потому как, например, GetAmmoResupply ссылается на 0000A46B в STRG, и каким образом мне перенаправить, чтобы название бралось не из STRG, а из STRU? Банальное добавление STRU логически ничего не дает.
|
При чтение obj'а, происходит парсинг секций, если какая либо секция встречается второй раз, то содержимое предыдущей теряется. Секция STRU и STRG различаются только в том, что после чтения STRG происходит декодирование по указанному вами алгоритму, если встречаются обе секции, то последняя из прочитанных считается за секцию текстовых данных.
Whiskas T-Mech : |
А я уж надеялся редактор сэйвов будет
|
Полноценный редактор сейвов невозможен (т.к. будет представлять собой игру, в которой остановлены все задачи). Альтернатива ему представляет программа со списоком из нескольких десятков тысяч экземпляров классов с редактором атрибутов. Причем в качестве значений атрибутов (а также значений массивов) могут выступать ссылки на экземпляр класса (порядка 10 000 в одном сейве), ссылки на массив (порядка 100 000 в одном сейве) и ссылки на ассоциативный массив (порядка 10 000 в одном сейве). К этому еще надо добавить тот факт, что для объектов в секторе с игроком создаются сущности для физического и графического движков игры, которые тоже надо редактировать (например если в сейве поменять атрибут корпус корабля, то при загрузке он сбросится, т.к. игра будет считывать значение корпуса из сущности физического движка игры, и потом записывать в атрибут, выявлено экспериментально при захвате Арана с 5% корпуса и десантниками со слабой техникой). Проще написать эмулятор виртуальной машины X3, и интерпретатор командной строки, который будет вызывать указанный метод класса (т.к. все атрибуты классов приватные).
Whiskas T-Mech : |
А как вручную дешифровать всю STRG? Хочу полностью перекинуть STRG на STRU,ну, или хотя бы попытаться. Впрочем, пока не разобрался с самой секцией...
|
Специально для таких целей существует ряд языков программирования, которые позволяют быстро написать и отладить программу (например на Python'е программа, открывающая x3story.obj, и конвертирующая STRG в STRU, получается очень маленькая, могу потом выложить).
|
|
|
vivere
230 EGP
![Бронзовая звезда (+25 EGP)](/conference/images/ranks/medals/bronze.gif) ![Ветеран Elite-Games (10 лет)](/conference/images/ranks/medals/veteran10.png) ![Разработчик аддона к X3: Terran Conflict (+50 EGP)](/conference/images/ranks/medals/x3tcaddon.png) Рейтинг канала: 4(57) Репутация: 56 Сообщения: 171
Зарегистрирован: 17.02.2011
![Вы не можете голосовать](images/tool_cool.gif) |
|
Whiskas T-Mech : |
А как вручную дешифровать всю STRG? Хочу полностью перекинуть STRG на STRU,ну, или хотя бы попытаться. Впрочем, пока не разобрался с самой секцией...
|
Тогда я не поняла, чего ты хочешь. Ведь именно расшифровку и выполняет моя функция. Вручную? Это в смысле "на бумажке"?
Двигаемся от конца блока к началу. Инвертируем последний байт и отнимаем от него предпоследний. Ту же операцию выполняем со всеми остальными.
|
|
|
Whiskas
137 EGP
![Бронзовая звезда (+25 EGP)](/conference/images/ranks/medals/bronze.gif) ![Ветеран Elite-Games (10 лет)](/conference/images/ranks/medals/veteran10.png) Рейтинг канала: 3(36) Репутация: 5 Сообщения: 139
Зарегистрирован: 28.04.2011
![Вы не можете голосовать](images/tool_cool.gif) |
|
vivere : |
Тогда я не поняла, чего ты хочешь. Ведь именно расшифровку и выполняет моя функция. Вручную? Это в смысле "на бумажке"?
Двигаемся от конца блока к началу. Инвертируем последний байт и отнимаем от него предпоследний. Ту же операцию выполняем со всеми остальными.
|
Все! Получилось!
Инверсия байта, это когда hex в bin переводишь и меняешь местами 1 и 0, кто бы мог подумать
Только у меня все наоборот, инвертируем все байты, переводим обратно в hex и складываем.
FF BD DA DE становится 1 42 25 3f 21
1+42=43=C
1+42+25=68=h
1+25+3F=65=e
1+3F+21=61=a
Улёт, спасибо!
_____________________________
Вот налево, перевел дальше получил что-то вроде CheatU"крякозябры".AddWare
Походу оригинальные зашифрованы несколько по-другому,мдауж, то ли CheckerTwo подправил названия при дешифровки(специально), то ли там все намного сложнее. А вот с расшифровкой ассемблированых асмом проблем не возникло. Хотя только T_Camera разобрал, сил нет больше))
Последний раз редактировалось: Whiskas (02:16 03-01-2012), всего редактировалось 3 раз(а) |
|
|
vivere
230 EGP
![Бронзовая звезда (+25 EGP)](/conference/images/ranks/medals/bronze.gif) ![Ветеран Elite-Games (10 лет)](/conference/images/ranks/medals/veteran10.png) ![Разработчик аддона к X3: Terran Conflict (+50 EGP)](/conference/images/ranks/medals/x3tcaddon.png) Рейтинг канала: 4(57) Репутация: 56 Сообщения: 171
Зарегистрирован: 17.02.2011
![Вы не можете голосовать](images/tool_cool.gif) |
|
Whiskas T-Mech : |
кто бы мог подумать
|
Век живи, век учись
Whiskas T-Mech : |
Все! Получилось!
...
Только у меня все наоборот, инвертируем все байты, переводим обратно в hex и складываем.
|
От перемены мест слогаемых...
Я вот всё думаю написать прогу для декомпиляции и рекомпиляции обжей в С++ код. Причем один к одному. Но всё как то на этапе планирования у меня глохнет. Кто нибудь знаком с алгоритмом выделения отдельных блоков данных из мешанины? например что то вроде A+B+D+C+E разбить на A+B+C и D+E. Упрощаю конечно, но идея в том, чтобы разобрать мешанину команд на отдельные блоки, которые могут частично накладываться друг на друга, и затем интерпретировать эти блоки в С++ команды.
|
|
|
mistaqur
|
|
vivere : |
Я вот всё думаю написать прогу для декомпиляции и рекомпиляции обжей в С++ код. Причем один к одному.
|
Если будут идеи, напиши, может смогу чем помочь. У получилось написать почти работающий декомпилятор (на python 3), но после мучений с трассировкой стека (например для того, чтобы восстановить условие в IF), я его так до конца и не довел, т.к. надо было придумывать синтаксис и семантику языка, на котором должен быть конечный результат.
|
|
|
Vilko
145 EGP
![Бронзовая звезда (+25 EGP)](/conference/images/ranks/medals/bronze.gif) ![Ветеран Elite-Games (15 лет)](/conference/images/ranks/medals/veteran15.png) Рейтинг канала: 3(27) Репутация: 62 Сообщения: 83 Откуда: StarWind world Зарегистрирован: 19.12.2006
![Вы не можете голосовать](images/tool_cool.gif) |
|
Я тоже давно бьюсь над декомпилятором (правда в связи с работой проект на полгода заглох, но сейчас возобновил работу).
декомпиляция сделана на базе открытого декомпилятора Java - JODE
Конечный язык - C/Java подобный (по сути - ближе к Java, поскольку и иксовая вирт-машина по духу близка к джаве).
Вот мои наработки на текущий момент:
http://vilko.ru/x3tc/x3tc_decomp.zip
есть проблемы с распознаванием цикцлов while, на больших циклах теряются связи с переменными и рушится логика. на небольших функциях работает неплохо.
Желающие - присоединяйтесь.
ЗЫ: Всех с новым годом!
Последний раз редактировалось: Vilko (11:49 10-01-2012), всего редактировалось 2 раз(а) |
|
|
Whiskas
137 EGP
![Бронзовая звезда (+25 EGP)](/conference/images/ranks/medals/bronze.gif) ![Ветеран Elite-Games (10 лет)](/conference/images/ranks/medals/veteran10.png) Рейтинг канала: 3(36) Репутация: 5 Сообщения: 139
Зарегистрирован: 28.04.2011
![Вы не можете голосовать](images/tool_cool.gif) |
|
Блин, тоже ща пойду свой декомпилятор мутить Так-с ща выберу язык, какие там есть... ага! Oxygene!
Не легче ли взять декомпиленный x3story.out и биться уже над ним? Ещё банальней, как тут упоминалось ранее, сделать транслятор asm<->%your language% Или тут массовые порывы творчества?
________
Я врубился как расшифровать строки, все-таки задом наперед читать надо, жестоко( Благо понял что 00 расшифрованный окончание строки,а не 2E.
Ха, на инженерном калькуляторе есть Xor, BD xor FF = 43. А я то думал че у меня все не то через бинарный конверт выходит, там нули если в начале, то кальк их не печатает и ручной инверт багнутый выходит
Последний раз редактировалось: Whiskas (15:18 11-01-2012), всего редактировалось 1 раз |
|
|
CheckerTwo
550 EGP
![Золотая звезда (+100 EGP)](/conference/images/ranks/medals/gold.gif) ![Ветеран Elite-Games (15 лет)](/conference/images/ranks/medals/veteran15.png) ![Автор программы под X-Tension (+25 EGP)](/conference/images/ranks/medals/xt_prog.gif) ![Автор программы под Х2 (+25 EGP)](/conference/images/ranks/medals/x2_prog.gif) ![Автор программы под Х3: Reunion (+25 EGP)](/conference/images/ranks/medals/x3_prog.gif) Рейтинг канала: 6(486) Репутация: 103 Сообщения: 412 Откуда: Tomsk Зарегистрирован: 18.08.2004
![Вы не можете голосовать](images/tool_cool.gif) |
|
vivere : |
Упрощаю конечно, но идея в том, чтобы разобрать мешанину команд на отдельные блоки, которые могут частично накладываться друг на друга, и затем интерпретировать эти блоки в С++ команды.
|
У Ахо с Ульманом был описан алгоритм разбивки потока команд на базовые блоки:
1. Определяем начало блока:
- первая инструкция является лидером блока
- команды, помеченные меткой, являются лидером блока
- команда, следующая за условным или безусловным переходом является лидером блока
2. Базовый блок состоит из лидера и последующих инструкций.
После такой разбивки получим блоки, которые можно пытаться интерпретировать.
mistaqur : |
У получилось написать почти работающий декомпилятор (на python 3), но после мучений с трассировкой стека (например для того, чтобы восстановить условие в IF), я его так до конца и не довел, т.к. надо было придумывать синтаксис и семантику языка, на котором должен быть конечный результат.
|
Компилятор для стековой машины работает просто - выражение, разобранное синтаксическим анализатором хранится фактически в виде дерева. При генерации кода узлы этого дерева обходятся и формируется команды в постфиксной форме (обратной польской). Для декомпилятора это же самое дерево нужно обойти, формируя инфикс - то как принято писать в языках программирования.
Выражение может присваиваться переменной или являться условием IF - фактически это одно и то же. Т.е. можно было бы предложить такой вариант работы декомпилятора - читая последовательно команды из базового блока, формировать дерево, содержащее операторы и операнды. В таком дереве все операнды (переменные, константы) будут листьями дерева, все операторы (сложение, вычитание и пр.) - всегда будут иметь детей. Потом такое дерево тупо обходится и формируется текст выражений.
Все неплохо расписано в "Языки программирования и трансляция". Не помню точно, автор кажется - Свердлов.
Самое сложное - это конечно анализ на циклы. Это я не думал..
Vilko : |
есть проблемы с распознаванием цикцлов while, на больших циклах теряются связи с переменными и рушится логика. на небольших функциях работает неплохо.
|
JODE. Я тож его когда-то смотрел. Но поковырять так и получилось. Со временем - беда...
Whiskas T-Mech : |
Блин, тоже ща пойду свой декомпилятор мутить. Так-с ща выберу язык, какие там есть... ага! Oxygene! Не легче ли взять декомпиленный x3story.out и биться уже над ним?
|
На самом деле Vilko верно заметил, что ХС и Ява очень похожи. Можно даже сказать, что ХС подмножество Java. И использование уже готовой заготовки для декомпилятора - вполне себе решение.
С декомпиленным x3story.out или obj-фалом - это уже дело десятое. Главное - сам принцип.
PS: С Новым годом!
|
|
|
Vilko
145 EGP
![Бронзовая звезда (+25 EGP)](/conference/images/ranks/medals/bronze.gif) ![Ветеран Elite-Games (15 лет)](/conference/images/ranks/medals/veteran15.png) Рейтинг канала: 3(27) Репутация: 62 Сообщения: 83 Откуда: StarWind world Зарегистрирован: 19.12.2006
![Вы не можете голосовать](images/tool_cool.gif) |
|
Ну вот, пока пытался с телефона пост отправить, CheckerTwo уже все за меня сказал
Добавлю только, что пробовал работать с .out файлом (даже для меня спец-версию делали с типами строк), но по результату понял что читать сразу обж быстрее и удобнее, чем текстовый файл парсить.
upd:
Видимо, давно надо было на форум выкинуть наработки. на 2й! день после того как вернулся к работе, нашел ошибку, с которой полгода бился и не мог запустить анализатор.
upd2:
Интересно, какой шизофреник написал компилятор, генерящий конструкции вида
Код: |
00003D2F: 64 | 7 if SP[0]=0 then push 1 else push 0
00003D30: 34 00003D49 | 7 if SP[0]=0 then jump L00003D49
|
При том что есть нормальные опкоды сравнения/перехода.
И как блин это все упрощать/оптимизировать в сишном виде прикажете?
Последний раз редактировалось: Vilko (23:44 13-01-2012), всего редактировалось 3 раз(а) |
|
|
CheckerTwo
550 EGP
![Золотая звезда (+100 EGP)](/conference/images/ranks/medals/gold.gif) ![Ветеран Elite-Games (15 лет)](/conference/images/ranks/medals/veteran15.png) ![Автор программы под X-Tension (+25 EGP)](/conference/images/ranks/medals/xt_prog.gif) ![Автор программы под Х2 (+25 EGP)](/conference/images/ranks/medals/x2_prog.gif) ![Автор программы под Х3: Reunion (+25 EGP)](/conference/images/ranks/medals/x3_prog.gif) Рейтинг канала: 6(486) Репутация: 103 Сообщения: 412 Откуда: Tomsk Зарегистрирован: 18.08.2004
![Вы не можете голосовать](images/tool_cool.gif) |
|
Vilko : |
Код: |
00003D2F: 64 | 7 if SP[0]=0 then push 1 else push 0
00003D30: 34 00003D49 | 7 if SP[0]=0 then jump L00003D49
|
При том что есть нормальные опкоды сравнения/перехода.
И как блин это все упрощать/оптимизировать в сишном виде прикажете?
|
Команда "if SP[0]=0 then push 1 else push 0" выполняет преобразование из какого-то типа в bool + дополнительно инверсия. Это похоже на что-то подобное, наверное:
Код: |
var1 = <какое-то выражение>;
if (!var1) {
<...>
};
|
добавлено спустя 12 минут:
Whiskas T-Mech : |
Блин, тоже ща пойду свой декомпилятор мутить Впереди, на лихом коне Так-с ща выберу язык, какие там есть... ага! Oxygene!
Не легче ли взять декомпиленный x3story.out и биться уже над ним? Ещё банальней, как тут упоминалось ранее, сделать транслятор asm<->%your language% Или тут массовые порывы творчества?
|
Кстати, может нам в модовом отсеке тоже конкурс организовать?
Кто, каким образом и с каким результатом напишет компилятор-декомпилятор? Результат конечно важен, но также важно участие. Ибо попробовать свои силы иногда тоже полезно для общего развития...
Последний раз редактировалось: CheckerTwo (14:25 14-01-2012), всего редактировалось 1 раз |
|
|
|
|
|
Канал X3: Terran Conflict ->
Модовый и скриптовый отсек X3: Terran Conflict: «X3TC Моддинг: obj-файлы и маленькие утилитки» |
|
К списку каналов | Наверх страницы |
Цитата не в тему: Стража Ксаара империи Паранид сообщает о массовом дезертирстве из Военно-Космического флота. Сбежали оба пилота. (mister X)
|
» X3TC Моддинг: obj-файлы и маленькие утилитки | страница 5 |
|