Земля. 2050 год. Генетический программер разбирает очерендной кусок генной последовательности и видит следующий комментарий: { A eti geny nado by ubrat nahren. Archangel Gavriil }
Так, сегодня мы рассмотрим как можно взять кэшированные пароли из 9x винды, а также из винды, где в установленном виде есть 5-я иешка (хотя может и 4-ой хватит:)
unit Unit1;
interfaceuses
Windows, SysUtils, Classes, Forms, ShellAPI, Controls, StdCtrls;
type
TForm1 = class(TForm)
GroupBox1: TGroupBox;
ListBox: TListBox;
Label1: TLabel;
Label2: TLabel;
procedure Label1Click(Sender: TObject);
procedure FormShow(Sender: TObject);
private{ Private declarations }public{ Public declarations }
hMPR: THandle;
end;
// Отсюда мы можем заключить что должно валяться на форме,// надеюсь вы сами всё закидаете, а если нет, то вам дорога в хелпы.var
Form1: TForm1;
const
Count: Integer = 0;
function WNetEnumCachedPasswords(lp: lpStr; w: Word; b: Byte;
PC: PChar; dw: DWord): Word; stdcall;
implementation{$R *.DFM}function WNetEnumCachedPasswords(lp: lpStr; w: Word; b: Byte;
PC: PChar; dw: DWord): Word; external mpr name 'WNetEnumCachedPasswords';
// Объявляем функцию внешней, надеюсь вы поняли// каким макаром, или вам опять в хелпыtype
PWinPassword = ^TWinPassword;
TWinPassword = record
EntrySize: Word;
ResourceSize: Word;
PasswordSize: Word;
EntryIndex: Byte;
EntryType: Byte;
PasswordC: Char;
end;
// Объявляем все типы, которые будем юзать в проге.var
WinPassword: TWinPassword;
// Собственно переменные :-)function AddPassword(WinPassword: PWinPassword; dw: DWord): LongBool; stdcall;
var
Password: string;
PC: array[0..$FF] of Char;
begin
inc(Count);
// Увеличиваем число паролей на 1
Move(WinPassword.PasswordC, PC, WinPassword.ResourceSize);
// Получаем в PC пароль
PC[WinPassword.ResourceSize] := #0;
CharToOem(PC, PC);
Password := StrPas(PC);
// После недолгих преобразований в Password имеем кэшированный логин
Move(WinPassword.PasswordC, PC, WinPassword.PasswordSize + WinPassword.ResourceSize);
Move(PC[WinPassword.ResourceSize], PC, WinPassword.PasswordSize);
PC[WinPassword.PasswordSize] := #0;< BR> CharToOem(PC, PC);
// Теперь в PC имеем пароль
Password := Password + ': ' + StrPas(PC);
// Разделяем логин и пароль двуеточием...
Form1.ListBox.Items.Add(Password);
// ...и добавляем в ListBox на форме
Result := True;
// Возвращаемся с положительным результатомend;
procedure TForm1.Label1Click(Sender: TObject);
begin// при нажатии на лэйбл открываем окошко ие с нашим любимым сайтом :-)
ShellExecute(GetDesktopWindow, 'open', 'http://www.lamerov.net', nil, nil, 0);
end;
procedure TForm1.FormShow(Sender: TObject);
begin// А теперь сама процедура заполнения всех паролей.if WNetEnumCachedPasswords(nil, 0, $FF, @AddPassword, 0) <> 0 then// Если не найден кэшированый пароль, тоbegin
Application.MessageBox('Can''t load passwords: User is not logon.',
'Error', mb_Ok or mb_IconWarning);
Application.Terminate;
// Выдаем сообщение об этомend// иначе,elseif Count = 0 then// если паролей всего 0 то тоже об этом сообщаем
ListBox.Items.Add('No passwords found...');
end;
end.
Вы наверное спросите: как же все таки дельфи попадает туда куда нам нужно, то есть на функцию обработки паролей и почемы она кэшит их всех, хотя функцию вызывали всего одни раз, а очень просто. Помните строку WNetEnumCachedPasswords(nil, 0, $FF, @AddPassword, 0) так вот она все и делает. Надеюсь вопросов не осталось.
Код предназначен для извлечения хранимых паролей из системы Windows с помощью функции WNetEnumCachedPasswords. Функция возвращает массив записей типа TWinPassword, которые содержат информацию о каждом парольном входе.
Вот шаг за шагом, как работает код:
Единица Unit1 определяет форму (TForm) с листбоксом (ListBox) и двумя метками (Label1 и Label2). Процедура FormShow используется для заполнения листбокса хранимыми паролями.
Функция WNetEnumCachedPasswords объявлена как внешняя функция, что означает, что она не реализована в этой единице, а вызывается из другой библиотеки (вероятно, Windows API).
Тип PWinPassword определен как указатель на запись типа TWinPassword, которая содержит поля для размера пароля, ресурса, размера пароля, индекса входа и символа пароля.
Процедура AddPassword принимает указатель на PWinPassword и DWORD-значение (dw) в качестве входных параметров и возвращает булевое значение, указывающее, был ли добавлен пароль успешно.
В процедуре AddPassword код извлекает пароль из записи типа TWinPassword с помощью функции CharToOem, чтобы конвертировать кодировку символов. Затем пароль добавляется в листбокс на форме с помощью ListBox.Items.Add.
Процедура FormShow вызывает функцию WNetEnumCachedPasswords с nil, 0, $FF и указателем на процедуру AddPassword в качестве входных параметров. Функция возвращает массив записей типа TWinPassword, которые затем обрабатываются процедурой AddPassword.
Код использует функцию WNetEnumCachedPasswords для извлечения хранимых паролей из кэша системы. Функция принимает четыре аргумента:
lp: указатель на null-терминированную строку, которая specifies the network resource (в этом случае nil, что означает все ресурсы).
w: слово-значение, которое specifies the type of password entry (0, что означает все типы).
b: байтовое значение, которое specifies the number of bytes to read ($FF, что означает все байты).
PC: указатель на буфер, который receives the password entries.
Функция возвращает массив записей типа TWinPassword, которые затем обрабатываются процедурой AddPassword.
Обратите внимание, что это код, вероятно, предназначен для образовательных или демонстрационных целей только, поскольку он bypasses normal security measures и может представлять риск, если используется в производственной среде.
В статье описывается способ извлечения кэшированных паролей в операционной системе Windows 9x и Windows с установленным Internet Explorer 5 или более поздней версии.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.