SkyLoader 53 Опубликовано 27 Июля 2011 Поделиться Опубликовано 27 Июля 2011 (изменено) Monnoroch, вообще меня интересует ф-ция работы с "bind_object". Она находится выше предыдущей ("motivation_action_manager"). Строка с "bind_object" встречается в движке только один раз - это там. Ну а если идет регистрация, как ты говоришь, то можно как-то узнать, куда в итоге идет ф-ция. Изменено 27 Июля 2011 пользователем SkyLoader Ссылка на комментарий
Monnoroch 6 Опубликовано 27 Июля 2011 Поделиться Опубликовано 27 Июля 2011 (изменено) SkyLoader, Я все еще ничего не понимаю. Теперь ты говоришь, что тебя интересует другая проблема, нежели ты описал выше. Напиши подробно что тебе надо от движка? И функция никуда не идет. Функции ходить не умеют, инфа 100%. Изменено 27 Июля 2011 пользователем Monnoroch Ссылка на комментарий
SkyLoader 53 Опубликовано 27 Июля 2011 Поделиться Опубликовано 27 Июля 2011 Monnoroch, это я просто пример приводил. Мне нужно знать, по какому адресу находится ф-ция, которая выполняет действия "bind_object". Ссылка на комментарий
Monnoroch 6 Опубликовано 27 Июля 2011 Поделиться Опубликовано 27 Июля 2011 (изменено) SkyLoader, а мне откуда знать по какому она адресу? О_о с чего, опять же ты взял, что существует некое действие "bind_object"? и в чем, по твоему оно выражается? Изменено 27 Июля 2011 пользователем Monnoroch Ссылка на комментарий
Malandrinus 615 Опубликовано 27 Июля 2011 Поделиться Опубликовано 27 Июля 2011 Что касается технологии Luabind, то там нет функции которая "всё биндит". Это потому, что Luabind построен на шаблонах C++ и для каждого экспорта при компиляции создаётся своя функция, причём не одна, а целая куча, и имён у них нет, поскольку они не выходят за пределы xrgame, да ещё и оптимизатор зачастую превращает это всё в малопонятную мешанину. Это кстати чертовски усложняет доэкспорт существующих в движке функций. Например, я совсем не представляю, как можно экспортировать некий класс. Я даже не понимаю, как можно экспортировать метод уже экспортированного класса, если нет экспортированного метода с таким же прототипом. В некоторых случаях удаётся это сделать, втиснув метод в другой, с похожим прототипом, оставив часть аргументов неиспользуемыми. Вот примерно на таком уровне удаётся работать, и лично мне дальше продвинуться не удалось. А о чём вы здесь беседы ведёте - я просто не понимаю. Видимо мне мозгов не хватает. Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Ссылка на комментарий
Monnoroch 6 Опубликовано 27 Июля 2011 Поделиться Опубликовано 27 Июля 2011 (изменено) 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]. И собственно постоение которой, походу и есть в коде выше. собственно, вот и все, что можно сказать (= Ну, вернее, я больше ничего там разобрать не могу. Изменено 27 Июля 2011 пользователем Monnoroch Ссылка на комментарий
SkyLoader 53 Опубликовано 28 Июля 2011 Поделиться Опубликовано 28 Июля 2011 В итоге я нашел то, что искал. Оно находилось там, где находится "script_binding". Ссылка на комментарий
Monnoroch 6 Опубликовано 28 Июля 2011 Поделиться Опубликовано 28 Июля 2011 SkyLoader, Ага, нашел-то нашел, только обьяснить никому не смог Ссылка на комментарий
SkyLoader 53 Опубликовано 28 Июля 2011 Поделиться Опубликовано 28 Июля 2011 (изменено) Monnoroch, да я на самом деле тупанул. Просто в билде я сначала искал "script_binding", чтобы изменить там кой-чего, а потом, бегая по ф-циям, забрел в "bind_object", искал. Там было 2 вызова ф-ций. Одна просто CScriptBinder_что-то там...Bind_Object, а другая - CScriptBinder__set_object. Во второй ф-ции я нашел и изменил одну проверку, которая мне нужна была. Хотел перенести это на оригинал и по привычке начал искать "bind_object", а там все изменено до неузнаваемости. В итоге оказалось, что все это лежит в "script_binding". Изменено 28 Июля 2011 пользователем SkyLoader Ссылка на комментарий
_Призрак_ 11 Опубликовано 28 Июля 2011 Поделиться Опубликовано 28 Июля 2011 Поделишься дллокой чтобы биндеры работали в мп? Freedom Ссылка на комментарий
SkyLoader 53 Опубликовано 29 Июля 2011 Поделиться Опубликовано 29 Июля 2011 (изменено) _Призрак_, хех, я только место нашел, поэтому на стадии ковыряния. При изменении одной проверки биндер отключается в сп. Я уже пробовал раз 8 различными подходами, без результата. Если есть желание, можешь сам глянуть: .text:101C9883 cmp byte ptr [ecx], 0 Если 0 заменить на 1, то в сп биндер отключается, однако если следующую строчку с jnz убрать вообще, то ничего не изменится. Изменено 29 Июля 2011 пользователем SkyLoader Ссылка на комментарий
KD87 718 Опубликовано 29 Июля 2011 Поделиться Опубликовано 29 Июля 2011 SkyLoader, _Призрак_, в CScriptBinder::set_object() есть проверка на сингловый тип игры. Надо не на нуль там заменять, а убрать проверку. На билде 2947 выглядит вот так: .text:1006F91F call ?IsGameTypeSingle@@YA_NXZ; IsGameTypeSingle(void) .text:1006F924 test al, al .text:1006F926 jz short loc_1006F92F Ссылка на комментарий
SkyLoader 53 Опубликовано 29 Июля 2011 Поделиться Опубликовано 29 Июля 2011 (изменено) KD87, ну я и говорю, что я билде я так делал, а в оригинале все по-другому. В оригинале даже вроде нет проверок на IsGameTypeSingle, все вручную проверяется. Изменено 29 Июля 2011 пользователем SkyLoader Ссылка на комментарий
Monnoroch 6 Опубликовано 29 Июля 2011 Поделиться Опубликовано 29 Июля 2011 (изменено) Если 0 заменить на 1, то в сп биндер отключается, однако если следующую строчку с jnz убрать вообще, то ничего не изменится. логично. у тебя зеро флаг был 1, выполняется cmp - становится 0.jnz не выполняется. убираешь cmp - остается 1 - jnz выполняется всегда. а тебе походу надо отключить jnz. так ты замени его на nop. Изменено 29 Июля 2011 пользователем Monnoroch Ссылка на комментарий
SkyLoader 53 Опубликовано 29 Июля 2011 Поделиться Опубликовано 29 Июля 2011 (изменено) Monnoroch, вот я и говорю, что заменил на nop, а ничего не изменилось. mov ecx, ds:?g_dedicated_server@@3_NA cmp byte ptr [ecx], 0 jnz short loc_101C98AB --тут на nop заменил Изменено 29 Июля 2011 пользователем SkyLoader Ссылка на комментарий
KD87 718 Опубликовано 29 Июля 2011 Поделиться Опубликовано 29 Июля 2011 SkyLoader, билд 2947 - это фактически билд финалки. Для какого патча ты пытаешься что-то поменять? Ссылка на комментарий
SkyLoader 53 Опубликовано 29 Июля 2011 Поделиться Опубликовано 29 Июля 2011 KD87, четвертый патч. Я билдовые копания делаю на билде 18.. Там много отличий. Ссылка на комментарий
KD87 718 Опубликовано 29 Июля 2011 Поделиться Опубликовано 29 Июля 2011 (изменено) 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; } Изменено 29 Июля 2011 пользователем KD87 Ссылка на комментарий
SkyLoader 53 Опубликовано 29 Июля 2011 Поделиться Опубликовано 29 Июля 2011 (изменено) KD87, скоро этот билд скачаю себе. 1) Про псевдокод я вообще не знал, что он встроен, спасибо! F5 2) Как ты ф-цию нашел? Я ее искал две недели. Неужели в этот билде все настолько схоже? 3) Я проверку и на 0 менял и на 2 (может в деатматче заработает), но ничего не работает - биндер отключается в сингле и не работает в мульте. Я пробовал следующую jz short loc_1012B4D9 заменить на jmp. Ведь на на проверку это больше влиять не будет? Но, тоже самое - отключение биндера везде. Изменено 29 Июля 2011 пользователем SkyLoader Ссылка на комментарий
KD87 718 Опубликовано 30 Июля 2011 Поделиться Опубликовано 30 Июля 2011 SkyLoader, а чего там искать? имена всех экспортированных функций есть в функциях script_register_... Выполняешь поиск по нужному имени, дальше дело техники. Если отладочной информации нет и нужное имя не находится, можно взять ближайший билд с оной и с умом сравнивать - обычно удается найти то, что нужно (в этом случае так и сделал). Это в данном конкретном случае. В общем случае, конечно, сложнее - когда я составлял список версий спавна по билдам, искал вообще по битовым маскам, применяемым в CAE_Abstract::Spawn_read(). В общем, свой подход каждый раз. Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти