Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 12 ноября!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

Что за ASProtect ???

Обсудить статью на форуме

Хорошая подборка видеоуроков, инструментов крэкера, книг и статей - здесь.

Автор: Alexey <alexey@energy.gov.ua>

От Bad_guy:
====
Эта статья не слишком свежая - по словам автора она лежала два года у него на компе и теперь он решил на наше усмотрение предложить её к размещению, очень жаль что два года назад он не разместил её в интернете, потому как такого рода статьи с мыслями автора о защите, как защите и о ней самой в принципе, на мой взгляд, очень интересны. Надеюсь, вы с удовольствием почитаете и тоже оцените эту статью.
====

Что у нас тут...



ASProtect is the system of software protection of applications, designed for quick implementation of application protection functions, especially targeted for software developers. ASProtect is designed for such specific tasks as working with registration keys and creation of evaluation and trial application versions.

ASProtect Features
compression of the application
encryption of the application
counteraction to dumping application memory with the tool like ProcDump.
application integrity check
counteraction to debuggers and disassemblers
counteraction to memory patching
API for interaction between application and protection routines
creation and verification of registration keys using public keys encryption algorithms
keeping of the database and checkup of "stolen" (illegal) registration keys
possibility to create evaluation (trial) versions, that limit application functions based on evaluation time and the number of runs left
expose nag-screens
generating of registration keys, based on the specific computer system

...У меня нет доступа в инет, поэтому я не могу судить о степени популярности этой программы. Просто она встретилась в одной защищенной программе. Название программы начинается с AS - видимо инициалы автора - я встречал их в программе. Поэтому далее, рассказывая о действиях программы, я буду говорить AS, а относится это к самой программе или к ее автору, пусть каждый решает по контексту, потому что я сам не знаю точно, о ком конкретно в данный момент говорить. В начале текста есть заявленные возможности программы. По поводу этих возможностей я хочу высказать свое мнение. Во-первых, о заявленной в первых двух позициях, способности шифровать и упаковывать программу. Известно, что при загрузке в оперативную память, программа должна иметь свой оригинальный (не шифрованный) вид. И в таком виде она и находиться в памяти. Т.е. зашифровав программу при ее записи на диск, AS дешифрует ее при запуске на исполнение. Зная, что есть программы, позволяющие дампить необходимые участки оперативной памяти и следовательно уже дешифрованный код, то по поводу возможностей шифровать, в задачке спрашивается: "А на #@я?". И по поводу возможностей упаковывать тоже не все однозначно. Я "упаковал" программу объемом 16 К и получил "упакованную" объемом 54 К. Забавно смотреть на сообщение, которое выдает такой "компрессор":)) "File size: 16KB compressed to 54KB, Ratio: 337,5%". AS к каждой программе дописывает свой собственный код, но только на программах большого объема он не заметен. Теперь по поводу возможностей противодействия программам дамперам памяти и отладчикам. Для меня такие заявления - признания собственной слабости. Представьте себе производителя замкОв, который расхваливая крутизну и навороты своего замкА, говорит вам, что этот замОк неприступен, если только не использовать этот, вот этот и вот этот ключи. Кроме всего прочего, такие действия бесперспективны. Невозможно отследить все программы подобного рода разных версий на машинах разной конфигурации. И даже, если предположить себе, что это так, как отнесется пользователь к защищенной таким образом программе, если при установке на машину, она начнет, как сварливая баба, требовать, чтобы этого и этого на машине не было, иначе ее не уговорите работать. Можно ли будет назвать такую программу дружественной по отношению к пользователю? Я понимаю, что SoftIce большая заноза в заднице разработчиков систем защиты. Но ведь он не фомка для вскрытия защищенных программ. Прежде всего это великолепный отладчик (хвала его создателям!) и не редки случаи, когда только с его помощью можно отследить, почему глючит программа. Конечно, мне могут возразить - заплати за регистрацию и пользуйся нормальной программой на здоровье. А как же я буду платить, если я не знаю, какая она, нормальная? Или может мне должно понравиться сообщение о том, что для получения регистрационного ключа, я должен позволить собрать информацию о содержимом моего компьютера? И хотя на моем, да и на многих других тоже, ничего, что могло бы быть предметом чужой зависти нет, но ведь дело в принципе. У меня не вызовет восторга предоложение пошнырить по моим карманам, даже если они пустые. Вообще, при первом знакомстве с этой системой защиты, создается впечатление, что автор (или авторы, не знаю) вложил немало сил и энергии для ее создания. Использованы, известные еще с DOS'овских времен, приемы защиты ассемблерного кода от реассемблирования - смещение адресов, дешифрация кода "под себя" и т.д. При этом применяется, используемый многими вирусами прием дописывания своего кода в конец файла и перенаправление на него точки входа. И если начать играть в игру, предложенную автором (реконструировать код защитного механизма), то, конечно, можно набить себе много шишек и ничего не достичь, потому что если даже и удасться что-нибудь раскопать, автор создаст новую версию и опять начинай с начала это бесполезное дело. Но если вспомнить, что умный в гору не пойдет, то можно этот механизм ОБОЙТИ всего лишь при помощи банального HEX-редактора. Просто нужно пойти по пути восстановления первоначального вида программы, освободить ее от дополнительного кода и от "привязок", которыми этот код связывает себя с программой. Для примера, я расскажу как это сделать с тем же самым ASProtect'ом v 1.2, поставив для себя цель, привести файл к виду, приемлемому для дизассемблирования.

Прежде всего нужно запустить программу и после этого записать на диск два участка памяти. 00400000-0049DFFF и 00C30000-00C37FFF. Есть еще дополнительные участки в памяти, которые создает AS, но они не понадобятся. Все адреса, с которыми придется работать на первом этапе - виртуальные. Первый участок программы - сама программа и второй - созданный в памяти AS'ом дополнительный участок для "собственных нужд". А теперь, вооружившись HEX-редактором, можно приступать к рутинной работе. После компиляции, линкер собирает программу из различных типов данных в соответствующие секции. Поэтому работу нужно проводить сначала для каждой секции отдельно. И начать ее нужно с секции ресурсов.

По поводу секции ресурсов можно сказать следующее. Секция ресурсов состоит из двух основных частей: таблиц, указывающих на размещение ресурсов и собственно самих ресурсов. Если говорить точно, то частей больше, но я разделяю их по принципу - таблицы и не таблицы. AS оставляет неизменными таблицы адресов размещения ресурсов (за исключением некоторых адресов) и шифрует сами ресурсы. Необходимость менять эти адреса вызвана требованиями, которые накладывает операционная система на содержание исполняемого модуля. А эти требования таковы, что программа должна показывать свои иконки (маленькую или большую в зависимости от обстоятельств). И следовательно эти дампы нельзя шифровать. Поэтому AS вычленяет эти дампы из общего содержимого ресурсов и переносит их в им созданные секции. И при этом, конечно, меняет адреса их (иконок) расположения. Кроме того, программа должна показывать и информацию о файле. Но прежде об иконках.

Адреса, находящиеся по 0071BF8 и по 0071C08 указывают на ресурсы иконок, маленькой и большой. Чтобы вычислить те адреса, по которым они (иконки) должны находиться в файле, нужно к предыдущим адресам прибавить размер файла как смещение. Т.е., взять 0x00076138 + 0xE0 и получим 0x00076218. И то же сделать для следующего адреса.

00071BD0: 00 00 00 00-00 00 00 00-78 60 07 00-C0 00 00 00 x` А
00071BE0: 00 00 00 00-00 00 00 00-38 61 07 00-E0 00 00 00 8a а
00071BF0: 00 00 00 00-00 00 00 00-58 08 09 00-68 05 00 00 X h
00071C00: 00 00 00 00-00 00 00 00-B0 FF 08 00-A8 08 00 00 ¦я Ё
00071C10: 00 00 00 00-00 00 00 00-28 70 07 00-0A 02 00 00 (p
00071C20: 00 00 00 00-00 00 00 00-34 72 07 00-2C 00 00 00 4r ,


Так выглядит восстановленный участок таблицы ресурсов.

00071BE0: 00 00 00 00-00 00 00 00-38 61 07 00-E0 00 00 00 8a а
00071BF0: 00 00 00 00-00 00 00 00-18 62 07 00-68 05 00 00 b h
00071C00: 00 00 00 00-00 00 00 00-80 67 07 00-A8 08 00 00 -g Ё
00071C10: 00 00 00 00-00 00 00 00-28 70 07 00-0A 02 00 00 (p


Весь участок файла, где размещались ресурсы иконок, AS забивает нулями.

00076200: 0F FF FF FF-00 CC CC CC-00 00 00 00-0C CC CC CC яяя МММ МММ
00076210: CC CC CC CC-CC CC CC CC-00 00 00 00-00 00 00 00 ММММММММ
-----------------------------------------------
00077020: 00 00 00 00-00 00 00 00-00 00 00 00-00 00 00 00
00077030: 00 00 00 00-08 00 21 04-32 04 35 04-34 04 35 04 ! 2 5 4 5


После того, как сделаны изменения в таблице адресов ресурсов, нужно перенести дампы иконок с адреса 00090858-00090DBF (маленькая иконка) по адресу 00076218 и с адреса 0008FFB0-00090857 (большая иконка) по адресу 00076780. Т.к. при переносе дампов иконок в новое место, AS меняет их местами, то возвращать их назад нужно по отдельности, а не общим дампом. Так выглядят начало и конец этих участков памяти в восстановленном файле.

00076200: 0F FF FF FF-00 CC CC CC-00 00 00 00-0C CC CC CC яяя МММ МММ
00076210: CC CC CC CC-CC CC CC CC-28 00 00 00-10 00 00 00 ММММММММ(
00076220: 20 00 00 00-01 00 08 00-00 00 00 00-40 01 00 00 @
-----------------------------------------------
00077010: FF F0 0F FF-FF F0 0F FF-FF F0 0F FF-FF E0 3F FF яр яяр яяр яяа?я
00077020: FF E1 FF FF-FF F3 FF FF-00 00 00 00-00 00 00 00 ябяяяуяя
00077030: 00 00 00 00-08 00 21 04-32 04 35 04-34 04 35 04 ! 2 5 4 5


На этом все "восстановительные работы" по секции ресусов закончены и можно сохранить отдельно этот участок файла, чтобы впоследствии скомпоновать полностью исполняемый модуль.

А теперь можно перейти к секции ипортируемых библиотек, функций и т.д. Эта секция - "направление главного удара" для AS. Эта секция тоже, как и секция ресурсов, состоит из двух основных частей: таблиц адресов и текстовых строк с названиями импортируемых библиотек и функций, так называемые hint-name. И так же как и в случае с секцией ресурсов, операционная система накладывает ограничения на возможность шифровать некоторые части этой секции. Нельзя шифровать таблицу указателей на импортируемые программой функции, поскольку вызовы этих функций из программы происходят через эту таблицу. В оригинальном файле, т.е. в том, что хранится на диске, адреса в этой таблице указывают на начала текстовых строк с названиями импортируемых функций. При запуске программы на исполнение, стандартный загрузчик меняет эти адреса, на адреса размещения этих функций в памяти. AS модифицирует эту секцию следующим образом. Удаляет или шифрует участок с адресами, указывающими на таблицу, а также участок с текстовыми строками. Но поскольку, при загузке программы в оперативную память, загрузчику нужно знать, какие библиотеки загружать, а эту информацию он получает именно из этого участка, то AS оставляет названия библиотек и по одному названию функций для каждой библиотеки. Кроме того он записывает вызов еще некоторых, дополнительных в некоторых случаях, функций, которые нужны ему для "собственных нужд". Установка прерывания на эти функции, в частности на VirtualFree, позволяет перехватить исполнение программы на этапе выполнения кода AS'а. В оставшейся таблице адресов, он, желая привязать исполнение программы к собственному коду, перенаправляет некоторые вызовы функций на созданный им участок памяти с 00C30000 по 00C37FFF. Эти адреса для разных программ могут быть другими. Работа проводится солидная, но если учесть, что в оставшейся таблице хранится ПОЛНАЯ! информация об остальных удаленных или зашифрованных участках этой секции, то эффективность этой работы можно поставить под сомнение. Всю работу по восстановлению модифицированных участков секции можно сделать вручную, хотя при этом наверное часто придется с уважением вспомнить золушку. Вообще, отвлекаясь, хочу сказать, что работа некоторых защитных механизмов расчитана не на полную секретность, а на принцип: "Замучаешься пыль глотать!".

Вот участок таблицы переходов на функции.

000662B0: F4 27 C3 00-0C 28 C3 00-24 28 C3 00-30 28 C3 00 ф'Г (Г $(Г 0(Г
000662C0: 48 28 C3 00-64 28 C3 00-7C 28 C3 00-9C 28 C3 00 H(Г d(Г |(Г °(Г
000662D0: B8 28 C3 00-D0 28 C3 00-E8 28 C3 00-00 00 00 00 ё(Г Р(Г и(Г
000662E0: 67 12 E7 BF-94 14 E7 BF-2F 15 E7 BF-00 00 00 00 g з©" з©/ з©
000662F0: 36 28 F2 BF-1E 14 F2 BF-CA 22 F2 BF-C3 1F F2 BF 6(т© т©К"т©Г т©
00066300: 33 57 F2 BF-B7 1F F2 BF-35 51 F2 BF-96 28 F2 BF 3Wт©T т©5Qт©-(т©


Адреса, типа 00C327F4 - переходы на дополнительный участок памяти и адреса, типа BFE71267 - переходы на конкретные адреса функций в памяти. По поводу дополнительных переходов хочу сказать, что это дополнительные циклы в работе процессора, а поскольку программы активно используют в своей работе встроенные библиотеки, то это, в известной степени, замедление работы программы.
Чтобы полностью восстановить оригинальный вид этой секции, нужно сначала составить текстовый список библиотек и функций, в соответствии с адресами в таблице.

Вот так выглядел участок этого файла до восстановления:

00066670: A4 1D C3 00-B4 1D C3 00-C0 1D C3 00-D0 1D C3 00 г Г ¦ Г А Г Р Г
00066680: E0 1D C3 00-F0 1D C3 00-00 1E C3 00-0C 1E C3 00 а Г р Г Г Г
00066690: 18 1E C3 00-28 1E C3 00-38 1E C3 00-44 1E C3 00 Г ( Г 8 Г D Г
000666A0: 50 1E C3 00-70 1E C3 00-00 00 00 00-63 61 E1 7F P Г p Г caб
000666B0: 12 61 E1 7F-00 00 00 00-A8 82 F4 7F-78 F5 F4 7F aб Ё-фxхф
000666C0: F3 14 F2 7F-D3 36 F5 7F-00 00 00 00-23 15 34 65 у тУ6х # 4e
000666D0: 00 00 00 00-FF 6A D1 7F-99 77 CF 7F-00 00 00 00 яjС?wП
000666E0: 00 00 00 00-00 00 00 00-00 00 00 00-00 00 00 00
000666F0: 00 00 00 00-00 00 00 00-00 00 00 00-00 00 00 00
00066700: 00 00 00 00-00 00 00 00-00 00 00 00-00 00 00 00
00066710: 00 00 00 00-00 00 00 00-00 00 00 00-00 00 00 00
00066720: 00 00 00 00-00 00 00 00-00 00 00 00-00 00 00 00


А это его вид после восстановления:

00066670: 5C 7D 06 00-73 7D 06 00-87 7D 06 00-9A 7D 06 00 \} s} +}  }
00066680: B0 7D 06 00-C5 7D 06 00-D7 7D 06 00-EE 7D 06 00 ¦} Е} Ч} о}
00066690: 05 7E 06 00-1D 7E 06 00-2D 7E 06 00-47 7E 06 00 ~ ~ -~ G~
000666A0: 5B 7E 06 00-6E 7E 06 00-00 00 00 00-6B 65 72 6E [~ n~ kern
000666B0: 65 6C 33 32-2E 64 6C 6C-00 00 00 44-65 6C 65 74 el32.dll Delet
000666C0: 65 43 72 69-74 69 63 61-6C 53 65 63-74 69 6F 6E eCriticalSection
000666D0: 00 00 00 00-4C 65 61 76-65 43 72 69-74 69 63 61 LeaveCritica
000666E0: 41 6C 65 78-65 79 00 00-00 00 44 61-74 73 75 6B lSection Enter
000666F0: 43 72 69 74-69 63 61 6C-53 65 63 74-69 6F 6E 00 CriticalSection
00066700: 00 00 49 6E-69 74 69 61-6C 69 7A 65-43 72 69 74 InitializeCrit
00066710: 69 63 61 6C-53 65 63 74-69 6F 6E 00-00 00 56 69 icalSection Vi
00066720: 72 74 75 61-6C 46 72 65-65 00 00 00-56 69 72 74 rtualFree Virt


Адреса, указывающие непосредственно на функции не вызывают проблем, а вот по поводу перенаправленных на дополнительный участок адресов, нужны некоторые уточнения. Все эти переходы нужно просмотреть каждый отдельно, потому что методика перехода на функции разная. Иногда, это прямой переход на встроенную библиотечную функцию, а иногда сначала исполняется код, повторяющий начальные коды функции и после этого следует переход в библиотеку, но уже не в стандартную точку входа, а "сбоку". Это обстоятельство, кстати, нужно учитывать при установке прерываний на вход в библиотеку.

Вот примеры некоторых вызовов. Чтобы определиться, какая именно функция вызывается тем или иным переходом, нужно от значения вызываемого адреса вычесть смещение относительно начала.

Вызов функции DeleteCriticalSection
00C3213C: 56 push esi
00C3213D: 68FBABF8BF push 0BFF8ABFB
00C32142: C3 retn

Вызов функции GetModuleHandleA
00C321D0: 57 push edi
00C321D1: 6A21 push 021
00C321D3: 2BD2 sub edx,edx
00C321D5: 68671DFABF push 0BFFA1D67
00C321DA: 64FF32 push d,fs:[edx]
00C321DD: 648922 mov fs:[edx],esp
00C321E0: 682677F7BF push 0BFF77726
00C321E5: C3 retn

Вызов функции CreateFileA
00C322F8: 57 push edi
00C322F9: 6827010000 push 000000127
00C322FE: 2BD2 sub edx,edx
00C32300: 68671DFABF push 0BFFA1D67
00C32305: 64FF32 push d,fs:[edx]
00C32308: 648922 mov fs:[edx],esp
00C3230B: 68EE7AF7BF push 0BFF77AEE
00C32310: C3 retn

Вызов функции WaitMessage
00C3291C: E9CBFD31BF jmp 0BFF526EC


Конечно, не обязательно нужно восстанавливать эту секцию до ее первоначального вида. Можно остановиться на полумерах - заменить переходы на дополнительный участок памяти переходами на стандартные функции. Но когда дизассемблер показывает названия функций - это намного удобней.

С восстановлением секций ресурсов и импортов, основная, рутинная часть работы окончена. Теперь нужно решить проблему размещения секций и восстановления записей в заголовке файла. Прежде всего в заголовке нужно удалить указатели на дополнительные секции и сами секции, создаваемые AS'ом, а также уменьшить значение NumberOfSections. Также нужно изменить физические адреса и размеры секций. Еще нужно изменить характеристики секций, только при этом нужно иметь в виду, что AS удаляет (а может прячет, не знаю, не определялся) Relocation Table и следовательно флаг того, что для этой секции существует Relocation Table не нужно устанавливать. Вообще то Relocation Table не является предметом первой необходимости, она служит подстраховкой для загрузчика, если у него возникнут проблемы с размещением блоков файла. Значение SizeOfImage равняется Virtual Address первой дополнительной секции, добавленной AS'ом. Но прежде всего, конечно, нужно найти точку входа в программный код. Можно пойти по пути, который не в гору :). Прежде всего нужно определиться, в какой среде написана программа. Компиляторы оставляют такие записи. Поскольку процедура открытия файла для каждого компилятора является стандартной, то и блоки кода на точке входа, тоже, по крайней мере, похожи. Конечно, это еще зависит от устанавливаемых при компиляции опций, но чаще всего они остаются по умолчанию. Поэтому нужно подсмотреть в нормальной программе, как это делается, а затем попробовать найти аналогичное место в данной программе. Обычно, больших проблем это не вызывает. Кстати, в ASProtect v1.23 RC1, автор удумал новую кознь, направленную на то, чтобы новыми проблемами ослабить здоровье благородным реставраторам первоначального вида программ. AS удаляет код программы на точке входа до первого вызова подпрограммы и забивает это место нулями. Классический пример реализации принципа: "Тот кто нам мешает, тот нам и поможет!". Поиск в файле последовательности нулевых байт, заканчивающихся на E8, практически гарантированно приводит на точку входа. Остается только дописать несколько недостающих инструкций. Восстановленный таким образом файл уже можно дизассемблировать, что собственно и являлось основной целью такой работы.

alexey@ugres-i.gpce.db.energy.gov.ua

Обсуждение статьи: Что за ASProtect ??? >>>


Материалы находятся на сайте https://exelab.ru



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS