Реверсинг. Задай вопрос - получи ответ

Discussion in 'Реверсинг' started by 0x0c0de, 2 Sep 2007.

  1. DartPhoenix

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

    Joined:
    15 Sep 2013
    Messages:
    1,080
    Likes Received:
    8,149
    Reputations:
    25
    * Может указатели дублируются т.к. протектор не хавает указатели из оригинала и добавляет свои в таблицу импорта ?

    * А почему импорт не чинится так как есть ? ImpRec ошибку выдает какую-то или что ? (не могу проверить, нет под рукой рабочего маздая).
    Можно попробовать самому руками починить. Насчет готовой тулзы х/з. Это надо на кряклабе бы спросить. У них там вроде серьезные траблы с оригиналом - но некоторые вроде-как поселились по этому адресу: (https://cracklab.team/index.php)
     
  2. mirvirusov

    mirvirusov New Member

    Joined:
    11 Jun 2021
    Messages:
    29
    Likes Received:
    3
    Reputations:
    0
    Протектор нормально хавает все адреса, он всю таблицу импорта поочередно для каждой функции заполняет и делает передресацию на свою таблицу - правильную, а там где должны быть адреса функций лежат указатели на переадресованые элементы в секцию созданную протектором, я нахожу переход где определяется оставлять ли функцию как есть или же переадресовывать, забиваю его нопами и в итоге все адреса в нормальном виде все на своем месте, и после запуска программы она нормально работает с этой таблицей, но когда снимается дамп, то обнаруживается, что в IAT дублируются адреса, в памяти оно нормально все работет, но вот когда восстанавливается таблица для дампа то возникает вопрос, куда пихать вторые элементы, я вроде знаю как работает загрузка функций по IT и IAT и там не должно быть повторяющихся имен, нельзя загрузить одну и ту же библиотеку 2 раза, с функциями думаю можно, но компиляторы так не делают, в стандартной реализации в IT на каждую библиотеку каждая функция имеет только одну ячейку.
     
  3. DartPhoenix

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

    Joined:
    15 Sep 2013
    Messages:
    1,080
    Likes Received:
    8,149
    Reputations:
    25
    На словах честно говоря я плохо себе картину представляю... а просить файлик смысла нет, мне посмотреть нечем.
    Но лучше, его-бы выложить наверное.
     
  4. #colorblind

    #colorblind Moderator

    Joined:
    31 Jan 2014
    Messages:
    632
    Likes Received:
    245
    Reputations:
    42
    По поведению похоже на обсидиум. Но как говорится нет тела - нет дела
     
  5. mirvirusov

    mirvirusov New Member

    Joined:
    11 Jun 2021
    Messages:
    29
    Likes Received:
    3
    Reputations:
    0
    [​IMG]
    Что нужно писать в окошке подчеркнутом зеленой линией, что бы логгировать сразу 2 значения, одно это адрес возврата, другое это ссылка на строку в параметре функции. Если убрать ESP вначале, то просто отдельно строку в лог пишет, и второй вопрос, как получить доступ к счетчику срабатываний остановок, залоггировать это значение и потом получить доступ к нему для установления условия остановки, какая переменная использутся для счетчика ?
    http://radikal.ru][​IMG]
     
  6. DartPhoenix

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

    Joined:
    15 Sep 2013
    Messages:
    1,080
    Likes Received:
    8,149
    Reputations:
    25
    Чем тебе поможет условная бряка лучше скажи...
    Не зарывайся в эту хрень. Если в самом деле это Обсидиум - он не совсем для новичков, но тогда надо искать паттерны как он ломится гуглить стандартные вызовы.
    Тоесть полюбому там какой-то rep должен быть.

    В любом случае твой лог тебе выдаст кучу непонятных данных.
    Для начала скажи, почему это ты решил что в импортах не может быть дублей ? Там может быть что угодно вообще говоря. Почему не дубли ?
     
  7. mirvirusov

    mirvirusov New Member

    Joined:
    11 Jun 2021
    Messages:
    29
    Likes Received:
    3
    Reputations:
    0
    В протекторе нет исключений, что бы подобраться максимально близко к OEP я подбираюсь к ней используя бряк на GetProcAddress которую используют все упаковщики, что бы заполнить таблицу импорта, смотрю по адресу возврата когда последний раз эта функция вызывалась из секции протектора и смотрю какую функцию она подгружала, после этого ставлю условие остановки что бы бряк сработал на загрузке именно последней функции и при выходе мы имеем почти заполненую таблицу импорта за исключением последнего элемента и перед нами где то впереди переход либо на OEP либо на украденые байты. Это все нужно, когда нет других методов подобраться к точке входа максимально близко, а трассировать вручную тонны асмокода это само#бство. Вот зачем я использую логирование, но до этого я логировал по отдельности адреса возврата и считал, какой пункт по счету мне нужен, потом логировал отдельно имена функций из параметра и смотрел уже по индексу какая мне подходит, вот что бы эту двофную работу не делать, мне нужно в лог писать сразу 2 значения - адрес возврата + Имя Функции
     
  8. DartPhoenix

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

    Joined:
    15 Sep 2013
    Messages:
    1,080
    Likes Received:
    8,149
    Reputations:
    25
    OEP - есть у самых банальных и тупых протекторов. Что может быть проще. Найти оеп, скинуть дамп, пофиксить импорты - и поехали.
    Но у тебя, как ты видишь, что-то уже нестандартное.

    И реально никак нельзя сказать что, если не посмотреть на сам PE-шник. Пусть я не могу (хотя ида у меня есть в принципе... :) ). Но
    если ты хочешь получить ответ на свой вопрос - нужен поциент. Описанием не отмажешься. ИМХО конечно же.
     
  9. DartPhoenix

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

    Joined:
    15 Sep 2013
    Messages:
    1,080
    Likes Received:
    8,149
    Reputations:
    25
    Ну вот самое простое. Что значит импортов не может быть несколько ?
    Это в таблице имен или в таблице адресов не может быть несколько ?

    В таблице имен - сколько угодно вроде... Да и в таблице адресов.
    Ну тоесть... надо бы желательно это увидеть. Я х/з что ты имеешь ввиду что не может быть.
    Спецификация позволяет, лодырь грузит....
     
  10. mirvirusov

    mirvirusov New Member

    Joined:
    11 Jun 2021
    Messages:
    29
    Likes Received:
    3
    Reputations:
    0
    Я скину сюда чуть позже файлик с такой же проблемой накрытый FSG 1.3 там точно такое же дубли появляются, а по поводу условий ответите ? Как записать в лог сразу 2 значения в одну строку ? Например [esp] и STRING [[esp+4]]
    что бы выдало мне примерно такой лог - 00475674 MessageBoxA
     
    DartPhoenix likes this.
  11. DartPhoenix

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

    Joined:
    15 Sep 2013
    Messages:
    1,080
    Likes Received:
    8,149
    Reputations:
    25
    Не. Я одно время юзал е109 кажется... для разбора файликов - потом вручную разбирал. Не могу так сказать...
    Но я и не профессиональный крякер. На кряклабе я могу только порекомендовать спросить. Эти перцы живут кряком. Они по внешнему виду определят что это, если оно стандартное.
     
  12. mirvirusov

    mirvirusov New Member

    Joined:
    11 Jun 2021
    Messages:
    29
    Likes Received:
    3
    Reputations:
    0
    Я говорю о таблице символов, ладно еще если человек пишет малварь и может вручную специально накидать всякого говна в таблицу что бы запутать реверсера когда это все дело пишется а ассемблере, но в нормальной программе обычно все собирается обычным компилятором, касательно языков высокого уровня, никакой нормальный компилятор не станет 2 раза упоминать символьное название функции.я к тому что пакер накрывает нормальную программу, и по идее при реконструкции импорта не должно быть повторов
     
  13. DartPhoenix

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

    Joined:
    15 Sep 2013
    Messages:
    1,080
    Likes Received:
    8,149
    Reputations:
    25
    Ну так можно предположить что это не компилятор.
    Или ты забыл флаги. Может это форвардинг. Тоесть указывается что данная функция импортируется и экспортируется одновременно. Тогда такое может быть.
    Может быть такое что эти импорты вообще декодируют код ! Как править код ? Пусть его правит лодырь ! Ты кидаешь ему оффсет на ноп,джампхуйзнаеткуда,ксор_rax-dword_pointer_жопа мира - а он превращает это в pop ebp, add eax,4 jmp LoadLibrary (условно).

    И это делалось с древних времен пока новые ВайтиВАйти не завалили на сцену.
    ======================
    Если оно выглядит как код на c++, пахнет как код на c++, и по цвету похоже - это не обязательно оно и есть :)
     
  14. mirvirusov

    mirvirusov New Member

    Joined:
    11 Jun 2021
    Messages:
    29
    Likes Received:
    3
    Reputations:
    0
    Почему же у самых банальных, та же фемида и вмпрот со всеми своими виртуальными машинами "виртуализируют" только точку входа помоему до первого call, по сути те же украденые байты, вся эта VM это не более чем морфленые инструкции с оригинальной точки входа вперемешку с мусором. После отработки которых передается управление дальше на код оригинальной программы. Тут два пути, либо просто прицепить полностью секцию с VM к файлу и передавать управление на нее, а после ее отработки делать джамп на продолжение оригинального кода, либо сидеть копать ВМ и отделять мусор от реально нужного кода, а потом подбирать инструкции, которые будут делать то же самое, только что бы они нормально улеглись в место откуда их украли. К чему это я, а к тому, что и в сложных и простых пакерах существует и понятие OEP и фальшивая EP, только реализация разная, где-то это просто тупо скопированный код в другое место, а где то "VM"
     
  15. DartPhoenix

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

    Joined:
    15 Sep 2013
    Messages:
    1,080
    Likes Received:
    8,149
    Reputations:
    25
    Слова банальных и фемида - плохо сочетаются.

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

    Написать то, что сам не сможешь сломать.
     
  16. mirvirusov

    mirvirusov New Member

    Joined:
    11 Jun 2021
    Messages:
    29
    Likes Received:
    3
    Reputations:
    0
    Я не фемиду банальной назвал, имел ввиду что не только к простеньким протам применяется понятие OEP
     
  17. DartPhoenix

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

    Joined:
    15 Sep 2013
    Messages:
    1,080
    Likes Received:
    8,149
    Reputations:
    25
    Ну да. А у тебя похоже не простенький прот. Поэтому просто так на словах... не думаю что кто-то даст тебе более или менее полезный ответ.
     
  18. mirvirusov

    mirvirusov New Member

    Joined:
    11 Jun 2021
    Messages:
    29
    Likes Received:
    3
    Reputations:
    0
    Вопрос решен, протектор записывал либо ложную, либо свою таблицу импорта вплотную к нормальной таблице, от этого казалось что все это одна таблица, так как выглядела она в принципе нормально и логично, а при попытке почининить в реконструкторе он видимо чужую таблицу импорта еще приделывать пытался, нашел начало оригинальной и дело в шляпе, плюс реконструктор некоторые функции неправильно распознал, после перепроверки вызовов вручную и правки все заработало.
     
    DartPhoenix likes this.
  19. mirvirusov

    mirvirusov New Member

    Joined:
    11 Jun 2021
    Messages:
    29
    Likes Received:
    3
    Reputations:
    0
    Вопрос о поводу того как мне вывести в лог сразу 2 разных выражения остается открытым
    Что писать в expression, что бы при CondLogBp на функцию GetProcAddress вывести [esp] и STRING [[esp+4]] => адрес возврата из функции и текстовый параметр передаваемый функции
    Что бы получить в логах отчет вида
    0044570 GetVersion
    0044860 GetModuleHandleA
    ...
    0047340 LoadLibraryA
    http://radikal.ru][​IMG]
     
  20. DartPhoenix

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

    Joined:
    15 Sep 2013
    Messages:
    1,080
    Likes Received:
    8,149
    Reputations:
    25
    Странное у тебя окно... Насколько я помню - там было одно поле Expression и там можно было писать name=expr, name=expr...
    Посмотри, может в настройках где это есть. Нет - можно и скриптом сделать, но вообще должно где-то быть.

    UPD: По идее это было где-то в старой версии Ольги, когда можно было только одно выражение получать но им вообще не особо пользовались. Был всегда OllyScript и там все гораздо веселее.

    Можно погуглить, где-то должны быть скрипты для этих задач.
    Что-то типа такого: http://www.openrce.org/blog/view/261/conditional_logging_of_multiple_expressions_in_ollydbg
     
    #1260 DartPhoenix, 13 Jun 2021
    Last edited: 13 Jun 2021