Описана программа просмотра и записи в отдельный файл всего парольного кэша определенного пользователя, с использованием недокументированной API.
(Только для программистов на VB) У дюдей всегда были секреты. И они пытались их сохранить .Достоверно известно, что пираты, пряча награбленое добро на каком нибудь Богом забытом острове рисовали секретную карту, где подробненько указывали расположение сокровищь. И уж конечно, карта рисовалась не для жадных до чужих денег кладоискателей, а для себя любимого, ибо память человеческая имеет хорошее свойство - забывать. С того времени мало что изменилось. Мы по прежнему прячем свои сокровища от чужого взгляда в недрах гигабайтных HDD. Только вместо карты придумываем секретное слово, и что бы его не забыть, сохраняем его в своем компьютере, ибо память человеческая имеет хорошее свойство - забывать, особенно если пароль действительно хороший. Пароли храняться в парольном кэше, в файле ВашЛогин.PWL. Под парольным кэшем понимается механизм сохранения и повторного использования паролей в системе. От обычной базы логинов данный механизм отличается именно хранением дополнительных парольных ресурсов и возможностью их использования по специальному запросу без участия пользователя. Это дает нам возможность не запоминать пароли не несущие смысловой информации, не возможно подглядеть за клавиатурой и исключает ошибки при вводе пароля. Но есть и свои недостатки - возможность получения секретной информации злоумышленником при взломе парольного кэша. Ну мы сегодня не будем о грустном. Возникают ситуации, когда недостатки превращаются в достоинства. Вот самая обычная ситуация.Покупка нового компьютера. Вы целый год пользовались старым, у вас накопилось два мешка различных интернет карт, несколько почтовых ящиков, что соответственно потребует восстановления информации на новом компе. Для восствновления нужны логины и пароли. А кто же их помнит? Только старый комп. Но пароли он не скажет - только звездочки покажет(стихи!!!). В Интернете полно прграмм, открывающих завесу звезд, это верно. Но для этого надо запустить процесс, что бы звездочки появились. А это нудно, особенно если много их. Да и пропустить что то можно. Вот если бы сразу все, и в отдельный файл желательно! Ага, вот и пришло представить одну интересную возможность. Кэширование паролей - общесистемный сервис, это значит, что любое приложение может получить к нему доступ. Вот и будем писать это приложение на VB. Это приложение для своей работы использует API функцию, которая по известным причинам недокументирована. В стандартном применении не может использоваться как инструмент взлома, т.к. для просмотра парольного кеша нужно сначала войти в систему с именем и паролем пользователя, который не хранится в кеше. Для каждого пользователя свой PWL файл, просматривается только текущий. Открываем стандартный проект. На форме ничего не требуется, если данные сбрасывать в файл. Если необходимо выводить на экран, то положите два ListBox. Сделайте их пошире - ресурсные имена бывают длинные. Код для формы простой: Private Sub Form_Load() On Local Error Resume Next WNetEnumCachedPasswords 0, 0, &HFF, AddressOf pceCallback, 0 'Проверочка системы If Err.Number Then MsgBox "Только для Win9*/ME!" End Sub Это что бы синхронизировать списки имени и пароля, если требуется вывод на экран. Private Sub List1_Click() List2.ListIndex = List1.ListIndex End Sub Private Sub List2_Click() List1.ListIndex = List2.ListIndex End Sub Далее добавляем модуль pwldecod.bas, который собственно и производит декодирование. Dim intFH As Integer ' это будет номер открываемого файла в котором сохраняются данные Public Type tagPASSWORD_CACHE_ENTRY ' тут переменные, хранящие размеры ресурсов, паролей cbEntry As Integer cbResource As Integer cbPassword As Integer iEntry As Byte nType As Byte End Type Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (hpvDest As Any, hpvSource As Any, ByVal cbCopy As Long) Public Declare Function WNetEnumCachedPasswords Lib "mpr.dll" (ByVal Param1 As Long, ByVal Param2 As Long, ByVal Flags As Long, ByVal ProcAddress As Long, ByVal Param3 As Long) As Long Public Function CString(aStr) As String Dim k As Long k = InStr(aStr, Chr$(0)) If k Then CString = Left$(aStr, k - 1) Else CString = aStr End If End Function Public Function pceCallback(ByVal lParam As Long, ByVal wParam As Long) As Long Dim PCE As tagPASSWORD_CACHE_ENTRY, abResource As String CopyMemory PCE, ByVal lParam, 6 abResource = Space$(PCE.cbResource + PCE.cbPassword) CopyMemory ByVal abResource, ByVal lParam + 8, Len(abResource) ' вывод на экран Form1.List1.AddItem CString(Left$(abResource, PCE.cbResource)) Form1.List2.AddItem CString(Mid$(abResource, PCE.cbResource + 1)) intFH = FreeFile() ' записать в файл Open "PWLfile.usr" For Append As intFH Print #intFH, CString(Left$(abResource, PCE.cbResource)), CString(Mid$(abResource, PCE.cbResource + 1)) Close intFH pceCallback = True End Function Особо подробно работу API не расписываю - потому, что недокументированно... Но все что нужно это уже есть, и работает. Если за один сеанс работы на компе запускать сие приложение несколько раз ( бывает для отладки надо), то может и не декодировать, лечиться перезагрузкой компа. 15.07.2002 г. Х. Крутой Рабочий пример скачать тут. |