ВНИМАНИЕ! Наша конференция посвящена космической тематике и компьютерным играм. Политические вопросы и происходящие в мире события в данный момент на нашем сайте не обсуждаются!
|
» X2-ASM - это проcто! | страница 11 |
|
|
|
Канал X2: The Threat: «X2-ASM - это проcто!» |
|
|
CheckerTwo
550 EGP
     Рейтинг канала: 4(96) Репутация: 103 Сообщения: 412 Откуда: Tomsk Зарегистрирован: 18.08.2004
 |
|
Hvala Mne : |
3 уровень у любого, кто зарегестрируется на форуме ES. Если ты зарегистрируешься, будет 3-й уровень у тебя.
|
Да я как-то пытался, правда давно это было. Что-то ни ответа, ни привета от них не дождался. Может настойчивости не хватило
Hvala Mne : |
Кстати ES немцы, а не американцы, так что твой корреспондент не знает об ES ничего.
|
Я в курсе. Это девелопер, который написал этот "warning", был амереканцем. Вроде как от официальной позиции ES. Но это все ерунда, конечно, я согласен.
Hvala Mne : |
Что утечек не было, я знаю.
|
Ну, это хорошо, это понятно. А вот ES-то почему такими вопросами озадачилась - на счет утечек? Или так, на всякий случай? Как я понял, это было главное, на что настаивал Лехан в разговоре... А все остальное - как бы "ну если что-то у вас там и получится - так и ладно, мы посмотрим ну и может быть воспользуемся.., а может и нет.."
А что Лехан еще-то говорил. Колись. Интересно же. Может уже Х4 делают...
PS: Хвала, скажи по-секрету, у тебя там какой левел?
|
|
|
Hvala Mne
882 EGP
        Рейтинг канала: 1(3) Репутация: 184 Сообщения: 1380 Откуда: где-то меж звезд Зарегистрирован: 08.02.2001
 |
|
CheckerTwo : |
Hvala Mne : |
3 уровень у любого, кто зарегестрируется на форуме ES. Если ты зарегистрируешься, будет 3-й уровень у тебя.
|
Да я как-то пытался, правда давно это было. Что-то ни ответа, ни привета от них не дождался. Может настойчивости не хватило
|
Какой в смысле настойчивости? Заполняешь форму, получаешь e-mail с паролем. На 3 уровне, вроде, была документация по КС и база с квестами.
CheckerTwo : |
Hvala Mne : |
Что утечек не было, я знаю.
|
Ну, это хорошо, это понятно. А вот ES-то почему такими вопросами озадачилась - на счет утечек? Или так, на всякий случай? Как я понял, это было главное, на что настаивал Лехан в разговоре... А все остальное - как бы "ну если что-то у вас там и получится - так и ладно, мы посмотрим ну и может быть воспользуемся.., а может и нет.."
А что Лехан еще-то говорил. Колись. Интересно же. Может уже Х4 делают...
PS: Хвала, скажи по-секрету, у тебя там какой левел?
|
У меня 5-й. Был 6-й. Сбавили из-за "утечек". Может, это именно для меня и был намек.
_________________ скромный подданный Королевства Боронов |
|
|
SD
270 EGP
  Рейтинг канала: 2(21) Репутация: 30 Сообщения: 2544
Зарегистрирован: 05.03.2006
 |
|
Пятый уровень, говоришь... Ну хорошо, давай проверим степень их открытости для зарегистрированных разработчиков. Найди, пожалуйста (я не говорю - "опубликуй") на их сайте такие веши как:
спецификации на функции SE_FreeText(), X2Save(4 параметра);
подробное описание работы команды START {};
список кодов клавиатуры, передаваемыx в методы T*.Input()
|
|
|
CheckerTwo
550 EGP
     Рейтинг канала: 4(96) Репутация: 103 Сообщения: 412 Откуда: Tomsk Зарегистрирован: 18.08.2004
 |
|
AlexYar : |
Какие нужны настройки и последовательность действий, чтобы "провернуть" туда и обратно?
|
Чуть выше по теме я предлагал один способ, позволяющий получить асм, который можно будет править. Посмотри.
|
|
|
CheckerTwo
550 EGP
     Рейтинг канала: 4(96) Репутация: 103 Сообщения: 412 Откуда: Tomsk Зарегистрирован: 18.08.2004
 |
|
AlexYar : |
Darth Revan : |
Все exe-функции можно посмотрете в самом exe в X2 и X3 патчей 2.0.x (защиту сняли).
|
Во, об этом и речь! Как и чем (какой нужен софт, где его взять) можно это посмотреть в файле x3.exe? (не в блокноте же ).
Может у кого есть готовый список всех ехе-функций из экзешника версии 2.0.02?
|
Есть 2 варианта: первый - действительно в блокноте Потому как имена этих функций присутствуют в EXE в текстовом виде. Второй вариант - это файл (сгенеренный dobj.exe) с расширением .def. В самом начале этого файла выводится список функций, используемых в obj-скрипте.
Цитата: |
Осталось два вопроса:
1. Где взять список ехе-функций? Или расскажите, чем расковырять экзешник (а еще лучше - выложить где-нить расковырянную версию, так как там кроме ехе-функций есть еще очень много интересного).
|
Информация по функциям (что делают, что возвращают, какие параметры и какого типа) фактически отсутствует. Для некоторых, часто используемых в obj-скриптах, можно догадаться из контекста.
Цитата: |
2. Повторная декомпиляция патченых обжей невозможна? Имеется в виду - для трансляции в хс и повторной компиляции.
|
Возможна. В большинстве случаев - без проблем.
Цитата: |
Как dobj, так и xa2c, матюкаются и отказываются работать с ними.
dobj выдаёт такие ошибки:
Error : "Warn : xjump : npar =1 <> epar 19"
Error : "Warn : xjump : npar =163 <> epar 1368"
Error : "The stack has incorrect value on instruction at address = 001186E6; stack =18."
|
Первые 2 ошибки - это dobj не смог правильно расчитать размер таблицы переходов по коду, который стоит перед командой xjump. Поиск размера этой таблицы заточен на код компилятора КС by Egosoft, с его косяками в кодогенераторе. Если писать код ручками, то в некоторых случаях dobj ругается, хотя сам код рабочий. Увы.
Третья ошибка - это уже смотреть надо. Выдается трассировщиком кода. Т.е. dobj пытается прогнать код функции на упрощенной виртуальной машине и исполняет каждую команду, проверяя состояние стека. При достижении команды ret выполняется проверка указателя стека. Если в стеке остаются какие-то данные или наоборот, вытолкнуто из стека слишком много - dobj ругается. В реале это приведет, скорее всего, к вылету игрухи...
Цитата: |
а ха2с не может обнаружить новые функции, которые были добавлены патчем, говорит "фатал еррор, код функций не сгенерирован".
|
М-м-м.. Тут начальник нужен!
|
|
|
AlexYar
1916 EGP
               Рейтинг канала: 6(445) Репутация: 325 Сообщения: 32758
Зарегистрирован: 26.10.2003
 |
|
CheckerTwo : |
Возможна. В большинстве случаев - без проблем.
|
А по факту - как раз проблемы Пробовал на почти всех патчах от Шадди и Дарт Ревана - всегда добж сыплет ошибки.
Если нужно - пиши адрес в личку - пришлю последний патчик для х3 для тестов.
CheckerTwo : |
Третья ошибка - это уже смотреть надо.
|
Я посмотрел, только не понял ничего
Сравнивал с оригинальным обжем той же версии - такое ощущение, что при асемблировании патча метки выставились от балды, а не там где должны были быть, в результате получились непредсказуемые последствия.
Кусок патченного обжа после работы dobj:
Цитата: |
001186AE: 002B 0053 | 1 write TMENU_WEAPONS.mew_Turret ; [83d ; 53h]
001186B2: 002C | 1 pop
001186B4: 0009 | 0 push 0
001186B6: 002B 0054 | 1 write TMENU_WEAPONS.mew_Slot ; [84d ; 54h]
001186BA: 002C | 1 pop
001186BC: 0001 FFFE | 0 push -2d ; 0FFFEh
001186C0: 002B 0055 | 1 write TMENU_WEAPONS.mew_CurSel ; [85d ; 55h]
001186C4: 002C | 1 pop
001186C6: 0009 | 0 push 0
001186C8: 003C | 1 get_object
001186CA: 0057 0000AC5A | 2 call TMENU_WEAPONS.GetLaserArray ; 0000AC5A
001186D0: 002B 0052 | 19 L001186D0: write TMENU_WEAPONS.mew_LaserList ; [82d ; 52h]
001186D4: 002C | 19 pop
001186D6: 0009 | 18 push 0
001186D8: 0001 08A2 | 19 push 2210d ; 08A2h
001186DC: 0057 0000A2F6 | 20 call TMENU_ID.SpecialMenu ; 0000A2F6
001186E2: 002C | 19 pop
001186E4: 0009 | 18 push 0
001186E6: 0035 | 19 ret
;Error: function at addr = 001186E6 has corrupted stack (18).
|
А вот это в оригинальном обже:
Цитата: |
001186AE: 002B 0053 | 1 write TMENU_WEAPONS.mew_Turret ; [83d ; 53h]
001186B2: 002C | 1 pop
001186B4: 0009 | 0 push 0
001186B6: 002B 0054 | 1 write TMENU_WEAPONS.mew_Slot ; [84d ; 54h]
001186BA: 002C | 1 pop
001186BC: 0001 FFFE | 0 push -2d ; 0FFFEh
001186C0: 002B 0055 | 1 write TMENU_WEAPONS.mew_CurSel ; [85d ; 55h]
001186C4: 002C | 1 pop
001186C6: 0009 | 0 push 0
001186C8: 003C | 1 get_object
001186CA: 0057 0000AC5A | 2 call TMENU_WEAPONS.GetLaserArray ; 0000AC5A
001186D0: 002B 0052 | 1 write TMENU_WEAPONS.mew_LaserList ; [82d ; 52h]
001186D4: 002C | 1 pop
001186D6: 0009 | 0 push 0
001186D8: 0001 08A2 | 1 push 2210d ; 08A2h
001186DC: 0057 0000A2F6 | 2 call TMENU_ID.SpecialMenu ; 0000A2F6
001186E2: 002C | 1 pop
001186E4: 0009 | 0 push 0
001186E6: 0035 | 1 ret
|
Здесь метки нету и результаты другие.
CheckerTwo : |
М-м-м.. Тут начальник нужен!
|
И тебе занятие найдётся
Последний раз редактировалось: AlexYar (17:34 27-05-2007), всего редактировалось 1 раз |
|
|
AlexYar
1916 EGP
               Рейтинг канала: 6(445) Репутация: 325 Сообщения: 32758
Зарегистрирован: 26.10.2003
 |
|
Касаемо этой ошибки дальше копнул. Вот листинг данных кусков (оригинал и патченый) на хс.
Оригинал:
function TMENU_WEAPONS.SpecialMenu()
{
TMENU.me_Title=SE_ReadText(35,831);
TMENU.me_TopLineInfo=0;
TMENU.me_PageLinesInfo=3;
TMENU.me_TopLineSelect=4;
TMENU.me_PageLinesSelect=(TMENU.me_VirtualTexHeight-49)/TMENU.me_YSpacing-4;
TMENU_WEAPONS.mew_Turret=0;
TMENU_WEAPONS.mew_Slot=0;
TMENU_WEAPONS.mew_CurSel=-2;
TMENU_WEAPONS.mew_LaserList=this->GetLaserArray();
2210->SpecialMenu();
return(0);
}
А вот после патча значение xa2c определить не смог, на что ругнулся:
"Error: function TMENU_WEAPONS.SpecialMenu(): Cound'n find value in stack for argument. Substituted by '?^."
И выдал такое:
function TMENU_WEAPONS.SpecialMenu()
{
TMENU.me_Title=SE_ReadText(35,831);
TMENU.me_TopLineInfo=0;
TMENU.me_PageLinesInfo=3;
TMENU.me_TopLineSelect=4;
TMENU.me_PageLinesSelect=(TMENU.me_VirtualTexHeight-49)/TMENU.me_YSpacing-4;
TMENU_WEAPONS.mew_Turret=0;
TMENU_WEAPONS.mew_Slot=0;
TMENU_WEAPONS.mew_CurSel=-2;
{
var loc19=this->GetLaserArray();
}
TMENU_WEAPONS.mew_LaserList=???;
2210->SpecialMenu();
return(0);
}
В чём может быть причина? Откуда "фантом" (синий) появился?
|
|
|
AlexYar
1916 EGP
               Рейтинг канала: 6(445) Репутация: 325 Сообщения: 32758
Зарегистрирован: 26.10.2003
 |
|
Цитата: |
case 339:
CM0438_00: (arg1:22, arg2:23, loc1:18, loc2:17, loc6:13, loc7:12, loc16:3, loc17:2, loc18:1, loc19:0)
{
бла-бла-бла...
break;
}
case 340:
|
А чем чревато такое написание на xc? Есть какие-нибудь возможные негативные последствия, или это вполне нормальное написание?
(транслятор не ругается, асемблер тоже, игра не вылетает, команда работает).
Кто-нить может перевести на "русский", что означает (как читается) вторая строка (CM0428_00:...) ? В теме по транслятору описано крайне туманно, чтобы можно было что-то понять
Вопрос2: Как сделать патч так, чтобы можно было переопределять имеющиеся в обже функции? Метод, описанный Реваном, нерабочий (ассемблер валится с ошибкой). (еще бы он не валился, если удаляются объявления и код функций, на которые ссылаются другие функции в обже...).
Вопрос3: Что будет, если поверх перекомпилированного обжа накатить патч, внутри которого изменённая копия функции, уже имеющейся в игре?
Т.е. если я буду функцию править не в обжем обже, а только в патче, а потом накатывать на обж. Что будет происходить, куда будет писаться новая версия функции, а если её размер больше, чем был у стандартной функции?
Или патч просто допишется в конец обжа и изменится точка входа на новую версию функции?
ХС не ругается, ХА_ASM - тоже не ругается, но как я уже понял - это не залог того, что всё ок
|
|
|
AlexYar
1916 EGP
               Рейтинг канала: 6(445) Репутация: 325 Сообщения: 32758
Зарегистрирован: 26.10.2003
 |
|
CheckerTwo : |
AlexYar : |
2. Повторная декомпиляция патченых обжей невозможна? Имеется в виду - для трансляции в хс и повторной компиляции.
|
Возможна. В большинстве случаев - без проблем.
|
Зато повторная декомпиляция перекомпелированных обжей - невозможна вообще
CheckerTwo : |
это dobj не смог правильно расчитать размер таблицы переходов по коду, который стоит перед командой xjump. Поиск размера этой таблицы заточен на код компилятора КС by Egosoft, с его косяками в кодогенераторе. Если писать код ручками, то в некоторых случаях dobj ругается, хотя сам код рабочий.
|
Пока по нему опять не пройтись добжем...
Тогда валится гора ошибок, а дизасемблированный файл оказывается битым (нерабочим). И соот-но xa2c.exe тоже говорит, что переходы кривые и что половину функций сгенерировать не удалось
Причем что странно - вся "нерабочесть" переходов касается исключительно функций классов TObj* и TQuest*, и больше никаких!
Что наводит на мысль, что косяк где-то на "нашей" стороне
зыж А может это типа "защиты" от Егософта, чтобы в код ежей не подглядывали?
|
|
|
AlexYar
1916 EGP
               Рейтинг канала: 6(445) Репутация: 325 Сообщения: 32758
Зарегистрирован: 26.10.2003
 |
|
AlexYar : |
Причем что странно - вся "нерабочесть" переходов касается исключительно функций классов TObj* и TQuest*, и больше никаких!
|
Уточняю - нерабочесть касается абсолютно всех функций, в которых есть конструкции switch-case. Все эти функции просто убиваются, и xa2c их не генерит.
|
|
|
CheckerTwo
550 EGP
     Рейтинг канала: 4(96) Репутация: 103 Сообщения: 412 Откуда: Tomsk Зарегистрирован: 18.08.2004
 |
|
AlexYar : |
CheckerTwo : |
В текущий момент есть только одно соображение: большинство патчей заточено на определенные адреса в коде. После работы дизассемблера/ассемблера адреса могут измениться. Это связано с тем, что ассемблер может вставлять более короткие команды вместо длинных, например для push sp[0]. После этого, если патч завязан на адреса и в нем есть конструкции вида
$ = const
.. cod ...
то возможны переналожения и вообще не предсказуемый результат.
|
Дык сделал бы отключение этой фишки в ассемблере, чтобы стандартно "по егософтски" код генерил
|
Сделать сие сейчас весьма затруднительно. Код, генерируемый КС формируется из "заготовок". В некоторых случаях вставляется один вид команды push sp[0], в других другой, вперемежку. Команды функционально эквиволентны, но имеют разную длину. После длительных дебатов решили, что пусть дизассемблер обзывает их одной командой - push. Ассемблер вставляет короткий вариант, для оптимизации, или длинный, для отладки и тестирования - если в ini-файле стоит OptPush = false. А вот так, что бы как у Egosofta - надо переделывать dobj/xasm и переобзывать варианты этих команд.
AlexYar : |
В добже настройка "XJUMP = On" не работает.
|
Почему не работает? Если Off - генерится switch/case jump, если On - xjump @sp + таблица переходов. В ассемблере, кажется, убрал команду switch из-за невозможности нормально написать даже простенький патчик, кроме того, эта конструкция в патчах Shaddie приводила к фатальной ошибке - парсеру внутреннего стека не хватало.
AlexYar : |
А шаги простые -
1. накатываю патч Шадди на оригинальный обж.
2. Декомпилю обж добжем (ошибки х-джампа и косяк со стеком, но его причина может быть в патче).
3. xa2c - транслирует в хс не полностью.
|
Угу. Так и должно быть. Проблема проста оригинальные obj-файлы содержат кучу ошибок, которые не позволяют просто так перетранслировать их. Как следствие, дизассемблированный оригинальный файл с трудом понимает транслятор. Патч Shaddie предназначен для оригинального obj-а и жестко завязан на адреса функций/переходов. Он не устраняет косяки Egosoft-а. Как следствие после дизассемблирования число косяков никак не должно изменится, потому как Shaddie вроде как на несколько раз все проверял...
Но! Косяки будут..
AlexYar : |
Путь второй (с перекомпиляцией).
1. Беру оригинальный обж.
2. Добжу.
3. Транслирую xa2c x3story addx3.txt (заглушка ставится автоматом).
4. Транслирую обратно xc x3story.cpp
5. Асмлю xa_asm x3story.inc
6. Всё ок, ошибок нет, х3 не вылетает вроде (новую игру начинал).
|
Что за заглушка? Что там? Она исправляет косяки EgoSoft-а? Честно скажу, я этот патчик не смотрел - машинка слабенькая и Х3 идет - как будто диафильмы просматриваешь...
AlexYar : |
7. Добжу перекомпиленный обж (140 с лишним килобайт ошибок, все с работой х-джампа).
8. Пытаюсь транслировать xa2c - куча ошибок, половина функций не сгенерирована. В основном это TQUEST{цифра}(TObj{цифра}) - функции или наоборот TObj{цифра}(TQUEST{цифра}) - функции, других в ошибках xa2c не видел (плохо, что он в лог ошибки не сбрасывает, а на экране хрен чего найдёшь конекретного).
|
dobj хоть и ругается на xjump, когда встречает непонятный ему код, все же редко ошибается. Алгоритм там такой: когда встретилась команда xjump, просматривается код, который стоит перед этой командой. Делаются примерные выводы о размере таблицы переходов. Для Х2 и Х3 размеры этих таблиц отличаются (в большинстве случаев) в 2 раза. Это старый косяк КС, исправленный в Х3. После этого таблица переходов тщательно проверяется, что бы все переходы указывали на рабочий код. Вот если "вычесленный" размер таблицы не соответствует размеру оттрассированной таблице, вот тогда dobj выводит это предупреждение. В общем случае на него можно не обращать внимания. Это касается сообщений вроде "Warn : xjump : npar =1 <> epar 18". Это все проходит только в случае, если дизассемблировать стандартные файлы. Для патчей Shaddie и Darth Revan-а есть своя особенность Из-за отличия файлов Х2 и Х3, по коду, предшествующему xjump, невозможно 100% прогнозировать размер таблицы переходов. Поэтому дополнительно просматриваются все команды jump, окружающие эту таблицу. Не очень оптимальный вариант решения, но в голову ничего умного не пришло... Так вот для ручных патчей это все плохо срабатывает, или вообще не работает. Можешь назвать это как хочешь - вплоть до "защиты кода", хотя это просто косяк дизассемблера. Короче, если после таблицы переходов поместить код, на который нет явных ссылок, то этот код воспримется как часть таблицы переходов. Например, в патче Darth Revana Х3 версии 1.4.02/03 после таблицы находится отладочный кусок CM04a1_createMenu, который и приводит к этому безобразию... Можно поправить вот так:
Код: |
case_jump CM04a1_GetStatCounter ;151
.if (0) ; условие не выполняется - код пропускается
CM04a1_createMenu:
push 1 ; 1
push 1 ; 1
......... вырезано .............
pop
jump CM04a1_retNull
.endif
|
Далее, если просмотреть сообщения об ошибках, то там могут встречаться что-то вида "Error : The stack has incorrect value on instruction (phase error) at address = 0008BE34; stack (12 <> 19)." А вот такие сообщения игнорировать не стоит. Дело в следующем. Трассировщик дизассемблера проверяет все ветки и переходы, просчитывая текущий стек при выполнении команд. Если несколько веток алгоритма, наконец, сходятся, значение стека должно быть одинаково, иначе выдается вот такое сообщение об ошибке.
AlexYar : |
1. В патче Шадди и Ревана есть хс-код для команд скриптредактора такого вида:
CM0428_00: (arg1:22, arg2:23, loc1:18, loc2:17, loc6:13, loc7:12, loc16:3, loc17:2, loc18:1, loc19:0)
{
var loc20=loc16[1];
|
Ммм. Это не хорошо, такого быть не должно. Транслятор почему-то пытается оформить заголовок процедуры, но по коду там таковой нет. Есть переход на метку CM0428_00 из таблицы xjump. Т.е. транслятор не смог корректно разобрать код. Ошибка может быть и в дизассемблерном файле и в самом трансляторе. Числа после двоеточия - это положение в стеке. Естественно, что транслироваться обратно в асм не будет или, если странслируется, будут чудовищные глюки... Возможно не соответствуют версии xNstory.obj и патча. Или косяк описанный выше...
AlexYar : |
2. Экзешник я всё-таки расковырял (блокнот рулит ), даже не подозревал, что там так много интерсного есть. Но все-ли перечисленные там команды работают?
|
Скорее всего работать-то должны все, вот параметры подобрать для них - вот проблема...
AlexYar : |
3. Как игра определяет папку с сейвами? Как я понял - это всё в экзешнике зашито, но обойти всё равно можно, написав новую обж-функцию и изменив стандартные doSaveGame и doLoadGame
|
Да, но doSaveGame() использует X2_Save(), которая собственно и записывает save-файл... Т.е. это нужно сам exe править...
Последний раз редактировалось: CheckerTwo (18:42 04-07-2007), всего редактировалось 1 раз |
|
|
CheckerTwo
550 EGP
     Рейтинг канала: 4(96) Репутация: 103 Сообщения: 412 Откуда: Tomsk Зарегистрирован: 18.08.2004
 |
|
AlexYar : |
Сравнивал с оригинальным обжем той же версии - такое ощущение, что при асемблировании патча метки выставились от балды, а не там где должны были быть, в результате получились непредсказуемые последствия.
Кусок патченного обжа после работы dobj:
Код: |
001186AE: | 1 write TMENU_WEAPONS.mew_Turret ; [83d ; 53h]
001186B2: | 1 pop
001186B4: | 0 push 0
001186B6: | 1 write TMENU_WEAPONS.mew_Slot ; [84d ; 54h]
001186BA: | 1 pop
001186BC: | 0 push -2d ; 0FFFEh
001186C0: | 1 write TMENU_WEAPONS.mew_CurSel ; [85d ; 55h]
001186C4: | 1 pop
001186C6: | 0 push 0
001186C8: | 1 get_object
001186CA: | 2 call TMENU_WEAPONS.GetLaserArray ; 0000AC5A
;
; !переход внутрь процедуры из неправильного jump-а!
001186D0: | 19 L001186D0: write TMENU_WEAPONS.mew_LaserList ; [82d ; 52h]
001186D4: | 19 pop
001186D6: | 18 push 0
001186D8: | 19 push 2210d ; 08A2h
001186DC: | 20 call TMENU_ID.SpecialMenu ; 0000A2F6
001186E2: | 19 pop
001186E4: | 18 push 0
001186E6: | 19 ret
;Error: function at addr = 001186E6 has corrupted stack (18).
|
|
Мда. Вот это у же проблема.
1. Дизассемблер не плюнулся на ошибку стека в 001186D0. Недоработка...
2. Вообще отловить такого рода ошибки черезвычайно сложно. Если, к примеру, в патче указан неверный jump и переход выполняется в середину чужой процедуры - глюков будет море. Ладно вот здесь - дизассемблер плюнулся на большой стек при выходе из процедуры. Посмотрел - и видно эту ошибку, а вот если стеки 2х веток алгоритма примерно равны, найти этот косяк будет почти невозможно...
Может dobj-у какую-то диагностику выдавать, если выполняется jump в середину чужой процедуры?
Последний раз редактировалось: CheckerTwo (07:55 05-07-2007), всего редактировалось 1 раз |
|
|
AlexYar
1916 EGP
               Рейтинг канала: 6(445) Репутация: 325 Сообщения: 32758
Зарегистрирован: 26.10.2003
 |
|
CheckerTwo : |
1. Дизассемблер не плюнулся на ошибку стека в 001186D0. Недоработка...
|
Это наверное Шадди немного промахнулся с адресом в патче.
Патч я полностью переделал, теперь для х3 он на перекомпилированном обже. Сам патч работает 100%, однако dobj при декомпиляции выдаёт ошибок 134 килобайт и такое:
Error : "Warn : xjump : npar =4 <> epar 30"
Error : "Warn : xjump : npar =4 <> epar 20"
Error : "Warn : xjump : npar =4 <> epar 19; case = 0"
Error : "Warn : xjump : npar =19 <> epar 4; case = 1"
Error : "Warn : xjump : npar =4 <> epar 20"
Error : "Warn : xjump : npar =4 <> epar 19; case = 0"
Error : "Warn : xjump : npar =19 <> epar 4; case = 1"
Error : "Warn : xjump : npar =5 <> epar 30"
Error : "Warn : xjump : npar =5 <> epar 17; case = 0"
Error : "Warn : xjump : npar =17 <> epar 5; case = 1"
Error : "Warn : xjump : npar =11 <> epar 30"
Error : "Warn : xjump : npar =6 <> epar 41"
Error : "Warn : xjump : npar =6 <> epar 26; case = 0"
Error : "Warn : xjump : npar =26 <> epar 6; case = 1"
Error : "Warn : xjump : npar =38 <> epar 45"
там по всему err-файлу.
Попробуй декомпилировать сам патч:
http://alexyar.fromru.com/files/x3patch_2002_to_2002ext_b4.7z
Кстати, глянь ещё в теме транслятора, что я там по переходам написал (Реван писал, что переходы swith/case работают не как в C++, а на самом деле они работают именно так).
Если в конфиге транслятора поставить swith autobreaks, то выходной асм-файл будет полностью убит, так как испортятся все переходы. Если же не ставить - всё ок, всё работает, но добж при декомпиляции генерит код неправильно.
Другими словами - ошибки декомпиляции именно из-за того, что алгоритмы генерации кода у xa_asm и dobj - разные, поэтому dobj и не понимает, что сгенерировал xa_asm
Если подвести их друг под друга проблематично, то и нафиг не нужно тогда, пусть как защита будет
|
|
|
CheckerTwo
550 EGP
     Рейтинг канала: 4(96) Репутация: 103 Сообщения: 412 Откуда: Tomsk Зарегистрирован: 18.08.2004
 |
|
AlexYar : |
Патч я полностью переделал, теперь для х3 он на перекомпилированном обже. Сам патч работает 100%, однако dobj при декомпиляции выдаёт ошибок 134 килобайт и такое:
Error : "Warn : xjump : npar =4 <> epar 30"
..........
там по всему err-файлу.
|
Не, выдает всего 799 строчек. И это не ошибки, а предупреждения.
AlexYar : |
Попробуй декомпилировать сам патч: x3patch_2002_to_2002ext_b4.7z
|
Дизассемблировал, asm-файл нормально компилируется с заглушкам.
Сейчас еще потестирую, выложу немного подправленный dobj. Немного подправил вывод в файл ошибок, определение функция/процедура, обнаружение ошибок на стеке, как в описанном выше примере..
AlexYar : |
Кстати, глянь ещё в теме транслятора, что я там по переходам написал
|
Угу...
---------
EDIT
dobj версия 03.27
на народе зеркало тоже обновил..
Последний раз редактировалось: CheckerTwo (17:26 05-07-2007), всего редактировалось 1 раз |
|
|
CheckerTwo
550 EGP
     Рейтинг канала: 4(96) Репутация: 103 Сообщения: 412 Откуда: Tomsk Зарегистрирован: 18.08.2004
 |
|
AlexYar : |
Если в конфиге транслятора поставить swith autobreaks, то выходной асм-файл будет полностью убит, так как испортятся все переходы. Если же не ставить - всё ок, всё работает, но добж при декомпиляции генерит код неправильно.
|
Чет не вьеду.
Какая связь между switсh autobreaks у транслятора и дизассемблером dobj?
В смысле "генерит код неправильно"?
AlexYar : |
Другими словами - ошибки декомпиляции именно из-за того, что алгоритмы генерации кода у xa_asm и dobj - разные, поэтому dobj и не понимает, что сгенерировал xa_asm
|
Не могёт такого быть. Процесс dobj -> xasm -> dobj ... ничего практически не меняет. На первых этапах только, когда из кода убирается неиспользуемый код. После 2й итерации все стабилизируется. Друг друга вполне понимают...
AlexYar : |
Если подвести их друг под друга проблематично, то и нафиг не нужно тогда, пусть как защита будет
|
Ну-ка, для меня, для тормоза, еще раз и по-подробнее. Почему и как косяки возникают в связке dobj-xasm...
|
|
|
AlexYar
1916 EGP
               Рейтинг канала: 6(445) Репутация: 325 Сообщения: 32758
Зарегистрирован: 26.10.2003
 |
|
CheckerTwo : |
Не, выдает всего 799 строчек. И это не ошибки, а предупреждения.
|
А я читаю, как написано, Error - значит ошибка
Можно тогда в лог писать типа "Warning" или "Attention".
CheckerTwo : |
Дизассемблировал, asm-файл нормально компилируется с заглушкам.
|
А транслятором после дизасма?
CheckerTwo : |
Какая связь между switсh autobreaks у транслятора и дизассемблером dobj?
|
Я пишу на хс, асм для меня пока тёмный лес. Поэтому если связка xc->asm->obj->asm->xc не работает, значит с моей позиции всё не работает А что виновато, асемблер или транслятор - мне определить проблематично. Поэтому и спрашиваю.
CheckerTwo : |
Процесс dobj -> xasm -> dobj ... ничего практически не меняет.
|
Меняет то, что транслятор "asm->xc" вторичный обж уже не понимает. А первичный - без проблем
|
|
|
Chem
780 EGP
          Репутация: 248 Сообщения: 4751 Откуда: Киев Зарегистрирован: 08.01.2007
 |
|
кстати, вопрос.
Дизассемблю оригинальный x3story.obj.
настройки-
dobj.ini : |
[System]
ErrExt = ".err"
OutFmt = DEC ;HEX
Tracer = On
RenameClass = On
OutExtern = On
OutDASM = ".out", On ; вывод файла дизассемблера
OutDEF = ".def", On ; вывод описания объектов
OutSYMB = ".sym", On ; вывод секции SYMB
OutVARS = ".var", On ; вывод секции VARS
OutPTCH = ".pct", On ; вывод секции PTCH
OutSTRG = ".str", On ; вывод секции STRG
OutLABS = ".lab", On ; Метки
OutASM = ".asm", On ; файл ассемблера (без hex-кодов)
OutMOD = "output\", "T", ".txt", Off
OutSplit = On, On
RemarkNoUse = On
RemarkIfConst = Off
XJUMP = On
ForcePush = On
|
есть такие ошибки (202)-
x3story.err : |
Error: Overflow stack at command addr = 00005670; stack = 1 limit = 0
....
Error: Overflow stack at command addr = 0024DCBC; stack = 1 limit = 0
|
_________________ Умножим энтропию на 0 :-)
Последний раз редактировалось: Chem (00:18 13-07-2007), всего редактировалось 1 раз |
|
|
CheckerTwo
550 EGP
     Рейтинг канала: 4(96) Репутация: 103 Сообщения: 412 Откуда: Tomsk Зарегистрирован: 18.08.2004
 |
|
Chem : |
кстати, вопрос.
Дизассемблю оригинальный x3story.obj.
........................
есть такие ошибки (202)-
x3story.err : |
Error: Overflow stack at command addr = 00005670; stack = 1 limit = 0
....
Error: Overflow stack at command addr = 0024DCBC; stack = 1 limit = 0
|
|
Это нормально. Вероятнее всего в КС объявление было такое, или нечто похожее:
Код: |
void TPATCH::Patch13(void)
{
}
|
Что транслировалось вот в такой код:
Код: |
| TPATCH.Patch13:
0000566C: 0055 0000 | 0 setmem 0
00005670: 0009 | 0 push 0
;Error: stack overflow condition at command addr = 00005670; stack = 1 limit = 0
00005672: 0035 | 1 ret
|
При этом в процедуре не резервируется место под локальные стековые переменные - setmem 0, а потом вгоняется в стек 0 (push 0). В результате dobj выводит сообщение об ошибке. Несмотря на то, что виртуальная машина в Х это дело молча проглатывает, все же считаю это косяком.
|
|
|
Chem
780 EGP
          Репутация: 248 Сообщения: 4751 Откуда: Киев Зарегистрирован: 08.01.2007
 |
|
CheckerTwo : |
Это нормально. Вероятнее всего в КС объявление было такое, или нечто похожее:
Код: |
void TPATCH::Patch13(void)
{
}
|
Что транслировалось вот в такой код:
Код: |
| TPATCH.Patch13:
0000566C: 0055 0000 | 0 setmem 0
00005670: 0009 | 0 push 0
;Error: stack overflow condition at command addr = 00005670; stack = 1 limit = 0
00005672: 0035 | 1 ret
|
При этом в процедуре не резервируется место под локальные стековые переменные - setmem 0, а потом вгоняется в стек 0 (push 0). В результате dobj выводит сообщение об ошибке. Несмотря на то, что виртуальная машина в Х это дело молча проглатывает, все же считаю это косяком.
|
А может его тогда менять на правильный код , например сделать параметр, как поступать с таким кодом?
_________________ Умножим энтропию на 0 :-) |
|
|
Darth Revan
345 EGP
    Рейтинг канала: 5(153) Репутация: 42 Сообщения: 349 Откуда: Belarus Prime Зарегистрирован: 01.02.2006
 |
|
Декомпилятор xa2c предназначен исключительно для детрансляции кода, сгенерированного Egosoft KC. Т.е. я сначала поизучал дизассмеблинг обжей, сгенерированных KC, разобрался, как он транслирует C-инструкции, а затем, пользуясь этой инфой, восстанавливал код. XC транслирует инстукции по другому (особенно switch), соответственно, xa2c уже не сможет работать с кодом, траслированным XC. То же самое относиться к патчам оригинального обжа. Вставка переходов в код и прочее не распознаётся и вызывает ошибки разной степени тяжести. Оно и понятно. Патч может не иметь сишног эквивалента. Тем более XC-эквивалента. XC ведь - это не полноценный компилятор и не компилятор вообще, а просто транслятор текста. Ни а каком контроле типов речь не идёт. Даже имена фукций не проверяются.
Поделка с минимумом функциональности и контролем ошибок не более чем достаточным лоя того, чтобы не ошибиться в букве имени переменной, выражениях и т.п. Т.е. писать нужно аккуратно. Точно также нет в XC, например, такой вещи, как безусловный переход (хотя я не уверен, что оный в KC есть). Т.е. просто jumpы с ассемблера не конвертируюся в XC, особенно на пол обжа длиной.
AlexYar : |
1. В патче Шадди и Ревана есть хс-код для команд скриптредактора такого вида:
CM0428_00: (arg1:22, arg2:23, loc1:18, loc2:17, loc6:13, loc7:12, loc16:3, loc17:2, loc18:1, loc19:0)
{
var loc20=loc16[1];
|
Это не заголовок процедуры. Это метка, а в скобках - адреса в стеке для переменных. Удобно как раз там, где нет процедуры, а нужно заменить на использовать XC код. Т.е. там огромная процедура (на солидную часть обжа), а патч у обж у меня уже правленый на асме был, так что я меняд на XC его кусками. И вот чтобы кусочек (а именно, обработчик соответствующей скрипт-команды) переписать, я его удаляю в асме обжа, и добавляю из декомпилированного xa2c кода оригинального обжа. И вот тут требуется указывать, где в стеке ледат переменные, что собственно, в скобках и перечисляется.
CheckerTwo : |
Может dobj-у какую-то диагностику выдавать, если выполняется jump в середину чужой процедуры?
|
На самом деле, переход в середину чужой процедуры - полезная штука. Если хочется пропатчить кусок метода класса, то патчик должен быть тоже в методе этого класса, чтобы xasm распознавал имена свойств класса, к которым в патче обращаемся. До какой-то версии асмы патч работал в произвольном месте, а затем пришлось создавать функции, в которые и пихать все патчи.
AlexYar : |
Я пишу на хс, асм для меня пока тёмный лес. Поэтому если связка xc->asm->obj->asm->xc не работает, значит с моей позиции всё не работает
|
Эта связка и не может работать. Я не могу в xc привести произвольный код. Можно теоретически обратно из асмы после xc обратно восстановить xc код, только не понятно зачем. Т.е. понятно, наверное, если хочется восстановит xc-код пропатченного обжа, но это не практически невозможно. Я не был даже уверен, что задача декомпиляции обжа от KC разрешима. Так что лучше рисать сразу на XC и не писать на асме вообще. Т.е. начинать либо сразу с XC кода оригинального обжа, либо с его asm-кода и, смотря на xc-код, заменять нужные места. Т.е. удалять из asm-файла, вставлять код в xc, а затем править. Последним способом я и делаю (как уже говорил, начинал не с оригинального, так что xa2c уже не работает; да и надёжность выше ).
Цитата: |
Это нормально. Вероятнее всего в КС объявление было такое, или нечто похожее...
|
Это действительно нормально. У меня сложилось подозрение, что виртуальная машина одно значение в стеке при переходе резервирует специально на такой случай. Или, что похоже на правду, место для возвращаемого значения резервируется при вызыве, соответственно, в число при setmem оно не входит.
AlexYar : |
case 339:
CM0438_00: (arg1:22, arg2:23, loc1:18, loc2:17, loc6:13, loc7:12, loc16:3, loc17:2, loc18:1, loc19:0)
{
бла-бла-бла...
break;
}
case 340:
А чем чревато такое написание на xc? Есть какие-нибудь возможные негативные последствия, или это вполне нормальное написание?
(транслятор не ругается, асемблер тоже, игра не вылетает, команда работает).
Кто-нить может перевести на "русский", что означает (как читается) вторая строка (CM0428_00:...) ? В теме по транслятору описано крайне туманно, чтобы можно было что-то понять.
|
CM0438_00 - имя метки. Переход на неё в другом месте - asm-командой jump.
В скобках имена переменных и их адреса в стеке:
arg1:22 - переменная arg1 находится в SP[22]
arg2:23 - переменная arg2 находится в SP[23]
loc1:18 - переменная arg2 находится в SP[18]
и т.д. до конца.
Используется всё это для того, чтобы переписать кусок asm-кода на XC. Т.е. это совершенно ленальная возможность, созданная специально для того, чтобы можно было работать с XC-кусками больших asm-функций. Как я уже говорил, вот есть патч к обжу, а его xa2c, естественно, не берёт. Берём оригинаольный обж - для него xa2c работает. Находим нужный кусок в полученном XC-тексте и в asm-тексте патченного обжа. Из второго вырезаем, XC-код добавляем. Это если патченный обж у нас в asm-виде, т.е. патч на основе подностью дезассемблированного обжа, но уже правленный на асме, или обж дезассемблировался уже патченный, а потом работаем уже с результатом. Так в последих патчах для X2. Для X3 там всё было проще. Т.е. просто патчилось место перехода на метку, в данном случае, обработки команды ScE. Соответсвенно, метка перехода в длинном switch менялась на CM0438_00. Код XC, как и ранее, брался из XC-варианта оригинального обжа, а затем правился в соответствии с нуждами. Остаётся только проставить позиции локальных переменных, что лекго по листингу дизасмы делается. Достаточно посмотреть для одной переменной, остальные задаются очевидным образом. Из примера вверху видно как. Т.е. число после loc повышается, позиция в стеке понижается на соответствующее число единиц, а аргументы проталкиваются в стек в обратном порядке, т.е. тут наоборот, и если число после arg повышается, то и положение в стеке повышается).
Цитата: |
Да, но doSaveGame() использует X2_Save(), которая собственно и записывает save-файл... Т.е. это нужно сам exe править...
|
Да, DoSaveGame() переписать можно (для этого нужет патч на основе полностью дизассемблированного, т.е. не патчить оригинальный обж, а иметь большой asm-файл(ы) от dobj). А вот exe реализации, в частености, X2_Save() изменить невозможно.
|
|
|
|
|
|
Канал X2: The Threat: «X2-ASM - это проcто!» |
|
К списку каналов | Наверх страницы |
Цитата не в тему: Появилась еще одна сволочь, Vitalii, бросается на всех и вся... (автопортрет Vitalii'я в СтарВинде)
|
» X2-ASM - это проcто! | страница 11 |
|