По многочисленным заявкам, я сегодня решил рассмотреть взлом с помощью Delphi. Ты узнаешь, как вытащить из системы пароли. На рисунке 1 ты можешь увидеть пример выполнения проги. Правда, паролей ты не увидишь, а то вдруг треснешь от такой халявы.
Рис 1. Форма
Как и в предыдущей статье, ты должен скачать пример здесь, а я сейчас расскажу, как всё реализовано.
В обработчике события формы "OnCreate" вызывается недокументированная функция WNetEnumCachedPasswords . Эта функция ищет пароли в кэше и возвращает их в процедуру указанную в качестве четвёртого параметра. В Win 9x есть огромный баг - при запуске widows пароли загружаются в память и хранятся там, на протяжении всего сеанса, поэтому их легко выдернуть с помощью этой функции. Самое интересное, что они хранятся в незашифрованном виде, и тебе не придётся ничего расшифровывать.
Теперь посмотрим как объявлена эта функция. Объявление состоит из двух строк. В первой я просто описал, что она представляет из себя. Вторую я рассмотрю подробнее:
function WnetEnumCachedPasswords // Имя функции
(lp: lpStr; //Должен быть NIL
w: Word;// Должен быть 0
b: Byte; // Должен быть $FF
PC: PChar; // Адрес функции, в которую вернутся пароли
dw: DWord): Word; // опять 0
external mpr // Имя DLL файла в котором находится эта функция
name 'WNetEnumCachedPasswords'; //Имя функции в DLL файле.
Теперь ты разберёшься и с первой строкой описания:
Единственное, чего ты можешь не знать, так это слово "stdcall". Оно означает, что функция использует стандартный вызов.
Функция, в которую возвратятся пароли должна выглядеть как:
function AddPassword//Имя функции, может быть любым.
(
WinPassword: PWinPassword; //Указатель на структуру WinPassword
dw: Dword //Мы не будем использовать.
): LongBool; stdcall;
Теперь нужно знать, что такое WinPassword . Эта не стандартная структура и её объявления ты нигде не найдёшь, поэтому ты должен объявить её ручками:
type
PWinPassword = ^TWinPassword;
TWinPassword = record
EntrySize: Word;
ResourceSize: Word;
PasswordSize: Word;
EntryIndex: Byte;
EntryType: Byte;
PasswordC: Char;
end;
В "PasswordC" будет находится строка содержащая имя пользователя и пароль. ResourceSize - размер имени пользователя, а PasswordSize - размер пароля.
Дальше я не буду ничего объяснять. Если сможешь, то разберешься сам, а если нет, то сочувствую. Единственное, что я могу сказать, так это то, что пароль хранится в DOS кодировке. Поэтому, чтобы его увидеть, надо перекодировать в Windows-кодировку. Для этого я использую функцию CharToOem. В качестве первого параметра передаётся то, что надо перекодировать, а второй - результат перекодировки.
На этом всё. Это занятие оказалось маленьким, но поучительным.