* Может указатели дублируются т.к. протектор не хавает указатели из оригинала и добавляет свои в таблицу импорта ? * А почему импорт не чинится так как есть ? ImpRec ошибку выдает какую-то или что ? (не могу проверить, нет под рукой рабочего маздая). Можно попробовать самому руками починить. Насчет готовой тулзы х/з. Это надо на кряклабе бы спросить. У них там вроде серьезные траблы с оригиналом - но некоторые вроде-как поселились по этому адресу: (https://cracklab.team/index.php)
Протектор нормально хавает все адреса, он всю таблицу импорта поочередно для каждой функции заполняет и делает передресацию на свою таблицу - правильную, а там где должны быть адреса функций лежат указатели на переадресованые элементы в секцию созданную протектором, я нахожу переход где определяется оставлять ли функцию как есть или же переадресовывать, забиваю его нопами и в итоге все адреса в нормальном виде все на своем месте, и после запуска программы она нормально работает с этой таблицей, но когда снимается дамп, то обнаруживается, что в IAT дублируются адреса, в памяти оно нормально все работет, но вот когда восстанавливается таблица для дампа то возникает вопрос, куда пихать вторые элементы, я вроде знаю как работает загрузка функций по IT и IAT и там не должно быть повторяющихся имен, нельзя загрузить одну и ту же библиотеку 2 раза, с функциями думаю можно, но компиляторы так не делают, в стандартной реализации в IT на каждую библиотеку каждая функция имеет только одну ячейку.
На словах честно говоря я плохо себе картину представляю... а просить файлик смысла нет, мне посмотреть нечем. Но лучше, его-бы выложить наверное.
Что нужно писать в окошке подчеркнутом зеленой линией, что бы логгировать сразу 2 значения, одно это адрес возврата, другое это ссылка на строку в параметре функции. Если убрать ESP вначале, то просто отдельно строку в лог пишет, и второй вопрос, как получить доступ к счетчику срабатываний остановок, залоггировать это значение и потом получить доступ к нему для установления условия остановки, какая переменная использутся для счетчика ? http://radikal.ru]
Чем тебе поможет условная бряка лучше скажи... Не зарывайся в эту хрень. Если в самом деле это Обсидиум - он не совсем для новичков, но тогда надо искать паттерны как он ломится гуглить стандартные вызовы. Тоесть полюбому там какой-то rep должен быть. В любом случае твой лог тебе выдаст кучу непонятных данных. Для начала скажи, почему это ты решил что в импортах не может быть дублей ? Там может быть что угодно вообще говоря. Почему не дубли ?
В протекторе нет исключений, что бы подобраться максимально близко к OEP я подбираюсь к ней используя бряк на GetProcAddress которую используют все упаковщики, что бы заполнить таблицу импорта, смотрю по адресу возврата когда последний раз эта функция вызывалась из секции протектора и смотрю какую функцию она подгружала, после этого ставлю условие остановки что бы бряк сработал на загрузке именно последней функции и при выходе мы имеем почти заполненую таблицу импорта за исключением последнего элемента и перед нами где то впереди переход либо на OEP либо на украденые байты. Это все нужно, когда нет других методов подобраться к точке входа максимально близко, а трассировать вручную тонны асмокода это само#бство. Вот зачем я использую логирование, но до этого я логировал по отдельности адреса возврата и считал, какой пункт по счету мне нужен, потом логировал отдельно имена функций из параметра и смотрел уже по индексу какая мне подходит, вот что бы эту двофную работу не делать, мне нужно в лог писать сразу 2 значения - адрес возврата + Имя Функции
OEP - есть у самых банальных и тупых протекторов. Что может быть проще. Найти оеп, скинуть дамп, пофиксить импорты - и поехали. Но у тебя, как ты видишь, что-то уже нестандартное. И реально никак нельзя сказать что, если не посмотреть на сам PE-шник. Пусть я не могу (хотя ида у меня есть в принципе... ). Но если ты хочешь получить ответ на свой вопрос - нужен поциент. Описанием не отмажешься. ИМХО конечно же.
Ну вот самое простое. Что значит импортов не может быть несколько ? Это в таблице имен или в таблице адресов не может быть несколько ? В таблице имен - сколько угодно вроде... Да и в таблице адресов. Ну тоесть... надо бы желательно это увидеть. Я х/з что ты имеешь ввиду что не может быть. Спецификация позволяет, лодырь грузит....
Я скину сюда чуть позже файлик с такой же проблемой накрытый FSG 1.3 там точно такое же дубли появляются, а по поводу условий ответите ? Как записать в лог сразу 2 значения в одну строку ? Например [esp] и STRING [[esp+4]] что бы выдало мне примерно такой лог - 00475674 MessageBoxA
Не. Я одно время юзал е109 кажется... для разбора файликов - потом вручную разбирал. Не могу так сказать... Но я и не профессиональный крякер. На кряклабе я могу только порекомендовать спросить. Эти перцы живут кряком. Они по внешнему виду определят что это, если оно стандартное.
Я говорю о таблице символов, ладно еще если человек пишет малварь и может вручную специально накидать всякого говна в таблицу что бы запутать реверсера когда это все дело пишется а ассемблере, но в нормальной программе обычно все собирается обычным компилятором, касательно языков высокого уровня, никакой нормальный компилятор не станет 2 раза упоминать символьное название функции.я к тому что пакер накрывает нормальную программу, и по идее при реконструкции импорта не должно быть повторов
Ну так можно предположить что это не компилятор. Или ты забыл флаги. Может это форвардинг. Тоесть указывается что данная функция импортируется и экспортируется одновременно. Тогда такое может быть. Может быть такое что эти импорты вообще декодируют код ! Как править код ? Пусть его правит лодырь ! Ты кидаешь ему оффсет на ноп,джампхуйзнаеткуда,ксор_rax-dword_pointer_жопа мира - а он превращает это в pop ebp, add eax,4 jmp LoadLibrary (условно). И это делалось с древних времен пока новые ВайтиВАйти не завалили на сцену. ====================== Если оно выглядит как код на c++, пахнет как код на c++, и по цвету похоже - это не обязательно оно и есть
Почему же у самых банальных, та же фемида и вмпрот со всеми своими виртуальными машинами "виртуализируют" только точку входа помоему до первого call, по сути те же украденые байты, вся эта VM это не более чем морфленые инструкции с оригинальной точки входа вперемешку с мусором. После отработки которых передается управление дальше на код оригинальной программы. Тут два пути, либо просто прицепить полностью секцию с VM к файлу и передавать управление на нее, а после ее отработки делать джамп на продолжение оригинального кода, либо сидеть копать ВМ и отделять мусор от реально нужного кода, а потом подбирать инструкции, которые будут делать то же самое, только что бы они нормально улеглись в место откуда их украли. К чему это я, а к тому, что и в сложных и простых пакерах существует и понятие OEP и фальшивая EP, только реализация разная, где-то это просто тупо скопированный код в другое место, а где то "VM"
Слова банальных и фемида - плохо сочетаются. Фемида, при правильном подходе, может виртуализовать твои функции. ======================= И вот в данном случае - тот вызов что кажется тебе двойным - на самом деле может служить делу расшифровки ключа, получения заранее предсказанного значения. И хрен его знает чего еще. Тут проблема кстати больше не у дешифровщика а у шифровщика. Как говорицо попробуй написать криптор который ты сочтешь вершиной мастерства. Написать то, что сам не сможешь сломать.
Ну да. А у тебя похоже не простенький прот. Поэтому просто так на словах... не думаю что кто-то даст тебе более или менее полезный ответ.
Вопрос решен, протектор записывал либо ложную, либо свою таблицу импорта вплотную к нормальной таблице, от этого казалось что все это одна таблица, так как выглядела она в принципе нормально и логично, а при попытке почининить в реконструкторе он видимо чужую таблицу импорта еще приделывать пытался, нашел начало оригинальной и дело в шляпе, плюс реконструктор некоторые функции неправильно распознал, после перепроверки вызовов вручную и правки все заработало.
Вопрос о поводу того как мне вывести в лог сразу 2 разных выражения остается открытым Что писать в expression, что бы при CondLogBp на функцию GetProcAddress вывести [esp] и STRING [[esp+4]] => адрес возврата из функции и текстовый параметр передаваемый функции Что бы получить в логах отчет вида 0044570 GetVersion 0044860 GetModuleHandleA ... 0047340 LoadLibraryA http://radikal.ru]
Странное у тебя окно... Насколько я помню - там было одно поле Expression и там можно было писать name=expr, name=expr... Посмотри, может в настройках где это есть. Нет - можно и скриптом сделать, но вообще должно где-то быть. UPD: По идее это было где-то в старой версии Ольги, когда можно было только одно выражение получать но им вообще не особо пользовались. Был всегда OllyScript и там все гораздо веселее. Можно погуглить, где-то должны быть скрипты для этих задач. Что-то типа такого: http://www.openrce.org/blog/view/261/conditional_logging_of_multiple_expressions_in_ollydbg