Douglasrg Posted July 28, 2012 Report Share Posted July 28, 2012 (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 by pmg realce linha com erro Link to comment Share on other sites More sharing options...
pmg Posted July 28, 2012 Report Share Posted July 28, 2012 (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 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 More sharing options...
Douglasrg Posted July 28, 2012 Author Report Share Posted July 28, 2012 @pmg, quando eu troco o valor a função nao funciona :S e ainda da break no programa Link to comment Share on other sites More sharing options...
pikax Posted July 28, 2012 Report Share Posted July 28, 2012 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 More sharing options...
Douglasrg Posted July 28, 2012 Author Report Share Posted July 28, 2012 pikax, funcionou, vou gravar no meu pequeno cerebro ^^ obrigado. Link to comment Share on other sites More sharing options...
pikax Posted July 28, 2012 Report Share Posted July 28, 2012 (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 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 More sharing options...
Douglasrg Posted July 28, 2012 Author Report Share Posted July 28, 2012 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 More sharing options...
pikax Posted July 28, 2012 Report Share Posted July 28, 2012 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 More sharing options...
Douglasrg Posted July 28, 2012 Author Report Share Posted July 28, 2012 agora sim,funcionou tudo certinho, vou pesquisar sobre a função new. obrigado pikax Link to comment Share on other sites More sharing options...
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