Исследование защиты программы SVG To PNG Converter
Скриншот программы SVG To PNG Converter
SVG To PNG Converter - весьма толковая программа для пакетного конвертирования файлов из векторного формата SVG в более привычный формат PNG. Сейчас на сайте разработчика 1533 программы, в числе которых различные конвертеры, надстройки над офисными пакетами и всякое подобное. Если циферками не зашло, продублирую буковками: у разработчика в списке релизов числятся более полутора тысяч программ. Часть из них используют бесплатные утилиты других авторов, другая часть, как мне кажется, какие-то бесплатные компоненты. Пора воплощать в жизнь марксистский термин "экспроприация экспроприаторов".
Забираем с офсайта последний дистрибутив, устанавливаем, смотрим. Основной файл написан на Visual Basic, отправляем его на дизассемблирование. А пока посмотрим на проявления незарегистрированной программы. После запуска программы открывается окно с предложением регистрации. Но главное ограничение, что за один раз можно обработать не более двух файлов. При этом появляется сообщение с предложением метнуться в кассу.
Триальное ограничение программы
Поиском по листингу строки этого сообщения обнаруживается следующий код:
Code (Assembler) : Убрать нумерацию
- .text:00468CAA mov dword ptr [ebp-4], 31h
- .text:00468CB1 lea eax, [ebp-38h]
- .text:00468CB4 push eax
- .text:00468CB5 call sub_460B20
- .text:00468CBA movsx ecx, ax
- .text:00468CBD test ecx, ecx
- .text:00468CBF jnz short loc_468D31
- .text:00468CC1 mov dword ptr [ebp-4], 33h
- .text:00468CC8 push offset aOnlyTwoFilesCa
- ; "Only two files can be worked on at a ti"...
- .text:00468CCD push offset dword_408758
- .text:00468CD2 call ds:__vbaStrCat
- .text:00468CD8 mov edx, eax
- .text:00468CDA lea ecx, [ebp-70h]
- .text:00468CDD call ds:__vbaStrMove
- .text:00468CE3 push eax
- .text:00468CE4 push offset dword_408758
- .text:00468CE9 call ds:__vbaStrCat
- .text:00468CEF mov edx, eax
- .text:00468CF1 lea ecx, [ebp-74h]
- .text:00468CF4 call ds:__vbaStrMove
- .text:00468CFA push eax
- .text:00468CFB push offset aWouldYouLike_0
- ; "Would you like to purchase a personal l"...
- .text:00468D00 call ds:__vbaStrCat
- .text:00468D06 mov edx, eax
- .text:00468D08 lea ecx, [ebp-78h]
- .text:00468D0B call ds:__vbaStrMove
- .text:00468D11 lea edx, [ebp-78h]
- .text:00468D14 push edx
- .text:00468D15 call sub_460DB0
Code (Assembler) : Убрать нумерацию
- .text:00460B20 push ebp
- .text:00460B21 mov ebp, esp
- .text:00460B23 sub esp, 8
- .text:00460B26 push offset __vbaExceptHandler
- .text:00460B2B mov eax, large fs:0
- .text:00460B31 push eax
- .text:00460B32 mov large fs:0, esp
- .text:00460B39 sub esp, 34h
- .text:00460B3C push ebx
- .text:00460B3D push esi
- .text:00460B3E push edi
- .text:00460B3F mov [ebp+var_8], esp
- .text:00460B42 mov [ebp+var_4], offset dword_4012B8
- .text:00460B49 mov ebx, [ebp+arg_0]
- .text:00460B4C xor eax, eax
- .text:00460B4E mov [ebp+var_1C], eax
- .text:00460B51 mov [ebp+var_18], eax
- .text:00460B54 lea eax, [ebp+var_2C]
- .text:00460B57 mov [ebp+var_24], ebx
- .text:00460B5A push eax
- .text:00460B5B mov [ebp+var_2C], 4008h
- .text:00460B62 call ds:rtcIsNumeric
- .text:00460B68 cmp ax, 0FFFFh
- .text:00460B6C jnz loc_460BF8
- .text:00460B72 mov ecx, [ebx]
- .text:00460B74 push ecx
- .text:00460B75 push offset dword_4072B8
- .text:00460B7A call ds:__vbaStrCmp
- .text:00460B80 test eax, eax
- .text:00460B82 jz short loc_460BF8
- .text:00460B84 mov edi, 1
- .text:00460B89 loc_460B89:
- .text:00460B89 mov eax, 0C8h
- .text:00460B8E cmp di, ax
- .text:00460B91 jg short loc_460BF8
- .text:00460B93 push edi
- .text:00460B94 call ds:__vbaStrI2
- .text:00460B9A mov edx, eax
- .text:00460B9C lea ecx, [ebp+var_1C]
- .text:00460B9F call ds:__vbaStrMove
- .text:00460BA5 lea edx, [ebp+var_1C]
- .text:00460BA8 push edx
- .text:00460BA9 call sub_4608F0
- .text:00460BAE call ds:__vbaFpR8
- .text:00460BB4 mov eax, [ebx]
- .text:00460BB6 fstp [ebp+var_44]
- .text:00460BB9 push eax
- .text:00460BBA call ds:__vbaR8Str
- ; Сравнить введенный номер и правильный серийный номер из массива
- .text:00460BC0 fcomp [ebp+var_44]
- .text:00460BC3 fnstsw ax
- .text:00460BC5 test ah, 40h
- .text:00460BC8 jz short loc_460BD1
- ; Серийник правильный
- .text:00460BCA mov esi, 1
- .text:00460BCF jmp short loc_460BD3
- .text:00460BD1 ; -------------------------------
- .text:00460BD1 loc_460BD1:
- .text:00460BD1 xor esi, esi
- .text:00460BD3 loc_460BD3:
- .text:00460BD3 lea ecx, [ebp+var_1C]
- .text:00460BD6 call ds:__vbaFreeStr
- .text:00460BDC neg esi
- .text:00460BDE test si, si
- .text:00460BE1 jz short loc_460BEA
- ; Один из 200 проверенных серийников оказался правильным
- .text:00460BE3 mov [ebp+var_18], 0FFFFFFFFh
- .text:00460BEA loc_460BEA:
- .text:00460BEA mov eax, 1
- .text:00460BEF add ax, di
- .text:00460BF2 jo short loc_460C22
- .text:00460BF4 mov edi, eax
- .text:00460BF6 jmp short loc_460B89
- .text:00460BF8 ; -------------------------------
- .text:00460BF8 loc_460BF8:
- .text:00460BF8 wait
- .text:00460BF9 push offset loc_460C0B
- .text:00460BFE jmp short locret_460C0A
- .text:00460C00 ; -------------------------------
- .text:00460C00 loc_460C00:
- .text:00460C00 lea ecx, [ebp+var_1C]
- .text:00460C03 call ds:__vbaFreeStr
- .text:00460C09 retn
- .text:00460C0A ; -------------------------------
- .text:00460C0A locret_460C0A:
- .text:00460C0A retn
- .text:00460C0B ; -------------------------------
- .text:00460C0B loc_460C0B:
- .text:00460C0B mov ecx, [ebp+var_10]
- ; Результат проверки 0 или 0xFFFF
- .text:00460C0E mov ax, word ptr [ebp+var_18]
- .text:00460C12 pop edi
- .text:00460C13 pop esi
- .text:00460C14 mov large fs:0, ecx
- .text:00460C1B pop ebx
- .text:00460C1C mov esp, ebp
- .text:00460C1E pop ebp
- .text:00460C1F retn 4
Сравнение чисел
Число 123456789 - это введенный неправильный серийник, число 50653000 - это то, с чем оно сравнивается. Таким образом, в программе зашиты 200 предустановленных серийников, но нам достаточно и этого. Кстати, независимо от результата, проверяются все 200 чисел, что наводит на мысли о квалификации писавшего этот код.
Закрываем отладчик и программу, запускаем просто так, повторяем регистрацию с найденным серийником. Триальное окно закрывается и при последующем запуске больше не появляется. Пробуем сконвертировать более 2 файлов, и тоже ничего плохого не происходит, все работает как надо.
Если не хочется заморачиваться с отладчиками и серийниками, то можно просто пропатчить функцию проверки, чтобы она всегда возвращала правильный результат. Для этого надо записать в ее начало по адресу 00460B20 пару команд MOV EAX,0FFFFh и RET 4. В этом случае даже не придется ничего вводить, все будет работать и так.
Еще одна гадость срабатывает случайным образом - иногда при старте открывается сайт разработчика. По названию сайта выходим на следующий код:
Code (Assembler) : Убрать нумерацию
- .text:0046183B call ds:rtcRandomNext
- .text:00461841 fmul ds:flt_401378
- .text:00461847 fnstsw ax
- .text:00461849 test al, 0Dh
- .text:0046184B jnz loc_46192D
- .text:00461851 call ds:__vbaFPInt
- .text:00461857 fadd ds:flt_4012B0
- .text:0046185D fnstsw ax
- .text:0046185F test al, 0Dh
- .text:00461861 jnz loc_46192D
- .text:00461867 call ds:__vbaFpI2
- .text:0046186D lea ecx, [ebp+var_28]
- .text:00461870 mov esi, eax
- .text:00461872 call edi ; __vbaFreeVar
- .text:00461874 cmp si, 7
- ; Рандомное условие не выполнено
- .text:00461878 jnz loc_461900
- .text:0046187E sub esp, 10h
- .text:00461881 mov ecx, 0Ah
- .text:00461886 mov edx, esp
- .text:00461888 mov [ebp+var_38], ecx
- .text:0046188B mov eax, 80020004h
- .text:00461890 push offset aKey ; "Key"
- .text:00461895 mov [edx], ecx
- .text:00461897 mov ecx, [ebp+var_34]
- .text:0046189A mov [ebp+var_30], eax
- .text:0046189D push offset aSvgToPngConver
- ; "SVG To PNG Converter Software"
- .text:004618A2 mov [edx+4], ecx
- .text:004618A5 push offset aSobolsoft ; "Sobolsoft"
- .text:004618AA mov [edx+8], eax
- .text:004618AD mov eax, [ebp+var_2C]
- .text:004618B0 mov [edx+0Ch], eax
- .text:004618B3 call ds:rtcGetSetting
- .text:004618B9 mov edx, eax
- .text:004618BB lea ecx, [ebp+var_14]
- .text:004618BE call ds:__vbaStrMove
- .text:004618C4 lea ecx, [ebp+var_14]
- .text:004618C7 push ecx
- .text:004618C8 call sub_460B20
- .text:004618CD cmp ax, 0FFFFh
- ; Обратное условие
- .text:004618D1 jnz short loc_461900
- .text:004618D3 lea edx, [ebp+var_38]
- .text:004618D6 lea ecx, [ebp+var_28]
- .text:004618D9 mov [ebp+var_30], offset aExplorerHttpWw
- ; "explorer \"http://www.sobolsoft.com/\""
- .text:004618E0 mov [ebp+var_38], 8
- .text:004618E7 call ds:__vbaVarDup
- .text:004618ED lea edx, [ebp+var_28]
- .text:004618F0 push 2
- .text:004618F2 push edx
- .text:004618F3 call ds:rtcShell
- .text:004618F9 lea ecx, [ebp+var_28]
Теперь избавимся от ублюдочных скинов, чтобы окно программы приобрело привычный системный вид. Тут все просто, достаточно удалить файл o.cjs. Останется стилизация кнопок, но это можно пережить. А вот сейчас начнется самая мякотка. Если деинсталлировать программу, то она удалит вместе с собой регистрацию компонентов скинов, которые, во-первых, находятся во вложенной папке вместо корневой папки с программой, а во-вторых, они регистрируются для всех установленных программ этого производителя. В результате после деинсталляции ОДНОЙ программы ВСЕ оставшиеся программы разработчика перестают работать из-за ошибки скинового движка. Придется перекинуть файлы sblc.ocx и sbls.ocx из вложенной папки x в папку с программой, чтобы эти поделия хоть как-то заработали. Жесть, короче.
Так или иначе, цель достигнута, все ограничения сняты. По этой же схеме снимается защита с других продуктов этого разработчика, если, конечно, у вас хватит на это терпения.
Просмотров: 1743 | Комментариев: 10
Метки: исследование защиты, графика
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
ManHunter
(12.11.2020 в 22:21):
Вот, сразу видно, что у школьников каникулы. Русский язык, как я понимаю, в списке любимых предметов не числится.
1
(12.11.2020 в 21:45):
какой смысл с ней ковырятся дешовка
Aleksandr
(10.11.2020 в 21:14):
Защиты никакой никакой обусфикации кода, никаких проверок, короче мелочь а не программа
user
(09.11.2020 в 03:40):
Качество софта весьма говённое -
задрипанный фильтр для удаления символа <cr> из текста
весит 5 мегабайт.
задрипанный фильтр для удаления символа <cr> из текста
весит 5 мегабайт.
brute
(07.11.2020 в 12:25):
azaza, у XnView/IrfanView плагин CADImage.dll надо немного пролечить, чтобы триальную надпись не показывал:502EEFAE jmp loc_502EEFC9
azaza
(07.11.2020 в 03:42):
rsvg-convert - https://sourceforge.net/projec...t-2.40.20.7z
(не на нем ли, случаем, разбираемое говноподелие работает?)
XnView с вышеуказанным плагином
IrfanView с последней версии
(не на нем ли, случаем, разбираемое говноподелие работает?)
XnView с вышеуказанным плагином
IrfanView с последней версии
ManHunter
(06.11.2020 в 18:38):
brute, так это редакторы, а тут просто конвертер. Когда надо выполнить пакетную обработку, такой конвертер будет лучше, имхо. Файлов накидал, нажал кнопку, получил результат.
brute
(06.11.2020 в 18:34):
с перекодировкой SVG помогут Visio и PhotoLine
ManHunter
(03.11.2020 в 18:01):
Vnv, 20 шекелей за 1 пакет и 1533*20 шекелей - это получаются совсем разные шекели
Vnv
(03.11.2020 в 17:56):
Смахивает на маниакальную шизофрению, мог бы все программки всунуть в один пакет. :)
Добавить комментарий
Заполните форму для добавления комментария