Исследование защиты программы DelinvFile
Скриншот программы DelinvFile
Программа DelinvFile предназначена для удаления или переименования файлов и папок, у которых имя повреждено или содержит символы в какой-нибудь неведомой кодировке. Такие файлы, как правило, нельзя удалить или переименовать обычными средствами Windows. Конечно, никто не отменял бесплатный Unlocker, который ничуть не хуже справляется с этими же задачами. Но раз какая-то программа просит денег, наша цель ее в этом переубедить.
Скачиваем дистрибутив, распаковываем, устанавливаем. Исполняемый файл ничем не защищен и не упакован, его можно сразу отправить в дизассемблер. А пока посмотрим на проявления триальности. Это текст "Trial - Status" в окне "О программе", ограничение по количеству доступных действий и/или количеству дней работы.
Строки сообщений найдены
Строка триального статуса находится без труда, рядом расположена строка о статусе зарегистрированной программы. Теперь вернемся к дизассемблеру и посмотрим, где эти строки используются.
Code (Assembler) : Убрать нумерацию
- .text:0060E229 loc_60E229:
- .text:0060E229 mov eax, ds:dword_678954
- ; jumptable 0060E1DD case 2
- .text:0060E22E mov eax, [eax+3C4h]
- .text:0060E234 mov edx, offset aTrialStatus
- ; "Trial - Status"
- .text:0060E239 call sub_520B44
- .text:0060E23E jmp short loc_60E2A6
- .text:0060E240 ; ---------------------------------------
- .text:0060E240 loc_60E240:
- .text:0060E240 mov eax, ds:dword_678954
- ; jumptable 0060E1DD case 3
- .text:0060E245 mov eax, [eax+3C4h]
- .text:0060E24B mov edx, offset aRegisteredStat
- ; "Registered - Status"
- .text:0060E250 call sub_520B44
- .text:0060E255 jmp short loc_60E2A6
Code (Assembler) : Убрать нумерацию
- .text:0060E1CD mov eax, off_671FE0
- .text:0060E1D2 mov eax, [eax]
- .text:0060E1D4 cmp eax, 4 ; switch 5 cases
- .text:0060E1D7 ja loc_60E291 ; default
- .text:0060E1DD jmp ds:off_60E1E4[eax*4] ; switch jump
- .text:0060E1DD ; -------------------------------------------------------
- .text:0060E1E4 off_60E1E4 dd offset loc_60E1F8
- .text:0060E1E4 dd offset loc_60E212
- .text:0060E1E4 dd offset loc_60E229
- .text:0060E1E4 dd offset loc_60E240
- .text:0060E1E4 dd offset loc_60E257
Перекрестные ссылки на указатель
Перекрестных ссылок на указатель достаточно много, больше трех десятков, придется по ним попрыгать. Почти все они так или иначе относятся к проверкам, но одно место выглядит очень характерно:
Code (Assembler) : Убрать нумерацию
- .text:00614D95 mov eax, ebx
- .text:00614D97 call sub_6141A0
- .text:00614D9C test al, al
- ; Проверка регистра AL
- .text:00614D9E jz short loc_614DC9
- .text:00614DA0 mov eax, off_6720A4
- .text:00614DA5 mov byte ptr [eax], 1
- .text:00614DA8 mov eax, off_671FE0
- .text:00614DAD mov dword ptr [eax], 4
- .text:00614DB3 mov byte_671B35, 1
- .text:00614DBA xor eax, eax
- .text:00614DBC pop edx
- .text:00614DBD pop ecx
- .text:00614DBE pop ecx
- .text:00614DBF mov fs:[eax], edx
- .text:00614DC2 call sub_40935C
- .text:00614DC7 jmp short loc_614E45
- .text:00614DC9 ; ---------------------------------------
- .text:00614DC9 loc_614DC9:
- .text:00614DC9 mov eax, off_6722A0
- .text:00614DCE mov eax, [eax]
- .text:00614DD0 call sub_6147CC
- .text:00614DD5 test al, al
- ; Еще одна проверка
- .text:00614DD7 jz short loc_614DE0
- .text:00614DD9 mov byte_671B35, 1
- .text:00614DE0 loc_614DE0:
- .text:00614DE0 cmp byte_671B35, 0
- ; И еще одна...
- .text:00614DE7 jz short loc_614DF6
- .text:00614DE9 mov eax, off_671FE0
- ; Инициализация переменой нужным нам значением
- .text:00614DEE mov dword ptr [eax], 3
- .text:00614DF4 jmp short loc_614E18
Сохраняем изменения, проверяем, и... не тут-то было. Получаем сообщение о том, что файл поврежден. Значит где-то внутри проверяется контрольная сумма и таким образом выявляются подобные патчи. Ну да и ничего страшного, никто ведь не запрещает пропатчить функцию проверки пропатченности :)
Сообщение о поврежденном файле
Строка сообщения также находится без проблем:
Строка сообщения
Конечно, можно воспользоваться привычным хирургическим вмешательством, но если посмотреть повнимательнее, то рядом со строкой сообщения обнаруживаются еще две интересные строки - это название системной библиотеки ImageHlp.dll и одной из ее функций MapFileAndCheckSumW. Мы знаем, что эта функция используется как раз для проверки целостности файла на основании данных контрольной суммы, записанных в PE-заголовок файла (если не знаете, то бегом на MSDN изучать матчасть). Похоже, что автор не стал заморачиваться с написанием своих велосипедов и контролирует целостность файла стандартными системными методами. Чтобы обойти такую проверку, достаточно подкорректировать контрольную сумму в заголовке пропатченного PE-файла. Для этого есть много разных инструментов, лично я воспользовался анализатором PEiD с плагином FixCRC, который предназначен как раз для этих целей.
Корректируем CRC в PE-заголовке
Сохраняем новую контрольную сумму, запускаем файл. Вот теперь никаких сообщений о том, что файл лишен целостности, нет. Значит наше предположение оказалось верным. Что ж, давненько я не встречал защит, которые используют столь примитивный трюк. А что же наш пропатченный файл? С ним тоже все нормально, в окне "О программе" красуется надпись, что все зарегистрировано, исчезли посторонние надписи в главном окне и теперь можно удалять или переименовывать файлы без каких-либо ограничений по количеству и времени. Цель достигнута.
Программа успешно "зарегистрирована"
Вот так мы получили в свое распоряжение инструмент сомнительной полезности, а главное, научились обходить проверку целостности файла, реализованную стандартными системными средствами.
Просмотров: 4795 | Комментариев: 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. В смысле, алгоритм другой. Мне когда-то сделали замечание по этому же поводу. Наверное, корректней говорить просто о "котрольной сумме".
Там такое (упрощённо, без подкачки порций файла):
- - - - - - - - - - - - ->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 - кейген и лоадер - единственные "законные" методы исправления программ.
user
(31.03.2015 в 20:26):
Имхо кейгенить некрасиво - явная кража. Гораздо лучше иметь исправленную программу, где нет этой возни с вводами абракадабры.
Если делается для себя, естественно.
Если делается для себя, естественно.
CryptoMaN
(31.03.2015 в 19:01):
Doxtur
(31.03.2015 в 12:45):
Блин что не топик то членомерка) Ладно зайду)
Я проги отламывал вообще без отладчика (не читая wsdasm)
Но жизнь задает свой конский ритм, в итоге никого не отламываю, но порою зафишишь ключег и вливается свежая кровь в застывшие вены, но жизнь задает свой конский ритм и времени нет...
Я проги отламывал вообще без отладчика (не читая 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 евро (губа у него дура).
P.S.: За софтину, к слову, автор хотел аж 300 евро (губа у него дура).
brute
(30.03.2015 в 20:23):
запатчить слишком легко даже не открывая ИДУ - все строки видны в ОЛЕ. Любой серийник принимается патчем одного перехода. И на CheckSum - ещё один..
CryptoMaN - научи писать кейгены. Имхо, легче сделать брутер процедуры проверки (рипнуть asm-код) - чтобы она возвращала eax=0. Но ведь в этой процедуре куча относительных ссылок (чтений, прыжков) и вызовы других процедур..
CryptoMaN - научи писать кейгены. Имхо, легче сделать брутер процедуры проверки (рипнуть asm-код) - чтобы она возвращала eax=0. Но ведь в этой процедуре куча относительных ссылок (чтений, прыжков) и вызовы других процедур..
CryptoMaN
(30.03.2015 в 19:06):
Привет, ManHunter.
Когда-то, по запросу на Ru-Board, сделал к этой программе кейген: http://rghost.ru/6Wh5jbSbQ. Алгоритм там довольно простой, кастомный блочный шифр на основе сети Фейстеля. Точно такой же шифр используется, например, в HTTPAnalyzer и My Notes Keeper.
Когда-то, по запросу на Ru-Board, сделал к этой программе кейген: http://rghost.ru/6Wh5jbSbQ. Алгоритм там довольно простой, кастомный блочный шифр на основе сети Фейстеля. Точно такой же шифр используется, например, в HTTPAnalyzer и My Notes Keeper.
Добавить комментарий
Заполните форму для добавления комментария