Jump to content

Windows Hook


Douglasrg
 Share

Recommended Posts

Bom, seguindo um tutorial em Delphi que vi, sobre Windows Hook, decidi passar o codigo para C.

Acho que atéagora esta tudo certo, mas o visual studio me retorna o seguinte erro:

c:\documents and settings\administrador\desktop\aprendendo c\window hook\window hook\window.cpp(24): error C2664: 'VirtualProtect' : cannot convert parameter 3 from 'DWORD *' to 'DWORD'

There is no context in which this conversion is possible

Codigo Atual:

#include <Windows.h>
#include <conio.h>
#include <stdio.h>
int meushook()
{
printf("Iniciando hook");
}
int main()
{
CHAR str;
void* Place;
DWORD* ProtecaoAntiga;
printf("Procurando pela função MessageBox...");
Place = GetProcAddress(GetModuleHandle("user32.dll"), "MessageBoxA");
VirtualProtect(Place, 5,PAGE_READWRITE,ProtecaoAntiga);
*(BYTE*)(Place)= 0xE9; //OPCODE DE JMP
*(DWORD*)(DWORD(Place) + 1)= (DWORD(&meushook) - DWORD(Place) -5);
VirtualProtect(Place, 5, ProtecaoAntiga, ProtecaoAntiga);
printf("Hookado!Vamos testar agora, usando MessageBox...");
getch();
}
Edited by pmg
realce linha com erro
Link to comment
Share on other sites

O resultado da pesquisa que eu fiz para VirtualProtect indica que o protótipo dessa função é:

BOOL VirtualProtect( 
 LPVOID lpAddress, 
 DWORD dwSize, 
 DWORD flNewProtect, 
 PDWORD lpflOldProtect 
);

Não faço ideia (hehe) o que são os tipos BOOL, LPVOID, DWORD, e PDWORD, mas supondo que são tipos distintos não podes meter o mesmo valor no terceiro e quarto parametro da função (um valor tem de ser do tipo DWORD (ou convertivel para esse tipo) e o outro do tipo PDWORD (ou convertivel)).

Tu estás a meter o valor ProteccaoAntiga, de tipo DWORD* no terceiro parametro. Esse parametro precisa dum valor de tipo DWORD e o teu compilador queixa-se que não pode converter o valor indicado.

Sugestão: passa um valor do tipo esperado pelo compilador.

VirtualProtect(Place, 5, VALOR_DE_TIPO_DWORD, ProteccaoAntiga);
Edited by pmg
typo

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Link to comment
Share on other sites

O erro diz que DWORD* nao pode ser convertido em DWORD, traduzindo isto para miudos fica: Nao se pode converter um apontador de DWORD num DWORD.

basta fazeres assim:

VirtualProtect(Place, 5, *ProtecaoAntiga, ProtecaoAntiga);

Ja agora, nem vi o codigo, a alteracao desta linha so' corrige o erro

Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Link to comment
Share on other sites

pikax, funcionou, vou gravar no meu pequeno cerebro ^^

obrigado.

Tens que ver se aprendes a ler os erros 😉

Não faço ideia (hehe) o que são os tipos BOOL, LPVOID, DWORD, e PDWORD, mas supondo que são tipos distintos não podes meter o mesmo valor no terceiro e quarto parametro da função (um valor tem de ser do tipo DWORD (ou convertivel para esse tipo) e o outro do tipo PDWORD (ou convertivel)).

em C++ esses tipos sao: bool tem o tamanho de um char que pode ter 2 valores, verdadeiro(true) ou falso(false); LPVOID e' um apontador para void(o windows gosta de inventar nomes); DWORD e' um unsigned long int; LPDWORD e' um apontador para DWORD.

Quem programa com a API do windows tem que saber estes tipos 😄

EDIT: nao me lembro ao certo se o prefixo LP e' um apontador regular ou um long pointer.

Edited by pikax

Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Link to comment
Share on other sites

opa, pikax, fiz o build e ocorreu tudo bem, porem o programa da um erro em tempo de execução

dizendo assim: 'Run-Time Check Failure #3 - The variable 'ProtecaoAntiga' is being used without being initialized.'

Estou pensando será que o programa esta fazendo tudo corretamente?

porque em Pascal a função nao retorna erro algum.;

Link to comment
Share on other sites

opa, pikax, fiz o build e ocorreu tudo bem, porem o programa da um erro em tempo de execução

dizendo assim: 'Run-Time Check Failure #3 - The variable 'ProtecaoAntiga' is being used without being initialized.'

Estou pensando será que o programa esta fazendo tudo corretamente?

porque em Pascal a função nao retorna erro algum.;

porque tens um apontador que nao foi inicializado, que significa que esta a apontar para lado nenhum.

para corrigir isso mete:

DWORD* ProtecaoAntiga = new DWORD;

apesar que era melhor meteres a ProteccaoAntiga como uma variavel normal em vez de um apontador

Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.