Blog. Just Blog

Исследование защиты программы Recover Passwords

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Темная сторона Силы | Автор: ManHunter
Скриншот программы Recover Passwords
Скриншот программы Recover Passwords

Программа Recover Passwords предназначена для автоматического сбора паролей на локальном или удаленном (при наличии соответствующих прав доступа) компьютере. Она извлекает сохраненные пароли из мессендежров, ICQ-клиентов, браузеров, почтовых программ, FTP-клиентов и т.п. Полный список поддерживаемых программ есть на офсайте, посмотрите, если интересно. В демонстрационном, то есть бесплатном режиме, Recover Passwords только показывает список найденных программ, но не показывает сами найденные пароли. Сейчас мы попробуем устранить этот недостаток.

Скачиваем дистрибутив, устанавливаем, запускаем. Действительно, программа пишет, что пароли найдены, показывает учетные записи, но сами пароли не показывает. В заголовке написано "Эта копия не зарегистрированнна" (орфография оригинала сохранена), а на панели инструментов присутствует иконка "Order me". При выходе из программы открывается наг-скрин с не менее оригинальной надписью и предложением купить ее или ввести регистрационный ключ.

Окно регистрации программы
Окно регистрации программы

Вот, теперь у нас есть практически все проявления незарегистрированной версии, поищем условия, при которых проявляются какие-нибудь из них. В подпапке Lang в файле Russian.xml есть строки:

<String name="cSKeyValid">Спасибо за регистрацию этого продукта</String>
<String name="cSKeyInvalid">Ключ не верный</String>

Очевидно, что это сообщения о результатах проверки регистрационного ключа, а обращение к ним идет по имени cSKeyValid или, соответственно, cSKeyInvalid. Поищем их в исполняемом файле.

Строка сообщения найдена
Строка сообщения найдена

Найдена строка в юникоде. Теперь смотрим как и при каких условиях к ним идет обращение.
  1. ...
  2. .text:0097BDA8                 mov     eax, [eax]
  3. .text:0097BDAA                 mov     edx, [ebp+var_4]
  4. ; Вызвать какую-то функцию проверки
  5. .text:0097BDAD                 call    sub_7819D0
  6. .text:0097BDB2                 test    al, al
  7. ; Если она вернула AL=0, то вывести сообщение о неправильном ключе
  8. .text:0097BDB4                 jz      short loc_97BE24
  9. ; Иначе записать его куда-то в реестр и поблагодарить за регистрацию
  10. .text:0097BDB6                 lea     eax, [ebp+var_10]
  11. .text:0097BDB9                 mov     edx, [ebp+var_4]
  12. .text:0097BDBC                 call    sub_407FB0
  13. .text:0097BDC1                 mov     eax, [ebp+var_10]
  14. .text:0097BDC4                 push    eax
  15. ...
Сразу смотрим функцию проверки:
  1. .text:007819D0 sub_7819D0      proc near
  2. .text:007819D0                 mov     eax, edx
  3. .text:007819D2                 call    sub_781798
  4. .text:007819D7                 retn
  5. .text:007819D7 sub_7819D0      endp
Ну здесь без вариантов, в самое начало вписываем команды MOV Al,1; RET и сохраняем изменения. Попробуем запустить:

Программа успешно "зарегистрирована"
Программа успешно "зарегистрирована"

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

Поделиться ссылкой ВКонтакте
Просмотров: 5647 | Комментариев: 21

Внимание! Статья опубликована больше года назад, информация могла устареть!

Комментарии

Отзывы посетителей сайта о статье
PiaVia (16.02.2017 в 13:21):
В реальном файле смещение
HEX
004148EC B0 01 90 90 90 90 90
PiaVia (16.02.2017 в 12:08):
Для версии v1.0.0.33
.text:008154EC mov al, 1
.text:008154EE nop
.text:008154EF nop
.text:008154F0 nop
.text:008154F1 nop
.text:008154F2 nop
HEX
008154EC  B0 01 90 90 90 90 90
Жека (22.07.2014 в 00:37):
ManHunter, заходил я в этот call, но правка одного байта  предпочтительнее для меня, тем более прога сразу уже зарегена, без всяких дополнительных манипуляций.
ManHunter (21.07.2014 в 23:14):
Это ж очень похоже на функцию сравнения. Лучше бы поставил бряк на 007CB31B и посмотрел, что там в EAX и EDX.
А там сравнивается хэш от введенного серийника с пулом готовых хэшей валидных серийников (00755FF4). Перебиваешь любую из сумм на свою и можешь регистрировать красивым серийником. Для релиза самое оно.
Жека (21.07.2014 в 22:31):
Описанный тут метод уже не работает. Вот новое решение для последней версии 1.0.0.25

007CB316  8B07                              mov    eax,[edi]
007CB318  8B55FC                            mov    edx,[ebp-04h]
007CB31B  E894CBC3FF                        call    SUB_L00407EB4
007CB320  7504 <--- меняем на 7404             jnz    L007CB326
007CB322  B301                              mov    bl,01h
007CB324  EB06                              jmp    L007CB32C
007CB326  83C704                            add    edi,00000004h
007CB329  4E                                dec    esi
007CB32A  75EA                              jnz    L007CB316
007CB32C  33C0                              xor    eax,eax
007CB32E  5A                                pop    edx
007CB32F  59                                pop    ecx
007CB330  59                                pop    ecx
007CB331  648910                            mov    fs:[eax],edx
007CB334  6849B37C00                        push    L007CB349
007CB339  8D45FC                            lea    eax,[ebp-04h]
007CB33C  E88BC1C3FF                        call    SUB_L004074CC
007CB341  C3                                retn

Также этот переход можно занопить, но это как-то не красиво.
zlo (26.12.2012 в 00:04):
скачал не давно что то не прокатывает ((((
ядщ (26.12.2012 в 00:03):
CODE:00401098
CODE:00401098
CODE:00401098 sub_401098      proc near               ; CODE XREF: sub_403D7C+71p
CODE:00401098
CODE:00401098 var_18          = byte ptr -18h
CODE:00401098 var_14          = word ptr -14h
CODE:00401098
CODE:00401098                 push    ebx
CODE:00401099                 add     esp, 0FFFFFFBCh
CODE:0040109C                 mov     ebx, 0Ah
CODE:004010A1                 push    esp             ; lpStartupInfo
CODE:004010A2                 call    GetStartupInfoA
CODE:004010A7                 test    [esp+44h+var_18], 1
CODE:004010AC                 jz      short loc_4010B3
CODE:004010AE                 movzx   ebx, [esp+44h+var_14]
CODE:004010B3
CODE:004010B3 loc_4010B3:                             ; CODE XREF: sub_401098+14j
CODE:004010B3                 mov     eax, ebx
CODE:004010B5                 add     esp, 44h
CODE:004010B8                 pop     ebx
CODE:004010B9                 retn
CODE:004010B9 sub_401098      endp
это правильная секция ?
JokerBaD (20.05.2012 в 05:51):
Дааа наипростейшая защита.Зато сам процесс поиска механизма защиты и крэк полное удовольствие)))
brute (14.03.2012 в 18:31):
спасибо! Программа может быть иногда полезна... но у меня "не пашет": оно и понятно - портабельный firefox версии 2.0 с открытыми паролями в текстовом файле не взломаешь!
ManHunter (13.03.2012 в 20:04):
brute, не может быть универсальных рецептов на все случаи жизни. Вкратце:
1 - в дикой природе нет, в заповедниках есть
1.5 - хз
2 - не совпадают. WinAPI на порядок приятнее отслеживать.
3 - компиляторов на самом деле очень мало, а в статике поведение не отследить, только эвристикой и эмуляцией по типовому набору функций. Вот это вирус или нет? :)

jmp skip_virus
... VIRUS!!!!! KILL 'EM ALL!!!! ...
skip_virus:
exit

В песочнице один фиг все сводится к вызову тех же чистых API, только под дельфями над ними еще стопицот всяких оберток. Но в итоге получаются все те же функции.
ManHunter (13.03.2012 в 19:52):
Vitalik, именно так:
.text:007819D0 MOV AL,1
.text:007819D2 RET
Vitalik (13.03.2012 в 19:10):
Здраствуйте уважаемый ManHunter!
Я только учусь ,не сочтите за наглость, скажите пожалуйста:
Я нашел в Ольке
.text:007819D2  call  sub_781798
Захожу на sub_781798
И в какое начало надо ставить MOV Al,1; RET
Заместо ".text:007819D0"  mov  eax, edx ?
brute (13.03.2012 в 18:27):
а если бы имена (которые в файле локализации "cSKeyValid") были в самой программе вначале пошифрованы, то полная ж? Не хватает теории, просвяти, пожалуйста:
1. есть ли в дикой природе idasig для делфи2010 или для idr? (что-то не гуглится)
1.5 чистое любопытство: как же так надо, и главное, зачем переделывать в новых делфях все функции, что старые (от 2009) совсем не подходят?
2. совпадают ли сообщения (и общее устройство цикла сообщений) у делфей и прог на winAPI?
3. как антивири статически анализируют такие (созданные каким-либо новым или редким компилятором) файлы (без анализа поведения путём запуска в песочнице: изменения файлов, обращения к сети и реестру?)
3.5 давече открыл в IDA "програмку" (вывод строки в консоль и пауза), написанную на любимом PB, весом менее 1.5 Кб. На граф было страшно смотреть, строки не видно, фунции все левые (нет writeconsole)...
ManHunter (13.03.2012 в 12:19):
С локализациями как раз проще, в языковом файле смотришь имя (номер, код и т.п.) строки, в исполняемом файле ищешь манипуляции с этим именем. Сперва в ASCII, а если не находит, то в юникоде. Дальше два варианта, или каждая строка подгружается по мере необходимости, или считывается сразу весь файл и хранится в виде указателей на строки, других вариантов я не встречал. Ну а потом уже по ситуации.
brute (13.03.2012 в 12:15):
Ну да-да, молодец, отхачил прогу! Я хотел повторить сей кульбит самостоятельно, не подглядывая. Ни ида, ни де-де, ни idr прогу не жуют (похоже delphi 2010 или закриптована). Нужны или файлы delphi2010 для idr, или сигнатуры для иди (где их найти в свободном доступе?). Все строки в файлах локализации, т.е. не в секции кода - бряк не поставишь(или на чтение данных в памяти ставить?). Хотел на щелчок мыши поставить (keymouseup), вроде не  получилось.. В дельфях свои события что-ли?
ManHunter (13.03.2012 в 11:14):
Никаких готовых файлов на этом сайте никогда не будет.
Mike (13.03.2012 в 11:14):
выложи "исправленный" файл :)
я не умею делать так, как тут написанно, даже по шагово.
SVS (13.03.2012 в 00:07):
Мне всегда казалось, что есть только одно слово с тремя буквами подряд - длинношеее :) Теперь буду знать, что есть ещё слово "зарегистрированнна". И ещё не совсем усекла оборотистость русского языка - не бесплатно, но почти свобдно приобрести без ограничений. А что с теми, кто хотел приобрести, но почти не смог? Совсем чуть-чуть почти не хватило... Ах, да, для таких почти есть manhunter :)))
KnightR (11.03.2012 в 14:30):
Есть ощущение, что эта прога сделана полностью на основе исходников Multi Password Recovery от автора пинча. Он как раз продает их отдельно. Хотя при всем желании от последней трудно добиться толковой работы. Да и автор забросил чего-то проект. Может сабж будет развиваться.
ManHunter (11.03.2012 в 10:52):
На счет защиты согласен, а программа полезная.
Voffka (11.03.2012 в 03:04):
Очередная ламо-защита с кучей md5 хэшей.

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2024
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.08 сек. / MySQL: 2 (0.0075 сек.) / Память: 4.5 Mb
Наверх