Исследование защиты программы Sothink SWF Decompiler
Скриншот программы Sothink SWF Decompiler
Sothink SWF Decompiler от компании SourceTec Software - одна из лучших программа для декомпиляции Flash-файлов в формате SWF и Flash EXE, извлечения из них ресурсов, скриптов, графики, музыки, восстановления исходных кодов проектов и т.д. Незаменимый инструмент при изучении чужих разработок и восстановления своих исходников в случае их утери. Было бы странным предполагать, что авторы будут распространять такую прелесть "за красивые глазки", так оно и есть, стоимость Sothink SWF Decompiler почти 80 вечнозеленых денег.
Скачиваем дистрибутив и устанавливаем его. Предварительный анализ исполняемого файла показывает, что он упакован навесным протектором Armadillo. Для распаковки воспользуемся программой ArmaGeddon. К сожалению, она пока не работает под Windows 7, так что придется запускать ее под какой-нибудь виртуальной машиной с установленной Windows XP.
Распаковываем файл
В логе видно, что для защиты использованы почти все опции, но ArmaGeddon успешно с ними справляется. Через несколько секунд получаем распакованный файл размером почти в два раза превышающий исходный. Попробуем немного сократить размер, удалив из него уже ненужные секции протектора. Сделать это можно при помощи программы CFF Explorer, которая входит в состав Explorer Suite.
Удаляем из файла секции протектора
В нашем случае не использовалась опция протектора, когда имена секций заменяются на случайный набор символов, это немного облегчит работу. Секции протектора имеют имена, похожие на имена оригинальных секций, но с добавлением в конец цифры, к тому же они идут подряд: .text1, .adata, .data1, .pdata. Отрезайте их по одной, предварительно сделав резервную копию распакованного файла и проверяя каждый раз работоспособность полученного файла. Опытным путем установлено, что безболезненно можно отрезать секции .text1, .adata, .pdata, после чего файл сразу "похудел" наполовину. Загоняем его в дизассемблер и вернемся к теории. Протектор Armadillo предоставляет функции регистрации защищаемых программ своими средствами. Для взаимодействия с защищаемой программой используются переменные окружения, в которые записываются данные об имени пользователя, ключе регистрации (если он найден в системе), триальном времени работы, количестве одновременно запущенных копий и другую информацию. Эти переменные имеют неизменные имена, значит их можно поискать в файле.
Найдены имена переменных окружения
Имена переменных найдены, они хранятся в файле в юникоде. Переменная EXPIRED устанавливается, когда триальный срок закончился, в переменной DAYSLEFT записано количество оставшихся дней, USERKEY содержит регистрационный ключ, если он установлен. Подробнее о наименованиях переменных и их значениях можете почитать в документации к Armadillo, если интересно, нас же интересует только переменная USERKEY. Посмотрим, где и как она обрабатывается.
Code (Assembler) : Убрать нумерацию
- ; Процедура проверки переменной окружения USERKEY. Возвращает EAX=1,
- ; если такая переменная установлена (т.е. программа зарегистрирована),
- ; и EAX=0, если нет.
- .text:00446310 sub esp, 20Ch
- .text:00446316 mov eax, dword_9F18B8
- .text:0044631B xor eax, esp
- .text:0044631D mov [esp+20Ch+var_4], eax
- .text:00446324 push esi
- .text:00446325 mov esi, [esp+210h+arg_0]
- .text:0044632C push 104h ; nSize
- .text:00446331 lea eax, [esp+214h+Src]
- .text:00446335 push eax ; lpBuffer
- ; Получить переменную окружения USERKEY
- .text:00446336 push offset aUserkey ; lpName
- .text:0044633B call ds:GetEnvironmentVariableW
- .text:00446341 test eax, eax
- ; Такая переменная не установлена
- .text:00446343 jbe short loc_446387
- .text:00446345 lea eax, [esp+210h+Src]
- .text:00446349 lea edx, [eax+2]
- .text:0044634C lea esp, [esp+0]
- .text:00446350 loc_446350:
- .text:00446350 mov cx, [eax]
- .text:00446353 add eax, 2
- .text:00446356 test cx, cx
- .text:00446359 jnz short loc_446350
- .text:0044635B sub eax, edx
- .text:0044635D sar eax, 1
- .text:0044635F push eax ; int
- .text:00446360 lea ecx, [esp+214h+Src]
- .text:00446364 push ecx ; Src
- .text:00446365 mov ecx, esi
- .text:00446367 call sub_4024D0
- ; Переменная есть, установить флаг EAX=1
- .text:0044636C mov eax, 1
- .text:00446371 pop esi
- .text:00446372 mov ecx, [esp+20Ch+var_4]
- .text:00446379 xor ecx, esp
- .text:0044637B call sub_7BE489
- .text:00446380 add esp, 20Ch
- .text:00446386 retn
- .text:00446387 ; -----------------------------------------------
- .text:00446387 loc_446387:
- .text:00446387 mov ecx, [esp+210h+var_4]
- .text:0044638E pop esi
- .text:0044638F xor ecx, esp
- ; Переменной нет, установить флаг EAX=0
- .text:00446391 xor eax, eax
- .text:00446393 call sub_7BE489
- .text:00446398 add esp, 20Ch
- .text:0044639E retn
- .text:0044639E sub_446310 endp
Собщение незарегистрированной программы
То есть какая-то дополнительная проверка регистрации выполняется где-то еще. Поищем строчку этого сообщения в исполняемом файле. Она найдется в ресурсах.
Строка сообщения в ресурсах
Код строки 302, или в шестнадцатеричном виде 12Eh. Поищем в дизассемблированном листинге строку "12Eh".
Code (Assembler) : Убрать нумерацию
- ; Вызвать какую-то функцию проверки чего-то
- .text:00455C28 call sub_4466F0
- .text:00455C2D test al, al
- ; Если она вернула AL=0, то окно с сообщением о незарегистрированной
- ; программе не выводить
- .text:00455C2F jz short loc_455C5F
- .text:00455C31 cmp byte ptr word_9FD804+1, 0
- .text:00455C38 jz short loc_455C5F
- .text:00455C3A lea eax, [esp+14h+var_10]
- ; Загрузить строку с кодом 302 (12Eh) из ресурсов
- .text:00455C3E push 12Eh
- .text:00455C43 push eax
- .text:00455C44 call sub_4629D0
- .text:00455C49 mov ecx, [esp+1Ch+var_10]
- .text:00455C4D add esp, 8
- ; Вывести окно сообщения
- .text:00455C50 push 0 ; int
- .text:00455C52 push 41h ; uType
- .text:00455C54 push ecx ; int
- .text:00455C55 call ?AfxMessageBox@@YGHPB_WII@Z
- ; AfxMessageBox(wchar_t const *,uint,uint)
- .text:00455C5A cmp eax, 1
- .text:00455C5D jnz short loc_455C0D
- .text:00455C5F loc_455C5F:
Code (Assembler) : Убрать нумерацию
- .text:004466F0 call sub_445B50
- .text:004466F5 mov ecx, eax
- .text:004466F7 call sub_446690
- .text:004466FC neg eax
- .text:004466FE sbb eax, eax
- .text:00446700 inc eax
- .text:00446701 retn
Про наличие кейгенов для навесных защит Armadillo, в том числе и для программ SourceTec, я прекрасно знаю, но информация о способах и алгоритмах кейгенинга для широкой публики недоступна, да и без навесного протектора программы обычно работают гораздо шустрее.
Просмотров: 9387 | Комментариев: 19
Метки: исследование защиты
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
ManHunter
(03.03.2016 в 09:06):
AEV Injector
pawel97
(02.03.2016 в 18:31):
Сделал по-другому:
1( установил USERKEY Вашей замечательной утилитой EAV Injector;
2) запатчил одну из проверок, из-за которой родительская процедура возвращала 0 и ролики не сохранялись. Ищем вызов GetProcAddress, где аргументом передаётся имя функции GetUserString из библиотеки ArmAccess, чуть выше будет прыжок в самый конец процедуры, где обнаружится команда mov eax,edi - меняем на mov al,1. SWF Catcher и Editor вылечились аналогично. Шаблон для патча (дополнительно к переменной USERKEY):
Search: EB 03 D6 D7 ?? 8B ?? ?? 8B C7
Replace: EB 03 D6 D7 ?? 8B ?? ?? B0 01
Попутно вопрос по арме: есть ли способы борьбы с Secured Sections без валидного ключа? Или хотя бы, если в закромах есть забаненный ключик к старой версии от какой-нибудь team, можно ли его разбанить?
1( установил USERKEY Вашей замечательной утилитой EAV Injector;
2) запатчил одну из проверок, из-за которой родительская процедура возвращала 0 и ролики не сохранялись. Ищем вызов GetProcAddress, где аргументом передаётся имя функции GetUserString из библиотеки ArmAccess, чуть выше будет прыжок в самый конец процедуры, где обнаружится команда mov eax,edi - меняем на mov al,1. SWF Catcher и Editor вылечились аналогично. Шаблон для патча (дополнительно к переменной USERKEY):
Search: EB 03 D6 D7 ?? 8B ?? ?? 8B C7
Replace: EB 03 D6 D7 ?? 8B ?? ?? B0 01
Попутно вопрос по арме: есть ли способы борьбы с Secured Sections без валидного ключа? Или хотя бы, если в закромах есть забаненный ключик к старой версии от какой-нибудь team, можно ли его разбанить?
ManHunter
(17.02.2016 в 11:21):
пару лет практики и все будет определяться на глаз
скорее всего, неправильно распаковалось. как вариант, в софтине есть дополнительные проверки на изменения. поможет только отладчик с трассировкой и точками останова на функциях типа ExitProcess и т.п.
вот ведь пичалька. имхо, более ненужной сущности, чем цифровая подпись, вообще трудно представить
ожидал найти здесь Единый Ответ на Главный вопрос жизни, вселенной и всего такого? ну так это 42, это общеизвестно. а под каждую конкретную программу должно быть свое решение.
Андрей
(17.02.2016 в 11:09):
С этой программой понятно! А если взять другую, например VideoReDo TVSuite v5.1.2.731 от DRD Systems ? Тут есть ряд сложностей: 1) после успешного снятия навесного протектора Armadillo v9.66 ArmaGeddon'ом v2.1 с главного приложения VideoReDo5.exe, имена секций - это случайный набор символов, что затрудняет выбор секций для их последующей обрезки, т.к. полученное приложение запускается на секунд 20 и, затем быстро отключается, так и непоявившись на экране; 2) Изначально главное приложение содержит цифровую подпись, которая после действий ArmaGeddon'а теряется и не отображается больше в свойствах файла.
brute
(13.02.2015 в 10:17):
кстати, ArmaGeddon 1.9 на W7_32 у меня тоже не пашет (как и никакой другой), ну и ладно - XP всегда под рукой. При установке Sothink SWF Decompiler в папку с прогой кидаются два инсталятора:Sothink SWF Editor и SWFCatcher. Решил я их пролечить. Со снятием армы и обрезкой секций .text1, .adata, .pdata, проблем нет. USERKEY запатчил там где "процедура проверки вызывается.. вызывается уже как минимум из трех мест." Диалоговое окно исчезло. Найти второе окно не могу!!! Нет конструкций call/test и далее push/push/call. Ничего похожего. Возле push/push/call (которых десятки) нет джампов.. Есть ли какая метода поиска этих мест? Может, лучше пытаться не убрать первое окно (патчить USERKEY), а пытаться отловить сообщение о неправильном серийнике? Или не обрезать секции армы и патчить ALTUSERNAME/USERNAME?
ManHunter
(03.05.2011 в 01:06):
Прочитай статью про распаковщики раз пятьдесят до наступления полного просветления, должно помочь.
Антон
(02.05.2011 в 22:55):
А все таки можно ли запустить армагеддон под виндовс 7 чтобы он работал. если да, то каким образом. скажите пожалуйста.
Sergey_K
(25.03.2011 в 19:56):
ArmaGeddon 1.9 сам все снял, размер уменьшил как в статье, с галочка "Minimize Size" - ничего не вышло. Спасибо.
ManHunter
(12.01.2011 в 07:26):
gluzden, да, умеет. Переключаешься на просмотр файла в юникоде (F8 - Unicode) и ищешь.
gluzden
(12.01.2011 в 03:08):
А Hiew умеет и в юникоде искать? Давненько я не брал в руки шашек :)
AyTkACT
(30.10.2010 в 22:11):
В ArmaGeddon'е есть же галочка "Minimize Size" так зачем ручками то секции прибивать? После галочки очень даже красиво получается ;)
Isaev
(08.10.2010 в 23:56):
А мне про секции порадовало... Не знал что их так безболезненно можно убрать. И прога сразу настолько меньше! Приятно :)
ManHunter
(08.10.2010 в 21:31):
Vovka, ну так напиши как правильно. Чем критиковать, публикуйте свой материал, делитесь своими знаниями, учите как надо делать. А по поводу использования тулз, так этак надо отказываться от IDA и HIEW, ImpRec и всего остального, будем дизассемблить в уме, и патчить напрямую на диске, так будет точно ТруЪ.
Vovka
(08.10.2010 в 20:37):
Если честно, то нифига не информативный мануал, после распаковки чужой тулзой, пропатчить пару байтов это моветон.
Тут-же есть интересная фишка с Code Splicing! mov eax,1 вместо SetEnvironmentVariable, это тоже очень не правильно.
Тут-же есть интересная фишка с Code Splicing! mov eax,1 вместо SetEnvironmentVariable, это тоже очень не правильно.
Isaev
(07.10.2010 в 14:47):
и дело не в нём, а что ещё может считаться системным отладчиком?
у меня кроме DrWeb и HttpAnalyzer ничего не стоит
ах да, твой форум ещё открыт! :D
кстати бяка ещё одна живёт... видимо это как раз в ней дело
надо систему переставить
у меня кроме DrWeb и HttpAnalyzer ничего не стоит
ах да, твой форум ещё открыт! :D
кстати бяка ещё одна живёт... видимо это как раз в ней дело
надо систему переставить
ManHunter
(07.10.2010 в 14:38):
Значит у тебя гранаты не той системы :) Серьезно, не знаю в чем проблема, у меня работает без прикрытия.
Isaev
(07.10.2010 в 14:37):
ArmaGeddon у меня 1.8, что ищет знаю, но ты его в статье не прикрывал ;)
ManHunter
(07.10.2010 в 14:29):
Все прекрасно клеится. Попробуй ArmaGeddon 1.7 и выше, он армудилой не обнаруживается, на крайняк прикрой его чем-нибудь типа HideToolz, армудила ищет "системные отладчики" тупо по заголовкам окна.
Isaev
(07.10.2010 в 14:27):
Интересная статья, только не всё клеится
"использованы почти все опции, но ArmaGeddon успешно с ними справляется."
что-то нифига он с ним не успешно справляется... Падает с сообщением:
"For security purposes, this program will not run while system debuggers are active. Please remove or disable the system debugger before trying to run this program again."
"использованы почти все опции, но ArmaGeddon успешно с ними справляется."
что-то нифига он с ним не успешно справляется... Падает с сообщением:
"For security purposes, this program will not run while system debuggers are active. Please remove or disable the system debugger before trying to run this program again."
Добавить комментарий
Заполните форму для добавления комментария