Douglasrg Posted July 28, 2012 at 09:05 PM Report #470813 Posted July 28, 2012 at 09:05 PM (edited) 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 July 28, 2012 at 09:22 PM by pmg realce linha com erro
pmg Posted July 28, 2012 at 09:31 PM Report #470816 Posted July 28, 2012 at 09:31 PM (edited) 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 July 28, 2012 at 09:36 PM 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!
Douglasrg Posted July 28, 2012 at 09:45 PM Author Report #470820 Posted July 28, 2012 at 09:45 PM @pmg, quando eu troco o valor a função nao funciona :S e ainda da break no programa
pikax Posted July 28, 2012 at 10:35 PM Report #470829 Posted July 28, 2012 at 10:35 PM 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."
Douglasrg Posted July 28, 2012 at 10:44 PM Author Report #470830 Posted July 28, 2012 at 10:44 PM pikax, funcionou, vou gravar no meu pequeno cerebro ^^ obrigado.
pikax Posted July 28, 2012 at 10:52 PM Report #470831 Posted July 28, 2012 at 10:52 PM (edited) 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 July 28, 2012 at 10:53 PM 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."
Douglasrg Posted July 28, 2012 at 10:53 PM Author Report #470832 Posted July 28, 2012 at 10:53 PM 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.;
pikax Posted July 28, 2012 at 10:56 PM Report #470833 Posted July 28, 2012 at 10:56 PM 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."
Douglasrg Posted July 28, 2012 at 11:19 PM Author Report #470838 Posted July 28, 2012 at 11:19 PM agora sim,funcionou tudo certinho, vou pesquisar sobre a função new. obrigado pikax
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now