Антикейлогер и DLL

317
09 января 2017, 21:44

Написал программу, которая должна выполнять функцию антикейлогера(отлавливать хуки в системе через функцию в DLL). Но почему-то при подключении DLL к проекту программа не видит функцию в самой DLL. Как и что изменить, чтобы все увиделось и заработало? среда VS15. Коды прилагаю, может, я и там где ошибся.

Код в DLL:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include "stdafx.h"
#pragma data_seg(".hdata") // секция в памяти общая для всех процессов
HINSTANCE hi = NULL; // эта переменная может изменяться любым поэтому здесь не должно быть ничего лишнего
#pragma data_seg() // конец секции
#pragma comment(linker, "/section:.hdata,rws") // даем права этой секции
#ifdef __cplusplus 
#define EXPORT extern "C" __declspec (dllexport) 
#else 
#define EXPORT __declspec (dllexport) 
#endif 
EXPORT HHOOK SetKeyboardHook(void); // объявляем экспортируемую функцию
                                    // а эти будут у всех свои
#include "Header.h"
HANDLE hFile = NULL; // !!!!! хэндл файла для каждого процесса должен быть свой !!!!!
HHOOK hKeyHook = NULL;
HHOOK hCBTHook = NULL;
BOOL APIENTRY DllMain(HINSTANCE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH: // вызывается каждый раз когда новый процесс грузит DLL в свою память
    {
        if (!hi) // запоминаем запустивший хэндл(наша DLL) толко первый раз, чтобы он небыл переписан на новый
            hi = hModule;
        break;
    }
    case DLL_PROCESS_DETACH:
    {
        break;
    }
    default:
        break;
    }
    return TRUE;
}
LRESULT CALLBACK DebugProc(int nCode, WPARAM wParam, LPARAM lParam) // вызывается при нажатии или отпускании клавиши
{
    if (nCode)
        return CallNextHookEx(hKeyHook, nCode, wParam, lParam);
    if (lParam >= 0) // нам нужно только нажатие
        printf("Замечен кейлогер");
    return CallNextHookEx(hKeyHook, nCode, wParam, lParam);     // обработали передаем дальше
}
HHOOK SetKeyboardHook(void) // эту функцию надо вызывать из приложения для создания ловушек
{
    hKeyHook = SetWindowsHookEx(WH_DEBUG, &DebugProc, hi, 0);
    return hKeyHook;
}
// конец DLL

Код основной программы, в которой вызывается DLL:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <locale>
#include <windows.h>
INT main() {
    setlocale(LC_ALL, "russian");
    HHOOK hook = SetKeyboardHook();
    if (hook) {
        while (WaitMessage())
        {
            MSG msg = { 0 };
            while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
            {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
            }
        }
    }
    system("pause");
    ExitProcess(0);
}

DLL подключаю через проект-свойства-...

Answer 1

Вероятно, этот код:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include "stdafx.h"
#ifdef __cplusplus 
#define EXPORT extern "C" __declspec (dllexport) 
#else 
#define EXPORT __declspec (dllexport) 
#endif 
EXPORT HHOOK SetKeyboardHook(void); // объявляем экспортируемую функцию
                                    // а эти будут у всех свои

должен находиться в файле Header.h. Файл main.c должен подключить Header.h с помощью #include. Кроме того, скорее всего имелось в виду следующее:

#ifdef __cplusplus 
#define EXPORT extern "C" __declspec (dllexport) 
#else 
#define EXPORT __declspec (dllimport) 
#endif 

То есть в dll-модуле, который написан на C++, применяется атрибут dllexport, а в main-модуле, который написан на C, применяется атрибут dllimport (если всё наоборот, то следует написать #ifndef __cplusplus). Проверьте всё это, и компилятор должен увидеть вашу функцию. Но этого недостаточно - её ещё должен увидеть линковщик, а это достигается ключами компоновки. Скорее всего, в Visual Studio нужно просто добавить в зависимости *.lib-файл, который создался вместе с dll.

READ ALSO
Сортировка по полю с нулями, идущими последними

Сортировка по полю с нулями, идущими последними

Мне нужно произвести сортировку товаров по возрастанию ценыДелаю так:

272
Как можно узнать версию MySQL

Как можно узнать версию MySQL

Как можно узнать версию MySQL под Windows?

283
Как лучше всего сделать общую операцию для всех методов контроллера в Spring MVC?

Как лучше всего сделать общую операцию для всех методов контроллера в Spring MVC?

Использую Spring BootЗадача довольно простая - в каждом методе у меня однотипные операции, проверка, вошел ли пользователь, если не вошел кидаем...

298
Добавление данных JSON в ComboBox

Добавление данных JSON в ComboBox

Подскажите, пожалуйста, как лучше всего добавить данные из JSON в ComboBoxГрафическая часть сделана с помощью Scene Builder, есть класс Controls, где прописаны...

262