Перейти к контенту

Редактирование движка X-Ray


Rolan

Рекомендуемые сообщения

З.Ы. Удивлен что тема дает толк

Обсуждения такого рода вполне уместны в ковырялке для соответствующей версии. История повторяется. Создана тема с узкоспециальным назначением, причём по этому самому назначению её никто не использует (и не будет использовать). В лучшем случае тема уйдёт по списку вниз, и о ней благополучно забудут. В худшем - получится ещё одна микроковырялка. И зачем! У форума, к примеру, есть неприятная особенность "отписывать" рассылки от тем, где долго никто не пишет. Да и следить гораздо лучше за тремя темами, а не за десятком.

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

Поделиться этим сообщением


Ссылка на сообщение

sabir,

Не надоело еще?

У меня все три игры установлены. Ни в одной из них библиотеки движка не защищены никакими защитами и никак не зашифрованы. Основной загрузчик может и (был) защищен, но он никому и не интересен.

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

Поделиться этим сообщением


Ссылка на сообщение

_Призрак_,

в hex виде из контекстного меню выбери "Data format" -> "Single Float (32 bit)". Затем можешь редактировать прямо число с плавающей запятой. Но только учти, что IDA никогда не меняет файл. То, что ты таким образом "изменил", можно сохранить в виде файла отличий "*.dif" через "File" -> "Produce File". Затем уже нужно применять этот файл к исходной dll с помощью утилиты "bpatch", которая понимает эти файлы и которую можно найти в сети.

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

Поделиться этим сообщением


Ссылка на сообщение

Rolan,

Как начну обновлять шапку выложу и xrGame исходный

Кстати, а где? Сколько можно по ушам то ездить? =)

 

Rolan,

Выложу с разрешения админов ибо тут Шкипер писал

...

Так что только, с разрешения.

Ага =) Как там в одной книжке... Насовал нам фиалок за уши, а теперь отмазки лепит, админов понимаешь ли боится.

Изменено пользователем malandrinus
 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

Поделиться этим сообщением


Ссылка на сообщение

Rolan,

Вот он , xrGame от ЗП на сцене!

Я ценю ваши старания, но давайте таки определимся. Это не исходники. Исходники - это то, что писали разработчики, и они их никому не давали. А это - сгенерированный идой текст. Его нетрудно получить самому. Загружаем в IDA pro вашу dll и делаем

File -> Produce File -> Create C File...

Толку от этого текста чуть менее, чем ничего. Потеряна информация о типах, точных сигнатурах и именах функций, именах аргументов функций, шаблонах C++ и ещё куча всего. Существенная часть функций не распознана (поскольку ссылки на них сделаны не вызовами, а косвенные). Комментариев в этом тексте естественно нет (хотя не факт, что они и в исходниках были =). Отсутствует деление на файлы (а между прочим в одном только xrgame.dll файлов исходного текста несколько тысяч). Читать этот текст и извлечь из него полезную информацию невозможно. Это не значит, что декомпилятор hex-ray из IDA бесполезен. Напротив, полезен весьма, но использовать его имеет смысл точечно. Вот нашли функцию, которая делает что-то (и вы знаете что именно), тогда уже именно эту функцию и пытаетесь декомпилить, чтобы понять, как именно она делает то, что делает. И это не избавит от необходимости смотреть в окно дизассемблера, уж поверьте.

 

С практической точки зрения более интересным и информативным представляется разбор файлов билда MP 2947, которые шли с отладочными дампами.

 

Насчёт законности. Вся эта возня не более и не менее законна, нежели прочая деятельность модостроителей (т.е. вообще говоря незаконна, почитайте лицензию к игре, параграф 1).

 

 

AK74,

рискну предположить что это было сделано из-за более навороченной графики.

И вот почему: скрипты - это LUA, а LUA - это интерпретатор. А как известно, быстродействие не числится среди достоинств интерпретаторов.

И имхо, вполне разумно, то что в предыдущих версиях игры реализовывалось скриптами "ввести" в код движка, а высвободившееся ресурсы CPU "отдать" графике.

Для начала, Lua здесь используется в связке с JIT копилятором. Т.е. интерпретируется текст только при первом исполнении, затем уже исполняется скомпилированный код. Такой же принцип используется в исполняемой среде .NET. Естественно, это помедленнее будет, чем код движка, но не так уж драматически медленней. И потом на скриптовую часть не ложится большая нагрузка (естественно до тех пор, пока какой-либо новичок не начнёт делать при каждом апдейте перебор всех объектов =).

 

Потом, утверждение о "переносе функций из скриптов в движок" - это ерунда из того-же разряда, что и разговоры о протекторах и прерываниях. Я утверждаю, что движок в той части, что соответствует xrgame.dll (т.е. вся игровая логика) практически мало изменился за все три игры. В лучшем случае была проведена работа по исправлению ошибок и может быть некоторой оптимизации. Практически все функции, которые были экспортированы в ЧН и ЗП по сравнению с ТЧ - это функции, которые там имелись изначально (т.е. ещё в ТЧ), просто были экспортированы в Lua и даны в распоряжение скриптёров. Т.е. выходит картина с точностью до наоборот - в новых версиях движка скриптёру предоставляются потенциально более широкие полномочия.

 

 

Это Int 03h которые?

Вот ведь...

Господа, есть форумы и тьма их, на которых только тем и занимаются, что обсуждают ломание всяких защит и прочее в этом роде. Но обсуждать это здесь, при том, что никаких защит тут нет - это уже не смешно даже.

 

Другое дело, если бы удалось скажем LAU и физикой нагрузить 2-е ядро процессора

Это к сожалению невозможно. Совсем. Всё, что можно сделать в этом направлении, уже сделали разработчики.

 

_Призрак_,

Вообще-то, как я понял, flt_1006452C - не является названием переменной. Это так сказать сборка из 2 показателей - (тип числа)_(оффсет) В нашем случае это число типа float которое находится в 1006452C.

Это всё-таки именно имя, не более. Только учтите, что в IDA есть только адреса ячеек памяти, поэтому это просто метка адреса. Имя метки IDA определяет при первичном анализе. Если по каким-то причинам IDA сочла, что по этому адресу лежит 4-х байтовый float, то имя составляется как flt_virtual_address. В дальнейшем вы можете изменить как это имя, так и интерпретацию содержимого памяти по этому адресу.

 

как сделать новый сектор?

Есть замечательная утилита PE Tools, которая позволяет это сделать.

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

Поделиться этим сообщением


Ссылка на сообщение

nuklia,

может версия не та? Попробуй найти 5.5

 

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

Поделиться этим сообщением


Ссылка на сообщение

_Призрак_,

точнее malandrinus'а bpatch

Не моя =) Это вроде бы известная GNU утилита. Хотя я о ней не знал сам, пока не потребовалось найти, чем применять dif файлы.

Изменено пользователем malandrinus
 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

Поделиться этим сообщением


Ссылка на сообщение

_Призрак_,

Из вызываемых без затей с классами и прочим могу посоветовать из _g.script:

on_actor_...() таких там несколько штук

start_game_callback() там же

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

Поделиться этим сообщением


Ссылка на сообщение

_Призрак_,

из alife.ltx, ничего вызываться не может. Там просто прописывается его имя. Движок читает конфиг и затем вызывает функцию с этим именем.

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

Поделиться этим сообщением


Ссылка на сообщение

SkyLoader,

то, что ты нашёл, - это не функция, а строка с завершающим нулём (очевидно, имя консольной команды). IDA даёт им имя, комбинируя его из собственно строки и добавляя в начале "a" от ASCII.

Чтобы найти остальные, надо реверсить функцию регистрации консольных команд. Ну или на wiki посмотреть =)

 

align = выравнивание. Всякие данные обычно начинаются как минимум на границе двойного слова (4 байта). Ида распознаёт (чаще всего верно) все такие микропустоты перед началом переменных и пытается изобразить при этом корректный ассемблерный текст.

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

Поделиться этим сообщением


Ссылка на сообщение

SkyLoader,

можно ли взять кусок кода из одной длл-ки и кинуть в другую?

 

=) Можно взять хвост от одной собаки и кинуть к другой, да чтоб она потом им махала? "Кинуть" - неподходящее слово.

 

А вообще можно, вот же в шапке лежит проект "пришивания второго хвоста".

 

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

Поделиться этим сообщением


Ссылка на сообщение

SkyLoader,

Это фрагмент функции добавления констант к классу-перечислению key_bindings. Там сериями вызовов добавляются пары ключ/значение. То, что ты конкретно привёл - это фрагмент добавления константы key_bindings.kCAM_2 со значением 17.

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

Поделиться этим сообщением


Ссылка на сообщение

SkyLoader,

признаться, не понимаю о каких настройках ты говоришь. Камера следует за актором. Что тут настраивать?

 

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

Поделиться этим сообщением


Ссылка на сообщение

SkyLoader,

так это тебе нужно смотреть туда, где эти команды используются. Могу предположить, что это одна из таких функций:

CActor::IR_OnKeyboardHold

CActor::IR_OnKeyboardPress

CActor::IR_OnKeyboardRelease

Берёшь билд с отладочными дампами (mp 2947), находишь там эти функции (а может и не эти) и грызёшь их с помощью иды, пока не поймёшь, как это всё работает =)

В релизных билдах разумеется код изменён, но не существенно, а найти там нужную функцию сходу почти нереально.

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

Поделиться этим сообщением


Ссылка на сообщение

SkyLoader,

надо искать в xrGame.dll из билда mp 2947. Там в комплекте имеются файлы с расширением *.pdb для каждого экзешника или библиотеки. При открытии файла идой в первый раз она спросит, загружать ли отладочную информацию. Надо ответить, что загружать. В этом случае ида уже не будет искать функции, типы и прочее, а просто возмёт это из этих файлов. Там безымянных или нераспознанных функций не будет вообще, и каждая функция будет иметь точную информацию о типе возвращаемого значения, типах и даже именах аргументов.

Вот теперь уже и можете искать функции по имени. Можно сделать "jump to function" и там с помощью "search" найти функцию по тем иенам, что я давал. А можно просто отсортировать функции по именам в окошке слева и тогда найти её в списке тоже будет несложно.

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

Поделиться этим сообщением


Ссылка на сообщение

SkyLoader,

посмотрел эти функции, они большие. :) Я, правда, не очень понимаю, о чем они и чем могут мне помочь.

ида даёт такой прототип этой функции:

void __thiscall CActor__IR_OnKeyboardPress(CActor *this, int cmd);

что означает на самом деле такой:

void CActor::IR_OnKeyboardPress(int cmd);

тип аргумента - неопределённый int, но можно предположить, что это одна из констант-действий из key_bindings. Функции большие, действительно. Это на самом деле хорошо. Думается мне, что там как раз и происходит обработка действий нажатия на клавиши. Скорее всего там в коде стояло что-то вроде такого:

switch (cmd){
case <команда стрелять>:
    // делаем выстрел
    break;
case <команда прыгать>:
    // выполняем прыжок
    break;
    // и т.д.
}

Это довольно нудно расшифровывать, поскольку оператор switch компилируется по-разному в зависимости от режима оптимизации и внутри превращается в весьма запутанную и неоднозначную конструкцию. Но что и где делается можно иногда понять и так по именам вызываемых функций. К примеру, стоят вызовы CInventory::Action(int,uint). Это явно какие-то действия с предметами в слотах. А вот это CActor::cam_Set(ACTOR_DEFS::EActorCameras) похоже на действия с камерой актора. Вероятно как раз и есть переключение режимов. Где-то там есть и изменение расстояния от актора до камеры.

Если нужно найти параметры камеры, то отсюда надо начинать копать. Лезть в эти функции и пытаться понять, откуда они берут данные или куда пишут, какие ещё функции вызывают и т.д.

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

Поделиться этим сообщением


Ссылка на сообщение

AK74,

ну как они могут подходить? Ведь файлы PDB содержат привязки строк кода к бинарным файлам. Изменились бинарные файлы - всё, соответствие порушено. Даже если скомпилировать тот-же исходник с другими настройками, уже не подойдёт. А здесь мы говорим о новой версии движка.

Т.е. НЕ подходят никаким боком.

 

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

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

Поделиться этим сообщением


Ссылка на сообщение

JIT = "Just In Time" компилятор "на лету". Ссылка для информации. Если вкратце, то суть в том, что вместо обычной интерпретации байткода при каждом исполнении при первом проходе функция компилируется в машинный код и затем исполняется. При всех последующих выполнениях функции уже исполняется компилированная версия. Такая же технология используется в среде выполнения .NET.

Такой компилятор используется во всех версиях движка, так что особой разницы в скорости выполнения нет.

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

Поделиться этим сообщением


Ссылка на сообщение

Сяк,

с точки зрения создателей игры нет никакой разницы меняется движок, скрипты или что-то ещё. Любые изменения противоречат лицензии. Таким образом, любое модостроение под сингл является незаконным и возможно лишь в силу того, что фирма-разработчик закрывает на это глаза.

Насчёт виртуальности если честно не понял.

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

Поделиться этим сообщением


Ссылка на сообщение

Сяк,

Я не согласен. Т.к. изменение скриптов не предполагает возможности запуска игры без лицензионного диска. А изменение движка - предполагает.

А при чём здесь наличие или отсутствие диска? Речь о модификации. Скрипты - такая же кодовая часть игры, как и исполняемые файлы и динамические библиотеки. Как и кстати вообще всё содержимое игровых архивов. Я что-то не припомню, чтобы разработчики давали нам утилиту для их распаковки. Уже сам факт распаковки нарушает лицензию, поскольку файлы оттуда достаются с помощью утилит, которые были сделаны с помощью реверс инженеринга. Не так ли?

 

Vano_Santuri,

Менять в виртуальной памяти, когда запущен процесс. Как вариант fov в памяти...

Это внедрение dll в адресное пространство? Типа asi loader и иже с ними? Во первых, это даёт только возможность менять данные. Насчёт кода не уверен, поскольку на нём стоит атрибут только для чтения. Что-то типа изменения fov или получения каких-либо данных ещё можно, а вот скажем дорегистрация своих функций уже становится проблематичной.

Ну и даже если возможно. От того, что код меняется не на диске, а в памяти, это не становится более легально.

 

DiXares,

Шип, а где тогда в ТЧ либа jit'а? В ЧН и ЗП она есть, а в ТЧ нету...

Статически прилинкован. В ЧН и ЗП не только это вынесли во внешние dll. Физику например тоже вынесли, а в ТЧ движок физики был в составе xrgame.dll.

Читал, что luajit - это добавка к lua и содержит его самого.

Так и есть.

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

Поделиться этим сообщением


Ссылка на сообщение
  • Недавно просматривали   0 пользователей

    • Ни один зарегистрированный пользователь не просматривает эту страницу.
×
×
  • Создать...