Ir para conteúdo
  • Cadastre-se

Posts Recomendados

Você já parou para pensar como os programas espiões conseguem capturar tudo que é digitado nos computadores onde estão instalados? Bem, eu não sei exatamente como ELES fazem isto , mas mostrarei uma possível técnica usando Windows Hooks. Este artigo irá mostrar como criar programas que "escutam" por uma certa combinação de teclas e, quando ativada, executar alguma tarefa (como ejetar a unidade de CDROM).

Tecnicamente, um hook é somente uma outra subrotina ("hook procedure") que "fica no caminho" do mecanismo normal de tratamento de mensagens do Windows. A hook procedure pode ser instalada no sistema e assim ela captura certas mensagens do Windows ANTES delas serem enviadas para as devidas rotinas de tratamento. Windows contém vários tipos diferentes de hooks; cada tipo fornece acesso a um aspecto diferente do mecanismo de tratamento de mensagens do Windows. As constantes que identificam os tipos de hooks estão em Windows.pas. Abaixo temos alguns destes tipos, com uma breve descrição:

WH_KEYBOARD: instala uma hook procedure que monitora as mensagens do teclado. Utilizaremos este em nosso programa.

WH_MOUSE: instala uma hook procedure que monitora mensagens do mouse.

WH_CBT: instala uma hook procedure que recebe notificações úteis para uma aplicação de treinamento baseada em computador (CBT).

WH_JOURNALRECORD: instala uma hook procedure que grava as mensagens de entrada postadas para a fila de mensagens de sistema. Este hook é útil para a gravação de macros.

WH_JOURNALPLAYBACK: instala uma hook procedure que envia mensagens previamente gravadas pela WH_JOURNALRECORD hook procedure.

Devido a muitos programas poderem instalar um hook no sistema ao mesmo tempo, o Windows mantém internamente um "hook chain", que é apenas uma lista de ponteiros para as hook procedures que os programas instalaram. Quando uma mensagem acontece no sistema, o Windows primeiro passa por cada uma das procedures no hook chain, uma depois da outra. Então, caso a mensagem não tenha sido bloqueada por qualquer uma das hook procedures, o Windows encaminha a mensagem para a janela adequada.

Mais um assunto antes de ir para a próxima seção: hooks podem ser classificados de uma outra forma. Existem os hooks de sistema (globais) que recebem mensagens de todos os threads do sistema, e os hooks específicos de thread (locais), que recebem mensagens apenas de um determinado thread. Devido a uma hook procedure global poder ser chamada no contexto de qualquer aplicação (que capturam mensagens de todas as aplicações), elas devem estar localizadas em uma DLL (Dynamic Link Library). Esta restrição não se aplica aos hooks específicos de threads, onde a hook procedure pode estar em qualquer parte da aplicaçao que controla o thread a ser interceptado.

Neste artigo nós trataremos somente com hooks globais.

Instalando uma WH_KEYBOARD hook procedure no hook chain

A API de hooks contém 3 importantíssimas funções: SetWindowsHookEx (que instala uma hook procedure), UnhookWindowsHookEx (que desinstala a hook procedure) e CallNextHookEx (que chama a próxima hook procedure no hook chain). Os parâmetros destas funções são os seguintes (em windows.pas):

function SetWindowsHookEx(idHook: Integer; lpfn: TFNHookProc; hmod: HINST; dwThreadId: DWORD): HHOOK; stdcall;

"idHook": tipo do hook a ser instalado (p.e. WH_KEYBOARD);

"lpfn" : aponta para a hook procedure para onde a mensagem será enviada;

"hmod" : handle da DLL que instala a hook, normalmente hInstance(para hooks globais) ou 0 para hooks locais;

"HINST" : identificador do thread ao qual o hook estará associado.

Se 0 a hook procedure é associada com todos os threads.

Retorna um valor usado para identificar o hook.

function UnhookWindowsHookEx(hhk: HHOOK): BOOL; stdcall;

"hhk": identifica o hook a ser desinstalado.

Retorna True se ocorreu com sucesso ou False se falhou.

function CallNextHookEx(hhk: HHOOK; nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;

"hhk": identificador do hook corrente;

"nCode", "wParam", "lParam": parâmetros a serem enviados para a próxima hook procedure no hook chain.

Retorna o valor retorna pela próxima hook procedure do chain.

Nós veremos adiante o que isto significa.

A hook procedure

A hook procedure para o teclado tem o seguinte formato:

function HookProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;

"nCode": = HC_ACTION - os parâmetros wParam e lParam contém informações sobre as mensagens das teclas pressionadas

= HC_NOREMOVE - os parâmetros wParam e lParam contêm informações

sobre as mensagens das teclas pressionadas mas a mensagem não

foi removida da fila de mensagens (uma aplicação chamou a função PeekMessage especificando o flag PM_NOREMOVE).

"wParam": especifica o código virtual da tecla que gerou a mensagem(p.e. VK_F9 para a tecla de função F9)

"lParam": especifica informações adicionais (do tipo contador de repetição, scan code ...); não utilizado em nosso programa;

veja Win32SDK para maiores detalhes;

HookProc deve retornar um valor não zerado para evitar que o Windows passe a mensagem para os demais hooks da cadeia, ou para a window procedure alvo, ou zero para deixar que o Windows passe a mensagem para a window procedure alvo.

Exemplo

Este exemplo cria uma hook global para o teclado e quando uma certa combinação de teclas ocorrem ele executará alguma coisa (veja abaixo):

WinKey + F9: mostra a janela principal se ela estiver oculta;

WinKey + F10: ejeta a unidade de CDROM;

WinKey + F12: encerra a aplicação.

A comunicação entre a DLL que implementa a hook e a aplicação é feita com a função SendMessage da API, que envia uma HOOK_MSG (definida em constants.inc) para a aplicação principal, com os comandos (SHOW, EJECT, QUIT) em wParam (veja abaixo).

Como não querermos ser incomodados com a janela sendo mostrada a todo instante, quando clica-se o botão de minimizar a janela é ocultada (até da lista de tarefas), mas poderá ser visualizada com a combinação WinKey+F9.

Eu somente mostrarei aqui as partes mais importantes da aplicação:

1. HookDll.dpr


function KeyboardProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM):

	LRESULT; stdcall;

  var

	Handled: Boolean;

	KeyState: TKeyboardState;

	Han: HWND;

  function WinKeyPressed: boolean;

  begin

	Result := (KeyState[VK_LWIN] and $80 <> 0)

  	or (KeyState[VK_RWIN] and $80 <> 0);

  end;

  begin

	Handled := False;

	Result := 1;

	if nCode = HC_ACTION then

	begin

  	GetKeyboardState(KeyState);

  	Han:=FindWindow('TForm1',APP_CAPTION);

  	if (IsWindow(Han)) and (KeyState[wParam] and $80 <> 0)

      	and WinKeyPressed then

  	begin

    	Handled := True;

    	case wParam of

      	VK_F9: SendMessage(Han, HOOK_MSG, APP_SHOW, 0);

      	VK_F10: SendMessage(Han, HOOK_MSG, EJECT_CDROM, 0);

      	VK_F12: SendMessage(Han, HOOK_MSG, APP_QUIT, 0);

    	else

      	Handled := False;

    	end;

  	end;

	end;

	if not Handled then

  	Result := CallNextHookEx(hhk, nCode, wParam, lParam);

  end;

Na entrada da hook procedure nós testamos se o flag HC_ACTION em nCode (assim sabemos que tivemos o pressionamento de uma tecla), então salvamos em KeyState o estado (se foi pressionado ou não, CAPSLOCK ligado, etc.) de todas as teclas virtuais utilizando GetKeyboardState. Nós também procuramos pelo handle da janela principal da aplicação para a qual serão enviados os comandos (APP_SHOW, EJECT_CDROM, APP_QUIT). Se a janela for encontrada (IsWindow(han)) e tiver um mensagem de tecla pressionada, então enviamos um comando para a janela principal de acordo com o pressionamento. Se não foi possível tratar a mensagem (Handled=false) então os parâmetros são passados para a próxima hook na cadeia. 2. Hooks.Dpr & Unit1.pas A principal função aqui é HOOK_MSG_PROC que recebe os comandos enviados da DLL:

type TForm1=class(TForm)

  ...

	procedure HOOK_MSG_PROC(var Msg: TMessage); message HOOK_MSG;

  ...

  end;

  ...

  procedure TForm1.HOOK_MSG_PROC(var Msg: TMessage);

  begin

	case Msg.WParam of

  	APP_SHOW:

  	begin

    	Application.ShowMainForm := True;

    	Visible:=True;

  	end;

  	EJECT_CDROM: mciSendString('set CDAudio door open', nil, 0, 0);

  	APP_QUIT: Close;

	end;

  end;

O recurso de "Ocultar na minimização" é executado pela especialização do tratamento da mensagem WM_SYSCOMMAND que é enviada pelo Windows quando um comando de sistema (close, minimize, maximize) ocorre. Então a janela será oculta se receber um comando SC_MINIMIZE:

procedure TForm1.OnMinimize(var Msg: TMessage);

  begin

	if Msg.WParam = SC_MINIMIZE then

	begin

  	if not IsHookInstalled then

  	begin

    	ShowMessage('Install the hook first or you''ll'#13#10 +

      	'not be able to access the program');

    	Exit;

  	end;

  	Application.ShowMainForm := False;

  	Visible := False;

	end else

  	Inherited;

  end;

Para esconder o programa da lista de tarefas utilizamos:

function RegisterServiceProcess(dwProcessID, dwType: integer):integer; stdcall; external 'KERNEL32.DLL';

NOTA: A técnica de ocultamento acima funciona somente no Windows 9x.

É claro que isto é exemplo bem simples de aplicação de hooks, mas as possibilidades são enormes. Um pequeno programa espião, talvez!

Créditos: Adilson Vahldick

Link para o post
Compartilhar em outros sites

Muito foda ara

gogo gfaze rum bot de Tibia Antha

esses que tem por ai são sux pra kct >.<

Já falei pra voce fazer... isso da grana

Eeu sei que tu manja

Link para o post
Compartilhar em outros sites

Eu não sou nenhum hacker muito bom, mais a minoria é por Hook, normalmente os maiores são feitos de outros metodos, mais os menores principalmente os que se edita a source não faz o server pelo client, é por o esquema de Virtual-Key pode saber mais sobre isso nessa pagina da microsoft. http://msdn.microsoft.com/en-us/library/ms927178.aspx

Daniel Novaes diz

seu notebook não roda tibia né?

Robson Venturin diz

roda

com 95ºC

Robson Venturin diz

vo apontar meu lapiz

com a faca

afk

Link para o post
Compartilhar em outros sites

Digamos que outros métodos como onKeyDown e derivados são apenas "gambiarras" e assim fica bem mais fácil tanto para manipular como para deixar FUD o kl.

Link para o post
Compartilhar em outros sites

Só que quem quer deixar o kl fud não vai foder o código, o maximo que vai fazer é usar um programa que edite o hex e assim acabe sem querer corrompendo o código, normalmente as pessoas usam crypters.

Daniel Novaes diz

seu notebook não roda tibia né?

Robson Venturin diz

roda

com 95ºC

Robson Venturin diz

vo apontar meu lapiz

com a faca

afk

Link para o post
Compartilhar em outros sites

Só que quem quer deixar o kl fud não vai foder o código, o maximo que vai fazer é usar um programa que edite o hex e assim acabe sem querer corrompendo o código, normalmente as pessoas usam crypters.

Como assim fuder o código?

Saber manipular as hooks do windows não é fuder o código... quem quer deixar o kl fud compra um kl fud que é bem mais barato do que comprar um crypter fud...

Tudo bem que tem noobs que querem deixar o kl fud e acabam fudendo tudo, mas para um programador(que é o alvo deste meu tópico) é fundamental saber manipular as hooks do windows, não só para fazer kl, mas para futuras aplicações também...

E em realação às virtual-keys como você disse, peço que observer uma das virtual-keys sendo usadas no tópico(VK_F9), já que seu comentário fez a entender que não fazia o uso de virtual0keys no code.

Editado por antharaz (veja o histórico de edições)
Link para o post
Compartilhar em outros sites

Eu não sou nenhum hacker muito bom, mais a minoria é por Hook, normalmente os maiores são feitos de outros metodos, mais os menores principalmente os que se edita a source não faz o server pelo client, é por o esquema de Virtual-Key pode saber mais sobre isso nessa pagina da microsoft. http://msdn.microsof...y/ms927178.aspx

Nem hacker tu é ^^ é uma criança

Link para o post
Compartilhar em outros sites

Tópico já ta perdendo a função... pelo visto não ajudou muitos devido ao desinteresse de alguns em floodar...

então peço que deletem o tópico por favor .-.

Editado por antharaz (veja o histórico de edições)
Link para o post
Compartilhar em outros sites

Quis dizer quando você se referiu a gambiarra.

@Edit

VK tem muito pouco no seu código, depois vou fazer um kl basico acho que em vb ou c e posto a source para mim mostrar.

Editado por Beatriz Oliveira (veja o histórico de edições)

Daniel Novaes diz

seu notebook não roda tibia né?

Robson Venturin diz

roda

com 95ºC

Robson Venturin diz

vo apontar meu lapiz

com a faca

afk

Link para o post
Compartilhar em outros sites

Enfim... o tópico já perdeu o sentido... o povo ta floodando e talz... melhor remover ele mesmo... sei que assim como nos outro forums, poucos aqui tem realmente interesse em estudar a linguagem a fundo... então peço novamente que removam o tópico...

Link para o post
Compartilhar em outros sites

Participe da conversa

Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.

Visitante
Responder

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emojis são permitidos.

×   Seu link foi automaticamente incorporado.   Mostrar como link

×   Seu conteúdo anterior foi restaurado.   Limpar o editor

×   Não é possível colar imagens diretamente. Carregar ou inserir imagens do URL.

  • Quem Está Navegando   0 membros estão online

    Nenhum usuário registrado visualizando esta página.

×
×
  • Criar Novo...

Informação Importante

Confirmação de Termo