Sie sind auf Seite 1von 5

Log In / Cadastre-se

Desenvolvimento - Delphi
Windows hooks
Este artigo ir mostrar como criar programas que "escutam" por uma certa combinao de teclas e, quando
ativada, executar alguma tarefa (como ejetar a unidade de CDROM).
por Florin Sabau
Voc j parou para pensar como os programas espies conseguem capturar tudo que digitado nos
computadores onde esto instalados? Bem, eu no sei exatamente como ELES fazem isto :), mas
mostrarei uma possvel tcnica usando Windows Hooks. Este artigo ir mostrar como criar programas
que "escutam" por uma certa combinao 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 contm vrios 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 esto em Windows.pas. Abaixo temos alguns destes tipos, com uma
breve descrio:
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 notificaes teis para uma aplicao 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 gravao 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 mantm
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. Ento, caso a mensagem no 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 prxima seo: 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 especficos de thread (locais), que recebem mensagens apenas de um determinado thread.
Devido a uma hook procedure global poder ser chamada no contexto de qualquer aplicao (que
capturam mensagens de todas as aplicaes), elas devem estar localizadas em uma DLL (Dynamic Link
Library). Esta restrio no se aplica aos hooks especficos de threads, onde a hook procedure pode
estar em qualquer parte da aplicaao que controla o thread a ser interceptado.
Neste artigo ns trataremos somente com hooks globais.
Instalando uma WH_KEYBOARD hook procedure no hook chain
A API de hooks contm 3 importantssimas funes: SetWindowsHookEx (que instala uma hook
procedure), UnhookWindowsHookEx (que desinstala a hook procedure) e CallNextHookEx (que chama a
prxima hook procedure no hook chain). Os parmetros destas funes so os seguintes (em
windows.pas):
Publ i ci dade
Seguir @linhadecodigo 3.114 seguidores

2.504

Pesquisar Enviar
HOME DESENVOLVIMENTO FRONT-END BANCO DE DADOS EM DESTAQUE TODOS PUBLIQUE

0 0 Like
.net Mag 115 Easy .net mag 37
ASSINE VER TODAS
REVISTAS DEVMEDIA
1 Comandos bsicos em SQL - insert,
update, delete e select
2 HTML Bsico
3 Menu em CSS - Menu dropdown horizontal
com HTML5 e CSS3
4 Formato dos registros do Sintegra
5 Quanto vale o seu servio? Aprenda a
cobrar pelo seu trabalho.
6 Excel: Como verificar se existe valores
duplicados
7 Trabalhando com Div em HTML
8 Criando um sistema de cadastro e login
com PHP e MySql
9 Copiando dados com o Robocopy
10 Noes da linguagem SQL para consultas
VER TODOS
TOP 10 - ARTIGOS TOP 10 - AUTORES
3 1 0 0
Listagem 1: Funo SetWindowsHookEx
"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.
Listagem 2: Funo UnhookWindowsHookEx
"hhk": identifica o hook a ser desinstalado.
Retorna True se ocorreu com sucesso ou False se falhou.
Listagem 3: Funo CallNextHookEx
"hhk": identificador do hook corrente;
"nCode", "wParam", "lParam": parmetros a serem enviados para a prxima hook procedure no
hook chain.
Retorna o valor retorna pela prxima hook procedure do chain.
Ns veremos adiante o que isto significa.
A hook procedure
A hook procedure para o teclado tem o seguinte formato:
Listagem 4: Funo HookProc
"nCode": HC_ACTION - os parmetros wParam e lParam contm informaes sobre as
mensagens das teclas pressionadas. HC_NOREMOVE - os parmetros wParam e lParam contm
informaes sobre as mensagens das teclas pressionadas mas a mensagem no foi removida da
fila de mensagens (uma aplicao chamou a funo PeekMessage especificando o flag
PM_NOREMOVE).
"wParam": especifica o cdigo virtual da tecla que gerou a mensagem (p.e. VK_F9 para a tecla
de funo F9).
"lParam": especifica informaes adicionais (do tipo contador de repetio, scan code ...); no
utilizado em nosso programa; veja Win32SDK para maiores detalhes.
HookProc deve retornar um valor no 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 combinao 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;
1 function SetWindowsHookEx(idHook: Integer; lpfn: TFNHookProc; hmod: HINST; dwThreadId: DWORD): HHOOK; stdcall;
1 function UnhookWindowsHookEx(hhk: HHOOK): BOOL; stdcall;
1 function CallNextHookEx(hhk: HHOOK; nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
1 function HookProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM):LRESULT; stdcall;
WinKey + F12: encerra a aplicao.
A comunicao entre a DLL que implementa a hook e a aplicao feita com a funo SendMessage
da API, que envia uma HOOK_MSG (definida em constants.inc) para a aplicao principal, com os
comandos (SHOW, EJECT, QUIT) em wParam (veja abaixo).
Como no querermos ser incomodados com a janela sendo mostrada a todo instante, quando clica-se o
boto de minimizar a janela ocultada (at da lista de tarefas), mas poder ser visualizada com a
combinao WinKey+F9.
Para o cdigo fonte completo veja o arquivo anexo. Eu somente mostrarei aqui as partes mais
importantes da aplicao:
1. HookDll.dpr
Listagem 5: Funo KeyboardProc
Na entrada da hook procedure ns testamos se o flag HC_ACTION em nCode (assim sabemos que
tivemos o pressionamento de uma tecla), ento salvamos em KeyState o estado (se foi pressionado ou
no, ~CAPSLOCK ligado, etc.) de todas as teclas virtuais utilizando GetKeyboardState. Ns tambm
procuramos pelo handle da janela principal da aplicao para a qual sero enviados os comandos
(APP_SHOW, EJECT_CDROM, APP_QUIT). Se a janela for encontrada (IsWindow(han)) e tiver um
mensagem de tecla pressionada, ento enviamos um comando para a janela principal de acordo com o
pressionamento. Se no foi possvel tratar a mensagem (Handled=false) ento os parmetros so
passados para a prxima hook na cadeia.
2. Hooks.Dpr & Unit1.pas
A principal funo aqui HOOK_MSG_PROC que recebe os comandos enviados da DLL:
Listagem 7: Funo HOOK_MSG_PROC
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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;
if not Handled then
Result := CallNextHookEx(hhk, nCode, wParam, lParam);
end;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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;
O recurso de "Ocultar na minimizao" executado pela especializao do tratamento da mensagem
WM_SYSCOMMAND que enviada pelo Windows quando um comando de sistema (close, minimize,
maximize) ocorre. Ento a janela ser oculta se receber um comando SC_MINIMIZE:
Listagem 8: Evento OnMinimize
Para esconder o programa da lista de tarefas utilizamos:
Listagem 9: Funo RegisterServiceProcess
NOTA: A tcnica de ocultamento acima funciona somente no Windows 9x.
claro que isto exemplo bem simples de aplicao de hooks, mas as possibilidades so enormes. Um
pequeno programa espio, talvez! :) De qualquer maneira, se voc tiver alguma dvida sobre este
artigo, sinta-se a vontade de me mandar uma mensagem para .
Faa o download do cdigo referente a este artigo.
Traduo: Adilson Vahldick
Florin Sabau
Leia tambm
Multicast Events no Delphi
Delphi
Utilizando o componente dxWindowAlertManager da DevExpress
Delphi
Classe Genrica para Transformar Tipos ENUM Para TStrings em Delphi
Delphi
Desenvolvendo FrameWork em Delphi
Delphi
Criao de Componente Vinculado a Lista Encadeada
Delphi
18 end;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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;
1 function RegisterServiceProcess(dwProcessID, dwType: integer): integer; stdcall; external

0 0 Like
Estamos aqui:
3 1 0 0
Linha de Cdigo faz parte do grupo Web-03 Poltica de privacidade e de uso | Anuncie | Cadastre-se | Fale conosco
Linha de Cdigo
9.424 pessoas curtiram Linha de Cdigo.
Plug-in social do Facebook
Curtir
2014 Linha de Cdigo. Todos os direitos reservados

Das könnte Ihnen auch gefallen