Исследование защиты программы iSunshare Password Genius

iSunshare Password Genius предназначена для восстановления забытых паролей от офисных документов, архивов, баз данных, всего несколько десятков различных форматов. Взлом пароля работает путем прямого перебора, по шаблону, по словарю. Без регистрации можно восстановить только пароли не длиннее 3 символов, что для практического применении бесполезно. Это досадное недоразумение надо исправить.

Забираем с офсайта дистрибутив максимально доступной Advanced-версии программы, устанавливаем, смотрим. Основной файл упакован UPX без каких-либо модификаций, так что распаковываем его самим же UPX командой upx -d PasswordGeniusAdvancedTrial.exe. Распакованный файл отправляем на разбор в дизассемблер, а параллельно посмотрим на внешние проявления триальности:

https://a.radikal.ru/a12/2009/30/e2740e1afdce.png
Окно "О программе"

В заголовке окна надпись "Trial", в окне "О программе" надпись о триальной версии, активная кнопка покупки, пункты регистрации в меню. Пробуем ввести какой-нибудь левый серийник через меню регистрации, получаем сообщение.

https://c.radikal.ru/c13/2009/76/c4db61e1fdba.png
Сообщение о неправильной регистрации

Дизассемблер уже закончил свою работу, можно поискать место, где и при каких условиях это сообщение появляется.

Цитата:

Code (Assembler) :

.text:00423E9D call sub_424100
.text:00423EA2 lea eax, [esp+1Ch]
.text:00423EA6 push eax
.text:00423EA7 call sub_4037F0
.text:00423EAC mov byte ptr [esp+3Ch], 1
.text:00423EB1 mov eax, [esp+10h]
.text:00423EB5 cmp dword ptr [eax-0Ch], 0
.text:00423EB9 jl short loc_423F1E
.text:00423EBB push offset aIsunsharePas_0
; "ISUNSHARE-PASSWORD-GENIUS-ADVANCED"
.text:00423EC0 push eax
.text:00423EC1 call _wcsstr
.text:00423EC6 add esp, 8
.text:00423EC9 test eax, eax
.text:00423ECB jz short loc_423F1E
.text:00423ECD sub eax, [esp+10h]
.text:00423ED1 sar eax, 1
.text:00423ED3 jnz short loc_423F1E
.text:00423ED5 mov ecx, ebx
.text:00423ED7 push ecx
.text:00423ED8 call sub_423540
.text:00423EDD test al, al
.text:00423EDF jz short loc_423F1E
.text:00423EE1 mov edx, ebx
.text:00423EE3 push edx
.text:00423EE4 call sub_4236D0
.text:00423EE9 test al, al
.text:00423EEB jz short loc_423F2C
.text:00423EED call ?AfxGetModuleState
.text:00423EF2 mov eax, [eax+4]
.text:00423EF5 mov esi, [eax+20h]
.text:00423EF8 call sub_40F930
.text:00423EFD push 0
.text:00423EFF push offset aIsunsharePassw
; "iSunshare Password Genius Advanced Tria"…
.text:00423F04 push offset aThankYouForReg
; "Thank you for registering!"
.text:00423F09 mov ecx, edi
.text:00423F0B call sub_45509E
.text:00423F10 mov eax, [edi]
.text:00423F12 mov edx, [eax+158h]
.text:00423F18 mov ecx, edi
.text:00423F1A call edx
.text:00423F1C jmp short loc_423F3F
.text:00423F1E ; —————————————
.text:00423F1E loc_423F1E:
.text:00423F1E push 30h
.text:00423F20 push offset aRegistration
; "Registration"
.text:00423F25 push offset aTheCodeYouVeEn
; "The Code you’ve entered invalid!"
.text:00423F2A jmp short loc_423F38

Несколько условных переходов по адресам 00423EB9, 00423ECB, 00423ED3, 00423EDF и 00423EEB, каждый из которых ведет на сообщение о неправильной регистрации. Забиваем их все командами NOP. Теперь любой серийник будет принят как правильный. Но это еще не все, ведь серийник проверяется при старте, после чего к интерфейсу применяются все признаки триальности или наоборот, не применяются. Надо найти место, где выполняются аналогичные проверки. Выйти на второе место помогают перекрестные ссылки на функцию sub_423540, которая вызывается как раз из двух мест.

Цитата:

Code (Assembler) :

.text:004234CE mov eax, [esp+1Ch+var_14]
.text:004234D2 cmp [eax-0Ch], ebx
.text:004234D5 jl short loc_4234FD
.text:004234D7 push offset aIsunsharePas_0
; "ISUNSHARE-PASSWORD-GENIUS-ADVANCED"
.text:004234DC push eax ; wchar_t *
.text:004234DD call _wcsstr
.text:004234E2 add esp, 8
.text:004234E5 cmp eax, ebx
.text:004234E7 jz short loc_4234FD
.text:004234E9 sub eax, [esp+1Ch+var_14]
.text:004234ED sar eax, 1
.text:004234EF jnz short loc_4234FD
.text:004234F1 lea edx, [esp+1Ch+var_14]
.text:004234F5 push edx ; wchar_t *
.text:004234F6 call sub_423540
.text:004234FB mov bl, al
.text:004234FD loc_4234FD:
.text:004234FD mov [esp+1Ch+var_4], 0FFFFFFFFh
.text:00423505 mov eax, [esp+1Ch+var_14]

Точно так же NOP’им условные переходы по адресам 004234D5,004234E7 и 004234EF. Но обратите внимание, что результат функции sub_423540 сохраняется в регистр BL. А он, как мы помним по предыдущему кусочку кода, должен быть ненулевым. Ок, открываем функцию проверки по адресу 00423540, забиваем в начало пару команд MOV AL,1 и RET 4, чтобы не порушить стек при возврате. Сохраняем изменения.

Теперь можно проверить работоспособность. Открываем архивный файл "TEST.ZIP" с паролем и получаем сообщение, что такой формат не поддерживается. Переименовываем файл в "TEST.zip" и программа его без проблем принимает в обработку. Серьезно???! Чувствительность к регистру расширения? Написать программу для взлома паролей и запороться на такой элементарщине? Стыдоба какая.

https://b.radikal.ru/b07/2009/31/f148a21280bc.png
Программа успешно "зарегистрирована"

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

• Author: ManHunter

Оставьте комментарий