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 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