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

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


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

viewer32 - Как всё дело то было :)

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

Массу крэкерских инструментов, видеоуроков и статей вы сможете найти на видеокурсе от нашего сайта. Подробнее здесь.

Автор: Bad_guy <bad_guy@cracklab.ru>

Давненько руки не тянулись к написанию статей и вот наконец появилось некоторое вдохновение, которое возникло неспроста и не на пустом месте, а на основе одной интереснейшей программы или вернее будет сказать защиты.

Назначение


Статья написана для начинающих крэкеров, для таких новичков, которые уже держали в руках отладчик, ломали по пошаговым подробным статьям. В своей же статье я не стал раскрывать подробности, чтобы у вас было пространство для творчества. Однако, рассмотрел три различные возможности отключить защиту программы: пропатчивание, модификация системной библиотеки kernel32.dll для изменения кода WinAPI функции, кейген.
Мне часто пишут, что сложно найти программы, упомянутые в статьях. Сейчас это было бы еще сложнее, так как исследованная программа - приватная версия "от автора", которую он высылает только зарегистрированным пользователям. Поэтому выкладываю вместе со статьей архив с программой:

http://cracklab.ru/art/viewer32_crack.rar

Исследование


Началось всё с того, что один товарищ попросил меня "убрать окошко" в программке viewer32. Программка эта как потом выяснилось написана на фрипаскале и скомпилирована в виде консольного приложения. Я взялся за неё, "убрать окно" ведь задача не сложная, скажу только, что "окном" было предложение ввести регистрационный код при запуске программы.

Для начала, хочется рассказать что же это за программа viewer32 - она позволяет распечатывать некие бухгалтерские отчёты из системы учёта БЭСТ, которые та выдает лишь ввиде таблиц выполненных псевдографикой, а эту псевдографику очень уж сложно напечатать из ворда, да еще и на лазерном принтере. Вот эта программа и занимается такой распечаткой, вначале осуществляя перевод псевдографики в графический вид, также она умеет конвертировать таблицы начерченные псевдографикой в EXCEL таблицы и делает это весьма красиво.

При запуске, как мы уже говорили выше, программа показывает некий код (ИД), начинающийся с буквы M или I. Четыре трехзначных числа после - это 4 байта переведенные в десятичную форму, в общем можно приступать к исследованиям, но как показывает опыт, никогда не надо сразу бросаться на программу с отладчиком, если цель только "убрать окно" :) - в любой научной деятельности важно оценить имеющийся опыт других авторов, который пару секунд поискав мы элегантно находим на нашем же форуме. Там есть топик про v32, в котором я нашёл некоторые подсказки для начала

http://cracklab.ru/f/index.php?action=vthread&forum=2&topic=5746

В топике пишут "Программа привязывается к жесткому диску .PhysicalDrive .SMARTVSD .Scsi"

это отчасти верно

еще пишут "если ее зарегить "таким способом" - печатаются только иероглифы."

Да в этом основная загвоздка, дальше будет понятно почему так.

Далее последний пост:

"BASE-I-007-175-034-087 = I178116123a1781161238958d в Regedite

там проверка вообще простая.

PS: на печать не проверял

0040CB01 |. E8 26F9FFFF |CALL viewer32.0040C42C ---------- проверка серийника"


Признаться он дал мне первый толчок - адрес 40CB01, на котором я прервался в отладчике. Но в остальном автор поста в корне не прав. Ключ его неверный, процедура эта не проверка ключа, а лишь формальная проверка контрольной суммы ключа, которой являются последние 2 символа в программе. Однако, длина ключа именно 25 символов и что же они представляют (возьмем для примера неправильный ключ указанный выше):


I  ;;; 17 81 16 12 3a 17 81 16 12 38 95  ;;;;  8d

Изначально это некий первый символ (буква), потом 11 символов в 
шестнадцатиричной форме, потом 1 символ в той же форме - это 
контрольная сумма ключа. 


Вместо 11 символов можно набрать любые наобум и потом подогнать контрольный байт в процедур проверки (из адреса 40CB01 лично я пришёл к адресу 40C7C0), НО автор поста не проверил как потом печатает программа, а печатать она будет именно перекошенную фигню.

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

Что дают валидные ключи обычно ? Допустим в программе есть зашифрованный код, тогда имея один валидный ключ пускай не для своей машины, но он обычно даёт возможность полазав в отладчике найти ключ расшифровки зашифрованных блоков.

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

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

Надо разобраться что это за параметры машины. В отладчике я пошёл по коду I-111-003-128-250 который показывала мне программа, установив на него брейк на чтение и запись. Несколько раз перезапустив программу и каждый раз ставя брэйк на то место где раньше всего появляется этот код я пришёл к тому, что вначале в памяти программы он выглядит не как сточка, а как 5 байт подряд: первый из них это символ I который равен 49 в хексе и потом эти 4 числа тоже в хексе, далее я пошёл ещё выше и нашёл что 4 байта генерятся отдельно, а буква подсоединяется потом. В итоге я пришёл в процедуру генерации, которая делала:
CreateFileA('.PhysicalDrive0',....) а потом DeviceIoControl(....) в итоге она запрашивала таким образом данные о винчестере (вспомним пост из форума - там был правильный намёк), а именно:

Модель : Vmware hardddisk
Серийный номер : 00000000000000001
Версия микропрограммы : 00000001

и потом скручивала их в 4 байтный уникальный код.

У меня возникла идея не трогать программу пока что, мало ли как она может себя на пропатчивание проверить и тогда покопавшись в алгоритме скручивания параметров жесткого диска в уникальный код я разобрался что должна вернуть DeviceIoControl в качестве параметров винчестера.

Поспрашивав у гуру "нулевого кольца" про то как поменять в вмваре серийник винта я пришёл к факту что никто этого не знает. Пропатчивание vmdk файла образа диска вмваре тоже ничем хорошим не кончилось. В итоге всё пришло к тому, что я решил модифицировать саму эту WinAPI DeviceIoControl, находящуюся внутри kernel32.dll - вообще то написание небольших инлайн прог это мой любимый подход, в итоге я нашёл место внутри kernel32 и дописал туда своего кода, поменяв функционирование winapi функции DeviceIoControl, в итоге она возвращала то что мне было нужно и я смог подогнать уникальный код который показывала исследуемая программа под те валидные ключи, которые прислал заказчик. Скажу что в программе эта скрутка происходила весьма хитроумным путем и обратить алгоритм я смог не так быстро, но это было очень интересно - такой самопальной олдскулл математики я уже давно не видел в наше время, когда все тупо навешивают протектор на проги, а тут автор даже хэш алго написал самодельный.

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

При экспорте в эксель сам процесс происходил через постоянный вызов исключений и свой обработчик, поэтому в отладчике OllyDbg всегда нужно было нажимать Shift-F9 пока программа не заканчивала процесс экспорта.

Итак, допустим программа зарегистрирована, но теперь стоял вопрос сделать это попроще, потому что подмена kernel32.dll для ломания программы это крайняя мера и "большой слон в посудной лавке". Обратившись внутрь процедуры самодельного хэша я взял да и пропатчил её, но к тому времени я уже успел заметить, что программа 2 раза определяет свой уникальный код. Один раз для показа в окошке, второй раз для своих внутренних нужд и происходит это в двух разных местах кода, в общем это ничто иное как часть защиты, хотя и какая-то тоже самопально-самоуверенная. Оба этих участка расчёта хэша были просто запатчены и сразу возвращали нужные 4 байта для проги. Но оставался пятый байт - буква. Немного покопавшись в проге я разобрался что буква может быть M или I и от этого зависит как программа расчитывает эти остальные 4 байта. M-код выдается на тех компах, где есть сетевая карта и скручивается из MAC-адреса, а I-код это код зависящий от данных о жестком диске. То есть у меня не было на компе сетевой карты, поэтому я и видел сразу I-....

Далее я просто запатчил в проге запрос к WinAPI функции Netbios из Netapi32.dll, чтобы будь даже на компе сетевая карта она её не видела. Так что на всех компах прога стала показывать один и тот же код начиная с буквы I, под который был валидный ключ. И казалось бы всё на этом, но как выяснилось позже, не на всех компах у проги получается рассчитать код для жесткого диска, потому как некоторые компы сидят с урезанными админом локальной сети правами и не имеют доступа к винчестеру (доступ для CreateFileA('.PhysicalDrive0',....) закрыт). Конечно можно было запатчить сами вызовы апи функций и сразу же возвращать 4 байта, но тут я уже совсем увлекся этой программой и решил, что надо всё-таки найти и разобраться в алго проверки ключа и попробовать сделать кейген.

Программа хранит введенные данные в реестре, оттуда читает их 2 раза при запуске и сверяет 2 раза (один раз чтобы нас запутать). Далее как обычно ставя прерывания на доступ к памяти в отладчике я попал в итоге на адрес 40562A, потом смотрю в дизассемблере IDA этот участок выглядит не кодом, а набором байт, потом перезапустил прогу и в отладчике также. Далее я поставил железный бряк на исполнение на этом адресе и стало понятно, что тут у нас пошифрованный кусок кода, который расшифровывается по ходу выполнения программы и позанимавшись с ним немного я разобрался, что именно тут идёт реальная проверка ключа и даже скорее не совсем проверка.

Программа берёт 11 байт из ключа и скручивает их с четырьмя байтами уникального кода, в итоге получаются другие 11 байт (я сначала пошёл по коду для экселя):


BA B7 BB D2 AE BC BB BF D8 C4 B3


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

Но зная это можно делать кейген, однако обратить алгоритм тут тоже было нужно и в итоге я нашёл ряд xor манипуляций, да еще и реверс-манипуляцию, самодельную (она переворачивала биты в байте справа налево, то есть тоже взаимообратимая функция). Исписав 3 странички бумаги логическими операциями, происходящими с байтами ключа для превращения в нужных 11 символов я приступил к пересчёту алго наоборот и за пару часов был готов кейген. Вот и всё !

PS. На скриншоте в архиве валидная пара, чтобы у вас тоже была фора :)

http://cracklab.ru/art/viewer32_crack.rar

Желаю удачи в увлекательном процессе исследования защиты программ !



Обсуждение статьи: viewer32 - Как всё дело то было :) >>>


Комментарии к статье: viewer32 - Как всё дело то было :)

DMD 28.12.2007 16:22:03
особо понравился "юмор": указывать адреса для версии от 2006 года, а в аттачмент положить версию от 2007 года... смешно... :)
---
Bad_guy 01.01.2008 21:26:10
Эт я скопипастил из поста немного. на самом деле не "0040CB01 |. E8 26F9FFFF |CALL viewer32.0040C42C ---------- проверка серийника", а проверка эта в 40C7B0 в данной версии
---
[8UNG] 18.02.2008 10:19:53
Цитата:
Итак, допустим программа зарегистрирована, но теперь стоял вопрос сделать это попроще, потому что подмена kernel32.dll для ломания программы это крайняя мера и "большой слон в посудной лавке".

Хм... тут уж смотря какие цели ты преследуешь... Я бы наоборот - просто сделал лоадер, который бы патчил kernel32.dll и netapi32.dll, да и дело с концеом, и тебе возни меньше.
Но это моё сугубо личное ИМХО

---
Bad_guy 18.02.2008 14:36:08
Дело в том, что это не так просто. Существует много разных билдов этих системных библиотек, поэтому то и патчить и делать лоадер удобно, если это делается только для одного компа.
---
ValdikSS 11.05.2008 08:50:59
я знаю эту прогу! KingSise ее ломал так, что пароль она не требовала, но таймер шел, и при каждом перемещении мышки опять становился на 5 минут =)
---

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



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


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