VB6 - Capturando senhas ocultas


O que eu vou mostrar neste artigo não é novidade , pois o recurso usado é conhecido há tempos dos programadores VB.

Como existem muitos que estão começando agora creio que vale a pena mostrar o uso dos recursos das mensagens e funções das API's do Windows.

Se você pretende saber mais sobre como usar as APIs do WIndows no Visual Basic leia o meu artigo:  Usando API no Visual Basic

Neste artigo eu mostro como usar a API SendMessage com as mensagens EM_GETPASSWORDCHAR, WM_GETTEXTLENGTH   e WM_GETTEXT  para obter o valor da senha digitada em uma janela Windows.

Vejamos cada uma destas APIs usadas neste artigo:

- SendMessage

Vamos começar apresentando a  API SendMessage que envia uma mensagem chamando a função do Windows para a janela indicada. O controle não retorna ao programa que a chamou enquanto sua execução não estiver finalizada. Sua declaração é a seguinte:

Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

- EM_GETPASSWORDCHAR

Esta mensagem identifica o caractere de senha definido usado no controle. Os caracteres substituem cada caractere digitado no controle com o objetivo de esconder a senha informada.

Definição de constante : Const EM_GETPASSWORDCHAR = &HD2

-WM_GETTEXTLENGTH  

A mensagem WM_GETTEXTLENGTH  quando enviada para uma janela descobre o número de caracteres do texto da janela. Não é contado o caractere de fim de linha null.

Quando usamos SendMessage para enviar a mensagem WM_GETTEXTLENGTH  os parâmetros usados wParam and lParam devem ser definido usando a expressão ByVal CLng(0).

Definição de constante :  Const WM_GETTEXTLENGTH = &HE

- WM_GETTEXT 

Quando enviamos a mensagem WM_GETTEXT para uma janela ela retorna o texto da janela. O texto é copiado para buffer de texto fornecido nos parâmetros da mensagem.

Quando usamos SendMessage par enviar uma mensagem WM_GETTEXT , a palavra chave ByVal deve ser usada em frente dos dois parâmetros wParam and lParam.

Definição de constante :  Const WM_GETTEXT = &HD

Criando o projeto no Visual Basic

Agora vamos mostrar como usar a API e as mensagens para obter a senha digitada em uma caixa de texto de um formulário Windows.

Abra o Visual Basic 6 e crie um novo projeto do tipo Standard EXE com nome pegaSenha

No menu Project selecione a opção Add Module e aceite o nome padrão. A seguir inclua as declarações para a API SendMessage, e mensagens WM_GETTEXTLENGTH e WM_GETTEXT;

Public Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hWnd As Long, ByVal Msg As Long, wParam As Any, lParam As Any) As Long

Public Const WM_GETTEXT = &HD
Public Const WM_GETTEXTLENGTH = &HE
Public Const EM_GETPASSWORDCHAR = &HD2

Agora no formulário padrão form1.frm inclua duas Labels , duas caixas de texto e um botão de comando conforme leiaute abaixo:

Agora no evento Click do botão de comando - Exibir Senha Digitada - inclua o seguinte código:

Option Explicit

Private Sub cmdpegaSenha_Click()

Dim length As Long
Dim result As Long
Dim strtmp As String

If SendMessage(Text1.hWnd, EM_GETPASSWORDCHAR, ByVal CLng(0), ByVal CLng(0)) <> 0 Then
    'obtem o valor dos caracteres digitados
    length = SendMessage(Text1.hWnd, WM_GETTEXTLENGTH, ByVal 0, ByVal 0) + 1
    strtmp = Space(length - 1)
    result = SendMessage(Text1.hWnd, WM_GETTEXT, ByVal length, ByVal strtmp)
End If

'exibe os caracteres digitado no textbox
Text2.Text = strtmp

End Sub

Execute o projeto, digite uma senha na caixa de texto e clique no botão Exibir Senha digitada o resultado será a senha sendo exposta na caixa de texto conforme figura abaixo:

Embora a aplicação que eu tenha usado como exemplo obtenha o texto diretamente do controle TextBox você pode usar a API GetCursorPos para obter a posição do cursor na tela e em conjunto com as APIs acima criar uma rotina genérica para obter a senha oculta.

A declaração da API GetCursorPos pode ser feita da seguinte forma em um módulo:

Declare Sub GetCursorPos Lib "User" (lpPoint As POINTAPI)

Type POINTAPI
      x As Integer
      y As Integer
End Type


Como você notou a segurança pode ser apenas aparente, se um programa feito em VB com poucas linhas de código pode revelar a senha digitada imagine o que um keylogger varrendo o seu sistema não pode fazer...

Meu objetivo neste artigo foi mostrar que você tem que olhar com mais atenção para o quesito segurança em suas aplicações e não incentivá-lo a descobrir senhas ocultas. Lembrando que o VB é uma ferramenta poderosa quando usada com bom senso e inteligência.

Pegue o projeto aqui: pegaSenha.zip

Até o próximo artigo Visual Basic ...


José Carlos Macoratti