Blog. Just Blog

Исследование защиты программы DelinvFile

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Темная сторона Силы | Автор: ManHunter
Скриншот программы DelinvFile
Скриншот программы DelinvFile

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

Скачиваем дистрибутив, распаковываем, устанавливаем. Исполняемый файл ничем не защищен и не упакован, его можно сразу отправить в дизассемблер. А пока посмотрим на проявления триальности. Это текст "Trial - Status" в окне "О программе", ограничение по количеству доступных действий и/или количеству дней работы.

Строки сообщений найдены
Строки сообщений найдены

Строка триального статуса находится без труда, рядом расположена строка о статусе зарегистрированной программы. Теперь вернемся к дизассемблеру и посмотрим, где эти строки используются.
  1. .text:0060E229 loc_60E229:
  2. .text:0060E229                 mov     eax, ds:dword_678954
  3. ; jumptable 0060E1DD case 2
  4. .text:0060E22E                 mov     eax, [eax+3C4h]
  5. .text:0060E234                 mov     edx, offset aTrialStatus
  6. ; "Trial - Status"
  7. .text:0060E239                 call    sub_520B44
  8. .text:0060E23E                 jmp     short loc_60E2A6
  9. .text:0060E240 ; ---------------------------------------
  10. .text:0060E240 loc_60E240:
  11. .text:0060E240                 mov     eax, ds:dword_678954
  12. ; jumptable 0060E1DD case 3
  13. .text:0060E245                 mov     eax, [eax+3C4h]
  14. .text:0060E24B                 mov     edx, offset aRegisteredStat
  15. ; "Registered - Status"
  16. .text:0060E250                 call    sub_520B44
  17. .text:0060E255                 jmp     short loc_60E2A6
По характерным строкам "jumptable xxx case yyy" в листинге безошибочно определяется оператор CASE, то есть ветвление алгоритма в зависимости от значения какой-то переменной. Префикс всей этой конструкции выглядит следующим образом:
  1. .text:0060E1CD                 mov     eax, off_671FE0
  2. .text:0060E1D2                 mov     eax, [eax]
  3. .text:0060E1D4                 cmp     eax, 4          ; switch 5 cases
  4. .text:0060E1D7                 ja      loc_60E291      ; default
  5. .text:0060E1DD                 jmp     ds:off_60E1E4[eax*4] ; switch jump
  6. .text:0060E1DD ; -------------------------------------------------------
  7. .text:0060E1E4 off_60E1E4      dd offset loc_60E1F8
  8. .text:0060E1E4                 dd offset loc_60E212
  9. .text:0060E1E4                 dd offset loc_60E229
  10. .text:0060E1E4                 dd offset loc_60E240
  11. .text:0060E1E4                 dd offset loc_60E257
Берется переменная, на которую ссылается указатель по адресу 671FE0. Она может иметь значение от 1 до 5, причем значение 3 соответствует тому, что программа зарегистрирована. Теперь надо найти место, где эта переменная инициализируется нужным значением.

Перекрестные ссылки на указатель
Перекрестные ссылки на указатель

Перекрестных ссылок на указатель достаточно много, больше трех десятков, придется по ним попрыгать. Почти все они так или иначе относятся к проверкам, но одно место выглядит очень характерно:
  1. .text:00614D95                 mov     eax, ebx
  2. .text:00614D97                 call    sub_6141A0
  3. .text:00614D9C                 test    al, al
  4. ; Проверка регистра AL
  5. .text:00614D9E                 jz      short loc_614DC9
  6. .text:00614DA0                 mov     eax, off_6720A4
  7. .text:00614DA5                 mov     byte ptr [eax], 1
  8. .text:00614DA8                 mov     eax, off_671FE0
  9. .text:00614DAD                 mov     dword ptr [eax], 4
  10. .text:00614DB3                 mov     byte_671B35, 1
  11. .text:00614DBA                 xor     eax, eax
  12. .text:00614DBC                 pop     edx
  13. .text:00614DBD                 pop     ecx
  14. .text:00614DBE                 pop     ecx
  15. .text:00614DBF                 mov     fs:[eax], edx
  16. .text:00614DC2                 call    sub_40935C
  17. .text:00614DC7                 jmp     short loc_614E45
  18. .text:00614DC9 ; ---------------------------------------
  19. .text:00614DC9 loc_614DC9:
  20. .text:00614DC9                 mov     eax, off_6722A0
  21. .text:00614DCE                 mov     eax, [eax]
  22. .text:00614DD0                 call    sub_6147CC
  23. .text:00614DD5                 test    al, al
  24. ; Еще одна проверка
  25. .text:00614DD7                 jz      short loc_614DE0
  26. .text:00614DD9                 mov     byte_671B35, 1
  27. .text:00614DE0 loc_614DE0:
  28. .text:00614DE0                 cmp     byte_671B35, 0
  29. ; И еще одна...
  30. .text:00614DE7                 jz      short loc_614DF6
  31. .text:00614DE9                 mov     eax, off_671FE0
  32. ; Инициализация переменой нужным нам значением
  33. .text:00614DEE                 mov     dword ptr [eax], 3
  34. .text:00614DF4                 jmp     short loc_614E18
Что мы тут видим? Несколько проверок, которые или выводят нас к инициализации переменной нужным значением "зарегистрировано", или различные варианты триальности. Есть несколько вариантов патчей, например, можно сделать первый переход безусловным, а затем нейтрализовать NOPами две другие проверки, а можно наоборот, избавиться от первого перехода по адреу 00614D9E и заменить команду mov dword ptr [eax], 4 по адресу 00614DAD на mov dword ptr [eax], 3, то есть вместо триальности сразу инициализировать нужным значением. Я решил попробовать второй вариант.

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

Сообщение о поврежденном файле
Сообщение о поврежденном файле

Строка сообщения также находится без проблем:

Строка сообщения
Строка сообщения

Конечно, можно воспользоваться привычным хирургическим вмешательством, но если посмотреть повнимательнее, то рядом со строкой сообщения обнаруживаются еще две интересные строки - это название системной библиотеки ImageHlp.dll и одной из ее функций MapFileAndCheckSumW. Мы знаем, что эта функция используется как раз для проверки целостности файла на основании данных контрольной суммы, записанных в PE-заголовок файла (если не знаете, то бегом на MSDN изучать матчасть). Похоже, что автор не стал заморачиваться с написанием своих велосипедов и контролирует целостность файла стандартными системными методами. Чтобы обойти такую проверку, достаточно подкорректировать контрольную сумму в заголовке пропатченного PE-файла. Для этого есть много разных инструментов, лично я воспользовался анализатором PEiD с плагином FixCRC, который предназначен как раз для этих целей.

Корректируем CRC в PE-заголовке
Корректируем CRC в PE-заголовке

Сохраняем новую контрольную сумму, запускаем файл. Вот теперь никаких сообщений о том, что файл лишен целостности, нет. Значит наше предположение оказалось верным. Что ж, давненько я не встречал защит, которые используют столь примитивный трюк. А что же наш пропатченный файл? С ним тоже все нормально, в окне "О программе" красуется надпись, что все зарегистрировано, исчезли посторонние надписи в главном окне и теперь можно удалять или переименовывать файлы без каких-либо ограничений по количеству и времени. Цель достигнута.

Программа успешно "зарегистрирована"
Программа успешно "зарегистрирована"

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

Поделиться ссылкой ВКонтакте
Просмотров: 4736 | Комментариев: 26

Внимание! Статья опубликована больше года назад, информация могла устареть!

Комментарии

Отзывы посетителей сайта о статье
nubuser (28.11.2017 в 13:52):
В общем, если я понял, ctrl-X - это перекрестные ссылки на строку, в данном случае. А чтобы до этого сначала найти строку, я делаю CTRL-L, Search и далее Filter. Так как не знаю кнопки, типа "Продолжить поиск..." (как F3 во многих прогах). Примерно так?
ManHunter (28.11.2017 в 12:14):
В IDA курсор на адрес строки, Ctrl+X
nubuser (28.11.2017 в 12:10):
Это CTRL-L и кнопка Search?
Или другой способ?
nubuser (28.11.2017 в 11:48):
ЦитатаСтрока триального статуса находится без труда, рядом расположена строка о статусе зарегистрированной программы. Теперь вернемся к дизассемблеру и посмотрим, где эти строки используются.

Расскажите, пожалуйста, один раз, как это делается?
А то с поиском в отладчике еще как-то, а с дизасмами пока не очень.
Как именно находятся искомые строки в Иде (в каком окне или меню)?

А то у Вас на этом почти всё основано.
ManHunter (18.04.2015 в 22:11):
Согласен. Поправил в тексте.
user (18.04.2015 в 20:18):
Цитатадостаточно подкорректировать CRC в заголовке пропатченного PE-файла.

Вообще-то, там не CRC. В смысле, алгоритм другой. Мне когда-то сделали замечание по этому же поводу. Наверное, корректней говорить просто о "котрольной сумме".
Там такое (упрощённо, без подкачки порций файла):

- - - - - - - - -  - - - ->8
xor     edx,edx     
mov     checksum, edx     
mov     ecx,length_of_file
inc     ecx
mov     byte ptr [esi+ecx],0
shr     ecx,1   
@@next_word:
mov     dx,[esi] 
add     checksum,edx
shr     checksum,10h
mov     dx,w checksum
add     checksum,edx
add     esi,2 
loop @@next_word
mov     eax,checksum
add     eax,length_of_file 
mov     checksum,eax     
- - - - - - - - -  - - - ->8
Андрей (06.04.2015 в 16:06):
Спасибо.
ManHunter (06.04.2015 в 13:30):
Просмотр и редактирование - HiEW, дизассемблер - IDA, работа с ресурсами - eXeScope, отладчик - OllyDbg. Это основное, остальные мелкие инструменты по необходимости.
Андрей (06.04.2015 в 12:08):
Подскажите Ваш "настольный" перечень инструментов для подобного рода исследований. Если по этому поводу есть статья, не сочтите за труд дать ссылку. Или подтверждение что статья есть, попытаюсь сам найти.
X-Wing Top Ace (04.04.2015 в 08:44):
Цитата(С) Лаврентий Павлович

По мемуарам дочери Валерия Чкалова - Андрей Януарьевич. Это если кто-то вообще говорил так в реале, а не в чьих-то россказнях, как это выяснилось, например, с фразами "Нет человека - нет проблемы" (выдумал А. Рыбаков) и "Генетика - продажная девка империализма" (выдумал А. Хазин).
CryptoMaN (03.04.2015 в 17:45):
ЦитатаИ вся красота выходит впустую..

Ну почему же впустую. Красота здесь рассматривается с точки зрения трудоемкости и полноты проведённой исследовательской работы, требующей высокой квалификации. Конечно, обычный пользователь навряд ли сможет оценить её по достоинству.
Ну, а что касается попыток программы выйти в Интернет, то здесь каждый сам должен блокировать нежелательную сетевую активность, причём это касается любых приложений, не вызывающих доверия, мало ли какую информацию они там передают. Да и в nfo-файлах к кейгенам обычно указывают, нужно ли использовать фаервол.
ManHunter (02.04.2015 в 21:26):
ЦитатаПравда, некоторые понятия в законодательстве весьма расплывчатые.

"Был бы человек, а статья всегда найдется" (С) Лаврентий Павлович
user (02.04.2015 в 19:50):
Мда..
Ну, может и так, спорить не стану.
Хотя сейчас, с повсеместным развитием интернета, программы всё чаще проверяют валидность накейгененных данных, связываясь со своим логовом.
И вся красота выходит впустую.. Причём обнаружиться такое безобразие может и через пол-года
CryptoMaN (02.04.2015 в 18:00):
ЦитатаОбычным пользователям абсолютно параллельно, каким образом сломана программа.

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

ЦитатаЛоадер это вообще самое элегантное со всех точек зрения решение.

"Считается, что кейген (в отличие от патча и лоадера) это самый красивый способ взлома программы и самый лучший результат работы крэкера, сказать наверняка почему все так считают - сложно (это из области внегласного кодекса крэкера), но главные аспекты: "нет модификаций в коде программы", "повышенная трудоемкость задачи и высокая квалификация крэкера", в общем, кейген это "чистая работа"." (цитата с exelab)
CryptoMaN (02.04.2015 в 17:59):
Цитатакейген и лоадер - единственные "законные" методы исправления программ.

Цитатакейгенить некрасиво - явная кража

УК РФ говорит об обратном. Любая модификация кода, неважно на диске, с помощью патча, или в памяти, с помощью лодыря, является незаконной:
Статья 159.6: "...модификации компьютерной информации либо иного вмешательства в функционирование средств хранения...";
Статья 272: "Неправомерный доступ к охраняемой законом компьютерной информации, если это деяние повлекло уничтожение, блокирование, модификацию либо копирование компьютерной информации...";
Статья 273: "Создание, распространение или использование компьютерных программ либо иной компьютерной информации, заведомо предназначенных для несанкционированного уничтожения, блокирования, модификации, копирования компьютерной информации или нейтрализации средств защиты компьютерной информации".
Т.о. уголовно-наказуемы все деяния, которые повлекли материальные последствия в виде: уничтожения и/или блокирования, модификации, копирования компьютерной информации. Так что незаконность создания и использования кряков и лодырей не вызывает сомнения.
А вот за создание кейгена привлечь к уголовной ответственности по-труднее (за использование проще), т.к. нет прямых доказательств вторжения в чужой код (нет модификации, защита остаётся на месте и т.д.).
Правда, некоторые понятия в законодательстве весьма расплывчатые. Что, к примеру, понимается под "нейтрализацией средств защиты"? Понятно, что патч или загрузчик напрямую подпадают под это понятие. Если понимать под нейтрализацией любое средство не только уничтожения или модификации, но и просто обхода защиты, то тогда создание и использование кейгенов также противозаконно.
X-Wing Top Ace (02.04.2015 в 16:02):
Цитатакейгенить некрасиво - явная кража

Значит, надо кейгенить красиво! ;)
user (01.04.2015 в 21:11):
brute,
имхо, кейген уберите, лоадер оставьте. Тогда согласен.
Лоадер это вообще самое элегантное со всех точек зрения решение.
Но патч всёже удобнее, если он возможен.
ManHunter (01.04.2015 в 20:34):
Цитатаединственные "законные" методы исправления программ

Это только если в компании специалистов меряться длиной... эээ... например, дизассемблерных листингов :) Обычным пользователям абсолютно параллельно, каким образом сломана программа. Им важно: а) программа работает б) бесплатно
brute (01.04.2015 в 06:31):
CryptoMaN - сенкс, постараюсь разобраться.
user - кейген и лоадер - единственные "законные" методы исправления программ.
user (31.03.2015 в 20:26):
Имхо кейгенить некрасиво - явная кража. Гораздо лучше иметь исправленную программу, где нет этой возни с вводами абракадабры.
Если делается для себя, естественно.
CryptoMaN (31.03.2015 в 19:01):
brute
ЦитатаCryptoMaN - научи писать кейгены.

Постарался кратко изложить общий подход: http://pastebin.com/XRBJSz4U
Doxtur (31.03.2015 в 12:45):
Блин что не топик то членомерка) Ладно зайду)
Я проги отламывал вообще без отладчика (не читая wsdasm)
Но жизнь задает свой конский ритм, в итоге никого не отламываю, но порою зафишишь ключег и вливается свежая кровь в застывшие вены, но жизнь задает свой конский ритм и времени нет...
brute (31.03.2015 в 02:38):
для любителей копаться в PE формате напомню, что CRC находится в Optional Header по смещению 158.
Anonymous (31.03.2015 в 01:52):
CRC это еще ничего, тут разработчик хотя бы ддодумался задействовать готовые средства ОС. Я однажды видел такую "защиту" от модификации: программа брала md5-хеш своего бинарника и сравнивала с эталонным. Всё бы ничего, но автор не удовлетворился этим и решил колхозить свой велосипед дальше. Чтобы не светить эталонный хеш, этот горе-кодер заранее поXORил эталон с произвольной строкой вида "454545454545454545454545", вшил в код этот "зашифрованный" хеш и эту самую "произвольную" строку, а потом снова ксорил их в памяти, воссоздавая "эталон". Видимо, полагая, что крэкеры ничего не знают про XOR. Естественно, под отладчиком пошагово всё было видно, как на ладони.

P.S.: За софтину, к слову, автор хотел аж 300 евро (губа у него дура).
brute (30.03.2015 в 20:23):
запатчить слишком легко даже не открывая ИДУ - все строки видны в ОЛЕ. Любой серийник принимается патчем одного перехода. И на CheckSum - ещё один..
CryptoMaN - научи писать кейгены. Имхо, легче сделать брутер процедуры проверки (рипнуть asm-код)  - чтобы она возвращала eax=0. Но ведь в этой процедуре куча относительных ссылок (чтений, прыжков) и вызовы других процедур..
CryptoMaN (30.03.2015 в 19:06):
Привет, ManHunter.

Когда-то, по запросу на Ru-Board, сделал к этой программе кейген: http://rghost.ru/6Wh5jbSbQ. Алгоритм там довольно простой, кастомный блочный шифр на основе сети Фейстеля. Точно такой же шифр используется, например, в HTTPAnalyzer и My Notes Keeper.

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2024
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.08 сек. / MySQL: 2 (0.0076 сек.) / Память: 4.5 Mb
Наверх