
Исследование защиты программы iSumsoft RAR Password Refixer

Скриншот программы iSumsoft RAR Password Refixer
Программа RAR Password Refixer от компании iSumsoft, как нетрудно догадаться из названия, предназначена для рефиксинга паролей RAR-архивов. Не могу с уверенностью сказать, каким образом слово "исправление" относится к процессу подбора паролей, наверное, точно так же, как и "лечение" относится к взлому самой программы. Им и займемся.
Забираем с офсайта дистрибутив, устанавливаем, смотрим. Из внешних признаков триальности мне больше всего нравится надпись в окне "О программе":

Окно "О программе"
А вот по функционалу имеется ограничение, а именно по длине восстанавливаемого пароля. Если по мнению программы пароль длиннее 3 символов, то процесс рефиксинга в незарегистрированной версии останавливается вот с таким сообщением:

Сообщение незарегистрированной версии
Отправные точки для исследования у нас есть. Теперь посмотрим на главный исполняемый файл. Он упакован самым обычным пакером UPX, однако после попытки распаковки командой upx -d iSumsoftRARPasswordRefixer.exe перестает запускаться, падая с ошибкой.

Сообщение об ошибке
Вряд ли это защита, тут дело в другом. Открываем файл в любом редакторе, поддерживающем правку PE-заголовка. Так и есть: флаг, сигнализирующий об отсутствии в файле релоков, не проставлен.

Редактируем заголовок файла
Ставим галочку, сохраняем изменения, проверяем. Вот теперь распакованный файл запускается корректно. Отправляем его на разбор в дизассемблер. Когда тот закончит анализ, поищем в файле что-нибудь, связанное с триальным окном.

Триальное окно в ресурсах
В ресурсах обнаруживается диалог с числовым идентификатором 150 или 96h, если считать в шестнадцатеричной системе. Первый же результат поиска выводит нас на нужный код:
Code (Assembler) : Убрать нумерацию
- .text:00424260 sub_424260 proc near
- .text:00424260 push esi
- .text:00424261 push 0
- ; Идентификатор диалогового окна из ресурсов
- .text:00424263 push 96h
- .text:00424268 mov esi, ecx
- .text:0042426A call sub_455ED1
- .text:0042426F mov dword ptr [esi], offset off_5EE194
- .text:00424275 mov eax, esi
- .text:00424277 mov dword ptr [esi+98h], 0
- .text:00424281 mov dword ptr [esi+9Ch], 0
- .text:0042428B mov dword ptr [esi+0A0h], 0
- .text:00424295 mov dword ptr [esi+0A4h], 0
- .text:0042429F mov dword ptr [esi+0ACh], 0
- .text:004242A9 mov dword ptr [esi+0A8h], offset off_5B731C
- .text:004242B3 pop esi
- .text:004242B4 retn 4
- .text:004242B4 sub_424260 endp
Code (Assembler) : Убрать нумерацию
- .text:0042B9DD mov dword ptr [esp+20h], 0
- .text:0042B9E5 mov dword ptr [esp+24h], 0
- .text:0042B9ED mov dword ptr [esp+28h], 0
- .text:0042B9F5 mov byte ptr [esp+2B8h], 1
- ; Вызвать функцию проверки
- .text:0042B9FD call sub_4382F0
- ; Если AL!=0, то триальное окно не появится
- .text:0042BA02 test al, al
- .text:0042BA04 jnz loc_42BAA5
- .text:0042BA0A mov eax, [edi+1AF4h]
- .text:0042BA10 test eax, eax
- .text:0042BA12 jz loc_42BB69
- .text:0042BA18 cmp dword ptr [eax+30h], 0
- .text:0042BA1C jnz loc_42BB69
- .text:0042BA22 mov eax, [esp+14h]
- .text:0042BA26 cmp dword ptr [eax-0Ch], 3
- .text:0042BA2A jle loc_42BB69
- .text:0042BA30 cmp dword ptr [edi+1B3Ch], 0
- .text:0042BA37 jnz loc_42BB69
- .text:0042BA3D mov eax, [edi+33BCh]
- .text:0042BA43 test eax, eax
- .text:0042BA45 jz short loc_42BA62
- .text:0042BA47 xor ecx, ecx
- .text:0042BA49 add eax, 28ECh
- .text:0042BA4E xchg ecx, [eax]
- .text:0042BA50 mov eax, [edi+33BCh]
- .text:0042BA56 mov ecx, 7
- .text:0042BA5B add eax, 28ECh
- .text:0042BA60 xchg ecx, [eax]
- .text:0042BA62 loc_42BA62:
- .text:0042BA62 mov esi, [edi+1AF4h]
- .text:0042BA68 mov dword ptr [edi+1B38h], 1
- .text:0042BA72 test esi, esi
- .text:0042BA74 jz short loc_42BA8B
- .text:0042BA76 push esi
- .text:0042BA77 call ds:EnterCriticalSection
- .text:0042BA7D push esi
- .text:0042BA7E mov dword ptr [esi+30h], 1
- .text:0042BA85 call ds:LeaveCriticalSection
- .text:0042BA8B loc_42BA8B:
- .text:0042BA8B push ecx
- .text:0042BA8C lea ecx, [esp+1F8h]
- .text:0042BA93 call sub_424260
- .text:0042BA98 mov byte ptr [esp+2B8h], 2
- .text:0042BAA0 jmp loc_42BB49
- .text:0042BAA5 ; ------------------------------------------------------
- .text:0042BAA5 loc_42BAA5:
- .text:0042BAA5 mov al, [edi+3198h]
- .text:0042BAAB test al, al
- .text:0042BAAD jz loc_42BB69
- .text:0042BAB3 mov eax, [edi+1AF4h]
- .text:0042BAB9 test eax, eax
Code (Assembler) : Убрать нумерацию
- .text:004382F0 sub_4382F0 proc near
- .text:004382F0 push ebp
- .text:004382F1 mov ebp, esp
- .text:004382F3 push 0FFFFFFFFh
- .text:004382F5 push offset loc_5A2FE8
- .text:004382FA mov eax, large fs:0
- .text:00438300 push eax
- .text:00438301 sub esp, 8
- .text:00438304 push ebx
- .text:00438305 mov eax, dword_61F480
- .text:0043830A xor eax, ebp
- .text:0043830C push eax
- .text:0043830D lea eax, [ebp+var_C]
- .text:00438310 mov large fs:0, eax
- .text:00438316 call sub_453144
- .text:0043831B xor ecx, ecx
- .text:0043831D mov edx, eax
- .text:0043831F test edx, edx
- .text:00438321 setnz cl
- .text:00438324 test ecx, ecx
- .text:00438326 jnz short loc_438332
- .text:00438328 push 80004005h
- .text:0043832D call loc_4201B0
- .text:00438332 loc_438332:
- .text:00438332 mov eax, [edx]
- .text:00438334 mov ecx, edx
- .text:00438336 call dword ptr [eax+0Ch]
- .text:00438339 add eax, 10h
- .text:0043833C mov [ebp+var_10], eax
- .text:0043833F lea eax, [ebp+var_10]
- .text:00438342 mov [ebp+var_4], 0
- .text:00438349 push eax
- .text:0043834A push ecx
- .text:0043834B call sub_438AE0
- .text:00438350 test al, al
- .text:00438352 jz short loc_438386
- .text:00438354 mov eax, [ebp+var_10]
- .text:00438357 cmp dword ptr [eax-0Ch], 0
- .text:0043835B jl short loc_438386
- .text:0043835D push offset off_5F240C
- .text:00438362 push eax
- .text:00438363 call sub_57C8D4
- .text:00438368 add esp, 8
- .text:0043836B test eax, eax
- .text:0043836D jz short loc_438386
- .text:0043836F sub eax, [ebp+var_10]
- .text:00438372 sar eax, 1
- .text:00438374 jnz short loc_438386
- .text:00438376 lea ecx, [ebp+var_10]
- .text:00438379 call sub_438400
- .text:0043837E test al, al
- .text:00438380 jz short loc_438386
- .text:00438382 mov bl, 1
- .text:00438384 jmp short loc_4383C7
- .text:00438386 ; ---------------------------------------------
- .text:00438386 loc_438386:
- .text:00438386 lea ecx, [ebp+var_10]
- .text:00438389 call loc_41FEF0
- .text:0043838E lea eax, [ebp+var_10]
- .text:00438391 push eax
- .text:00438392 call sub_438730
- .text:00438397 mov eax, [ebp+var_10]
- .text:0043839A cmp dword ptr [eax-0Ch], 0
- .text:0043839E jl short loc_4383C5
- .text:004383A0 push offset off_5F240C
- .text:004383A5 push eax
- .text:004383A6 call sub_57C8D4
- .text:004383AB add esp, 8
- .text:004383AE test eax, eax
- .text:004383B0 jz short loc_4383C5
- .text:004383B2 sub eax, [ebp+var_10]
- .text:004383B5 sar eax, 1
- .text:004383B7 jnz short loc_4383C5
- .text:004383B9 lea ecx, [ebp+var_10]
- .text:004383BC call sub_438400
- .text:004383C1 mov bl, al
- .text:004383C3 jmp short loc_4383C7
- .text:004383C5 ; ------------------------------------------
- .text:004383C5 loc_4383C5:
- .text:004383C5 xor bl, bl
- .text:004383C7 loc_4383C7:
- .text:004383C7 mov [ebp+var_4], 0FFFFFFFFh
- .text:004383CE or ecx, 0FFFFFFFFh
- .text:004383D1 mov edx, [ebp+var_10]
- .text:004383D4 add edx, 0FFFFFFF0h
- .text:004383D7 lea eax, [edx+0Ch]
- .text:004383DA lock xadd [eax], ecx
- .text:004383DE dec ecx
- .text:004383DF test ecx, ecx
- .text:004383E1 jg short loc_4383EB
- .text:004383E3 mov ecx, [edx]
- .text:004383E5 push edx
- .text:004383E6 mov eax, [ecx]
- .text:004383E8 call dword ptr [eax+4]
- .text:004383EB loc_4383EB:
- .text:004383EB mov al, bl
- .text:004383ED mov ecx, [ebp+var_C]
- .text:004383F0 mov large fs:0, ecx
- .text:004383F7 pop ecx
- .text:004383F8 pop ebx
- .text:004383F9 mov esp, ebp
- .text:004383FB pop ebp
- .text:004383FC retn
- .text:004383FC sub_4382F0 endp

Ограничение снято
Теперь при восстановлении пароля никаких ограничений по его длине нет. Вот, к примеру, успешно подобран пятизначный тестовый пароль.

Программа успешно "зарегистрирована"
В окне "О программе" пропала надпись, что это триальная версия. Цель достигнута, убираем очередной полезный инструмент на дорожную флешку. Остальные программы этого разработчика рефиксятся примерно так же.
Просмотров: 1055 | Комментариев: 4
Метки: исследование защиты

Комментарии
Отзывы посетителей сайта о статье
Жека
(13.03.2023 в 01:33):
ManHunter, ну вы блин даёте, вы уже крякали из разряда это "говнософта" ранее, только другим методом. Там их куева туча, такого поделья - с одинаковым интерфейсом и самое главное кодом, от типа, разных производителей. Правильный ключ, для этой, будет: ISUMSOFT-RAR-REFIXER1234-45678 Ключевое слово там - ISUMSOFT-RAR-REFIXER отличатся друг от друга, а 1234-45678 у всех одинаковое. Кстати, они все не поддерживают архивы RAR-5. Как написали 10 лет назад свой код, ТАК И КЛЕПАЮТ, МОЛОДЦЫ!

voffka
(09.11.2022 в 11:43):
В последнее время стараюсь не трогать этот флаг, патчу по смещению от ImageBase. Всего 2-3 строчки кода.
Для exe
MOV EAX,DWORD PTR FS:[030h]
MOV EAX,DWORD PTR DS:[EAX+8] ;ImageBase EAX
Для dll
CALL @_00401236
@_00401236:
POP EAX
SUB EAX,01236h ; sub @_00401236 RVA, ImageBase EAX
Хотя при инлайне дорог каждый байт свободного места.
Для exe
MOV EAX,DWORD PTR FS:[030h]
MOV EAX,DWORD PTR DS:[EAX+8] ;ImageBase EAX
Для dll
CALL @_00401236
@_00401236:
POP EAX
SUB EAX,01236h ; sub @_00401236 RVA, ImageBase EAX
Хотя при инлайне дорог каждый байт свободного места.

ManHunter
(09.11.2022 в 07:35):
Можно заинлайнить упакованный файл, тогда все равно придется флажок сбрасывать.

voffka
(09.11.2022 в 06:14):
Распаковка по фэншую: upx -d --strip-relocs=0 iSumsoftRARPasswordRefixer.exe

Добавить комментарий
Заполните форму для добавления комментария
