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

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

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

   Страница 5 из 12
На страницу: Пред.  1, 2, 3, 4, 5, 6 ... 10, 11, 12  След.    Перейти:   Все страницы
Поиск в этой теме:
Канал X3: Terran Conflict » Модовый и скриптовый отсек X3: Terran Conflict: «X3TC Моддинг: obj-файлы и маленькие утилитки»
Dimmell
 88 EGP


Рейтинг канала: 4(95)
Репутация: 10
Сообщения: 772
Откуда: Минск
Зарегистрирован: 31.01.2010
ULiX
держи оригинальный

x3story.7z
 Описание:
 Имя файла:  x3story.7z
 Размер файла:  584.74 KB
 Скачано:  461 раз(а)
    Добавлено: 16:16 23-09-2011   
vivere
 230 EGP


Рейтинг канала: 4(57)
Репутация: 56
Сообщения: 171

Зарегистрирован: 17.02.2011
шифрование секции текста там элементарное до неприличия.
вот мои функции на 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]));
            }
        }
    Добавлено: 00:59 24-09-2011   
CheckerTwo
 550 EGP


Рейтинг канала: 6(486)
Репутация: 103
Сообщения: 412
Откуда: Tomsk
Зарегистрирован: 18.08.2004
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
  };
}
         
    Добавлено: 13:32 29-09-2011   
mistaqur
 





CheckerTwo
Несколько замечаний по поводу стёковой машины X3TC и структуры obj-файла:

    В SP[0] и SP[1] расположены адрес возврата и указатель на объект, которые имеют собственный тип, с которым нельзя работать.

    В структуре obj-файла X3TC уже нет поля имя переменной, на его месте поле, в котором хранится версия obj-файла, начиная с которой эта переменная появилась. Сделано, чтобы поддерживать сохранения, сделанные в более старых версиях. С этой же целью существует секция PTCH, в которой для каждой версии obj-файла указано, как изменились адреса возврата (наверное поэтому в коде есть участки, на которые управление никогда не передастся).

    Добавлено: 17:08 06-10-2011   
CheckerTwo
 550 EGP


Рейтинг канала: 6(486)
Репутация: 103
Сообщения: 412
Откуда: Tomsk
Зарегистрирован: 18.08.2004
mistaqur :
В SP[0] и SP[1] расположены адрес возврата и указатель на объект, которые имеют собственный тип, с которым нельзя работать.

М-м-м. Откуда инфа?
А ведь похоже ты прав. Улыбка
Манипуляция с этими двумя приводит к краху...
mistaqur :
В структуре obj-файла X3TC уже нет поля имя переменной, на его месте поле,

Да я вроде везде говорил, что имена переменных убрали из обжей.
mistaqur :
в котором хранится версия obj-файла, начиная с которой эта переменная появилась.

Ну не совсем версия - там дата компиляции модуля, хотя сути не меняет.
mistaqur :
Сделано, чтобы поддерживать сохранения, сделанные в более старых версиях.

Зачем имена убрали - на самом деле фиг знает. Может быть и для поддержки патчей. А может - чтоб обжи не удобно изучать было.
mistaqur :
С этой же целью существует секция PTCH, в которой для каждой версии obj-файла указано, как изменились адреса возврата

Ну и...продолжай.. ? Улыбка
    Добавлено: 17:38 11-10-2011   
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", причем порядок разделов может быть произвольным.
    Добавлено: 02:53 12-10-2011   
by.@ztek
 315 EGP


Рейтинг канала: 5(218)
Репутация: 50
Сообщения: 795
Откуда: Минск, Беларусь
Зарегистрирован: 21.04.2010
Архив с лицами всех актеров. Имя файла соответствует ИД актера. Просто БД. Улыбка

faces.rar
 Описание:
 Имя файла:  faces.rar
 Размер файла:  538.66 KB
 Скачано:  685 раз(а)

_________________
Совершенству нет предела...
    Добавлено: 15:01 17-12-2011   
Whiskas
 137 EGP


Рейтинг канала: 3(36)
Репутация: 5
Сообщения: 139

Зарегистрирован: 28.04.2011
Так, к 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 раз(а)
    Добавлено: 05:04 26-12-2011   
mistaqur
 





Whiskas T-Mech :
А откуда декомпилятор сэйвов? Или че это вообще за лог такой?

Сам написал, в виде модуля для Python. Собственно тот лог просто строковое представление объектов, для наглядности. И слово декомпилятор неуместно, тогда уж парсер.

Надо будет где нибудь найти Albion Prelude, и посмотреть, как там формат сейва поменялся или нет, и добавились ли новые встроенные функции.
    Добавлено: 10:06 29-12-2011   
Whiskas
 137 EGP


Рейтинг канала: 3(36)
Репутация: 5
Сообщения: 139

Зарегистрирован: 28.04.2011
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 раз(а)
    Добавлено: 01:23 31-12-2011   
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, получается очень маленькая, могу потом выложить).
    Добавлено: 02:51 31-12-2011   
vivere
 230 EGP


Рейтинг канала: 4(57)
Репутация: 56
Сообщения: 171

Зарегистрирован: 17.02.2011
Whiskas T-Mech :
А как вручную дешифровать всю STRG? Хочу полностью перекинуть STRG на STRU,ну, или хотя бы попытаться. Впрочем, пока не разобрался с самой секцией...

Тогда я не поняла, чего ты хочешь. Ведь именно расшифровку и выполняет моя функция. Вручную? Это в смысле "на бумажке"?
Двигаемся от конца блока к началу. Инвертируем последний байт и отнимаем от него предпоследний. Ту же операцию выполняем со всеми остальными.
    Добавлено: 11:35 31-12-2011   
Whiskas
 137 EGP


Рейтинг канала: 3(36)
Репутация: 5
Сообщения: 139

Зарегистрирован: 28.04.2011
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 раз(а)
    Добавлено: 12:31 31-12-2011   
vivere
 230 EGP


Рейтинг канала: 4(57)
Репутация: 56
Сообщения: 171

Зарегистрирован: 17.02.2011
Whiskas T-Mech :
кто бы мог подумать

Век живи, век учись Улыбка
Whiskas T-Mech :
Все! Получилось!
...
Только у меня все наоборот, инвертируем все байты, переводим обратно в hex и складываем.

От перемены мест слогаемых... Улыбка

Я вот всё думаю написать прогу для декомпиляции и рекомпиляции обжей в С++ код. Причем один к одному. Но всё как то на этапе планирования у меня глохнет. Кто нибудь знаком с алгоритмом выделения отдельных блоков данных из мешанины? например что то вроде A+B+D+C+E разбить на A+B+C и D+E. Упрощаю конечно, но идея в том, чтобы разобрать мешанину команд на отдельные блоки, которые могут частично накладываться друг на друга, и затем интерпретировать эти блоки в С++ команды.
    Добавлено: 16:01 31-12-2011   
mistaqur
 





vivere :
Я вот всё думаю написать прогу для декомпиляции и рекомпиляции обжей в С++ код. Причем один к одному.

Если будут идеи, напиши, может смогу чем помочь. У получилось написать почти работающий декомпилятор (на python 3), но после мучений с трассировкой стека (например для того, чтобы восстановить условие в IF), я его так до конца и не довел, т.к. надо было придумывать синтаксис и семантику языка, на котором должен быть конечный результат.
    Добавлено: 18:42 31-12-2011   
Vilko
 145 EGP


Рейтинг канала: 3(27)
Репутация: 62
Сообщения: 83
Откуда: StarWind world
Зарегистрирован: 19.12.2006
Я тоже давно бьюсь над декомпилятором (правда в связи с работой проект на полгода заглох, но сейчас возобновил работу).
декомпиляция сделана на базе открытого декомпилятора Java - JODE
Конечный язык - C/Java подобный (по сути - ближе к Java, поскольку и иксовая вирт-машина по духу близка к джаве).
Вот мои наработки на текущий момент:
http://vilko.ru/x3tc/x3tc_decomp.zip
есть проблемы с распознаванием цикцлов while, на больших циклах теряются связи с переменными и рушится логика. на небольших функциях работает неплохо.
Желающие - присоединяйтесь.

ЗЫ: Всех с новым годом! Улыбка

Последний раз редактировалось: Vilko (11:49 10-01-2012), всего редактировалось 2 раз(а)
    Добавлено: 11:20 10-01-2012   
Whiskas
 137 EGP


Рейтинг канала: 3(36)
Репутация: 5
Сообщения: 139

Зарегистрирован: 28.04.2011
vivere :

mistaqur :

Vilko :

Блин, тоже ща пойду свой декомпилятор мутить Впереди, на лихом коне Так-с ща выберу язык, какие там есть... ага! Oxygene! Гы-гы

Не легче ли взять декомпиленный x3story.out и биться уже над ним? Ещё банальней, как тут упоминалось ранее, сделать транслятор asm<->%your language% Или тут массовые порывы творчества? Вау!

________

Я врубился как расшифровать строки, все-таки задом наперед читать надо, жестоко( Благо понял что 00 расшифрованный окончание строки,а не 2E.
Ха, на инженерном калькуляторе есть Xor, BD xor FF = 43. А я то думал че у меня все не то через бинарный конверт выходит, там нули если в начале, то кальк их не печатает и ручной инверт багнутый выходит Совсем запутался...


Последний раз редактировалось: Whiskas (15:18 11-01-2012), всего редактировалось 1 раз
    Добавлено: 15:18 11-01-2012   
CheckerTwo
 550 EGP


Рейтинг канала: 6(486)
Репутация: 103
Сообщения: 412
Откуда: Tomsk
Зарегистрирован: 18.08.2004
vivere :
Упрощаю конечно, но идея в том, чтобы разобрать мешанину команд на отдельные блоки, которые могут частично накладываться друг на друга, и затем интерпретировать эти блоки в С++ команды.

У Ахо с Ульманом был описан алгоритм разбивки потока команд на базовые блоки:
1. Определяем начало блока:
- первая инструкция является лидером блока
- команды, помеченные меткой, являются лидером блока
- команда, следующая за условным или безусловным переходом является лидером блока
2. Базовый блок состоит из лидера и последующих инструкций.
После такой разбивки получим блоки, которые можно пытаться интерпретировать.
mistaqur :
У получилось написать почти работающий декомпилятор (на python 3), но после мучений с трассировкой стека (например для того, чтобы восстановить условие в IF), я его так до конца и не довел, т.к. надо было придумывать синтаксис и семантику языка, на котором должен быть конечный результат.

Компилятор для стековой машины работает просто - выражение, разобранное синтаксическим анализатором хранится фактически в виде дерева. При генерации кода узлы этого дерева обходятся и формируется команды в постфиксной форме (обратной польской). Для декомпилятора это же самое дерево нужно обойти, формируя инфикс - то как принято писать в языках программирования.
Выражение может присваиваться переменной или являться условием IF - фактически это одно и то же. Т.е. можно было бы предложить такой вариант работы декомпилятора - читая последовательно команды из базового блока, формировать дерево, содержащее операторы и операнды. В таком дереве все операнды (переменные, константы) будут листьями дерева, все операторы (сложение, вычитание и пр.) - всегда будут иметь детей. Потом такое дерево тупо обходится и формируется текст выражений.
Все неплохо расписано в "Языки программирования и трансляция". Не помню точно, автор кажется - Свердлов.
Самое сложное - это конечно анализ на циклы. Это я не думал.. Улыбка
Vilko :

есть проблемы с распознаванием цикцлов while, на больших циклах теряются связи с переменными и рушится логика. на небольших функциях работает неплохо.

JODE. Я тож его когда-то смотрел. Но поковырять так и получилось. Со временем - беда...
Whiskas T-Mech :
Блин, тоже ща пойду свой декомпилятор мутить. Так-с ща выберу язык, какие там есть... ага! Oxygene! Не легче ли взять декомпиленный x3story.out и биться уже над ним?

На самом деле Vilko верно заметил, что ХС и Ява очень похожи. Можно даже сказать, что ХС подмножество Java. И использование уже готовой заготовки для декомпилятора - вполне себе решение.
С декомпиленным x3story.out или obj-фалом - это уже дело десятое. Главное - сам принцип.

PS: С Новым годом! Улыбка
    Добавлено: 17:43 11-01-2012   
Vilko
 145 EGP


Рейтинг канала: 3(27)
Репутация: 62
Сообщения: 83
Откуда: StarWind world
Зарегистрирован: 19.12.2006
Ну вот, пока пытался с телефона пост отправить, 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 раз(а)
    Добавлено: 18:58 11-01-2012   
CheckerTwo
 550 EGP


Рейтинг канала: 6(486)
Репутация: 103
Сообщения: 412
Откуда: Tomsk
Зарегистрирован: 18.08.2004
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 раз
    Добавлено: 14:25 14-01-2012   
Канал X3: Terran Conflict -> Модовый и скриптовый отсек X3: Terran Conflict: «X3TC Моддинг: obj-файлы и маленькие утилитки»
На страницу: Пред.  1, 2, 3, 4, 5, 6 ... 10, 11, 12  След.    Перейти:   Все страницы
  
Показать: 
Предыдущая тема | Следующая тема |
К списку каналов | Наверх страницы
Цитата не в тему: Стража Ксаара империи Паранид сообщает о массовом дезертирстве из Военно-Космического флота. Сбежали оба пилота. (mister X)

  » X3TC Моддинг: obj-файлы и маленькие утилитки | страница 5
Каналы: Новости | 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