
Скриншот программы RAR Password Recovery Magic
Программа RAR Password Recovery Magic предназначена для восстановления забытых паролей к архивам RAR. Скорость работы существенно уступает топовым аналогам, так что программа сгодится исключительно для экспериментов. Пытается подобрать пароли по заранее созданному словарю, а также прямым перебором (brute-force). Настройки скудноваты, видимо вся энергия авторов ушла на написание интерфейса с поддержкой графического скина, или же в свое время это была чья-то лабораторная по информатике. К минусам можно отнести еще и шароварность.
Скачиваем дистрибутив, устанавливаем, запускаем. На запрос регистрации введем любые неправильные данные, получим сообщение "You are unsuccessful!". Запускающий файл ничем не упакован, строка сообщения обнаруживается в секции данных:
CODE:004A2B1C _str_You_are_unsucce dd 0FFFFFFFFh ; _top
CODE:004A2B1C dd 21 ; Len
CODE:004A2B1C db 'You are unsuccessful!',0; Text
На нее ссылается указатель:
DATA:004ACB0C off_4ACB0C dd offset _str_You_are_unsucce.Text
DATA:004ACB0C ; DATA XREF: sub_4A3EAC+1DA
DATA:004ACB0C ; sub_4A4170+16C...
На него в свою очередь ссылается следующий указатель:
DATA:004AD118 off_4AD118 dd offset off_4ACB0C
; DATA XREF: _TCode_btnOkClick+DA
И только на этот указатель есть ссылка из секции кода:
...
CODE:004A4EFD call @Controls@TControl@GetText$qqrv
; Controls::TControl::GetText(void)
CODE:004A4F02 mov eax, [ebp+var_4]
CODE:004A4F05 push eax
CODE:004A4F06 lea edx, [ebp+var_8]
CODE:004A4F09 mov eax, [ebx+308h]
CODE:004A4F0F call @Controls@TControl@GetText$qqrv
; Controls::TControl::GetText(void)
CODE:004A4F14 mov edx, [ebp+var_8]
CODE:004A4F17 mov eax, ds:off_4ACC58
CODE:004A4F1C mov eax, [eax]
CODE:004A4F1E mov eax, [eax+370h]
CODE:004A4F24 pop ecx
; Вызвать функцию проверки введенных данных
CODE:004A4F25 call @Sqledit@EditSQL$qqrp16Classes
CODE:004A4F2A test al, al
; Если функция вернула AL = 0, то введенные данные неправильные
CODE:004A4F2C jz short loc_4A4FA3
; Программа успешно зарегистрирована
CODE:004A4F2E mov edx, ds:off_4ACDD8
CODE:004A4F34 mov edx, [edx]
CODE:004A4F36 mov eax, ds:off_4ACC58
CODE:004A4F3B mov eax, [eax]
...
; Часть кода пропущена
...
CODE:004A4FA1 jmp short loc_4A4FC6
CODE:004A4FA3 ; ----------------------------------------------------
CODE:004A4FA3 loc_4A4FA3:
; Показать сообщение о неправильном серийном номере
CODE:004A4FA3 push 10h ; uType
CODE:004A4FA5 mov eax, ds:off_4ACE88
CODE:004A4FAA mov eax, [eax]
CODE:004A4FAC call @System@@LStrToPChar$qqrx17System
; System::__linkproc__ LStrToPChar(System::AnsiString)
CODE:004A4FB1 push eax ; lpCaption
CODE:004A4FB2 mov eax, ds:off_4AD118
CODE:004A4FB7 mov eax, [eax]
CODE:004A4FB9 call @System@@LStrToPChar$qqrx17System
; System::__linkproc__ LStrToPChar(System::AnsiString)
CODE:004A4FBE push eax ; lpText
CODE:004A4FBF push 0 ; hWnd
CODE:004A4FC1 call MessageBoxA_0_0
...
Теперь запустим программу под отладчиком и поставим точку останова по адресу 004A4F25. Введем в окно регистрации ваше имя и любой неправильный серийный номер, отладчик остановится на вызове функции проверки. Попробуем пройти ее пошагово. В самом начале функции на стеке видны введенное имя и неправильный серийник, а потом на основе введенного имени по адресу 00490F76 производятся какие-то расчеты.

Пошаговая трассировка
Если внимательно наблюдать за стеком, то можно заметить, что после этого в нем появилось еще одно интересное значение, очень похожее на какой-то серийный номер:

Серийный номер найден
Далее в регистры EAX и EDX заносится новая строка и введенный серийный номер, и по адресу 00490F81 выполняется их сравнение. Предположим, что это и есть правильный серийный номер для введенного имени. Скопируем его и повторим регистрацию, но уже с ним.

Программа успешно зарегистрирована
Как видим, наша догадка подтвердилась и регистрация прошла успешно. Теперь можно побаловаться и самой программой, чтобы убедиться в ее несостоятельности. Вот такая никому не нужная программа с никчемной защитой. Дорогие товарищи программисты, пожалуйста, никогда не пишите подобный софт! В интернете и без того слишком много хлама!