Есть старый шутер 1999 года. Есть я. Есть файл .lib(библиотека статическая, насколько я понял), который находится в SDK это самой игрушки. Нужно декомпилировать файл .lib, минуя\исправляя все декомпиляционные баги, чтобы была возможность править исходный код и компилировать обратно в .lib. Если имеет значение - игра написана на С. Реально ли это и как это сделать? В идеале, конечно, если найдётся Нэо, который это сваяет, ибо, похоже, вникать во всё это нужно самому лет 10. P.S. Ощущаю себя Морфеусом, который ищет избранного программиста, ибо, как я понял, то, что мне нужно - возможно только в матрице, а не в реальной жизни...
Можно-то оно можно, 10 лет возможно и не понадобится но дороговато сей Нэо стоить будет Зачем полный реверс - тоже еще вопрос. Может он и не нужен.
Тогда развернём карты побольше: Я играю в одну игрушку. 1999 год, Фаргус, если это о чём-то говорит... Делаю для неё карты, моддинг, в общем. Делаю и для одиночной игры, и для мультиплеера. Все NPC, которые есть в одиночной игре перемещаются по карте по определённым навигационным меткам. Такая метка называется "node". Если ты их по карте не расставишь, боты не смогут ориентироваться в пространстве и будут жёстко тупить. Поэтому лучше покрыть ими всю поверхность, по которой можешь ходить сам. Делается это через консольные команды. Просто вводишь и бегаешь, а игра делит пространство на определённые клетки, где 4 клетки = 1 node, типо один из них занимает 4 клетки. Ты бегаешь, создаётся .nav file в корне игры и всё - после этого NPC тебя достанут, где хочешь. Проблема в том, что разработчики сделали для nodes лимит - 695, не больше. Мне нужно расширить это число, ибо карта у меня большая, а резать не хочу. Что имеем: SDK в виде .c и .h файлов, где эти 695 есть, но их и изменение ни на что не влияет. Там, кстати, строка "#define max_nodes 700", а не 695 почему-то, но да ладно. Navlib.lib - статическая(как я понимаю) библиотека в самом SDK, которая используется при его компиляции. Эти 695 прописаны в .lib. Нужно декомпилировать .lib, изменить те 695 на что-нибудь типа 10000 и компилировать обратно в .lib. Я уже пробовал открывать его через Hex Editor и там искать значения 694 и т.д. Результат таков, что если исправить единственное находимое там "700" и второе из двух находимых 695 (но не 694), то число меток можно увеличить до 730, но игра постоянно вылетает тогда. Если открывать через IDA, то там в коде есть конкретная строчка типа с "> 694" и ниже printf с сообщением о "max_nodes reached", если достигаются те 695. Был вариант всё декомпилировать, исправить 695 на нечто большее не через Hex, где непонятно, то ли это вообще место в коде правится, а через сам код и компилировать обратно, проверив, получится ли расширить число nodes без каких-либо проблем. Я могу на почту переслать большое письм с кучей скриншотов того, что было в IDA, в Hex, что я делал, что да как, чтобы нагляднее было, может и реверс не нужен, может есть какой-то обходной пть для моей задачи.
Вообще от размера либы очень зависит но в среднем полный реверс будет гораздо дороже чем эту либу написать с нуля (если вообще не всю игрушку). Ветку с max_nodes_reached несложно и занопать коль ты ее уже нашел. Если ее туда воткнули чисто от нехер делать - сработает ок. Но скорее всего на это значение 700 или 694 или что там еще - опирается еще парочка компонентов и их все надо будет подправить. Лучше править прямо в готовом exe-шнике через OllyDbg чтобы сразу замечать изменения а потом уже их переносить в либу если все будет ок. Сам код найти несложно будет сигнатурно. Ты же уже нашел место в либе - значит просто ищешь такой же паттерн и в exe / dll. Сложность еще в том что баги вполне вероятны и придется активно тестить все после каждого изменения а это не очень прикольно. Я бы предположил что за пару килобаксов вполне возможно кого-то найти для решения проблемы. Но это работа такая что гарантии какбэ сложно дать, никто не знает что там внутри. Потому исполнителя желательно подбирать придирчиво ибо могут слегка кинуть и не прикопаешься потом.
Выкладываю виновника торжества - https://dropmefiles.com/e20zS. Как здесь прикрепить файл - не разобрался, только через ссылку похоже. В архиве 4 папки: SDK - файлы в .c и .h, которые компилируются в .dll для самой игры, используя тот .lib. Может взгляд на эти файлы как-то прояснит спектр работы с .lib, не знаю, просто бонусом кидаю. Navlib_lib - оригинальный .lib файл, речь о котором и идёт. Navlib_o - нескомпилированный Navlib.lib, состоящий из четырёх .o файлов. Насколько я знаю, это от самих разработчиков, но с заточкой вроде под Linux. Navlib_c - декомпилированный Navlib.lib в виде тех четырёх файлов в .o, но уже в .c. Один знакомый, который играет в эту же игрушку, каким-то образом смог всё это дело декомпилировать, но сказал, что есть декомпиляционные баги, однако компилировать обратно в .lib не пробовал. Может как-то тоже облегчит суть дела. Размер 61 КБ
Тю. Вот эта малышка ? Ну тогда может быть и можно Code: if ( **(_WORD **)(a1 + 1820) > 694 ) { ((void (__cdecl *)(const char *, void *))gi[40])("nav_dynamic", &unk_8002D0C); NAV_dprintf("MAX_NODES reached, nav_dynamic disabled.\n"); } result = v7; Загружаешь exe в Olly. В IDA ищешь сей код и переключаешься в HEX. Выделяешь кусок и в самом Olly ищешь где он находится. Там просто заменяешь 694 на все что угодно (ну только что желательно размер не превышать ). И вполне возможно что все ок.
Блин, как вы это все делаете!? Я тогда минут 40 пытался в этой IDA найти вот этот самый,/ругательство/, фрагмент, потом плюнул и всё, а тут мгновенно... Это обнадёживает. Только вот я с Olly, IDA и HEX как попугай с интегральными уравнениями. Я могу заиметь наглость попросить тебя это всё провернуть, заменив 694 на ту же 1000, например, чтобы я сразу попытал у игры счастье - изменится лимит или нет? Как я понял, это дело 15 кликов мышкой
Я бы уже завернул, но у меня Линух. Мне просто нечем сие завернуть. Но ты вполне можешь кого-нибудь попросить и без всяких штук баксов Декомпилить тебе либу сомнительно что кто-то будет, а подправить - не сложно. Там кода не много. Если тут никто не ответит - попробуй на ExeLab попроси.
Линух как Ролех, понимаю. А может тогда туториал сделаешь, типо это открыл, сюда перенёс, исправил, радуешься? Или там на 19 страниц выйдет? А так сейчас ещё напишу куда-нибудь, кому-нибудь.
Мне и посмотреть не на чем. Надо как-то Olly перенести хотя-бы под Wine или поднять мерзкую Венду и под нее ставить... Очень геморно. Но вообще просто открой этот кусок в IDA там по идее HEX синхронизирован с дизасмом. И этот свой кусок скопируй в буфер обмена. В Ольке, в открытом exe по дизассемблерному коду правой кнопкой и "поиск". Вот как точно он называется я ушь и не помню. Там что-то типо поиск по сигнатуре или х/з. Но там в окне поиска будет предложено вводить hex-код. Вот найденный код туда вводишь - тебя перебрасывает по нужному адресу. Я думаю увидишь там свои 694 (только в шестнадцатиричном виде, это будет 0x2B6 вроде). Вот эти 0x2b6 ищешь, нажимаешь пробел превращаешь для пробы в какой-нибудь 0xfff и жмакаешь enter и может - быть esc потом. После чего выделяешь текст, по нему правой кнопкой и там будет пункт типо "сохранить изменения в файл" или что-то типо того. Сохраняешь (только желательно в отдельный файл а не в тот же самый) - и тестишь.
Рэмбо, а может ты мне ВК дашь свой? Я бы тебе картиночки посбрасывал, потому что вопросы возникают уже на моменте "открой этот кусок в IDA", я ей открываю .lib, а она его видит в четырёх .o, предлагая открыть один на выбор. Я бы прям по пунктам скриншотил и отсылал доброму человеку.
Скинь тот же вопрос лучше на exelab. Там нубы частенько бродят - им может быть будет тупо интересно поразбираться с этим барахлом. Заодно накидают ссылок если интересно именно реверсить. Если интересны просто игрушки - сильно рекомендуется затестить Unity. Там есть туториалы и практически нихрена не умея кодить - можно собрать вполне себе игрушку.
Да, опубликовался там. Кстати, если никто не согласится и придётся копать самому, какой .exe ты имел в виду, который нужно загружать в Olly? От игры что ли или сам .lib? Только он ведь не .exe...
От игры. Внутри него содержимое этой lib. Внутри него легче что-то изменить и попробовать ибо иначе тебе надо сначала изменить lib, потом перекомпилить exe. Попробовать. Если не получится - операцию повторить. Если он не PE-файл а Эльф - то тогда можно и lib менять.
Да и... они видать не скачивали просто. Они ожидают что там ЛИБА. А там этой либы - плюнуть и растереть
Через Олю я открыл, вроде норм, а Лида вместо .lib предлагает открыть одну из составляющих этого .lib, у тебя так же? Каковы действия? Нашёл читерский способ приковыривать сюда фото. P.S. - 1 Про "PE" и "'Эльф" ничего не понял P.S. - 2 Кстати, а как все будут это делать, если ни у кого нет того самого .exe от игры?
Что ты запускаешь чтобы пользоваться этой херней ? Какой файл ? Есть предположение что kpdata.exe 1) В окне что ты видишь в IDA открываешь g_nav.obj и ищешь код который хочешь исправить. Там же где-то будет кнопалка типо "переключиться в HEX" нажимаешь на нее. Шестнадцатиричный вид должен открыться не по 0-му адресу а там где-то неведомо где но тебе это не сильно важно. Где-то в окрестностях ищешь 0x2b6. Цифр штук 5 которые до этого и еще штуки 4 после - сохраняешь где-то в блокноте. 2) открываешь в OllyDbg - exe которым ты пользуешься (может быть kpdata.exe) и который уже скомпилен при помощи этой navlib. Нажимаешь правой кнопой на коде (лучше бы на памяти но так я точно не помню настолько чтобы объяснить, это обычно делается на автомате) и там где-то будет меню поиска. Будет возможность искать строки, команды... еще что-то... и сигнатуру. Может быть "binary data" или как-то так. Вот туда вводишь те цифры из п.1. Должно найти. Если нет - можешь попробовать другие цифры взять (желательно захватывая при этом 0x2b6). 3) Когда найдешь заменяешь на что хочешь, выделяешь измененный код (можно с запасом) и нажимаешь на нем правой кнопой. Там ищешь команду которая позволит сохранить это безобразие. Ну собссно и все.
UPD: Моргот не новичок если что Ему тоже может быть люто лениво смотреть на все это дело. А ты, даже если это исправишь, можешь столкнуться с каким-нибудь Access Violation потому что эти 695 наверняка сохраняются где-то в массиве. Искать это по дизасму - сомнительное удовольствие а вот в отладчике - несложно. Но ты я думаю сам не найдешь. Так что... х/з.