┌──┌─┐┌──
──┘├─┘──┘ Presents
┐ ┌┐┐┌─┤ VMag, Issue 3, 1 January 1999
└─┘┘ ┘└─┘ ─────────────────────────────
╔════════════════════════════╗
║ Version: 1.0 ║
║ Release: 09-Nov-1998y ║
║ Created by: Hard Wisdom ║
╚════════════════════════════╝
─[09-Nov-1998y]─[v1.0]─────────────────────────────────────────────────────────
Первоначально созданный файл
───────────────────────────────────────────────────────────────────────────────
Несчастливая сказка с грустным концом
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
(или как не надо защищать программное обеспечение)
[] Содержание
~~~~~~~~~~~~~
[0] Несчастливая сказка с грустным концом
[1] Сервер новостей DejaNews v4.6r
[2] Интерактивный дизассемблер IDA v3.xx
[3] Текстовый процессор Microsoft Word for Windows v8.0
[Z] Продолжение следует...
[0] Несчастливая сказка с грустным концом
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Программирование - достаточно новый вид человеческой деятельности,
получивший практическое развитие совершенно недавно, но едва появившись -
успел пройти достаточно длинный путь в своем развитии от отдельных энтузиастов
до больших коллективов, занятых разработкой коммерческого программного
обеспечения. И чем дальше по ленте времени - тем более коммерческим и менее
творческим оно (программирование) становится. Да, безусловно, еще остались
энтузиасты вроде Ричарда Столлмана, который организовал в свое время
организацию FSF (Free Software Foundation) и проект GNU которой, я полагаю,
всем известен, но это, к сожалению, скорее исключение чем правило.
Следует отметить еще один интересный аспект в программировании - конечный
продукт возможно легко тиражировать. Это ключевой момент, под программой
понимается запись алгоритма конечным числом элементарных операций реализуемых
исполнителем, т.е. формально программа лишь набор данных, представимых
определенному исполнителю. Но именно легкость манипулирования данными
(исполнителем) и определяет сам факт существования программного обеспечения,
целью создания которого является решение задач по обработке информации (мы
сейчас не будем рассматривать ни разные типы исполнителей, ни множества
выполняемых ими операций, ни формы организации и представления информации).
Соответственно возникает потребность в механизме регулирующем создание и
распространение копий коммерческого программного обеспечения, в противном
случае, в силу человеческой природы, выполнение основной экономической
операции Т-Д-Т остается под вопросом. А раз так, то вместо того, чтобы
заниматься интересными вещами из области программирования, люди начинают
ломать голову над проблемами абсолютно не связанными с последним. Как жалок
мир. Средства защиты программного обеспечения от несанкционированного
тиражирования, впрочем, не получили достаточно большого развития, т.к.
сказывается фактор уменьшения конечной прибыли от реализации программного
продукта (защита тривиальным образом входит в себестоимость ;-) И даже
лоббирование соответствующих законодательных актов в парламентах разных стран
нельзя назвать удовлетворительным решением проблемы.
Каковы же основные формы реализации защит коммерческого программного
обеспечения (ПО) от несанкционированного копирования (НСК):
- прежде всего - в "развитых" странах это лицензирование, т.е.
приобретая программу пользователь приобретает лицензию на ее
использование и должен неукоснительно следовать ее правилам, в
противном случае вступают в действие юридические механизмы
определенные законодательством данной страны. Хо-хо, назовем этот
метод организационным. Кто читал тексты лицензий? Пресно, лишено
юмора и рассчитано, честно говоря, на среднестатистического дебила:
не смотреть внутрь, не дизассемблировать, не изменять, не копировать
и т.д. а самое главное - авторы ничего не гарантируют и ни за что не
отвечают.
- далее, аппаратные методы: использование своего аппаратного
обеспечения (в крайнем случае ЭВМ целиком, в простейшем -
специализированные электронные схемы устанавливаемые в порт
расширения существующих ЭВМ), либо обработка носителей информации
нестандартным образом (соответственно для тиражирования такого
носителя необходимо специальное оборудование использовавшееся при
обработке носителя), как пример - лазерные "отверстия" на дискетах,
плавающие биты (там же) и т.п.
- третье: специальная информация необходимая наряду с параметрами
пользователя (реквизиты предприятия, имя владельца программы...) или
его компьютера (скорость ОЗУ, MAC адрес сетевого адаптера, тип
жесткого диска и т.п.) для принятия решения о легальности
используемой копии.
Итак: разрешение на работу с программой может быть выражено в виде наличия
исполнителя программы или особого носителя с ключевой информацией или особой
формой представления этой информации. Впрочем, никто не мешает комбинировать
данные методы любым удобным способом. Уже устоялось представление о том, что
все вышеперечисленное не более, чем "Security by Obscurity" и я разделяю его.
Что же привносят вышеперечисленные реализации защит? Головную боль
пользователям (а нука, представьте, каково по телефону продиктовать 64 значный
код машины/пользователя и ввести 40-значный код ответа, а в случае ошибки хотя
бы в одном знаке получить очищенную CMOS память или еще что-нибудь ;-) Или
сидеть на разбитой "добрыми дружественными инсталляциями" операционке
Windows'95 не в силах сменить ее, т.к. программа осуществила привязку где-то
там в недрах SYSTEM\ Или не иметь возможности дефрагментировать диск (по тем
же причинам). Как вам понравится пылинка стоимостью XXX долларов попавшая под
головку дисковода читающего ключевую дискету...
А хорошие аспекты? О, их... не так уж и много. Я могу назвать только один:
дополнительное поле деятельности для Reverse Engineering, а так же юмор, да,
да, именно - Юмор! Да и как иначе, ведь люди вместо того, чтобы творить софт
заняты зарабатыванием денег, они не могут отвлекаться от своего основного
занятия... А тут еще приходится программы писать... (и по возможности очень
коммерческие). Очень не часто можно посмеяться сидя перед экраном монитора.
Вот этим мы сейчас и займемся. Все готовы?
Да, название этого эссе... Думаю, что вы уже и так догадались.
[1] Сервер новостей DejaNews v4.6
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Итак, первый кандидат на потрошение. Сервер новостей DejaNews v4.6, создала
его фирма:
Netwin LTD, PO Box 27574, Mount Roskill,
Auckland, New Zealand.
E-mail: [email protected]
Всю подробную информацию вы можете взять у авторов ;-) Мы же займемся более
интересными вещами. Программа осуществляет проверку легальности своего запуска
по некоторому "ключевому номеру". После непродолжительного рассмотрения
оказалось, что этот номер имеет следующий внутренний формат:
Номер суть шестнадцатеричное число следующей структуры
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
xxxxxxxxxxxxxxxx
││└┤└┤└┤└─┬┘└─┬┘ ? В процессе проверки используются:
││ │ │ │ │ │
││ │ │ │ │ └── Контрольная подпись самого номера
││ │ │ │ └────── Свертка имени PC (+свертка IP адреса PC)
││ │ │ └───────── Месяц создания лицензии (0..11)
││ │ └─────────── Год создания лицензии (0..99)
││ └───────────── ? Количество пользователей сервером
│└─────────────── Истечение срока действия (В месяцах)
└──────────────── Основной тип (8 и 9 - без IP адреса)
Итак, преобразование номера во внутренний формат осуществлялось достаточно
простой перестановкой битов (в четных и нечетных позициях). Перестановка битов
характерна тем, что не изменяет их (битов) значений. После определенного
количества экспериментов и доисследования кода оказалось, что значение срока
истечения действия лицензии равное 0 подразумевает разработчиками программы
бессрочное использование своего детища. Самое интересное, что при этом не
проверяется дата генерации лицензии (да и зачем, ведь лицензия то бессрочная
;-) Принудительно запишем 0 в месяц и дату создания лицензии. Количество
пользователей сервера постигла та же участь. Итак: основной тип лицензии -
контролируется ограничительным способом и в случае указания неизвестного типа
по умолчанию не приведет ни к каким ограничениям, чувствуете куда это клонит ?
;-) Правильно тип тоже 0. Затем имя PC, о, ну с этим аналогичная история, 0
значение свертки имени приводит к пропуску процедуры проверки (мне кажется,
что в этом месте человек написал автоматически что-то вроде if
(r=ReduceString(GetComputerNameA())) { if (r==...) ... }; ). Что там у нас
осталось ? Ах, да, подпись лицензии (этого многострадального номера). Я
реконструировал данный фрагмент так (дурацкие приведения типов для того, чтобы
заставить компилятор генерировать нужный код):
int CrazySign(void* area, int len) {
int i; long t,s=0; unsigned char* p=area;
for (i=0;i<len;i++) { t=*p++; s=(t*i+s+s) % 32000; }
return s;
}
Ну как? первый индекс равен 0, соответственно подпись не зависит от первого
символа сворачиваемой строки. Вот такая хитрая операция умножения, так что для
тех, кто не согласен с типом лицензии 0 - смело можно поменять его на желаемый
(тем самым испортив чистоту эксперимента ;-) Да, последний момент, так
происходит преобразование лицензии во внутренний формат:
BinaryKey* ScrambleKey(BinaryKey* K) {
int i,t1,t2; for (i=0;i<8;i+=2) {
t1=((*K)[i] & 0x55) | ((*K)[i+1] & 0xAA);
t2=((*K)[i] & 0xAA) | ((*K)[i+1] & 0x55);
(*K)[i]=t1; (*K)[i+1]=t2;
} return K;
}
Хм, никто еще не забыл цель нашего разговора? Напоминаю, система регистрации.
Так вот, программа регистрируется серийным номером (лицензией)
0000000000000000 Да, да, именно 16 нулей. Такого я еще никогда не видел, тут
даже регистратор в общем-то специальный не нужен. Безусловно, в Netwin LTD
скоро очухаются и пофиксят эти глюки, но каково? В дополнительное
подтверждение своих слов предлагаю посетить мою домашнюю страничку:
www.geocities.com/SiliconValley/Hills/7827
[2] Интерактивный дизассемблер IDA v3.xx
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Думаю, ни для кого не является секретом существование данной программы, так
что дополнительное представление вряд-ли необходимо, но все таки:
(Users in Russia please contact [email protected])
Site licenses, unlimited corporate licenses, education
discount, please contact
[email protected]
ph : + 32-4-3446510
fax : + 32-4-3446514
Данная программа является первой более-менее успешной попыткой создания
удобного средства дизассемблирования программных средств. Интересным является
и процесорно-независимый подход при создании. Но... due to перечисленные в
предисловии причины, существует большое количество проблем внутри данного
дизассемблера: монстроватость, невысокая скорость работы, неустойчивость
функционирования в критических условиях, наконец - просто большое количество
ошибок и очень неудобный интерфейс программы.
Оставим все это. Обратим свой взор на механизмы ограничения
несанкционированного использования данной программы. Критическая информация
находится в ключевом файле, это: статус функционирования программы,
идентифицирующая информация владельца программы (для отслеживания источника
возникновения несанкционированных копий). Выполним анализ данного программного
средства с помощью его же самого.
Итак, начнем с версии 3.5 К сожалению, за давностью событий я не могу
восполнить пробелы в воспоминаниях путем обращения к бинарному коду. Начнем
сразу. Регистрационный файл с критической информацией зашифрован методом RSA с
длиной ключа не менее 1024 бита (используется пара чисел длиной по A0h байтов
или 1280 битов). Соответственно не представляется возможным выполнить задачу
факторизации ключа и создания таких же файлов (со своей критической
информацией). Но я забежал немного вперед. А пока: после чтения из файла
фрагмента данных производится его преобразование (в данный момент неважно
какое). Производится преобразование считанного бинарного ресурса (значением
полученным из ключевого файла) и передача туда управления. Ни для кого не
является секретом наличие в IDA встроенного языка сходного синтаксически с Си,
но несколько перегруженного условностями. Естественно было предположить в
данном случае расшифровку именно Пи-кода с данного языка. Так оно и оказалось.
Вторая проблема... Для выполнения расшифровки надо бы знать структуру
расшифровываемых данных... Пи-код оказался похожим на аналогичный код
клиппер-машины, теперь у меня почти не осталось материалов описывающих его (я
тогда разобрал около 70-75% команд). Само шифрование было достаточно простым,
обычная ксорка по 4-м значениям (т.е. говоря более формально: 4-х алфавитный
шифр а-ля Виженер). Рассмотрим зашифрованный фрагмент нашего Пи-кода (код
считывается из HLP файла ;-)
This is the secret PCode from IDA.HLP file
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 13-Feb-1998y 14:32 *HW*
---Begin Array---
F1 F3 3A 56-F3 8E CF 23-46 43 9D 5A-D7 29 F7 EC *ёє:VєО╧#FCЭZ╫)ўь*
F9 F4 3A C4-F9 F0 3A 8E-AD 0C 90 55-25 81 94 23 *∙Ї:─∙:Он.РU%БФ#*
7A 95 56 50-27 9B 95 25-B4 19 CD 21-8A D0 B4 0E *zХVP'ЫХ%┤.═!К╨┤.*
CD 21 FE C8-A2 C2 04 BE-80 00 8A 0C-32 ED 0B C9 *═!■╚в┬.╛А.К.2э.╔*
75 03 E9 89-00 46 E8 9E-02 E8 A2 02-72 0E A0 C5 *u.щЙ.FшЮ.шв.r.а┼*
04 22 06 C6-04 75 02 EB-75 E9 83 00-81 7C 01 3A *.".╞.u.ыuщГ.Б|.:*
20 74 15 81-7C 01 3A 0D-74 0E 80 3E-C4 04 00 75 * t.Б|.:.t.А>─..u*
38 C6 06 C4-04 01 EB 31-80 3E C6 04-00 75 4F C6 *8╞.─..ы1А>╞..uO╞*
06 C6 04 FF-80 3E C4 04-00 75 05 C6-06 C4 04 02 *.╞. А>─..u.╞.─..*
8A 04 E8 67-02 2C 41 3A-06 C2 04 76-06 BA 74 05 *К.шg.,A:.┬.v.║t.*
E9 03 02 A2-C3 04 46 EB-9C 80 3E C5-04 00 75 1E *щ..в├.FыЬА>┼..u.*
C6 06 C5 04-FF 89 36 C8-04 46 E8 31-02 73 07 80 *╞.┼. Й6╚.Fш1.s.А*
3C 20 74 02-EB F3 89 36-CA 04 4E E9-77 FF BA 21 *< t.ыєЙ6╩.Nщw ║!*
06 B4 09 CD-21 BA 74 06-B4 09 CD 21-E9 E9 01 E8 *.┤.═!║t.┤.═!щщ.ш*
CF 02 73 06-BA 30 05 E9-?? ?? ?? ??-?? ?? ?? ?? *╧.s.║0.щ........*
---End Array---
После 2-х дней блужданий из-за неправильных посылок (в конце участка Пи-кода
мусор из памяти машины Гуильфанова, даже нормальный кусок программы разобрать
можно) получился такой результат:
This is unencrypted part of secret PCode
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
---Begin Array--- Well, for: 54 F3 3A 25 . . .
A5 00 00 73-A7 7D F5 06-12 B0 A7 7F-83 DA CD C9 *е..sз}ї..Г┌═╔*
AD 07 00 E1-AD 03 00 AB-F9 FF AA 70-71 72 AE 06 *н..сн..л∙ кpqrо.*
2E 66 6C 75-73 68 AF 00 *.flushп.
---End Array---
Добавлю еще пару комментариев: значение расшифровки получалось в результате
суммирования DWord константы и первых символов имени, возникает еще одна
задача: расщепить сумму на 2 значения (DWord в частности передавался
параметром в Пи-код и использовался в других местах), это оказалось просто, не
мудрствуя лукаво автор выбрал имя пользователя: "Registered to: <RealName>" А
теперь взглянем на фрагмент Пи-кода преобразованного к формату понятному для
человека:
static _hihi(Name,From,To,Key) {
if ((Key+0x1206f57d)=0xcdda837f) {
#ExecByName ".flush(Name,From,To)";
} else { while (1) do; };
}
Вверху изложен реконструированный код ИДА-Си. Макросом #ExecByName обозначен
Пи-код осуществляющий символическое выполнение команды (параметром является
строка имени команды). Аналогов в языке ИДА-Си я не знаю. Ну, код в целом
прозрачный, выполнить действие или повиснуть (Это подтверждение тому, что мне
надо было расщепить ключ расшифровки на 2 числа, имя и собственно само
значение, кстати, отсюда следует константность первых 4-х символов имени).
Забыл сказать, ради чего все делалось: IDA не выполняет запись
сгенерированного ассемблерного текста программы на диск. Вот фрагмент вызова
записи ассемблерного файла на внешний носитель:
static _expr() {
return(_lpoke(RetValue,(_hihi(Path,From,To,Key)));
}
Это вторая процедура находящаяся в расшифрованном Пи-коде. Интересным местом
является запись Пи-кодом значений прямо в область памяти программы, в качестве
RetValue осуществлялась передача адреса переменной количества обработанных
строк. Вызов вышеперечисленной функции осуществлялся генерацией фрагмента
программы на языке ИДА-Си, компиляцией и запуском полученного кода. Генерация
осуществлялась процедурой printf посредством такого шаблона:
static _expr() {
return _lpoke(0x%lX,(%s));
}
Хочу еще добавить. Исследование Пи-кода было простым и легким, автор (т.е.
Гуильфанов) генерирует Пи-код в файлы на диске и оттуда исполняет их ;-)
Достаточно было сделать замену в двух местах программы фрагмента:
Mov Ah,41h на соответствующий Mov Ah,30h
Int 21h Int 21h
Чтобы Пи-код оставался в файлах на винчестере горяченьким....
Обсуждение ИДА-Си и его реализации, полагаю, выходит за рамки этого эссе,
так что продолжим. Первый вариант хака IDA v3.5 был достаточно тривиальным,
желающие посмотреть - попросите меня отдельно.
Я пользовался некоторое время IDA v3.5, но однажды мне принесли новую
версию - 3.7 (а впоследствии и 3.75). И решил я опять посмотреть внутрь
(несмотря на то, что к IDA прилагался ключевой файл с очень интересным
происхождением). Но давайте для начала почитаем о происхождении ключевого
файла, которым вы наверняка пользуетесь (в данный момент):
─[HackMore.Txt]───────────────────────────────────────────────────────────────
[---hungry Ctrl+Y was here---]
Special notes:
Ida Pro has been registered as:
User: Brent Cole (An ex-co-worker, kind of a revenge thing.)
This name is encrypted into the ".key" file and is used to
register the program. It is required information when trying
to obtain a bug fix or an upgrade.
If you're going to change the "registered user" name in the ".key"
file prior to installation, DO NOT be fooled when you see the
name right at the begining of the ".key" file.
I am only distributing this program to HCU members and friends. If
you wish to distribute it to others, using web-pages, warez, or
disks, feel free to do so, I used false information throughout
the ordering process, including a false mailing address, and
someone elses credit card number. (I PAID for the program though,
a friend of mine borrowed a credit card from HIS friend for me to
use, then returned it, along with MY money to pay the bill.)
If you DO re-distribute this program, PLEASE leave this note with the
program so others will know the proper way to install and use it.
[---hungry Ctrl+Y was here---]
Hackmmore Readrite
DataMiners Inc.
*EOF*
─[HackMore.Txt]───────────────────────────────────────────────────────────────
Впечатляет, знать бы еще ребятам из DataMiners за что они отвалили свои
деньги... Блок Пи-кода безусловно изменился, изменился так же и механизм его
расшифровки.... он упростился! В частности для расшифровки используют только 1
байт !!! А это значит, что я автоматически могу получить ключ для шифрования,
ибо создание фрейма стека, с которого начинается любая процедура на ИДА-Си,
начинается кодом A5h... ;-) Проиллюстрируем сказанное:
(IDA.WLL v3.7 (Pro))
~~~~~~~~~~~~~~~~~~~~
00439673 jz short loc_439681
00439675 mov esi, offset byte_492A2C ; (1)
0043967A mov ecx, 1Fh
0043967F jmp short loc_43968B
00439681 ; ──────────────────────────────────────────────────
00439681
00439681 loc_439681:
00439681 mov esi, offset byte_492A54 ; (2)
00439686 mov ecx, 7Fh
0043968B
0043968B loc_43968B:
0043968B xor edx, edx
0043968D mov eax, esi
0043968F cmp ecx, edx
00439691 jle short loc_4396A1
00439693
00439693 loc_439693:
00439693 mov bl, KeyValue
00439699 xor [eax], bl
0043969B inc edx
0043969C inc eax
0043969D cmp ecx, edx
0043969F jg short loc_439693
004396A1
004396A1 loc_4396A1:
004396A1 push ecx
004396A2 mov eax, offset a_idainit
004396A7 mov edx, 3
004396AC mov ecx, esi
004396AE call sub_46FD58
Под (1) отмечен фрагмент Пи-кода демонстрационной версии, (2) - запуск
многопроходного анализатора и т.п. Кстати, в HLP файле до сих пор болтаются
фрагменты Пи-кода версии 3.5 (Ильфак - вытри это, раз перестал использовать).
Вы можете поискать строку "F1F3..." (именно текстовая строка, дамп ей соответ-
ствующий расположен несколько выше в этой статье).
Вот вроде бы и все? Ах, да, приведем дамп Пи-кода для IDA v3.7 Любители
могут написать даже процессорный модуль обработки Пи-кода ИДА-Си.
До расшифровки (2 фрагмента):
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.00092A20: 92 36 37 9D Т67Э
.00092A30: 47 F8 9F 35-45 55 B7 4B-77 D7 FE 9A-31 37 9D 46 G°Я5EU╖Kw╫■Ъ17ЭF
.00092A40: F9 B7 67 9E-90 37 37 27-37 98 E5 5F-69 64 61 69 ∙╖gЮР77'7Шх_idai
.00092A50: 6E 69 74<-->5A F9 FF 1E-41 DD 55 8F-30 57 FD 8D nit Z∙ A▌UП0W¤Н
.00092A60: 9D 7F 83 BF-1F 36 52 98-FF 55 9F 31-5E 5F FF 1D ЭГ┐ 6RШ UЯ1^_
.00092A70: 4D 19 4F 41-1D 7F 80 56-55 9F 31 1F-7F 78 44 DE M OA АVUЯ1 xD▐
.00092A80: 55 7F AE DC-55 7F 84 DB-9C 9B 4E DA-9B 9C 33 9A Uо▄UД█ЬЫN┌ЫЬ3Ъ
.00092A90: 1F 37 8D 49-4A 9E 9B 33-49 9A 58 7F-AE FE FF 33 7НIJЮЫ3IЪXо■ 3
.00092AA0: 49 52 D3 FF-9C 58 BF 8E-14 CA 34 52-F9 FF 58 98 IR╙ ЬX┐О ╩4R∙ XШ
.00092AB0: BA DC EE 50-9C 9E 4E DD-9D 5F C3 5F-C3 4D 5F E7 ║▄юPЬЮN▌Э_├_├M_ч
.00092AC0: 4D 5F E1 4D-13 4D 33 52-F9 FF 55 8E-31 7F AF 56 M_сM M3R∙ UО1пV
.00092AD0: 9D 50 2D ЭP-
После расшифровки (2 фрагмента):
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.00092A20: A5 01 00 AA е к
.00092A30: 70 CF A8 02-72 62 80 7C-40 E0 C9 AD-06 00 AA 71 p╧и rbА|@р╔н кq
.00092A40: CE 80 50 A9-A7 00 00 10-00 AF D2 68-5E 53 56 5E ╬АPйз п╥h^SV^
.00092A50: 59 5E 43<-->A5 06 00 E1-BE 22 AA 70-CF A8 02 72 Y^C е с╛"кp╧и r
.00092A60: 62 80 7C 40-E0 C9 AD 67-00 AA 60 CE-A1 A0 00 E2 bА|@р╔нg к`╬ба т
.00092A70: B2 E6 B0 BE-E2 80 7F A9-AA 60 CE E0-80 87 BB 21 ▓ц░╛тАйк`╬рАЗ╗!
.00092A80: AA 80 51 23-AA 80 7B 24-63 64 B1 25-64 63 CC 65 кАQ#кА{$cd▒%dc╠e
.00092A90: E0 C8 72 B6-B5 61 64 CC-B6 65 A7 80-51 01 00 CC р╚r╢╡ad╠╢eзАQ ╠
.00092AA0: B6 AD 2C 00-63 A7 40 71-EB 35 CB AD-06 00 A7 67 ╢н, cз@qы5╦н зg
.00092AB0: 45 23 11 AF-63 61 B1 22-62 A0 3C A0-3C B2 A0 18 E# пca▒"bа<а<▓а
.00092AC0: B2 A0 1E B2-EC B2 CC AD-06 00 AA 71-CE 80 50 A9 ▓а ▓ь▓╠н кq╬АPй
.00092AD0: 62 AF D2 bп╥
Итак, теперь все? Пожалуй, я забыл самое важное, регистратор (мой разумеется).
Все ли вы помните формулу выполнения RSA преобразования? Напомню ключевой
момент:
Encrypted_Data = Data ^ X Mod Z
Decrypted_Data = Encrypted_Data ^ Y Mod Z
Естественно Data == Decrypted_Data при знании ключа шифрования на требуемой
стадии процесса. Происхождение констант X, Y и Z лучше всего прочитать
где-нибудь в стандарте на алгоритм RSA, я не хочу его лишний раз переписывать.
Для нас самое важное в преобразовании, в факте существования самих констант.
Давайте выполним следующие присваивания: Y=1, Z=Maximal_Number, Тогда N^Y Mod Z
== N при N<Maximal_Number, на так ли ? Ок, сделаем такой фейк ключей в
программе IDA и запишем в ключевой файл требуемую нам информацию. Я полагаю,
что никому не надо объяснять уникальность 2*A0h байтов в пределах всего
жесткого диска!!! Таким образом очень просто осуществляется легкая модификация
программы IDA произвольной версии (осевой, для Windows или для DOS4GW). Ну,
теперь пожалуй все. Использовать RSA для того, чтобы спрятать ОДИН байт
ключевой информации..... И использовать RSA в чистом виде для этого.....
Налицо как некорректное применение алгоритма шифрования, так и построение
системы защиты в целом (код не верифицируется, не применяются методы
противодействия анализу (как статическому, так и динамическому)). Хм, сапожник
без сапог. Регистраторы для IDA v3.5-3.75 можно взять на моей домашней
страничке. Как оказалось впоследствии, на www.fravia.org некто Quine+ занимался
похожими изысканиями, предлагаю вам ознакомиться с ними так же.
[3] Текстовый процессор Microsoft Word for Windows v8.0
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Однажды мне пришлось довольно близко познакомиться с некоторым
англо-русско-украинским переводчиком, переводчик интегрировался в WinWord
v6.0-8.0 Поскольку на моей машине Microsoft Office не стоит вообще как класс,
то я взял первое, что было под рукой, Офис'97, и проинсталлировал текстовый
процессор оттуда. Данный текстовый процессор обладает способностью загружать
макросы из шаблонов в своих подкаталогах (подкаталог StartUp\). Достаточно
промучавшись с переводчиком я обратил свой взор на макросы. WinWord v8.0
использует разделяемую компоненту VBA (Visual Basic for Applications) v3.0
Макросы в документах WinWord могут быть защищены паролем, выглядит это из меню
как: Project Property, а в самом диалоге: Lock Project. Оказалось, что пароль
внутри VBA сравнивается ОТКРЫТЫМ текстом обычным repe cmpsb !!! Невероятно, но
это так. Тексты макросов хранятся так же в более-менее открытом виде. (Те из
вас, кто знаком с WinWord v6.0-7.0 могут отметить различия в поведении этих
программ, в частности, версии 6.0-7.0 хранят кроме исходного текста так же
Пи-код макроса и имеют возможность удалять исходный текст из макроса совсем! +
дополнительно зашифровывать документ паролем). Вот пример корректировки:
─[VBA_v002.crk]────────────────────────────────────────────────────────────────
M$-Office'97 VBA Support (C) by *HW*
Any password for <UnLock Project> query will be legal. [5.00.3508]
VBE.DLL
00071C5E: 74 EB
Any password for <UnLock Project> query will be legal. [5.00.4121]
VBE.DLL
0007202E: 74 EB
─[VBA_v002.crk]────────────────────────────────────────────────────────────────
Пример приведен для двух версий соответствующей DLL'и поддержки, сам же VBA
часто располагается в \Progam Files\Common Files\Microsoft Shared\VBA\...
Разумеется, что после этого открытия (буквально первые же проверки в течение
20-30 минут принесли такой результат) я обладал полными исходными текстами
макросов оболочки переводчика, что позволило быстро локализовать остатки
защиты и обезвредить ее, особенно приятным было чтение авторских комментариев.
Необходимо много раз подумать, прежде чем доверить Micro$oft исходный код
своих программ... А про защиту программного обеспечения в очередной раз можно
сказать следующее: где тонко, там и рвется.
[Z] Продолжение следует...
~~~~~~~~~~~~~~~~~~~~~~~~~~
Хочется надеяться на продолжение этого списка несуразностей и казусов, я
полагаю, что и в будущем смогу поразвлечь вас. Вспомним же, что в мире
существуют хорошие вещи: Free Software Foundation, например... Так как же надо
защищать программное обеспечение? Наверное, помещать под защиту GNU's General
Public License... ,) Дабы никто не мог посягнуть на ваш софт.
Все объявленные материалы можно просмотреть на моей домашней страничке:
www.geocities.com/SiliconValley/Hills/7827
Я открыт также и для переписки:
[email protected]
Флеймеры - не забывайте, что мой /dev/null не ограничен объемом.