This is a machine translation. The original page (in English) is available here.

Последние мировые новости: года-Почему США рассматривают возможность запрета TikTok RSS-канал

Главная> > Статьи> > Крюк Клавиатуры
Лучшие кейлоггеры
Посмотреть еще...

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

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

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

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

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

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

// Вызовите следующий крюк.
return (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) / / загрузка файла.DLL
{
если (pcount = = 0)
{
// Init / / время первой загрузки
// Установить крючок..
}
pcount++;
}
else if (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; unsigned long keystrokes = 0; int pcount = 0; #pragma data_seg () мы скоро закончим писать.DLL, каждый .DLL-файл должен иметь .DEF-файл для управления компилятором. В.Файл DEF мы сообщаем компилятору функции, которые мы хотим экспортировать, да, те, которые имеют _declspec (dllexport), и мы сообщаем компилятору об общем блоке данных. (См. исходный код для полного понимания.DEF file). Как-то так.DLL-файл готов, вы должны скопировать его в приложение, которое загружает его .Каталог DLL или скопировать его в %windir%\system.

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

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

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

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

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

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

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

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

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