Исследование защиты программы Sonne Flash Decompiler
Скриншот программы Sonne Flash Decompiler
Sonne Flash Decompiler - предназначена для извлечения объектов и других элементов, используемых во flash-файлах. Она также позволяет извлекать файлы SWF из EXE-контейнеров и редактировать ролики в формате SWF - изменять текст, шрифты, картинки, звуки, формы, скрипты и другие элементы, находящиеся во flash-файле. Естественно, за все это аффтары хотят денег.
Качаем дистрибутив, распаковываем, устанавливаем. Сразу после запуска нам предлагают ввести регистрационные данные, а точнее имя, адрес электронной почты и серийный номер.
Окно регистрации программы
На ввод всякого левака программа реагирует сообщением "Invalid registration key!". Исполняемый файл ничем не упакован, искомая строчка лежит в открытом виде:
Нехорошая строка найдена
Традиционно переходим к дизассемблированию с целью выяснить условия появления этой строки. Код достаточно понятный, но я постараюсь его максимально прокомментировать:
Code (Assembler) : Убрать нумерацию
- CODE:00644014 lea edx, [ebp+var_28]
- CODE:00644017 mov eax, [ebx+300h]
- ; Прочитать введенный текст из поля ввода
- CODE:0064401D call @Controls@TControl@GetText$qqrv
- CODE:00644022 cmp [ebp+var_28], 0
- ; Если его длина не нулевая, то продолжить
- CODE:00644026 jnz short loc_64406F
- ; Сообщение "Invalid registration key!"
- CODE:00644028 push 30h ; uType
- CODE:0064402A lea edx, [ebp+var_2C]
- ; Указатель на указатель на строку "Invalid registration key!"
- CODE:0064402D mov eax, ds:off_662AFC
- CODE:00644032 mov eax, [eax]
- CODE:00644034 call @Forms@TApplication@GetTitle$qqrv
- CODE:00644039 mov eax, [ebp+var_2C]
- CODE:0064403C call @System@@LStrToPChar$qqrx...
- CODE:00644041 push eax ; lpCaption
- CODE:00644042 mov eax, ds:off_66262C
- CODE:00644047 mov eax, [eax]
- CODE:00644049 call @System@@LStrToPChar$qqrx...
- CODE:0064404E push eax ; lpText
- CODE:0064404F mov eax, ebx
- CODE:00644051 call @Controls@TWinControl@GetHandle$qqrv
- CODE:00644056 push eax ; hWnd
- CODE:00644057 call MessageBoxA_0
- CODE:0064405C mov eax, [ebx+300h]
- CODE:00644062 mov edx, [eax]
- CODE:00644064 call dword ptr [edx+0C4h]
- CODE:0064406A jmp loc_644122
- CODE:0064406F ; -------------------------------------------
- ; Подготовка всех трех строк (имя, email и серийник) к проверке
- CODE:0064406F loc_64406F:
- CODE:0064406F lea eax, [ebp+var_30]
- CODE:00644072 mov edx, [ebp+var_8]
- CODE:00644075 call @System@@LStrFromWStr$qqrr...
- CODE:0064407A mov eax, [ebp+var_30]
- CODE:0064407D push eax
- CODE:0064407E push 0
- CODE:00644080 lea eax, [ebp+var_34]
- CODE:00644083 mov edx, [ebp+var_4]
- CODE:00644086 call @System@@LStrFromWStr$qqrr...
- CODE:0064408B mov eax, [ebp+var_34]
- CODE:0064408E push eax
- CODE:0064408F lea eax, [ebp+var_38]
- CODE:00644092 mov edx, [ebp+var_C]
- CODE:00644095 call @System@@LStrFromWStr$qqrr...
- CODE:0064409A mov edx, [ebp+var_38]
- CODE:0064409D mov eax, ds:off_662550
- CODE:006440A2 mov eax, [eax]
- CODE:006440A4 pop ecx
- ; Вызвать процедуру проверки серийного номера
- CODE:006440A5 call @Sqledit@EditSQL$qqrp16Classes...
- ; Если она вернула AL!=0, то регистрационные данные верные
- CODE:006440AA test al, al
- CODE:006440AC jz short loc_6440CB
- ; Регистрация прошла успешно
- CODE:006440AE mov eax, ds:off_662550
- CODE:006440B3 mov eax, [eax]
- CODE:006440B5 call sub_626308
- ; Установить флажок "Зарегистрировано"
- CODE:006440BA mov eax, ds:off_66284C
- CODE:006440BF mov byte ptr [eax], 1
- CODE:006440C2 mov eax, ebx
- ; Вывести сообщение об удачной регистрации
- CODE:006440C4 call sub_643E88
- CODE:006440C9 jmp short loc_644122
- CODE:006440CB ; ------------------------------------------------
- CODE:006440CB loc_6440CB:
- ; Вывести сообщение "Invalid registration key!"
- CODE:006440CB mov eax, ds:off_66284C
- CODE:006440D0 mov byte ptr [eax], 0
- CODE:006440D3 push 10h ; uType
- CODE:006440D5 lea edx, [ebp+var_3C]
- CODE:006440D8 mov eax, ds:off_662AFC
- CODE:006440DD mov eax, [eax]
- CODE:006440DF call @Forms@TApplication@GetTitle$qqrv
- CODE:006440E4 mov eax, [ebp+var_3C]
- CODE:006440E7 call @System@@LStrToPChar$qqrx17System@AnsiString
- CODE:006440EC push eax ; lpCaption
- ; Указатель на указатель на строку "Invalid registration key!"
- CODE:006440ED mov eax, ds:off_66262C
- CODE:006440F2 mov eax, [eax]
- CODE:006440F4 call @System@@LStrToPChar$qqrx17System@AnsiString
- CODE:006440F9 push eax ; lpText
- CODE:006440FA mov eax, ebx
- CODE:006440FC call @Controls@TWinControl@GetHandle$qqrv
- CODE:00644101 push eax ; hWnd
- CODE:00644102 call MessageBoxA_0
- ...
Code (Assembler) : Убрать нумерацию
- CODE:006260DC push ebp
- CODE:006260DD mov ebp, esp
- CODE:006260DF add esp, 0FFFFFFF4h
- CODE:006260E2 push ebx
- CODE:006260E3 push esi
- CODE:006260E4 xor ebx, ebx
- CODE:006260E6 mov [ebp+var_C], ebx
- CODE:006260E9 mov [ebp+var_8], ecx
- CODE:006260EC mov [ebp+var_4], edx
- CODE:006260EF mov esi, eax
- CODE:006260F1 mov eax, [ebp+var_4]
- CODE:006260F4 call @System@@LStrAddRef$qqrpv
- CODE:006260F9 mov eax, [ebp+var_8]
- CODE:006260FC call @System@@LStrAddRef$qqrpv
- CODE:00626101 mov eax, [ebp+arg_4]
- CODE:00626104 call @System@@LStrAddRef$qqrpv
- CODE:00626109 mov eax, [ebp+arg_0]
- CODE:0062610C call @System@@LStrAddRef$qqrpv
- CODE:00626111 xor eax, eax
- CODE:00626113 push ebp
- CODE:00626114 push offset loc_62619C
- CODE:00626119 push dword ptr fs:[eax]
- CODE:0062611C mov fs:[eax], esp
- CODE:0062611F cmp byte ptr [esi+34h], 0
- CODE:00626123 jnz short loc_626129
- CODE:00626125 xor ebx, ebx
- CODE:00626127 jmp short loc_626174
- CODE:00626129 ; ------------------------------------
- CODE:00626129 loc_626129:
- CODE:00626129 lea edx, [ebp+var_C]
- CODE:0062612C mov eax, esi
- CODE:0062612E call sub_626708
- ; Функция сравнения двух текстовых строк
- CODE:00626133 mov edx, [ebp+var_C]
- CODE:00626136 mov eax, [ebp+var_4]
- CODE:00626139 call @System@@LStrCmp$qqrv
- CODE:0062613E jnz short loc_626172
- CODE:00626140 mov bl, 1
- CODE:00626142 mov dl, 2
- CODE:00626144 mov eax, esi
- CODE:00626146 call sub_6271E4
- CODE:0062614B mov edx, [ebp+var_8]
- CODE:0062614E mov eax, esi
- CODE:00626150 call sub_62683C
- ...
Серийный номер в отладчике
В окне регистров видно, что сравнивается наш левый серийник с какой-то красивой строкой "SFD2568741". Попробуем повторить регистрацию, но теперь вместо серийного номера используем строку из отладчика "SFD2568741". На этот раз никакой ругани нет, наоборот, программа радостно приняла серийник и поблагодарила:
Сообщение об успешной регистрации
В окне "About" также появились наши регистрационные данные, стартовое окно с предложением купить также исчезло:
Программа успешно зарегистрирована
Здравый смысл в очередной раз победил неуемную жадность разработчиков. Надеюсь, что и сама программа также будет использоваться в борьбе со всякими защищенными ресурсами.
Просмотров: 4464 | Комментариев: 13
Метки: исследование защиты
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
ManHunter
(03.11.2020 в 15:50):
Sothink, только не последние версии, они какие-то стремные.
Petya
(03.11.2020 в 15:32):
А Вы что посоветуете - эту, Sothink или другое?
will shine
(08.10.2011 в 04:51):
> затем если это делфи иду в DeDe. Там уже нет проблем пройти по кнопочке в процедуру.
DeDe - конечно, полезная вещь, но дизассемблер в ней уж очень примитивный, да и не развивается она уже больше, насколько мне известно. Больше годится для получения максимальной информации о ресурсах и классах приложения для последующего анализа логики опять же в IDA.
Есть ещё такая штука для Delphi реверсинга как Interactive Delphi Reconstructor (IDR): http://kpnc.org/idr32/en/
DeDe - конечно, полезная вещь, но дизассемблер в ней уж очень примитивный, да и не развивается она уже больше, насколько мне известно. Больше годится для получения максимальной информации о ресурсах и классах приложения для последующего анализа логики опять же в IDA.
Есть ещё такая штука для Delphi реверсинга как Interactive Delphi Reconstructor (IDR): http://kpnc.org/idr32/en/
Serg
(10.07.2011 в 01:18):
ManHunter, скажите пожалуйста, как вы переходите из heiw в Ida?
Я делаю так: сначала смотрю Peid на чем сделана прога, затем если это делфи иду в DeDe. Там уже нет проблем пройти по кнопочке в процедуру.
Я делаю так: сначала смотрю Peid на чем сделана прога, затем если это делфи иду в DeDe. Там уже нет проблем пройти по кнопочке в процедуру.
Fantom
(26.06.2011 в 22:35):
ManHunter, спасибо за ответ! Буду дальше постигать реверсинг :-)
ManHunter
(26.06.2011 в 17:08):
Voffka, ну так хорошо же :) Нашим проще. Видимо из-за лени или недостатка навыков юзают какой-то сторонний компонент.
Fantom, в IDA нажимаешь Ctrl+X, получаешь список перекрестных ссылок. В данном случае будет указатель на строку. И ссылка в коде уже на него, поэтому я так и написал: "Указатель на указатель на строку".
Fantom, в IDA нажимаешь Ctrl+X, получаешь список перекрестных ссылок. В данном случае будет указатель на строку. И ссылка в коде уже на него, поэтому я так и написал: "Указатель на указатель на строку".
mov
(25.06.2011 в 12:25):
процедура регистрации вызывается по адресу:
006440A5 |. E8 3220FEFF CALL <SonneFla.VeeRegisterManager.sub_00>
006440AA |. 84C0 TEST AL,AL
006440AC |. /74 1D JE SHORT SonneFla.006440CB
после вызова идёт проверка al, и если al=0, то серийный номер не правильный.
006440A5 |. E8 3220FEFF CALL <SonneFla.VeeRegisterManager.sub_00>
006440AA |. 84C0 TEST AL,AL
006440AC |. /74 1D JE SHORT SonneFla.006440CB
после вызова идёт проверка al, и если al=0, то серийный номер не правильный.
Voffka
(25.06.2011 в 09:32):
Не понятно, мода чтоль пошла на такую защиту, уже не один десяток прог встретил с идентичной защитой, причем от разных авторов.
mov
(25.06.2011 в 00:00):
Dimas - спасибо, так получается (с помощью IDR). А как только Олей и Идой - непонятно!
Fantom
(24.06.2011 в 23:41):
меня, как и mov`a, интересует как вы переходите с адреса в HIEW d IDA ?
mov
(24.06.2011 в 23:34):
скажите, как от найденного сообщения (в Hiew адрес 6288А0) перешли в IDA по адресу листинга 644014? У меня все ссылки на эту строку начинаются с адреса 62.., т.е. далеко и не очевидно. Как заставили иду отображать вызовы ф-ций в виде имен, а не адресов?
DimitarSerg
(24.06.2011 в 16:53):
Защита простенькая, раз серийник в открытом виде валяется... Сниффер для таких прог - раз плюнуть, но всеравно спасибо - знания и опыт лишними не бывают !
Dimas
(24.06.2011 в 05:42):
Я сделал слегка по другому - декомпилировал в IDR, в форме ENTERKEYFORM брякнулся на нажатие кнопки регистрации и выудил код отладчиком)
Спасибо за статьи по реверсу
Спасибо за статьи по реверсу
Добавить комментарий
Заполните форму для добавления комментария