The silicon realms toolworks что это за программа
Как была закейгенена Armadillo, взломана PSP и скомпрометированы все DSA ключи в Debian. Или еще раз о слабых ГПСЧ и (EC)DSA
Лет семь назад попал в руки крякеров архив с сорцом генератора ключей для протектора под названием Armadillo. Просто кое-кому из благодарных пользователей продукта захотелось проверить его на прочность. А где еще получишь бесплатный аудит такого интересного кода, как не на крякерском форуме.
Этот генератор нужен был для того, чтобы при покупке клиентом вашей программы, защищенной Armadillo, мерчант смог сам автоматически сгенерировать для неё лицензионный ключ. Так же, он использовался в самой Armadillo и, если б была возможность узнать секрет, то можно было бы сделать кейген для неё самой. Что делало аудит кода вдвойне интересным.
Итак, вот он, оригинальный, добытый путём титанических усилий, архив. (исходник на C)
Попробуйте без подсказок понять, в чем именно сокрыта уязвимость. Там хоть и куча кода, но он хорошо читаем. Не получилось? А если глянуть на 528 строчку?
Ну, во-первых там несколько типов ключей. Старые, новые и т. д. Нам интересны самые крутые, так называемые Short level V10 ECC signed keys для которых отведена добрая половина сорца с математикой больших чисел и эллиптикой. Так что, будем ломать ECDSA!
Используется кривая в 112 бит, секретный ключ (x) тоже 112 бит. Это немного многовато для брутфорса.
Секретные значения берутся из ГПСЧ, который инициализируется… тада! 32 битным числом!
Матан
Чтобы сделать кейген, нужно иметь пару валидных ключей для программы. В принципе, можно обойтись и одним, но первые версии брутфорсилки нуждались в двух ключах, чтобы проверить правильность теории. Ниже будет показано, зачем.
Ох и нелегко их было получить! Ведь когда покупаешь Armadillo, генерится временный ключ. И только потом, лично пообщавшись с разработчиком, получаешь настоящий. Но, я опять отступил от темы, продолжим.
В ключе лежат параметры ECDSA параметры h,r,s. h — хэш сообщения, r,s — параметры подписи.
Как их оттуда доставать можно глянуть в сорцах, единственное что r и s называются в них c и d.
Итак, у нас есть две тройки (r, s) h и (r’, s’) h’
(EC)DSA
Я буду показывать формулы на примере DSA, т.к. суть уязвимости та же и суть формул та же, просто они гораздо читабельней.
Секретным ключом в (EC)DSA является случайно выбранное число x. Так же (уже только в DSA), выбираются два больших простых числа:
q, размер которого совпадает с размером хэш функции в битах.
p, такого, что (p-1) делится на q.
Еще выбирается число g такое, что его мультипликативный порядок по модулю p равен q (см статью на вики). Но, нам это не интересно, просто это число будет встречаться в формулах.
Чтобы сгенерировать цифровую подпись мы выполняем следующие действия:
Где H(m) — хэш сообщения, которое мы подписываем.
Уязвимость
Перенесем k влево
k = (h– h’) / (s – s’)
Что и было сделано группой fail0verflow в 2010 году, т.к. жопорукие кодеры из Sony додумались сгенерить k лишь единожды
Алгоритм перебора (все операции по модулю):
И так для обоих ключей. Получается на двоих где-то 2.6 гига данных. Потом просто надо найти в них одинаковый x, он и будет секретным ключом.
Ну а что до армадиллы, мы знатно потроллили разработчиков(кейген работал несколько версий), а потом уязвимость пофиксили (обновленные сорцы кейгена тоже имеются, можете сравнить). Кстати, походу, это эксклюзив, на паблик я этот архив не выкладывал. И было это, кстати, раньше, чем упомянутые взломы PSP и дыра в дебиане.
Надеюсь, было интересно. Берегите свои ГПСЧ.
Вот архив с той самой армадиллой и двумя валидными ключами на моё имя. Можете попробовать в качестве задания на дом сгенерить ключик на себя.
Для 80 lvl: обойдитесь одним ключом. А что, вполне себе олимпиадная задачка
Armadillo: защити свою программу от взлома. Часть 1
К написанию данной статьи меня побудила находка, которую я сделал, разбирая свои старые архивы. Давным-давно я интересовался методикой разработки и последующей продажи shareware-программ, накопил множество учебных материалов, статей, выдержек с форумов, рассказывающих о тонкостях этого процесса. В мир shareware я так и не пришел, но многие наработки, которые я сделал, мне пригодились в последующем. Сегодня я расскажу об одной из наиболее важных задач — защите созданного вами ПО от кражи или взлома.
Я не собираюсь посвятить эту статью assembler’у и всяким низкоуровневым хитростям, методикам работы с отладчиком, распаковщиками и прочим специализированным софтом. Я уверен, что, если вы никогда не занимались ничем подобным, то вряд ли, прочитав пяток-другой статей по этой тематике, сможете создать защиту для вашей программы, способную противостоять опытному взломщику более 5 минут. Я полагаю, что, если у вас есть отличная идея, то вы должны сосредоточиться на ее полировке, может быть, ее реализации на каком-то из высокоуровневых языков программирования: visual c++, delphi… Что касается вопроса защиты ПО, то пусть лучше этим занимаются специалисты. Вы не первые, у кого возникает подобная потребность, и рынок давно сориентировался, предоставляя наборы высокоуровневых библиотек или специальных систем, играющих роль «сейфа» для вашей программы. С другой стороны, как раз эти программные комплексы становятся одной из целей всевозможных взломщиков. Верх идиотизма в этой ситуации, когда на пиратских сайтах можно найти кряк для программы, с помощью которой планируется защищать другой софт. Доступны специализированные пиратские утилиты, целью которых является взлом ЛЮБЫХ защищенных с помощью некоторой библиотеки программ. Имеет ли смысл вообще полагаться на такие универсальные защитные системы или стоит разрабатывать что-нибудь свое? Ни то, ни то решение не является идеальным. Большей частью подобные универсальные «взламыватели» срабатывают для программ, разработчики которых не удосужились проштудировать справку и решили, что, нажав одну большую кнопку «защитить», они решат свои проблемы. Грамотная защита должна быть комплексной, существует ряд методик, заточенных под конкретные программы защиты, и эти методики следует применять, комбинируя между собой.
Выпускается две версии armadillo: basic и professional editions. Различий между ними не так уж много: в версии professional больше возможностей работы с аппаратными ключами, поддержка передачи лицензий, больше возможностей управлять временем работы программы, ключа, количеством запусков по сравнению с basic-версией. В основе своей обе версии armadillo используют одинаковый способ защиты вашей программы. Прежде всего, программа шифруется с помощью некоторого секретного ключа, сам ключ помещается в специальное хранилище, которое и защищается armadillo. Если указать неверный ключ, то после расшифровки программы взломщик получит «мусор». Также файл программы сжимается — это дает еще один уровень защиты от взлома плюс, если вы планируете распространять программу через Internet, это позволит вам экономить немножко денег на трафике. Ключи, которые вы рассылаете клиентам, могут быть похищены и выложены на каком-нибудь пиратском сайте. В таком случае вам необходимо оперативно это отследить и добавить похищенный ключ в специальную базу Stolen Codes Database. Когда вы выпустите новую версию программы, к ней уже не подойдут те ключи, которые вы поместили в черный список. Если пираты не могут похитить ключ для программы, они могут создать для нее «патч» — например, аккуратно вырезав из программы часть кода, которая проверяет корректность введенного ключа. Надо сказать, подобный способ взлома является одним из наиболее популярных. Например, вы решили создать собственную систему защиты, проверяющую введенный в диалоговом окне пользователем ключ доступа, и, если код совпадает с некоторым значением, то программа продолжает работу, иначе же аварийно завершается. Так вот, путем несложной замены пары байт в двоичном коде программы можно изменить условие проверки на противоположное, и любой неправильный код будет принят за верный. Для защиты от этого armadillo контролирует целостность и неизменность кода программы и своей защиты. В случае модификации выводится сообщение, что программа была модифицирована, и ее запуск блокируется. Также популярный способ взлома основан на возврате системных часов назад. Так, если у вас есть лицензия на программу до 1 июня, то после истечения этой даты, вернув часы на месяц назад, вы снова получаете рабочую программу. С armadillo этот фокус не пройдет. Один из наиболее надежных способов защиты — custom build. Его задача — защита от универсальных взломщиков. Идея в том, что после покупки armadillo вы можете запросить для себя ее custom build версию. Возможности ее абсолютно идентичны возможностям «обычной» версии armadillo, но сам код системы защиты расположен немного по-другому, что резко повышает сложность взлома вашей программы. По крайней мере, до тех пор, пока она не станет настолько популярной, что для нее создадут специализированный «взломщик», а не будут пытаться обойтись универсальным. Система защиты armadillo активно использует понятие сертификата. Сертификат служит не только для защиты программы, но и для контроля правил ее использования. Например, вы можете ограничить время использования программы (т.е., по сути, реализовать основную идею shareware: попробуй, и, если понравится, можешь купить). Также можно ограничить максимальное количество раз ее запуска.
Остальные закладки я пропущу, т.к. планирую рассказать о методиках привязки проекта к аппаратным ключам в следующий раз. Пока же мы переходим на закладку Certificates. На этой закладке перечисляется список сертификатов (воспринимайте сертификат как способ указать, как именно можно использовать программу). Естественно, что сертификаты, а также ключи, служащие для активации сертификата, не возникают из ниоткуда. Так, когда вы создаете очередной сертификат, то должны придумать некоторую фразу: именно эта фраза — ваш самый главный секрет. Если кто-либо узнает эту фразу-секрет, он может выполнить генерацию любого количества ключей/сертификатов. Надо сказать, генерация этих ключей не такая уж простая задача — я имею в виду не технический фактор, а социальный. Например, вы написали программу, которую хотите продавать за деньги как shareware. Вы узнали, что существуют специальные сайты-регистраторы — они выступают в роли посредника между вами — автором программы — и клиентами. Клиент заходит на сайт регистратора, указывает, какую версию программы хочет купить, указывает банковские данные, номер кредитки и т.д. Регистратор берет на себя задачу проверки этих сведений, получает деньги от клиента и по мере накопления некоторой суммы высылает чек, переводит на счет или иным способом доставляет вам деньги. Самое интересное в том, как клиент получит ключ для скачанной с вашего сайта программы. В самом простом случае регистратор пишет вам письмо: «мол, так и так, вашу программу купили — вышлите, пожалуйста, ключик». Но вы не получаете это письмо, потому что оно потерялось в ходе пересылки, его посчитали за спам и удалили, или у вас приступ насморка. В любом случае вы не можете сгенерировать и выслать клиенту этот самый ключ. Как следствие клиент недоволен, а регистратор и вы теряете деньги. Кому это надо? Поэтому регистраторы предоставляют услугу автоматической генерации ключа и ее отправки клиенту. Так, в справке armadillo написано, что они сотрудничают с рядом регистраторов, и вам нужно всего лишь выслать регистратору эту самую секретную фразу, на основании которой при подтверждении оплаты сервер регистратора выполнит генерацию ключа и отправит ее клиенту — все полностью автоматизировано. Особенно полезна эта функция в случае действительно массовых покупок. С другой стороны, если вы потеряете секретную фразу или ее получит недобросовестный регистратор, то вы оказываетесь в очень неприятной ситуации. Вы вынуждены отозвать все ключи, выполненные по скомпрометированной схеме генерации, и выслать новый ключ для всех добросовестных клиентов. Иначе, когда вы выпустите обновление программы и защитите его новой схемой генерации ключа, старые ключи клиентов уже не подойдут. Вы можете создать любое количество сертификатов для вашей программы, но существует особый вид сертификата (он создается всегда по умолчанию) DEFAULT. Этот сертификат используется для запуска программы в режиме demo (ограниченной функциональности) или в режиме shareware (ограниченной по времени работы). В случае, если вы хотите распространять свою программу как коммерческую (здесь под коммерческой схемой распространения подразумевается схема, когда мы не можем предварительно опробовать в течение некоторого времени возможности и решить, будем ли мы покупать программу), то такой сертификат вам не нужен, и его следует удалить из проекта. Давайте разберем один из важнейших параметров сертификата: когда и как будет принято решение о его отзыве. На закладке Certificate Expires возможны следующие варианты:
1. Сертификат станет недействительным по истечении N дней после установки. Для сертификата default отсчет начинается после первого запуска, для остальных видов сертификатов отсчет идет от даты, когда ключ был введен в систему защиты armadillo.
2. Сертификат становится недействительным по достижении заданной даты.
3. Срок истечения сертификата определяется не временем, а количеством раз запуска программы.·Интересна возможность внести параметр количества запусков в процедуру генерации ключа. Т.е., когда клиент у вас запрашивает ключ, вы должны указать, сколько раз эту программу можно запустить.
4. Сертификат, перестающий действовать по достижении некоторой версии программы.
5. И, наконец, комбинированный случай: здесь задается и количество дней использования, и количество попыток запуска.
6. Интересен вариант с указаниеммаксимального промежутка времени, в течение которого программа будет работать. Так, по достижении, скажем, 10 минут после запуска программа будет аварийно закрыта. Причем вы вольны указать, будет ли пользователь извещен об окончании срока действия с тем, чтобы он мог сохранить результаты работы.
7. Возможно управлять временем, в течение которого программа должна быть установлена. Например, вы выпустили ключ «1.04.2007» и хотите, чтобы его установка была проведена до истечения данного года. Такую методику обычно применяют для beta-версий, рассчитывая к концу года выпустить следующую версию продукта, так что устанавливать и тестировать устаревший вариант уже не следует.
В следующий раз я продолжу рассказ об armadillo. Мы завершим рассмотрение аппаратных ключей, а также методов программного взаимодействия с armadillo api.
black zorro, black-zorro@tut.by
Компьютерная газета. Статья была опубликована в номере 33 за 2007 год в рубрике soft
13.5. Несколько интересных протекторов
В настоящий момент разработано достаточно большое число протекторов исполняемых файлов. Многие из них бесплатны и созданы энтузиастами, которым просто интересно попробовать свои силы в защите программ. Разумеется, есть и коммерческие протекторы. А некоторые протекторы являются составляющими частями более сложных комплексов, включающих в себя привязку к аппаратным ключам или компакт-дискам.
Рассмотрим основные характеристики нескольких наиболее интересных протекторов.
13.5.1. ASProtect
Для защиты условно бесплатных программ чаще всего, наверное, применяется ASProtect — протектор, разработанный Алексеем Солодовниковым. ASProtect был чуть ли не первым серьезным протектором, сочетавшим в себе основные функции, применяемые для защиты программ:
Однако, благодаря огромной популярности ASProtect является и одним из самых хорошо изученных протекторов — почти для всех хитростей, применяемых в ASProtect, разработаны или автоматические, или полуавтоматические средства обхода.
Иногда у программ, защищенных ASProtect, возникают проблемы с работой под новыми версиями операционных систем, но автор не прекращает работы по совершенствованию протектора и стремится оперативно исправлять все обнаруженные ошибки, а также добавлять новые защитные механизмы.
13.5.2. Armadillo
Непривычный метод взаимодействия с защищаемой программой использует протектор, разработанный компанией The Silicon Realms Toolworks и носящий название Armadillo. При запуске защищенная программа выполняется как 2 процесса. Первый процесс, в котором работает основной код протектора, создает в режиме отладки второй процесс, содержащий собственно защищенную программу, и управляет его выполнением.
Протектор Armadillo применяет оригинальные технологии, называемые СоруМетП и Nanomites, для защиты кода выполняемой программы от считывания из памяти. Технология СоруМетП уже хорошо изучена и легко обходится автоматическими депротекторами. Про существование автомата, способного обойти Nanomites, пока не известно, но были многочисленные сообщения о ручной распаковке программ, при защите которых использовалась эта технология.
Протектор Armadillo также включает в себя менеджер лицензий.
13.5.3. PACEInterLok
Протектор InterLok, разработанный компанией РАСЕ Anti-Piracy, имеет версии для Windows и Macintosh. Набор функций, предлагаемых протектором, вполне обычный: менеджер лицензий, демонстрационные версии, API для интеграции и т. д.
Версия для Windows устанавливает драйвер ядра, препятствующий отладке защищенного приложения и выполняющий часть проверок. Но, несмотря на наличие такого сложного элемента, как драйвер, защита исполняемого файла довольно слабая. Например, все секции шифруются потоковым шифром с одним и тем же ключом. Это приводит к тому, что если секция кода больше, чем любая другая секция, то можно прочитать из памяти запущенной программы расшифрованную секцию кода, вычислить гамму, накладываемую при шифровании, и расшифровать все остальные секции файла, даже не прибегая к сложным инструментам. Драйвер практически не имеет защиты от исследования, а таблицы импорта вообще никак не защищены.
13.5.4. HASP Envelope
В комплект разработчика, поставляемый вместе с ключами HASP, входит протектор HASP Envelope. Цель этого протектора — защитить программу от исследования и даже запуска при отсутствии аппаратного ключа HASP.
Так как секретная функция, являвшаяся на протяжении многих лет сердцем ключей HASP, оказалась полностью раскрыта, не составляло большого труда эмулировать ответы на запросы, которые Envelope делал к ключу. Следовательно, любая программа, защищенная HASP Envelope, могла быть запущена без ключа.
С появлением ключей семейства HASP4, в которых используются новые секретные функции HaspEncodeData и HaspDecodeData, обход Envelope. При отсутствии ключа стал невозможен. Но в остальном протектор не способен обеспечить высокую стойкость защиты. И при наличии ключа получение незащищенной копии программы обычно не требует значительных усилий.
13.5.5. StarForce
Одной из составляющих StarForce Professional (системы, разработанной компанией Protection Technology для защиты информации, распространяемой на компакт-дисках) является протектор. В его функции входят проверка подлинности компакт-диска и запуск защищенной программы, но только в том случае, если введенный пользователем лицензионный код соответствует установленному в приводе диску.
В StarForce применяется множество уникальных технологических решений. Так, например, в защищенном исполняемом файле секция кода заполнена одними нулями, а код защиты выполняется из динамической библиотеки protect.dll, которая автоматически загружается и инициализируется при запуске программы.
Большая часть защиты сосредоточена в драйвере, устанавливаемом в ядро операционной системы. Именно там идет проверка подлинности компакт-диска. Сам драйвер также зашифрован с целью затруднения его исследования.
Часть защищаемой программы хранится в псевдокоде и выполняется на встроенной в протектор виртуальной машине.
Несмотря на то, что в Интернете можно найти подробные описания процесса ручного снятия StarForce с некоторых программ, таких случаев крайне мало. Частично это может быть объяснено тем, что для исследования защиты необходимо наличие оригинального компакт-диска, а также тем, что основная категория продуктов, которые защищаются с помощью StarForce, — компьютерные игры. А взлом защиты игр экономически не очень выгоден, т. к. стоимость одной копии игры невелика, а период популярности весьма короток. Но надо отдать должное разработчикам — они неплохо потрудились.
В целом StarForce на сегодняшний день является одним из самых серьезных протекторов, который, к тому же, продолжает развиваться. Так недавно компания Protection Technology объявила о выходе StarForce Soft 3.0 — системы защиты от копирования, основанной на ядре StarForce Professional 3.0, но не использующей компакт-дисков.
Распаковка и исследование №5: Armadillo
Как обычно, эта статья состоит из двух независимых друг от друга этапов:
Для скачивания доступны как запакованная, так и
распакованная версия подопытной программы.
Инструменты, которые я использовал:
Сразу договоримся, что на появляющиеся при запуске программы сообщение
о не зарегистрированной версией протектора обращать внимание мы не будем.
Сути дела это не меняет. Но степень легальности повышает.
Для начало узнаем, чем запакована наша программа. Воспользуемся для этого все
тем же Peid’ом. Запустим peid и откроем в нем наш файл. Мне он показал.
Как видите достаточно широкий диапазон, возможно существуют более новые версии PEID’а, которые скажут точнее,
но у меня есть только версия 2.67.
Чем запакованы мы знаем, теперь поговорим о самом протекторе, что он из себя представляет.
Для начала найдем OEP. Для этого вызовем SoftIce и поставим точку останова на SetProcessWorkingSetSize,
введем в окно отладчика bpx SetProcessWorkingSetSize и выйдем из
SoftIce. Запускаем нашу программу и оказываемся в отладчике, сработал SetProcessWorkingSetSize, нажмем F12
и окажемся здесь:
017F:008C10D1 E985000000 JMP 008C115B
017F:008C10D6 E8413FFFFF CALL 008B501C
017F:008C10DB 6AFF PUSH FF
017F:008C10DD 6AFF PUSH FF
017F:008C10DF FF151C918C00 CALL [008C911C]
017F:008C10E5 50 PUSH EAX
017F:008C10E6 FF15F4918C00 CALL [008C91F4]
017F:008C10EC FF1510918C00 CALL [008C9110] ; здесь мы будем находиться
017F:008C10F2 A3A01D8D00 MOV [008D1DA0],EAX
017F:008C10F7 E8284FFFFF CALL 008B6024
017F:008C10FC 6A00 PUSH 00
017F:008C10FE E8FA6DFFFF CALL 008B7EFD
017F:008C1103 8B06 MOV EAX,[ESI]
017F:008C1105 59 POP ECX
017F:008C1106 85C0 TEST EAX,EAX ; пройдем все эти инструкции по F10
017F:008C1108 7523 JNZ 008C112D
017F:008C110A E867E2FFFF CALL 008BF376
017F:008C110F 8B0D941D8D00 MOV ECX,[008D1D94]
017F:008C1115 FF7614 PUSH DWORD PTR [ESI+14]
017F:008C1118 8B5154 MOV EDX,[ECX+54]
017F:008C111B FF7610 PUSH DWORD PTR [ESI+10]
017F:008C111E 335144 XOR EDX,[ECX+44]
017F:008C1121 FF760C PUSH DWORD PTR [ESI+0C]
017F:008C1124 33513C XOR EDX,[ECX+3C]
017F:008C1127 03C2 ADD EAX,EDX
017F:008C1129 FFD0 CALL EAX
017F:008C112B EB2C JMP 008C1159
017F:008C112D 83F801 CMP EAX,01
017F:008C1130 7529 JNZ 008C115B
017F:008C1132 E83FE2FFFF CALL 008BF376
017F:008C1137 FF7604 PUSH DWORD PTR [ESI+04]
017F:008C113A 8BF8 MOV EDI,EAX
017F:008C113C A1941D8D00 MOV EAX,[008D1D94]
017F:008C1141 FF7608 PUSH DWORD PTR [ESI+08]
017F:008C1144 8B4854 MOV ECX,[EAX+54]
017F:008C1147 334844 XOR ECX,[EAX+44]
017F:008C114A 6A00 PUSH 00
017F:008C114C 33483C XOR ECX,[EAX+3C]
017F:008C114F 03F9 ADD EDI,ECX
017F:008C1151 E820E2FFFF CALL 008BF376
017F:008C1156 50 PUSH EAX ; пока не окажемся
017F:008C1157 FFD7 CALL EDI ; здесь, в edi находится адрес OEP, запомним или запишем его
017F:008C1159 8BF8 MOV EDI,EAX
017F:008C115B 8BC7 MOV EAX,EDI
017F:008C115D 5F POP EDI
017F:008C115E 5E POP ESI
017F:008C115F C3 RET ; возврат
Теперь уберем bpx, для этого введем команду bc* и поставим точку останова на
WriteProcessMemory, bpx WriteProcessMemory. Отпустим SoftIce, нажмем F5 сработает bpx, затем два раза F12 и окажемся
здесь:
Защита расшифровывает блоки, причем с каждым шагом вычисляет новый ключ расшифровки и по
ходу их зашифровывает. Зашифровывать их нам не надо, поэтому изменим условный переход по
адресу 0041247C:
JLE 0041257C 0F8EFA000000
JGE 0041257c 7DFE 90909090
прыжок будет происходить всегда и блоки зашифровываться не будут.
Находясь в SoftIce нажмем еще раз F12 и окажемся в отладочном цикле, главной копии программы.
017F:00410700 A1ACA24100 MOV EAX,[0041A2AC]
017F:00410705 33054CA24100 XOR EAX,[0041A24C]
017F:0041070B 33057CA24100 XOR EAX,[0041A27C]
017F:00410711 05FF0F0000 ADD EAX,00000FFF ; деление на 1000 hex
017F:00410716 C1E80C SHR EAX,0C ;
017F:00410719 A384DA4100 MOV [0041DA84],EAX ; помещаем по адресу [0041DA84]
Чтобы сделать нормальный дамп нам потребуется расшифровать все блоки кодовой секции.
Для этого будем вызывать цикл распаковки начиная с адреса 0041192D для каждого блока.
Сделаем в SoftIce следующие, находясь по адресу 004119DF введем:
a eip
inc dword ptr, [EBP+FFFFFA18]
jmp 0041192D
Мы сделали цикл распаковки, теперь изменим номер блока по адресу [EBP+FFFFFA18]
на 0, чтобы начать расшифровывать с первого блока.
Выход из цикла обеспечивают инструкции:
017F:0041192D 8B8D18FAFFFF MOV ECX,[EBP+FFFFFA18] ; номер текущего расшифрованного блока
017F:00411933 3B0D84DA4100 CMP ECX,[0041DA84] ; сравнивается с количеством
017F:00411939 0F8DB5000000 JGE 004119F4 ; если больше или равно прыжок на 004119F4
Заменим инструкцию JGE 004119F4 на прыжок на себя, введем в
SoftIce’e 411939 и впишем EBFE. Теперь, когда все блоки будут расшифрованы, программа зациклится
на 00411939 и нам останется только снять дамп.
Запустим PEEditor, нажмем «browse» и сделаем нашему процессу full dump.
Теперь восстановим импорт. Для защиты импорта aramdillo переадресовывает таблицу импорта. Наша задача
найти место где происходит переназначение и сделать так, чтобы импорт не был переадресован.
Поставим bpx на GetProcAddress, bpx GetProcAddress и запустим нашу программу,
когда сработает bpx мы окажемся в этом месте.
017F:008B5E54 750B JNZ 008B5E61
017F:008B5E56 FF76F8 PUSH DWORD PTR [ESI-08]
017F:008B5E59 FF1504918C00 CALL [008C9104]
017F:008B5E5F 8906 MOV [ESI],EAX
017F:008B5E61 391E CMP [ESI],EBX
017F:008B5E63 7419 JZ 008B5E7E
017F:008B5E65 8B7EFC MOV EDI,[ESI-04]
017F:008B5E68 391F CMP [EDI],EBX
017F:008B5E6A 7412 JZ 008B5E7E ;
017F:008B5E6C FF37 PUSH DWORD PTR [EDI] ; имя функции
017F:008B5E6E FF36 PUSH DWORD PTR [ESI] ; модуль
017F:008B5E70 FF1500918C00 CALL [008C9100] ; вызов GetProcAddress
017F:008B5E76 89470C MOV [EDI+0C],EAX ; мы будем находиться здесь
017F:008B5E79 83C710 ADD EDI,10
017F:008B5E7C EBEA JMP 008B5E68 ; прыжок на 008B5E68
017F:008B5E7E 83C60C ADD ESI,0C
017F:008B5E81 395EF8 CMP [ESI-08],EBX
017F:008B5E84 75C1 JNZ 008B5E47
017F:008B5E86 E998000000 JMP 008B5F23
017F:008B5E8B 381DE8108D00 CMP [008D10E8],BL
017F:008B5E91 0F858C000000 JNZ 008B5F23
017F:008B5E97 895DDC MOV [EBP-24],EBX
017F:008B5E9A 8B45DC MOV EAX,[EBP-24]
017F:008B5E9D 3B05F4108D00 CMP EAX,[008D10F4]
Сделаем по-простому, просто пропустим пару прыжков по адресу 008B5E6A.
Запускаем ImpRec, выбираем наш процесс, вводим OEP: 00003F00, жмем IAT AutoSearch
и GetImport и получаем полный импорт. Теперь нам остается лишь вставить его в наш дамп.
Можно еще уменьшить размер программы, отрезав ненужные секции протектора и сделав
rebuild.