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

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

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

Monnoroch, вообще меня интересует ф-ция работы с "bind_object". Она находится выше предыдущей ("motivation_action_manager"). Строка с "bind_object" встречается в движке только один раз - это там. Ну а если идет регистрация, как ты говоришь, то можно как-то узнать, куда в итоге идет ф-ция. Изменено пользователем SkyLoader
Ссылка на комментарий

SkyLoader, Я все еще ничего не понимаю. Теперь ты говоришь, что тебя интересует другая проблема, нежели ты описал выше.

Напиши подробно что тебе надо от движка?

 

И функция никуда не идет. Функции ходить не умеют, инфа 100%.

Изменено пользователем Monnoroch
Ссылка на комментарий
Monnoroch, это я просто пример приводил. Мне нужно знать, по какому адресу находится ф-ция, которая выполняет действия "bind_object".
Ссылка на комментарий

SkyLoader, а мне откуда знать по какому она адресу? О_о

с чего, опять же ты взял, что существует некое действие "bind_object"?

и в чем, по твоему оно выражается?

Изменено пользователем Monnoroch
Ссылка на комментарий

Что касается технологии Luabind, то там нет функции которая "всё биндит". Это потому, что Luabind построен на шаблонах C++ и для каждого экспорта при компиляции создаётся своя функция, причём не одна, а целая куча, и имён у них нет, поскольку они не выходят за пределы xrgame, да ещё и оптимизатор зачастую превращает это всё в малопонятную мешанину. Это кстати чертовски усложняет доэкспорт существующих в движке функций. Например, я совсем не представляю, как можно экспортировать некий класс. Я даже не понимаю, как можно экспортировать метод уже экспортированного класса, если нет экспортированного метода с таким же прототипом. В некоторых случаях удаётся это сделать, втиснув метод в другой, с похожим прототипом, оставив часть аргументов неиспользуемыми.

 

Вот примерно на таком уровне удаётся работать, и лично мне дальше продвинуться не удалось. А о чём вы здесь беседы ведёте - я просто не понимаю. Видимо мне мозгов не хватает.

 

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

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

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

 

Ссылка на комментарий

malandrinus, я примерно о том же и говорю, что понять мало что с такого кода можно.

просто из приведенного кода явно видно, что вызывается метод

luabind::detail::class_base::add_method(char const *,luabind::detail::overload_rep const &) с первым аргументом "motivation_action_manager"

push    offset amоtivation_act;
"motivation_action_manager"
call    ds:?add_method@class_base@detail@luabind@@QAEXPBDABUoverload_rep@23@@Z;
luabind::detail::class_base::add_method(char const *,luabind::detail::overload_rep const &)

 

вот, собственно и все, что на первый взгляд видно.

возникает ощущение, что в класс "motivation_action_manager" добавляется некоторый метод.

Тут важно, что имеется ввиду класс LUA. То есть конечно в с++ класс что-то добавить это нонсенс.

какой - а черт его знает. я даже не знаю что такое luabind::detail::overload_rep.

 

далее, чуть выше есть код:

lea     edx, [esp+58h+var_38]
push    edx

что наводит на мысль о связи var_38 и той самой добавляемой функцией типа luabind::detail::overload_rep (это вообще функция ли?), которая походу в коде представляла собой указатель, поскольку по-видимому выделена на стеке, ибо [esp+58h+var_38].

И собственно постоение которой, походу и есть в коде выше.

 

собственно, вот и все, что можно сказать (=

Ну, вернее, я больше ничего там разобрать не могу.

Изменено пользователем Monnoroch
Ссылка на комментарий
Monnoroch, да я на самом деле тупанул. Просто в билде я сначала искал "script_binding", чтобы изменить там кой-чего, а потом, бегая по ф-циям, забрел в "bind_object", искал. Там было 2 вызова ф-ций. Одна просто CScriptBinder_что-то там...Bind_Object, а другая - CScriptBinder__set_object. Во второй ф-ции я нашел и изменил одну проверку, которая мне нужна была. Хотел перенести это на оригинал и по привычке начал искать "bind_object", а там все изменено до неузнаваемости. В итоге оказалось, что все это лежит в "script_binding". Изменено пользователем SkyLoader
Ссылка на комментарий

_Призрак_, хех, я только место нашел, поэтому на стадии ковыряния. При изменении одной проверки биндер отключается в сп. Я уже пробовал раз 8 различными подходами, без результата.

Если есть желание, можешь сам глянуть:

.text:101C9883                 cmp     byte ptr [ecx], 0

Если 0 заменить на 1, то в сп биндер отключается, однако если следующую строчку с jnz убрать вообще, то ничего не изменится.

Изменено пользователем SkyLoader
Ссылка на комментарий

SkyLoader, _Призрак_, в CScriptBinder::set_object() есть проверка на сингловый тип игры. Надо не на нуль там заменять, а убрать проверку.

На билде 2947 выглядит вот так:

.text:1006F91F                 call    ?IsGameTypeSingle@@YA_NXZ; IsGameTypeSingle(void)
.text:1006F924                 test    al, al
.text:1006F926                 jz      short loc_1006F92F

Ссылка на комментарий
KD87, ну я и говорю, что я билде я так делал, а в оригинале все по-другому. В оригинале даже вроде нет проверок на IsGameTypeSingle, все вручную проверяется. Изменено пользователем SkyLoader
Ссылка на комментарий
Если 0 заменить на 1, то в сп биндер отключается, однако если следующую строчку с jnz убрать вообще, то ничего не изменится.

 

логично. у тебя зеро флаг был 1, выполняется cmp - становится 0.jnz не выполняется.

убираешь cmp - остается 1 - jnz выполняется всегда.

 

а тебе походу надо отключить jnz. так ты замени его на nop.

Изменено пользователем Monnoroch
Ссылка на комментарий

Monnoroch, вот я и говорю, что заменил на nop, а ничего не изменилось.

 

mov     ecx, ds:?g_dedicated_server@@3_NA
cmp     byte ptr [ecx], 0
jnz     short loc_101C98AB --тут на nop заменил

Изменено пользователем SkyLoader
Ссылка на комментарий

SkyLoader, скажи, а зачем пытаться перенести найденное в билдах 18xx в финалку? тебе недостаточно билдов 29xx с _отладочной информацией_?

Как бы то ни было, я нашел нужную тебе функцию в dll от четвертого патча:

.text:1012B4B0 sub_1012B4B0    proc near        ; DATA XREF: sub_10134FE0+F2Bo
.text:1012B4B0
.text:1012B4B0 arg_0           = dword ptr  4
.text:1012B4B0
.text:1012B4B0                 push    esi
.text:1012B4B1                 mov     esi, ecx
.text:1012B4B3                 push    edi
.text:1012B4B4                 mov     edi, [esi+4]
.text:1012B4B7                 test    edi, edi
.text:1012B4B9                 jz      short loc_1012B4C0
.text:1012B4BB                 call    sub_101CA330
.text:1012B4C0
.text:1012B4C0 loc_1012B4C0:                    ; CODE XREF: sub_1012B4B0+9j
.text:1012B4C0                 mov     eax, ds:?g_pGamePersistent@@3PAVIGame_Persistent@@A; IGame_Persistent * g_pGamePersistent
.text:1012B4C5                 mov     ecx, [eax]
.text:1012B4C7                 mov     eax, [ecx+424h]
.text:1012B4CD                 cmp     eax, 1
.text:1012B4D0                 mov     esi, [esi+4]
.text:1012B4D3                 jz      short loc_1012B4D9
.text:1012B4D5                 test    eax, eax
.text:1012B4D7                 jnz     short loc_1012B4E3
.text:1012B4D9
.text:1012B4D9 loc_1012B4D9:                    ; CODE XREF: sub_1012B4B0+23j
.text:1012B4D9                 mov     edx, [esp+8+arg_0]
.text:1012B4DD                 mov     [esi+114h], edx
.text:1012B4E3
.text:1012B4E3 loc_1012B4E3:                    ; CODE XREF: sub_1012B4B0+27j
.text:1012B4E3                 pop     edi
.text:1012B4E4                 pop     esi
.text:1012B4E5                 retn    4
.text:1012B4E5 sub_1012B4B0    endp

 

На всякий случай - то же самое в псевдокоде:

int __thiscall sub_1012B4B0(int this, int a2)
{
  int v2; // esi@1
  int result; // eax@3
  int v4; // esi@3

  v2 = this;
  if ( *(_DWORD *)(this + 4) )
    sub_101CA330();
  result = *((_DWORD *)g_pGamePersistent + 265);
  v4 = *(_DWORD *)(v2 + 4);
  if ( result == 1 || !result )
    *(_DWORD *)(v4 + 276) = a2;
  return result;
}

 

Чуешь, что надо менять? :)

проверка на тип игры тут:

.text:1012B4CD                 cmp     eax, 1

Для общей информации приведу перечисление для game_id:

enum s_gameid {
   GAME_ANY        => 0;
   GAME_SINGLE        => 0x01;
   GAME_DEATHMATCH    => 0x02;
   GAME_CTF        => 0x03;
   GAME_ASSAULT    => 0x04;
   GAME_CS            => 0x05;
   GAME_TEAMDEATHMATCH    => 0x06;
   GAME_ARTEFACTHUNT    => 0x07;
   GAME_LASTSTANDING    => 0x64;
    GAME_DUMMY        => 0xFF;
}

Изменено пользователем KD87
Ссылка на комментарий

KD87, скоро этот билд скачаю себе.

1) Про псевдокод я вообще не знал, что он встроен, спасибо! F5

2) Как ты ф-цию нашел? Я ее искал две недели. Неужели в этот билде все настолько схоже?

3) Я проверку и на 0 менял и на 2 (может в деатматче заработает), но ничего не работает - биндер отключается в сингле и не работает в мульте. Я пробовал следующую jz short loc_1012B4D9 заменить на jmp. Ведь на на проверку это больше влиять не будет? Но, тоже самое - отключение биндера везде.

Изменено пользователем SkyLoader
Ссылка на комментарий

SkyLoader, а чего там искать? имена всех экспортированных функций есть в функциях script_register_... Выполняешь поиск по нужному имени, дальше дело техники. Если отладочной информации нет и нужное имя не находится, можно взять ближайший билд с оной и с умом сравнивать - обычно удается найти то, что нужно (в этом случае так и сделал). Это в данном конкретном случае. В общем случае, конечно, сложнее - когда я составлял список версий спавна по билдам, искал вообще по битовым маскам, применяемым в CAE_Abstract::Spawn_read(). В общем, свой подход каждый раз.

 

Ссылка на комментарий

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

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

Войти
  • Недавно просматривали   0 пользователей

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

AMK-Team.ru

×
×
  • Создать...