Исследование защиты Accent OFFICE Password Recovery


Скриншот программы Accent OFFICE Password Recovery

Accent OFFICE Password Recovery от AccentSoft Team - еще одна полезная в хозяйстве программа, на этот раз для восстановления забытых паролей от документов Microsoft Office. Скачать дистрибутив для исследования можно с офсайта. Устанавливаем, запускаем, наблюдаем знакомую картину: надпись "Unregistered copy" и предупреждение, что пробная версия открывает пароли максимум из 4 символов. Это несерьезно, поэтому приступаем к лечению.

Наружный осмотр пациента показывает, что файл упакован UPX, однако код упаковщика модифицирован и обычное UPX -d не срабатывает. Придется распаковать вручную или воспользоваться чем-нибудь типа Quick Unpack или UPX-Ripper. Все распаковалось успешно, распакованный файл запускается. Приступаем к прогрессивной терапии. Если есть строчка "Unregistered", значит по логике где-то должна быть "Registered". Найдем ее.


Строка найдена

Теперь посмотрим код, который ссылается на эту строку. Код без сюрпризов, в нем сразу бросается в глаза комбинация из вызова какой-то функции и условного перехода в зависимости от ее возвращенного результата.
.text:0040E4D8                 push    eax
; Похоже что тут вызывается функция проверки регистрационных данных
.text:0040E4D9                 call    sub_4019B4
.text:0040E4DE                 add     esp, 8
.text:0040E4E1                 test    eax, eax
; По результатам проверки регистра EAX выполняется переход.
; EAX=1 - программа не зарегистрирована, EAX=0 - программа зарегистрирована.
.text:0040E4E3                 jnz     short loc_40E51A
.text:0040E4E5                 mov     word ptr [ebp-24h], 14h
.text:0040E4EB                 mov     edx, offset aRegisteredCopy ; "Registered copy   ."
.text:0040E4F0                 lea     eax, [ebp-0Ch]
.text:0040E4F3                 call    sub_4CFE10
.text:0040E4F8                 inc     dword ptr [ebp-18h]
.text:0040E4FB                 mov     edx, [eax]
.text:0040E4FD                 mov     eax, [ebx+2E0h]
.text:0040E503                 call    @Controls@TControl@SetText$qqrx17System@AnsiString ; Controls::TControl::SetText(System::AnsiString)
.text:0040E508                 dec     dword ptr [ebp-18h]
.text:0040E50B                 lea     eax, [ebp-0Ch]
.text:0040E50E                 mov     edx, 2
.text:0040E513                 call    sub_4CFFB8
.text:0040E518                 jmp     short loc_40E54D
.text:0040E51A ; ---------------------------------------------------------------------------
.text:0040E51A
.text:0040E51A loc_40E51A:
.text:0040E51A                 mov     word ptr [ebp-24h], 20h
.text:0040E520                 mov     edx, offset aUnregistered_0 ; "Unregistered copy   ."
.text:0040E525                 lea     eax, [ebp-10h]
.text:0040E528                 call    sub_4CFE10
.text:0040E52D                 inc     dword ptr [ebp-18h]
.text:0040E530                 mov     edx, [eax]
.text:0040E532                 mov     eax, [ebx+2E0h]
.text:0040E538                 call    @Controls@TControl@SetText$qqrx17System@AnsiString ; Controls::TControl::SetText(System::AnsiString)
.text:0040E53D                 dec     dword ptr [ebp-18h]
.text:0040E540                 lea     eax, [ebp-10h]
.text:0040E543                 mov     edx, 2
.text:0040E548                 call    sub_4CFFB8

Терапия закончилась, переходим к хирургии. Попробуем пропатчить функцию проверки регистрации. Мы помним, что в случае успешной регистрации она должна вернуть EAX=0. Для этого пропишем в самое начало две команды: XOR EAX,EAX и RET
; Процедура проверки регистрации должна вернуть EAX=0 если программа
; зарегистрирована
.text:004019B4                 push    ebp       ; <-- XOR EAX,EAX; RET
.text:004019B5                 mov     ebp, esp
.text:004019B7                 add     esp, 0FFFFFF94h
.text:004019BA                 xor     eax, eax
.text:004019BC                 lea     edx, [ebp+var_6C]
.text:004019BF                 push    ebx
.text:004019C0                 push    esi
.text:004019C1                 push    edi
.text:004019C2                 mov     esi, [ebp+arg_4]
.text:004019C5                 mov     [ebp+var_4], eax
.text:004019C8                 push    edx
.text:004019C9                 call    sub_410950
.text:004019CE                 pop     ecx
.text:004019CF                 push    22h             ; n
.text:004019D1                 mov     ecx, [ebp+src]
.text:004019D4                 push    ecx             ; src
.text:004019D5                 lea     eax, [ebp+var_6C]
.text:004019D8                 push    eax             ; int
.text:004019D9                 call    sub_410980
.text:004019DE                 add     esp, 0Ch
.text:004019E1                 lea     edx, [ebp+var_6C]
.text:004019E4                 push    edx             ; src
.text:004019E5                 call    sub_410A3C
.text:004019EA                 pop     ecx
.text:004019EB                 xor     ecx, ecx
.text:004019ED                 xor     edx, edx
.text:004019EF                 lea     eax, [ebp+var_14]
.text:004019F2
.text:004019F2 loc_4019F2:
.text:004019F2                 lea     edi, [edx+esi*8]
.text:004019F5                 xor     ebx, ebx
.text:004019F7                 mov     bl, [eax]
.text:004019F9                 cmp     ebx, dword_4DA7B0[edi*4]
.text:00401A00                 jz      short loc_401A09
.text:00401A02                 mov     eax, 1
.text:00401A07                 jmp     short loc_401A18
.text:00401A09 ; ---------------------------------------------------------------------------
.text:00401A09
.text:00401A09 loc_401A09:
.text:00401A09                 add     eax, 2
.text:00401A0C                 add     ecx, 2
.text:00401A0F                 inc     edx
.text:00401A10                 cmp     ecx, 10h
.text:00401A13                 jl      short loc_4019F2
.text:00401A15                 mov     eax, [ebp+var_4]
.text:00401A18
.text:00401A18 loc_401A18:
.text:00401A18                 pop     edi
.text:00401A19                 pop     esi
.text:00401A1A                 pop     ebx
.text:00401A1B                 mov     esp, ebp
.text:00401A1D                 pop     ebp
.text:00401A1E                 retn

Сохраняем изменения, запускаем, на первый взгляд все нормально. Для проверки сделаем запароленный файл в Microsoft Word, причем пароль надо будет сделать более 4 символов. Попробуем восстановить его. В настройках Accent OFFICE Password Recovery ставим метод Brute-Force, запускаем перебор.


Программа "зарегистрирована" и работает без ограничений

"... и о чудо! Никаких пятен!". Пароль восстанавливается, плохих надписей нет. Для информации: аналогичным способом убирается защита для всех остальных программ от AccentSoft Team.
Теги:
защита, взлом
Добавлено: 21 Сентября 2013 05:29:40 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...