Reverse Engineering (декомпиляция.lib)

Discussion in 'Реверсинг' started by Navlib_lib, 2 Feb 2020.

  1. Navlib_lib

    Navlib_lib New Member

    Joined:
    1 Feb 2020
    Messages:
    42
    Likes Received:
    1
    Reputations:
    0
    Есть старый шутер 1999 года. Есть я. Есть файл .lib(библиотека статическая, насколько я понял), который находится в SDK это самой игрушки. Нужно декомпилировать файл .lib, минуя\исправляя все декомпиляционные баги, чтобы была возможность править исходный код и компилировать обратно в .lib. Если имеет значение - игра написана на С. Реально ли это и как это сделать? В идеале, конечно, если найдётся Нэо, который это сваяет, ибо, похоже, вникать во всё это нужно самому лет 10.

    P.S. Ощущаю себя Морфеусом, который ищет избранного программиста, ибо, как я понял, то, что мне нужно - возможно только в матрице, а не в реальной жизни...
     
  2. DartPhoenix

    DartPhoenix Elder - Старейшина

    Joined:
    15 Sep 2013
    Messages:
    1,107
    Likes Received:
    8,482
    Reputations:
    25
    Можно-то оно можно, 10 лет возможно и не понадобится но дороговато сей Нэо стоить будет :)
    Зачем полный реверс - тоже еще вопрос. Может он и не нужен.
     
  3. Navlib_lib

    Navlib_lib New Member

    Joined:
    1 Feb 2020
    Messages:
    42
    Likes Received:
    1
    Reputations:
    0
    Тогда развернём карты побольше:

    Я играю в одну игрушку. 1999 год, Фаргус, если это о чём-то говорит...[​IMG]
    Делаю для неё карты, моддинг, в общем. Делаю и для одиночной игры, и для мультиплеера. Все 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, что я делал, что да как, чтобы нагляднее было, может и реверс не нужен, может есть какой-то обходной пть для моей задачи.
     
  4. DartPhoenix

    DartPhoenix Elder - Старейшина

    Joined:
    15 Sep 2013
    Messages:
    1,107
    Likes Received:
    8,482
    Reputations:
    25
    Вообще от размера либы очень зависит но в среднем полный реверс будет гораздо дороже чем эту либу написать с нуля (если вообще не всю игрушку).

    Ветку с max_nodes_reached несложно и занопать коль ты ее уже нашел. Если ее туда воткнули чисто от нехер делать - сработает ок. Но скорее всего на это значение 700 или 694 или что там еще - опирается еще парочка компонентов и их все надо будет подправить. Лучше править прямо в готовом exe-шнике через OllyDbg чтобы сразу замечать изменения а потом уже их переносить в либу если все будет ок. Сам код найти несложно будет сигнатурно. Ты же уже нашел место в либе - значит просто ищешь такой же паттерн и в exe / dll. Сложность еще в том что баги вполне вероятны и придется активно тестить все после каждого изменения а это не очень прикольно.

    Я бы предположил что за пару килобаксов вполне возможно кого-то найти для решения проблемы. Но это работа такая что гарантии какбэ сложно дать, никто не знает что там внутри. Потому исполнителя желательно подбирать придирчиво ибо могут слегка кинуть и не прикопаешься потом.
     
  5. Navlib_lib

    Navlib_lib New Member

    Joined:
    1 Feb 2020
    Messages:
    42
    Likes Received:
    1
    Reputations:
    0

    Выкладываю виновника торжества - 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 КБ
     
  6. DartPhoenix

    DartPhoenix Elder - Старейшина

    Joined:
    15 Sep 2013
    Messages:
    1,107
    Likes Received:
    8,482
    Reputations:
    25
    Тю. Вот эта малышка ?
    Ну тогда может быть и можно :)

    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 на все что угодно (ну только что желательно размер не превышать :) ). И вполне возможно что все ок.
     
  7. Navlib_lib

    Navlib_lib New Member

    Joined:
    1 Feb 2020
    Messages:
    42
    Likes Received:
    1
    Reputations:
    0
    Блин, как вы это все делаете!? Я тогда минут 40 пытался в этой IDA найти вот этот самый,/ругательство/, фрагмент, потом плюнул и всё, а тут мгновенно...

    Это обнадёживает. Только вот я с Olly, IDA и HEX как попугай с интегральными уравнениями. Я могу заиметь наглость попросить тебя это всё провернуть, заменив 694 на ту же 1000, например, чтобы я сразу попытал у игры счастье - изменится лимит или нет? Как я понял, это дело 15 кликов мышкой:D
     
  8. DartPhoenix

    DartPhoenix Elder - Старейшина

    Joined:
    15 Sep 2013
    Messages:
    1,107
    Likes Received:
    8,482
    Reputations:
    25
    Я бы уже завернул, но у меня Линух. Мне просто нечем сие завернуть. Но ты вполне можешь кого-нибудь попросить и без всяких штук баксов :)
    Декомпилить тебе либу сомнительно что кто-то будет, а подправить - не сложно. Там кода не много.

    Если тут никто не ответит - попробуй на ExeLab попроси.
     
  9. Navlib_lib

    Navlib_lib New Member

    Joined:
    1 Feb 2020
    Messages:
    42
    Likes Received:
    1
    Reputations:
    0
    Линух как Ролех, понимаю. А может тогда туториал сделаешь, типо это открыл, сюда перенёс, исправил, радуешься? Или там на 19 страниц выйдет?
    А так сейчас ещё напишу куда-нибудь, кому-нибудь.
     
  10. DartPhoenix

    DartPhoenix Elder - Старейшина

    Joined:
    15 Sep 2013
    Messages:
    1,107
    Likes Received:
    8,482
    Reputations:
    25
    Мне и посмотреть не на чем. Надо как-то Olly перенести хотя-бы под Wine или поднять мерзкую Венду и под нее ставить...
    Очень геморно.

    Но вообще просто открой этот кусок в IDA там по идее HEX синхронизирован с дизасмом. И этот свой кусок скопируй в буфер обмена.
    В Ольке, в открытом exe по дизассемблерному коду правой кнопкой и "поиск". Вот как точно он называется я ушь и не помню. Там что-то типо поиск по сигнатуре или х/з. Но там в окне поиска будет предложено вводить hex-код. Вот найденный код туда вводишь - тебя перебрасывает по нужному адресу. Я думаю увидишь там свои 694 (только в шестнадцатиричном виде, это будет 0x2B6 вроде). Вот эти 0x2b6 ищешь, нажимаешь пробел превращаешь для пробы в какой-нибудь 0xfff и жмакаешь enter и может - быть esc потом. После чего выделяешь текст, по нему правой кнопкой и там будет пункт типо "сохранить изменения в файл" или что-то типо того. Сохраняешь (только желательно в отдельный файл а не в тот же самый) - и тестишь.
     
  11. Navlib_lib

    Navlib_lib New Member

    Joined:
    1 Feb 2020
    Messages:
    42
    Likes Received:
    1
    Reputations:
    0
    Рэмбо, а может ты мне ВК дашь свой? Я бы тебе картиночки посбрасывал, потому что вопросы возникают уже на моменте "открой этот кусок в IDA", я ей открываю .lib, а она его видит в четырёх .o, предлагая открыть один на выбор. Я бы прям по пунктам скриншотил и отсылал доброму человеку.
     
  12. DartPhoenix

    DartPhoenix Elder - Старейшина

    Joined:
    15 Sep 2013
    Messages:
    1,107
    Likes Received:
    8,482
    Reputations:
    25
    Скинь тот же вопрос лучше на exelab. Там нубы частенько бродят - им может быть будет тупо интересно поразбираться с этим барахлом. Заодно накидают ссылок если интересно именно реверсить.
    Если интересны просто игрушки - сильно рекомендуется затестить Unity. Там есть туториалы и практически нихрена не умея кодить - можно собрать вполне себе игрушку.
     
  13. Navlib_lib

    Navlib_lib New Member

    Joined:
    1 Feb 2020
    Messages:
    42
    Likes Received:
    1
    Reputations:
    0
    Я бы скинул, он не даёт мне создать новую тему.
     
  14. DartPhoenix

    DartPhoenix Elder - Старейшина

    Joined:
    15 Sep 2013
    Messages:
    1,107
    Likes Received:
    8,482
    Reputations:
    25
  15. Navlib_lib

    Navlib_lib New Member

    Joined:
    1 Feb 2020
    Messages:
    42
    Likes Received:
    1
    Reputations:
    0
    Да, опубликовался там. Кстати, если никто не согласится и придётся копать самому, какой .exe ты имел в виду, который нужно загружать в Olly? От игры что ли или сам .lib? Только он ведь не .exe...
     
  16. DartPhoenix

    DartPhoenix Elder - Старейшина

    Joined:
    15 Sep 2013
    Messages:
    1,107
    Likes Received:
    8,482
    Reputations:
    25
    От игры. Внутри него содержимое этой lib. Внутри него легче что-то изменить и попробовать ибо иначе тебе надо сначала изменить lib, потом перекомпилить exe. Попробовать. Если не получится - операцию повторить.
    Если он не PE-файл а Эльф - то тогда можно и lib менять.
     
  17. DartPhoenix

    DartPhoenix Elder - Старейшина

    Joined:
    15 Sep 2013
    Messages:
    1,107
    Likes Received:
    8,482
    Reputations:
    25
    Да и... они видать не скачивали просто. Они ожидают что там ЛИБА. А там этой либы - плюнуть и растереть :)
     
  18. Navlib_lib

    Navlib_lib New Member

    Joined:
    1 Feb 2020
    Messages:
    42
    Likes Received:
    1
    Reputations:
    0
    [​IMG]
    Через Олю я открыл, вроде норм, а Лида вместо .lib предлагает открыть одну из составляющих этого .lib, у тебя так же? Каковы действия?

    Нашёл читерский способ приковыривать сюда фото.


    P.S. - 1 Про "PE" и "'Эльф" ничего не понял:D

    P.S. - 2 Кстати, а как все будут это делать, если ни у кого нет того самого .exe от игры?:D
     
  19. DartPhoenix

    DartPhoenix Elder - Старейшина

    Joined:
    15 Sep 2013
    Messages:
    1,107
    Likes Received:
    8,482
    Reputations:
    25
    Что ты запускаешь чтобы пользоваться этой херней ? Какой файл ? Есть предположение что kpdata.exe

    1) В окне что ты видишь в IDA открываешь g_nav.obj и ищешь код который хочешь исправить. Там же где-то будет кнопалка типо "переключиться в HEX" нажимаешь на нее. Шестнадцатиричный вид должен открыться не по 0-му адресу а там где-то неведомо где но тебе это не сильно важно. Где-то в окрестностях ищешь 0x2b6. Цифр штук 5 которые до этого и еще штуки 4 после - сохраняешь где-то в блокноте.

    2) открываешь в OllyDbg - exe которым ты пользуешься (может быть kpdata.exe) и который уже скомпилен при помощи этой navlib. Нажимаешь правой кнопой на коде (лучше бы на памяти но так я точно не помню настолько чтобы объяснить, это обычно делается на автомате) и там где-то будет меню поиска. Будет возможность искать строки, команды... еще что-то... и сигнатуру. Может быть "binary data" или как-то так. Вот туда вводишь те цифры из п.1. Должно найти. Если нет - можешь попробовать другие цифры взять (желательно захватывая при этом 0x2b6).

    3) Когда найдешь заменяешь на что хочешь, выделяешь измененный код (можно с запасом) и нажимаешь на нем правой кнопой. Там ищешь команду которая позволит сохранить это безобразие. Ну собссно и все.
     
  20. DartPhoenix

    DartPhoenix Elder - Старейшина

    Joined:
    15 Sep 2013
    Messages:
    1,107
    Likes Received:
    8,482
    Reputations:
    25
    UPD: Моргот не новичок если что :) Ему тоже может быть люто лениво смотреть на все это дело. А ты, даже если это исправишь, можешь столкнуться с каким-нибудь Access Violation потому что эти 695 наверняка сохраняются где-то в массиве. Искать это по дизасму - сомнительное удовольствие а вот в отладчике - несложно. Но ты я думаю сам не найдешь. Так что... х/з.