Исследование защиты программы 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
Ограничение снято
Теперь при восстановлении пароля никаких ограничений по его длине нет. Вот, к примеру, успешно подобран пятизначный тестовый пароль.
Программа успешно "зарегистрирована"
В окне "О программе" пропала надпись, что это триальная версия. Цель достигнута, убираем очередной полезный инструмент на дорожную флешку. Остальные программы этого разработчика рефиксятся примерно так же.
Просмотров: 1327 | Комментариев: 9
Метки: исследование защиты
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
Саша
(06.12.2023 в 16:00):
ManHunter, Низкий поклон вам, как вас отблагодарить не знай. Очень интересно покопаться
ManHunter
(06.12.2023 в 15:56):
ida
Саша
(06.12.2023 в 15:36):
ManHunter, Имеется в ввиду Code Assembler
Ни где не могу найти что эта за программа, перекачал многое уже не подходят
Ни где не могу найти что эта за программа, перекачал многое уже не подходят
ManHunter
(06.12.2023 в 14:00):
Взять и загуглить по названиям программ.
Саша
(06.12.2023 в 13:35):
А где скачать редактор такой же как в посте ? Благодарю
Жека
(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
Добавить комментарий
Заполните форму для добавления комментария