
Delphi. Создание и использование DLL
Xakep, номер #034, стр. 034-071-1
Horrific (smiandr@mail.ru) www.x-c-r.com
Благодаря твоим просьбам и запросам из HackFaq мне приходится отходить от плана, согласованного с главредом. С одной стороны, ты толкаешь меня под окровавленный кровью авторов Х нож главреда. С другой стороны, ты мне усложняешь жизнь по самые "не хочу". В любом случае, ничего хорошего. Если так пойдет и дальше, то на ноже SINtez-а появится моя свежая кровь. И следующий репортаж о кодинге мне придется вести уже из морга. Но что поделаешь. Сегодня мне приходится корректировать свой план и выполнять твои просьбы. В этом номере обе статьи кодинга построены по самым многочисленным просьбам.
Эта статья отвечает на наиболее часто задаваемый вопрос из HackFaq: "Как увидеть пароль, спрятанный под звездочками?". Для этого есть куча разных прог. Но мы же с тобой совместимые челы, поэтому не юзаем чужие творения. Вот поэтому мы создадим такую прогу сами. Тем более, что сам просил объяснить, как это работает.
Шкодинг
Для этого примера я написал DLL файл, который будет сейчас расписан перед твоими глазами. Ничего особо визуального мы сегодня делать не будем. Только кодинг и ничего больше. Кстати, я уже перешел на Delphi 6, так что все исходники теперь будут писаться в нем. Если ты до сих пор застрял в Delphi 5, то бегом на рынок за свеженьким диском.
Для начала создадим новый проект. Но не тот, который использовали до этого, а проект DLL библиотеки. Для этого выбирай меню File->New->Other ... (для Delphi 5 это просто File->New). Перед тобой откроется окно, как на рисунке 1. Найди здесь пункт DLL Wizard и дважды кликни по нему. Delphi создаст пустой проект DLL библиотеки. Сразу нажми пимпу "Save", чтобы сохранить проект. В качестве имени введи "hackpass", это же и будет именем dll файла.
Теперь сотри весь текст, который написал Delphi, и напиши то, что находится у меня во врезке "исходный текст dll файла".
Теория
Самое основное в нашей DLL - это процедура RunStopHook. Ей передается один только параметр. Если он равен true, то я регистрирую ловушку, которая будет ловить все сообщения Windows на себя. Для этого используется функция SetWindowsHookEx. У этой функции четыре параметра:
1. Тип ловушки. Я указал WH_GETMESSAGE, которая ловит все сообщения.
2. Указатель на функцию, которой будут пересылаться сообщения Windows.
3. Указатель на приложение
4. Идентификатор потока. Если ноль, то используется текущий.
В качестве второго параметра я указал имя функции SysMsgProc. Она также описана в этой dll. Давай на нее посмотрим.
Ловушка для сообщений
В первой строке я передаю пойманное сообщение остальным ловушкам, установленным в системе с помощью CallNextHookEx. После этого я получаю окно, сгенерировавшее событие, и проверяю тип события. Если была кликнута левая кнопка крысы и удержана пимпа Control, то убрать звездочки.
Я не могу больше останавливаться на этой DLL, потому что моя рубрика не резиновая. Придется тебе разбираться с происходящим по комментариям.
Юзаем DLL
Теперь напишем прогу, которая будет загружать DLL и запускать ловушку. Для этого создай новый проект (такие мы уже создавали). Перейди в исходник и найди раздел var. Рядом должно быть написано что-то типа "Form1: TForm1". Допиши сюда строку:

















































































































