
Скриншот программы 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.