Как скрытое становится явным Bad_guy Спецвыпуск: Хакер, номер #058, стр. 058-016-2 Как показывает скриншот, ключи Behavior и Item Data содержат данные, явно относящиеся к паролям, содержащимся в защищенном хранилище, однако самих паролей в открытом виде все равно нет. Пишем "расшифровщик" Мысль написать расшифровщик была как раз первой пришедшей в голову, когда я увидел данные, содержащиеся в ключах Behavior и Item Data. Но, попроверяв изменение данных при смене пароля от ящика в OE, я понял, что это будет непростой задачей. Необходимо посмотреть, как же сам Outlook Express расшифровывает эти данные. При помощи отладчика и дизассемблера начался разбор, поведавший мне, что сам по себе Outlook Express не работает с этими ветвями реестра: существует некая системная библиотека pstorec.dll для непосредственной работы с защищенным хранилищем. У этой библиотеки есть все необходимые экспортируемые функции, которые выдают программе, использующей библиотеку, все возможности по работе с защищенным хранилищем: чтение, запись, стирание данных и отображение хранящихся в нем записей. Поискав что-нибудь о "pstorec.dll" в Google и Яndex, я нашел пару мест, где об этом что-то было, но информация была очень скудной: например из MSDN, которая фактически не давала никаких возможностей самостоятельно реализовать алгоритм использования функций библиотеки. Также попался какой-то левый Visual Basic-исходник, перековерканный web-парсингом (примерно вот в таком же виде - http://progg.net.ru/dir13/p3291.htm, только здесь на C++) и никак не компилировавшийся. Попробовал реализовать алгоритм на Delphi - началась долгая и упорная работа по разбору алгоритма. Выяснилось, к примеру, что библиотеку pstorec.dll нужно обработать прежде всего при помощи tlibimp.exe из комплекта Delphi (командная строка: "tlibimp.exe pstorec.dll"), полученные файлы (PSTORECLib_TLB.dcr, PSTORECLib_TLB.pas) подключаются в Delphi, как новый компонент. В реализации же самого алгоритма на Delphi сильно помог опыт крэкера: дизассемблирование упомянутой выше программы (Protected Storage PassView) принесло необходимые результаты, и в итоге был получен рабочий алгоритм (см. врезку). ListBox1.Clear; StatusBar1.SimpleText := DateToStr(Date)+' @ '+TimeToStr(Time); hMod := LoadLibrary('pstorec.dll'); PStoreCreateInstance := GetProcaddress(hMod, 'PStoreCreateInstance'); if @PStoreCreateInstance = nil then ShowMessage('PStoreCreateInstance not found'); hRes := PStoreCreateInstance(@spPStore, 0, 0, 0); hRes := spPstore.EnumTypes(0,0,spEnumTypes); while spEnumTypes.Next(1,typeGUID,c1) = S_OK do |