Os ganchos nos sistemas Windows têm funções muito poderosas. Através desta tecnologia, quase todas as mensagens nos sistemas Windows podem ser interceptadas, monitoradas e processadas. Esta tecnologia pode ser amplamente utilizada em diversos softwares, especialmente softwares que requerem monitoramento, gravação automática e outras funções de monitoramento do sistema. Este artigo discute esse tema, esperando servir de referência para os leitores.
1. Mecanismo e tipo de gancho
Os aplicativos do Windows são todos orientados por mensagens e a operação do aplicativo depende do tipo e do conteúdo da mensagem que ele recebe. Os ganchos são semelhantes ao mecanismo de processamento de interceptação de interrupção do Dos. Hook é uma plataforma de mecanismo de processamento de mensagens do Windows. Ao instalar vários ganchos, o aplicativo pode configurar sub-rotinas para monitorar certas mensagens na janela especificada e processar a mensagem antes que ela chegue à janela de destino.
No Windows, existem dois tipos de ganchos, um é o gancho do sistema (RemoteHook), que monitora mensagens em todo o sistema, e o outro é o gancho de thread (LocalHook), que apenas intercepta mensagens dentro do processo. Para ganchos de sistema, a função de gancho (HookFunction) deve ser implementada na biblioteca de vínculo dinâmico (DLL) do sistema Windows. Para ganchos de thread, a função de gancho pode ser implementada na DLL ou no aplicativo correspondente. Isso ocorre porque quando um desenvolvedor cria um gancho, o Windows primeiro cria uma estrutura de dados na memória do sistema, que contém informações sobre o gancho, e então adiciona a estrutura à lista de ganchos existente, e os novos ganchos serão classificados na frente dos mais antigos. ganchos. Quando ocorre um evento, se um gancho local estiver instalado, a função de gancho no processo atual será chamada. Se for um gancho remoto, o sistema deve inserir a função de gancho no espaço de endereço de outros processos. Para fazer isso, a função de gancho deve estar em uma biblioteca de vínculo dinâmico, portanto, se você quiser usar um gancho remoto, deverá colocá-lo. o gancho Coloque a função na biblioteca de vínculo dinâmico. Para os tipos de mensagens monitorados por ganchos, o Windows fornece um total dos seguintes tipos: Conforme mostrado na Tabela 1:
Tabela 1. Tipos de mensagens do Windows
Identificador constante do tipo de mensagem | valor | Tipo de mensagem | Escopo de aplicação |
WH_CALLWNDPROC | 4 | mensagem para janela | thread ou sistema |
WH_CALLWNDPROCRET | 12 | A mensagem retornada pela janela | thread ou sistema |
WH_CBT | 5 | Mensagens como alterações de janela e configurações de foco | thread ou sistema |
WH_DEBUG | 9 | Se deve executar Hooks de outros Hooks | thread ou sistema |
WH_FOREGROUNDIDLE | 11 | O programa em primeiro plano está ocioso | thread ou sistema |
WH_GETMESSAGE | 3 | Mensagens postadas na fila de mensagens | thread ou sistema |
WH_JOURNAL REPRODUÇÃO | 1 | Reproduza as mensagens gravadas | sistema |
WH_JOURNALRECORD | 0 | Monitore e registre mensagens de entrada | sistema |
WH_KEYBOARD | 2 | Mensagens do teclado | thread ou sistema |
WH_MOUSE | 7 | mensagem do mouse | thread ou sistema |
WH_MSGFILTER | -1 | Barras de rolagem de menu, mensagens de diálogo | thread ou sistema |
WH_SHELL | 10 | mensagens de shell | thread ou sistema |
WH_SYSMSGFILTER | 6 | Barras de rolagem de menu, mensagens de diálogo para todos os tópicos | sistema |
2. Implementação de ganchos na programação VB
(1) Formato da função hook (Função HOOK). A função Hook é na verdade uma função. Se for um gancho do sistema, a função deve ser colocada na biblioteca de vínculo dinâmico. Esta função possui um determinado formato de parâmetro, que é o seguinte em VB:
Função privada HookFunc (ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long |
Entre eles, nCode representa a situação em que o gancho é gerado, e existem diferentes conjuntos de valores possíveis dependendo dos parâmetros wParam e lParam, os valores de retorno incluem o conteúdo da mensagem monitorada, que varia; com o tipo de mensagem monitorada pelo Hook. Difere dependendo do valor do nCode. Para funções de gancho definidas com VB, a forma geral da estrutura é a seguinte:
Função privada HookFunc (ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Selecione o caso do nCode caso ncode<0:hookfunc=callnexthookex(hHookFunc, nCode, wParam, lParam) valor de caso 1: Processamento 1: HookFunc=X1 case2:Processo de processamento 2:HookFunc=X1 … final selecionar função final |
O valor de retorno da função Se a mensagem for processada, passe 0, caso contrário, passe 1 e coma a mensagem.
(2) Instalação e execução de ganchos. Várias funções de API são usadas para instalar ganchos: Você pode usar a função de API SetWindowsHookEx() para instalar uma sub-rotina de gancho definida pelo aplicativo na lista de ganchos. A declaração da função SetWindowsHookEx() é a seguinte:
Declarar função SetWindowsHookEx Lib user32 Alias SetWindowsHookExA (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long |
O valor idHook é o tipo de mensagem que ele trata; o valor lpfn é o ponteiro de endereço da sub-rotina do gancho. Se o parâmetro dwThreadId for 0 ou o identificador de um thread criado por outro processo, lpfn deverá apontar para a sub-rotina do gancho na DLL. Além disso, lpfn pode apontar para um código de sub-rotina de gancho do processo atual. O valor hMod é o identificador da aplicação, identificando a DLL que contém a sub-rotina apontada por lpfn. Se dwThreadId identificar um thread criado pelo processo atual e o código da sub-rotina estiver localizado no processo atual, hMod deverá ser 0. O valor dwThreadId é o identificador do thread associado ao subprocesso de gancho instalado. Se for 0, o subprocesso de gancho será associado a todos os threads. Se o gancho for instalado com sucesso, o identificador do subprocesso do gancho será retornado. Se falhar, 0 será retornado.
Além disso, a função CallNextHookEx() geralmente deve ser chamada na sub-rotina de gancho para executar a próxima sub-rotina de gancho apontada pela lista de ganchos. Caso contrário, os aplicativos com outros ganchos instalados não receberão notificações de gancho, resultando em resultados incorretos. A declaração da função CallNextHookEx() é a seguinte:
Declarar função CallNextHookEx Libuser32 Alias CallNextHookEx(ByVal hHook As Long, ByVal ncode As Lonog, ByVal wParam As Long, lParam As Any) As Long |
O valor hHook é o valor de retorno de SetWindowsHookEx() e nCode, wParam e lParam são os três parâmetros na função Hook. Antes de o programa terminar, a função UnhookWindowsHookEx() deve ser chamada para liberar os recursos do sistema associados ao gancho. A função UnhookWindowsEx() é declarada da seguinte forma:
Declarar Função Unhook WindowsHookEx Lib user32 Alias Unhook WindowsHookEx(ByVal hHook As Long)As Long |
hHook é o valor de retorno ao instalar o gancho, ou seja, o identificador do subprocesso do gancho.
(3) Questões que devem ser observadas ao instalar ganchos em VB. O parâmetro lpfn é o endereço de um HookFunc que estipula que o código HookFunc deve ser colocado em um módulo .BAS padrão e passado como Endereço de HookFunc. Ele não pode ser colocado em um módulo de classe ou anexado a um formulário. Para RemoteHook, HookFunc deve ser incluído na biblioteca de vínculo dinâmico, portanto, se você usar RemoteHook em VB, também precisará usar duas funções de API: GetModuleHandle() e GetProcAddress().
Declarar função GetModuleHandle Libkernel32 Alias GetModuleHandleA(ByVal lpModuleName As String) As Long Declarar função GetProcAddress Lib kernel32 Alias GetProcAddress(ByVal hModule As Long, ByVal lpProcName As String) As Long |
O valor hmod é o identificador do nome do módulo que contém o processo de gancho. Se for LocalHook, o valor pode ser Nulo (0 é passado em VB) e se for RemoteHook, você pode usar GetModuleHandle (name.dll) para passá-lo. .