This is a machine translation. The original page (in English) is available here.
Главная> > Статьи> > Крюк Клавиатуры
Лучшие кейлоггеры
Посмотреть еще...

Крючок Для Клавиатуры

  •  
Пользовательский рейтинг: 4.5-2 голосов
Hook-это механизм, с помощью которого функция может перехватывать события до того, как они достигнут приложения. Функция может воздействовать на события, изменять или отбрасывать их. Функции, которые получают события, называются функциями фильтра, каждая функция фильтра классифицируется по своему типу. Хуки обеспечивают мощные возможности: обработка или изменение каждого сообщения; запись или воспроизведение событий клавиатуры и мыши; предотвращение вызова другого фильтра; и многие другие возможности... Как правило, существует два типа крючков: общесистемные и специфичные для резьбы. Общесистемный крюк используется для фильтрации сообщений всех приложений (т. е. при написании регистратора ключей). И специфичный для потока крюк используется для фильтрации сообщений определенной нити. В этом уроке я буду рассматривать только общесистемный крюк клавиатуры. Чтобы установить общесистемный крюк, нам нужна DLL.

Библиотека DLL-это косвенно исполняемый файл, который не имеет цикла сообщений для получения пользовательского ввода. Библиотеки DLL-это отдельные файлы, содержащие функции (не только), которые могут быть вызваны программами и другими библиотеками DLL. Для конечного пользователя библиотека DLL-это программа, которая не может быть выполнена непосредственно из программы Manger(или других оболочек), но с точки зрения системы, есть два различия между библиотеками DLL и приложениями: библиотеки DLL не могут иметь несколько запущенных экземпляров, загруженных в память. и библиотеки DLL присоединяются к процессам, только экземпляры приложений являются процессами. DLL означает динамически подключаемую библиотеку. Dynamic-Link-это механизм для связывания библиотек с приложениями во время выполнения. Эти библиотеки (DLL) находятся в своих собственных исполняемых файлах(.dll) и не копируются в исполняемые файлы приложений(.exe) как и в случае со статическими ссылочными библиотеками. Важно понимать, что А.Библиотека DLL загружается в адресное пространство указанного связующего приложения, а не в глобальную кучу! Преимущества использования метода динамической компоновки заключаются в следующем:
Они могут быть обновлены без необходимости повторной компиляции или пересоединения приложений.
Когда несколько приложений используют то же самое .DLL, the .Библиотека DLL загружается только один раз для всех приложений(сокращение объема памяти и дискового пространства).

Причина, по которой нам нужна DLL для системного крюка, заключается в том, что мы хотим, чтобы функция фильтра находилась в любом адресном пространстве приложения. Поэтому, когда вы устанавливаете функцию фильтра сообщения крючка, которая лежит в .dll Windows карты то .библиотека dll автоматически попадает в адресное пространство всех приложений. Таким образом, вы получаете свою функцию фильтра, вызванную для каждого процесса! Поэтому, когда мы динамическое связывание крючок, который находится в А.DLL это становится общесистемным крючком (конечно, это зависит от типа функции фильтра тоже). Хорошо, теперь после важного теоретического материала..
Давайте начнем кодирование .DLL для общесистемного крючка клавиатуры, а затем я объясню, как динамическая компоновка .DLL в наше приложение.
Пожалуйста, загрузите исходный код, чтобы увидеть, как все это написано и сделано.

// Это наш обратный вызов клавиатуры proc:
// _declspec (dllexport) означает, что мы хотим позволить другим
// applications / DLL вызывают эту функцию, в тех же случаях, когда вы этого не делаете
// нужен этот префикс, но для безопасности мы будем использовать его.
_declspec (dllexport) LRESULT обратный вызов KBHookProc(int код,
WPARAM wParam, LPARAM lParam)
{
// Если код меньше 0, то мы вызываем следующий Хук,
// вот как работают крючки, ничего особенного
если (код < 0) возвращает (CallNextHookEx(hhook, Code, wParam, lParam));

// Информация о том, что происходит с клавиатурой
если (lParam & (1 << 31)) // бит 31 говорит, является ли ключ вниз

// Вызовите следующий Хук.
возврат (CallNextHookEx(hhook, Code, wParam, lParam));
}

// Это то же самое, что WinMain/Main, но для библиотек DLL,
// вы получаете экземпляр DLL, причина того, как ваш .DLL называется зарезервированной.
BOOL APIENTRY DllMain(HINSTANCE hInstance, DWORD dwReason,
LPVOID lpReserved)
{
// На самом деле есть 4 причины, мы будем обрабатывать только 2 из них,
/- потому что этого достаточно для нашего прога.
if (dwReason == DLL_PROCESS_ATTACH) / / Loading the .DLL
{
если(pcount = = 0)
{
// Init / / первое время загрузки
// Установить крюк..
}
pcount++;
}
иначе если (dwReason == DLL_PROCESS_DETACH)
{
// UnInit перед тем, как система освобождает .DLL из памяти.
если(pcount = = 1)
{
// Бесплатно
/- Убей Хук..
}
pcount--;
}
возвращение(1);
}

Видите ли, это довольно легко, я бы сказал. В любом случае, pcount-это наш счетчик процессов, он говорит, сколько раз .Библиотека DLL была вызвана. pcount-это специальная переменная, она должна быть в глобальной куче, потому что если она не будет тогда каждый раз наша .DLL называется он будет инициализирован до 0 еще раз и again...so чтобы предотвратить это, мы говорим компилятору поместить переменную в глобальную кучу. Мы делаем это и для ручки крючка, потому что мы устанавливаем крючок только один раз. Если мы будем ставить крючок каждый раз то .DLL называется, это будет запутанный крюк, и он не будет работать должным образом и так, как мы хотим! Чтобы сообщить компилятору, что мы хотим, чтобы он поместил переменную в глобальную кучу, мы делаем это:

#pragma data_seg ("SharedBlock")
HHOOK hhook = NULL;
int pcount = 0;
#pragma data_seg()

Обратите внимание, что каждая переменная должна быть инициализирована. ок мы собираемся HHOOK hhook = NULL; длинные нажатия клавиш без знака = 0; int pcount = 0; #pragma data_seg () мы скоро закончим писать.DLL, каждый .DLL файл должен иметь .DEF-файл для управления компилятором. В.DEF file мы сообщаем компилятору функции, которые мы хотим экспортировать, да, те, которые имеют _declspec (dllexport), и мы сообщаем компилятору об общем блоке данных. (Смотрите исходный код для полного понимания .DEF file). Один раз то .DLL файл готов, вы должны скопировать его в приложение, которое загружает .Каталог DLL или скопировать его в каталог %windir%\system.

Ладно, это все для себя .DLL материал, теперь давайте загрузим .DLL мы только что создали! Сначала мы должны объявить указатели на функции с параметрами, которые они получают.

typedef void (*LPFunction) (void);
Функция LPFunction = NULL;

// Это указатель на функцию, которая не имеет
// parameters и который возвращает пустоту.

HMODULE DLLmodule = LoadLibrary ("mydll.dll");
если (!DLLmodule) // .DLL файл не найден!

// Эта функция получает код конкретной разыскиваемой функции из памяти,
// Обратите внимание на заглавные буквы, искомое имя функции должно быть точно,
// как и в самом деле .DEF file И.CPP файл из библиотеки DLL, которую мы написали.

функция = (LPFucntion)GetProcAddress(DLLmodule, "функция");
если (!функция) / / код реализации функции не найден!

// Теперь вы можете вызвать функцию.
функция();

// После завершения использования .DLL, не забудьте освободить его!
FreeLibrary(DLLmodule);

У-у-у, вот оно что!! Ну, это были только основы, и это не будет работать, если вы копируете пасту.
Дата публикации:
Читайте полный текст статьи
Главная> > Статьи> > Крюк Клавиатуры
Очень важно! Установка средств мониторинга компьютера на компьютеры, которыми вы не владеете или не имеете разрешения на мониторинг, может нарушать местное, государственное или федеральное законодательство.