Как я решал одну маленькую задачку
В последнее время мне довольно часто приходится заниматься реверс инжинирингом и создавать свои аналоги зареверсенных функций, либо писать модули, которые будут взаимодействовать с модулями приложений, интерфейсы которых не описаны. В процессе работы частенько возникает задача найти алгоритм шифрования в программе и получить информацию о его типе (DES, AES, ГОСТ и т.д.), режиме его работы (ECB, CBC, CTR и т.д.), используемых ключах, ну и возможных ошибках и слабостях его конкретной реализации. Об одном таком случае я решил рассказать в данной заметке.
Сразу оговорюсь, что на картинках многие переменные были любезно переименованы мной уже в процессе работы. Изначально названия переменных и функций не несли никакой информации. 
Обычно функция, реализующая алгоритм шифрования не похожа на обыкновенные функции программы. Анализируя очередной кусок кода, я натолкнулся на весьма странную последовательность операций:

Какие-то сплошные mov-ы, xor-ы и так далее. Обычно я в таких случаях запускаю любимый декомпилятор HexRays, который и в этот раз меня не подвел, и выдал что-то более-менее осмысленное:

Сразу в глаза бросаются криптографические константы 128, 192, 256. Ключи шифрования симметричных алгоритмов чаще всего имеют именно такую длину. Продолжая дальнейший анализ функции натыкаемся на конструкцию swich/case.

В качестве значений case используются числа 10, 12, 14. Это уже интересно. Кто читал мою статью про AES-256 наверняка вспомнит эти три замечательных числа в процедуре KeyExpansion. Дальнейшее сравнение псевдокода этой процедуры из стандарта AES и данной функции не оставляет сомнений, что это именно процедура развертывания ключа. Теперь глядя на параметры данной функции легко установить, где хранится ключ шифрования, и что алгоритм шифрования AES-128. Так получилось, что в попавшемся мне образце в начале работы программы происходит выработка сеансовых ключей, а позднее, когда доходит дело до алгоритма шифрования, он оперирует уже раундовыми ключами.
Половина задачи решена. Дальнейший реверсинг натыкает меня на функцию шифрования. На вход она принимает аж целых 5 параметров, взглянув на которые сразу определяю, что режим работы алгоритма точно не ECB, так как одним из параметров выступает массив, по длине равный длине блока (128 бит) – вектор инициализации. Опять при помощи декомпилера взглянем на cишный листинг:

Присмотревшись, легко определяем что режим шифрования CBC (AesBlockEncrypt это я впоследствии переименовал).
Вот собственно и все. Через пару часов, аналог функции был написан на C#. 
Напоследок хотелось бы дать пару советов тем, кто столкнулся с аналогичной задачей:
1. Пользуйтесь декомпилятором. Иногда реально помогает разобраться в запутанном коде.
2. Обращайте внимание на константы. В любом алгоритме есть отличающие его от собратьев признаки. Например, в ГОСТ 32 раунда и в каждом раунде циклический сдвиг на 11, длина блока 64, длина ключа 256. В алгоритмах хэш-функций обычно используются целые наборы раундовых констант, да и число раундов также дает дополнительную информацию.
Вот так в паре строк уместилось несколько часов работы
Если что-то непонятно или есть советы и пожелания, пиши на почту!
Думаю кому-нибудь пригодится мой опыт 
Evgenij
evgenij.minsk@gmail.com
- Evgenij's блог
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
- 1319 просмотров



Комментарии
10 комментария(ев)Дата: СБ, 15/10/2011 - 21:23
Приятно видеть что тут кто-то занимается реверсингом!) Только HexRays стоит не мало, а другие декомпиляторы как-то не очень дотягивают до его уровня. Поэтому в основном приходится своими силами восстанавливать код. Но всё равно познавательно)
Дата: СБ, 15/10/2011 - 21:37
Согласен. Ида с хексрейсом вообще вещь дорогая, благо каждый новый релиз благополучно утекает и появляется на рутрекере
Дата: СБ, 15/10/2011 - 22:08
Ну да. Если не боать во внимание HexReys, то и Идэ фри в принципе хватает)
UPD: А это не вы случайно писали? ]]>http://habrahabr.ru/blogs/windows/130287/]]>
Дата: СБ, 15/10/2011 - 22:11
Да, хорошо что есть фри версия. Касательно ссылки точно не я
я для хабрахабра ниче не пишу, ток читаю.. даж не зарегистрирован на нем 
Дата: СБ, 15/10/2011 - 22:22
Понятно) Просто стиль, приёмы и тема очень похожи с данной)
Дата: ВС, 16/10/2011 - 02:22
В статье про реверс инжинеринг есть ссылки про быдлокодинг и быдлокодеров... так вот, там в их списке и Михаил Фленов,а также есть нелицеприятная статья про журнал Хакер и его школотную направленность... Было обидно такое читать
. Жаль, но тот 
охуенныйавтор видимо не нашел в себе духа,чтобы подписаться под всем этим шлакомДата: ВС, 16/10/2011 - 06:41
Не парься, луркоморье - сообщество анонимных троллей, поносящих все и вся, там нету ничего объективного
Дата: Пнд, 17/10/2011 - 07:38
Забей =) Обосрать всегда проще, чем повторить хотя бы 10% успеха. Народу всегда проще ругать.
Дата: ВС, 16/10/2011 - 08:01
Ребят, воспринимайте луркоморье с улыбкой и не принимайте все написанное там близко к сердцу
Дата: Втр, 18/10/2011 - 03:26
Хорошо, не буду париться =)
Просто, это ведь ИТ - здесь чтобы что-то создать нормальное надо вджобывать 24/7, а тут всякие тролли бисер мечут
Пора взяться за Орду! Созвать Альянс!