Теория и практика восстановления паролей Internet Explorer
Введение
ВведениеВряд ли кто будет оспаривать тот факт, что на сегодняшний день Internet Explorer является одним из самых популярных обозревателей сети Интернет. По статистике, около 70 процентов всех пользователей сети предпочитают пользоваться именно этой программой. Можно бесконечно спорить о его достоинствах и недостатках, но то, что данный браузер является флагманом своей индустрии - факт, не требующий доказательств. Internet Explorer имеет несколько встроенных технологий, предназначенных облегчить жизнь рядовому пользователю. Одна из них - IntelliSense - предназначена для решения рутинных задач. Например, автоматического заполнения адреса посещаемых Web страниц, заполнение полей формы, паролей пользователей и т.д.
Типы хранимых в Internet Explorer паролейВ IE могут храниться следующие типы паролей:
Пройдемся по этому списку чуть более подробно.
Пароли к Интернет сайтамПароли к Интернет сайтам представляют собой логины и пароли к Web сайтам, обрабатываемые библиотекой wininet.dll. Например, при входе в защищенную область какого-либо сайта, может последовать следующий диалог на ввод имени пользователя и пароля (рисунок 1).
Данные полей автозаполненияДанные для полей автозаполнения аналогично хранятся в защищенном хранилище и представляют собой списки из имен полей html формы и соответствующий этим полям информации пользователя. Например, если html страница содержит диалог ввода почтового адреса, то после того, как пользователь ввел свой адрес, в защищенное хранилище пропишется название html поля, сам почтовый адрес и время последнего доступа к нему.
Пароли автозаполненияОднако в случае с паролями, как вы уже могли предположить, автоматической подстановки не произойдет. Поскольку пароли автозаполнения как раз хранятся вместе с именем Web страницы, и каждый пароль привязывается только к одной определенной html странице.
Пароли FTPАналогично работает и механизм сохранения паролей к FTP сайтам. Будет нелишним упомянуть что, начиная с Windows XP, пароли FTP хранятся с использованием дополнительно шифрования DPAPI. В нем принимает участие пароль на вход в систему. Естественно, это заметно осложняет задачу ручного восстановления таких утерянных паролей, поскольку теперь дополнительно необходимо наличие Мастер Ключа пользователя, знание SID и пароля учетной записи.
Пароли синхронизацииПароли синхронизации позволяют избавить пользователя от необходимости каждый раз вводить пароль для кэшированных сайтов (сайтов, выбранных для offline доступа). Пароли этого типа тоже хранятся в защищенном хранилище Internet Explorer.
Пароли удостоверенийРавно как и пароли удостоверений. Механизм разграничение доступа на основе удостоверений не получил широкого распространения в продуктах Microsoft, за исключением, пожалуй, Outlook Express.
Данные автозаполнения формОтдельной строкой следует сказать о механизме автозаполнения on-line форм, который представляет собой гибридный вариант хранения данных. При этом сами данные хранятся в Protected Storage, а URL, которому они принадлежат - в реестре пользователя. Записываемый в реестр URL хранится не открытым текстом, а в виде хэша. Вот алгоритм чтения данных автозаполнения форм IE 4 - 6: //Get autoform password by given URL
BOOL CAutoformDecrypter::LoadPasswords(LPCTSTR cszUrl, CStringArray *saPasswords) { assert(cszUrl && saPasswords); saPasswords->RemoveAll(); //Check if autoform passwords are present in registry if ( EntryPresent(cszUrl) ) { //Read PStore autoform passwords return PStoreReadAutoformPasswords(cszUrl,saPasswords); } return FALSE; } //Check if autoform passwords are present BOOL CAutoformDecrypter::EntryPresent(LPCTSTR cszUrl) { assert(cszUrl); DWORD dwRet, dwValue, dwSize=sizeof(dwValue); LPCTSTR cszHash=GetHash(cszUrl); //problems computing the hash if ( !cszHash ) return FALSE; //Check the registry dwRet=SHGetValue(HKCU,_T("Software/Microsoft/Internet Explorer/IntelliForms/SPW"), cszHash, NULL, &dwValue, &dwSize); delete((LPTSTR)cszHash); if ( dwRet==ERROR_SUCCESS ) return TRUE; m_dwLastError=E_NOTFOUND; return FALSE; } //retrieve hash by given URL text and translate it into hex format LPCTSTR CAutoformDecrypter::GetHash(LPCTSTR cszUrl) { assert(cszUrl); BYTE buf[0x10]; LPTSTR pRet=NULL; int i; if ( HashData(cszUrl,buf,sizeof(buf)) ) { //Allocate some space pRet=new TCHAR [sizeof(buf) * sizeof(TCHAR) + sizeof(TCHAR)]; if ( pRet) { for ( i=0; i<sizeof(buf); i++ ) { // Translate it into human readable format pRet[i]=(TCHAR) ((buf[i] & 0x3F) + 0x20); } pRet[i]=(TCHAR) ((buf[i] & 0x3F) + 0x20); } pRet[i]=_T(' |