Как стать автором
Обновить

Комментарии 22

Спасибо!
Было интересно!
Интересно, почему авторы этого crackme задействовали всю эту тему с драйверами? Если суть задачи именно в анализе хэш-функции, то для чего все эти сложности гонять данные через драйверы?
Особенностью этого crackme является то, что его решение тренирует не только навыки реверса, но и даёт понимание, как происходит общение между юзермодным приложением и драйвером режима ядра.
мы видим стандартный заголовок… «MZ». Также видно, что файл… написан на C++.
А какие бывают другие заголовки?
А как определить язык? Там осталась debug-информация?
У исполняемых файлов Windows формат заголовка один и тот же, на то он и стандартный заголовок.
Язык программирования выдаёт совокупность признаков. С++ особенно выдаёт библиотека crt. К примеру, на точке входа вызывается функция 0004072EB инициализации канареек. Далее идёт jmp, в котором в самом низу идёт вызов функции main. Это характерные признаки для исполняемых файлов, собранных в visual studio. А если посмотреть на строки, то можно увидеть что-то типа: " delete[], vector constructor iterator", чтобы убедиться, что это C++.
Строго говоря, MZ — Это досовский заголовок 16 битного исполняемого файла. В нынешних исполняемых файлах он для совместимости) вдруг вы в досе запустите, а оно там выведет красивое «This program can not be run in DOS mode.»
Виндовый заголовок — PE.

Язык на 100% не определить. Но если известно, что файл после компилятора не модифицировался, можно по косвенным признакам узнать компилятор. Например секции TEXT, DATA капсом, любят компиллеры Borland. А еще более детально компилятор узнают по сигнатурам стандартных функций. (В IDA — ромашка вроде.) При нахождении более 100 системных функций из одной библиотеки сигнатур, можно с большой вероятностью сказать что оно писалось на таком-то языке.
Все языки обладают спецификацией и как правило моделью памяти. Уже по расположению функций, классов, структур и стэка можно достаточно ясно определить язык. Подключаемые файлы и сборки тоже обычно стандартные и как следствие используют один и тот же код, а такие дизассемблеры как IDA уже давно детектируют их на лету.
Компилятор это множество (под)программ, включая линкер, оптимизатор и саму генерацию кода. На ассемблере можно по разному записать некоторые действия(кто бы мог подумать?),
к примеру:
mov ax, 0;поместить 0 в регистр 'ax'
mul ax, 0;умножить 'ax' на 0
xor ax, ax; обнулить совпадающие биты из ax(совпали все => все нули: ax = 0)

и т.д. так же есть внутренние соглашения о вызовах.
Анализируя всё это можно определить даже компилятор, его версию и версию его компонентов.
Может быть ZM
Поменял MZ на ZM — Win7 не запускает такую прогу.
Я думал, что заголовок MZ единственный для .exe, просто предложение в статье даёт усомниться в этом.
В досе работало, возможно для винды в какой-то момент подкрутили.
MZ это инициалы какого-то польского программиста, Марека Не-помню-фамилию, который в 80 лохматом году разрабатывал формат EXE. Тогда ещё писали на асме и экономили каждый байт, и там был хитрый трюк через XOR, экономивший пару байт на сравнении. Но он пропускал как MZ, так и ZM.

А почему бы было просто не подменить драйвер, что бы он всегда возвращал true?
Как головоломка хорошо, как система защиты — плохо.

Смысл головоломки в том что бы сделать кейген. Так то можно заменить один условный переход на безусловный, что бы всегда выводилось «Serial is Valid». Даже без возни с драйверами.
Спасибо за разбор. Было интересно читать.
Было бы здорово, если бы вы опубликовали аналогичные статьи с описанием процесса исследования простых вирусов, т.к. разборов различного рода crackme и keygenme в интернете хватает, а вот живой malware analysis встречается редко.
спасибо, возьмем на заметку.
а можно ссылку для скачивания этого crackme?
Да, конечно: goo.gl/9QQVCV
спасибо
все таки, не работает…
А что именно не работает? На момент подготовки статьи вроде все работало.
не рабочая ссылка
Зарегистрируйтесь на Хабре, чтобы оставить комментарий