Исследование защиты программы Process Master
Скриншот программы Process Master
Программа Process Master - менеджер процессов с возможностью принудительного завершения выбранных процессов и якобы даже способный обнаруживать руткиты. Ну и все, вроде как. И за все это грандиозное разнообразие функций, которое студенты-первокурсники пишут в качестве лабораторных работ, аффтар требовал быренько метнуться в кассу на предмет выкладывания своих кровных. К счастью, проект прекратил свое развитие практически сразу после начала, оффсайт сдох, так что нам остается только попрактиковаться в реверсивной некромантии. Ну а что, почему бы и нет?
По ссылке выше забираем последний из доступных дистрибутивов, устанавливаем, запускаем. Все вроде работает, за исключением того, что в окне "О программе" тикает счетчик триальных дней. По функционалу никаких ограничений я не нашел.
Триальный счетчик
Исполняемый файл ничем не упакован, просто отправляем его в дизассемблер. Теперь надо выяснить, как программа будет реагировать на попытку ее зарегистрировать какой-нибудь левотой.
Сообщение после активации программы
Это уже интереснее. Никаких сообщений о правильной или неправильной регистрации, просто предложение перезапустить программу. Значит проверка регистрационных данных выполняется при запуске. Подобная схема - это очень правильный подход к реализации защиты. Логично предположить, что когда при запуске программа определяет свой статус, на его основании она обозначает триальный срок. Поищем какие-нибудь строки, связанные с триальным временем.
Строка сообщения в файле
Код, где используются эти строки достаточно объемный, целиком я его приводить не буду. Главное, что ему предшествует проверка и условный переход, который перепрыгивает все, что связано с проверкой окончания триального срока:
Code (Assembler) : Убрать нумерацию
- ; Проверить значение переменной
- .text:00405824 mov eax, [esi+2E0h]
- .text:0040582A test eax, eax
- ; Если оно не равно нулю, то перепрыгнуть все триальные активности
- .text:0040582C jnz loc_405A42
- .text:00405832 cmp [esi+2F0h], eax
- .text:00405838 jz short loc_4058B8
- .text:0040583A mov ecx, 1Eh
- .text:0040583F sub ecx, [esi+2F4h]
Code (Assembler) : Убрать нумерацию
- .text:004057BF lea ecx, [esi+29Eh]
- ; Вызвать функцию проверки
- .text:004057C5 call sub_406A60
- .text:004057CA mov edi, [esi+2E8h]
- .text:004057D0 mov ebx, [esi+2ECh]
- .text:004057D6 push 0
- ; Сохранить результаты проверки
- .text:004057D8 mov [esi+2E0h], eax
Code (Assembler) : Убрать нумерацию
- .text:00406A60 sub_406A60
- .text:00406A60 sub esp, 50h
- .text:00406A63 mov eax, ___security_cookie
- .text:00406A68 xor eax, esp
- .text:00406A6A mov [esp+50h+var_4], eax
- .text:00406A6E push ebx
- .text:00406A6F push esi
- .text:00406A70 push edi
- .text:00406A71 lea eax, [esp+5Ch+String1]
- .text:00406A75 mov ebx, ecx
- .text:00406A77 push eax
- .text:00406A78 push ebx ; lpString
- .text:00406A79 call ds:lstrlenA
- .text:00406A7F push eax
- .text:00406A80 call sub_40A120
- .text:00406A85 mov ebx, ds:lstrcmpA
- .text:00406A8B add esp, 8
- .text:00406A8E xor edi, edi
- ; Указатель на массив сравниваемых хэшей
- .text:00406A90 mov esi, offset String2
- ; "ed4080635961cbc29753aebbb21b0af277ddfda"...
- .text:00406A95 loc_406A95:
- .text:00406A95 push esi ; lpString2
- .text:00406A96 lea ecx, [esp+60h+String1]
- .text:00406A9A push ecx ; lpString1
- .text:00406A9B call ebx ; lstrcmpA
- .text:00406A9D test eax, eax
- .text:00406A9F jz short loc_406AAF
- .text:00406AA1 add esi, 41h
- .text:00406AA4 add edi, 1
- .text:00406AA7 cmp esi, offset Blowfish_p_init
- .text:00406AAD jl short loc_406A95
- .text:00406AAF loc_406AAF:
- .text:00406AAF mov ecx, [esp+5Ch+var_4]
- .text:00406AB3 xor eax, eax
- ; Все 1000 сравнений выполнены?
- .text:00406AB5 cmp edi, 3E8h
- .text:00406ABB pop edi
- .text:00406ABC pop esi
- ; AL = 1 - совпадение найдено, программа зарегистрирована
- .text:00406ABD setnz al
- .text:00406AC0 pop ebx
- .text:00406AC1 xor ecx, esp
- .text:00406AC3 call @__security_check_cookie@4
- .text:00406AC8 add esp, 50h
- .text:00406ACB retn
- .text:00406ACB sub_406A60 endp
Программа успешно "зарегистрирована"
В окне "О программе" красуются введенные ранее левые регистрационные данные. Переводим системные часы на пару месяцев вперед. Никаких сообщений об окончании пробного периода не появляется. Цель достигнута. В качестве второго варианта для патча можно было в отладчике подсмотреть хэш левых регистрационных данных и заменить им одно из значений в массиве предустановленных хэшей. В этом случае программа принимала бы эти данные как корректные.
Просмотров: 1786 | Комментариев: 4
Метки: исследование защиты, процессы
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
Лестер Глючный
(08.10.2022 в 12:01):
По поводу "обнаружения скрытых процессов" — нужен ntdll от WinXP (SP0,SP1 и SP2)! Видимо, интерфейс сисемных вызовов от вист/семёрок и т.д. не поддерживает. И ещё хз что насчёт локализации ОС…
ManHunter
(15.12.2018 в 22:36):
voffka, прочитай последний абзац.
voffka
(15.12.2018 в 21:18):
А почему бы хэш не подменить? там sha-256 от ключа.
X-Wing Top Ace
(15.12.2018 в 10:38):
Ну, это уж вы загнули. Сильный студент, конечно, и на первом курсе может такое написАть, но не за одну лабораторку - даже в RAD-среде и на языке высокого уровня просто времени не хватит. Или хватит, чтобы кое-как слепить (без копирастического кода), но потом придется минимум несколько дней фиксить баги и дорабатывать функционал.
Другое дело, что студента можно озадачить написанием такой проги ВМЕСТО примитивных лабораторных заданий. Написал, отнес преподу вместе с исходниками, и получил зачет по всем лабораторным без примитивных задач типа "дан массив, обнулить нулевые элементы, проотрицать отрицательные". Я сам, когда учился, вместо такого примитива писАл на зачет по асму один досный резидент.
Даже интересно стало - якобы или способный? Проверить наличие команд JMP или CALL вместо "PUSH EBP;MOV EBP, ESP" в начале кода перехватываемых руткитами функций, конечно, можно, но таким перехватом не одни руткиты занимаются.
Добавить комментарий
Заполните форму для добавления комментария