Api Hook
23/02/2006
0
conforme o exemplo do livro... Ai mandei compilar e me retorna o erro
[b:71aa00a954]Undeclared Indentifier : TStartupInfoA[/b:71aa00a954]
procurei no windows.pas e nada definido para esta ´Classe´ .. Se pudemos dizer assim
Alguem sabe aonde esta o erro ????
Marco Salles
Posts
23/02/2006
Michael
Não estou com a revista aqui em mãos, mas tem certeza de que está escrito TStartupInfoA? O correto é [b:53bfef3972]TStartupInfo[/b:53bfef3972], e sua definição está localizada dentro da unit [b:53bfef3972]Windows[/b:53bfef3972], linha 4922. Achei estranho pq o artigo é revisado e o editor técnico - [b:53bfef3972]Luciano Pimenta[/b:53bfef3972] - faz todos os exemplos antes de aprovar. Bom, se de fato estiver assim, peço desculpas, em meu nome ou da revista ClubeDelphi.
Uma dica: a maioria das API´s do Windows ficam armazenadas na unit [b:53bfef3972]Windows.pas[/b:53bfef3972], então qdo uma dúvida como esta surgir é só abrir este arquivo e pesquisar pela assinatura da API ([b:53bfef3972]CreateProcessA [/b:53bfef3972]neste caso) e conferir os parâmetros.
Aproveitando, vou responder ao email que vc me mandou ontem:
[quote:53bfef3972=´Marcos Salles´]Professor [color=red:53bfef3972][b:53bfef3972]Michael[/b:53bfef3972][/color:53bfef3972] Benford , sobre o seu trabalho na edição 68 do clube delphi , estou muito deseperado
1) não consigo achar a unit BmsApiHook.pas apos o downlooad
so aparece o BmsApiHook.dcu
Como fazer para ter o .pas desta unit ????
2) sera suficiente colar esta Unit Dcu no caminho
c:\ArquivosDeProgramas\Borland\Delphi5\Lib ???
Fiz usando O tools > environement Options . Library > Library Pacth > e adicionei o Nome da pasta que contem essas Units e o Programa pede oa extenção .pas dessas Units
3) Nen mesmo a função BmsRemoteLooadLibrary e reconhecida
muito agradecido
marco salles
Clube delphi[/quote:53bfef3972]
1) Tanto a [b:53bfef3972]BmsApiHook [/b:53bfef3972]do [b:53bfef3972]Nildo [/b:53bfef3972]qto a [b:53bfef3972]MadCodeHook [/b:53bfef3972]do Madshi não possuem o código fonte para download. Vc deve comprá-lo para poder acessá-lo. Entre em contato com o [b:53bfef3972]Bruno [/b:53bfef3972]para mais detalhes.
2) Sim, basta adicionar em algum caminho que esteja sendo referenciado no Delphi.
3) O Delphi está pedindo o arquivo PAS pq a DCU usada não foi compilada para o Delphi 5. De fato não há suporte para esta versão do Delphi. Na página de download do site www.projetobms.net é dito que as versões compatíveis são a 6, 7 e 2005. Novamente, entre em contato com o Nildo e veja se ele pode compilar para vc. Ou então baixe a MadCodeHook, que oferece suporte para o Delphi 4-2005 (exceto 8).
Ah, é o professor se chama [b:53bfef3972]Michael[/b:53bfef3972], e não Michel... ;-)
23/02/2006
Marco Salles
com certeza esta escrito assim ;
Troquei ja compilou normalmente :P :P :P
outro problema que apareceu :cry: :cry: :cry:
bInheritHandles não esta compilando :cry:
dwcreationFlags não esta escrito :cry:
tem erro tb nesta linha :?: :?: :?:
Cabeça quente...
23/02/2006
Marco Salles
este erro foi exclusivo meu.. Ja corrige .. Mas ta ainda dificil
Surge estes erros :
[URL=http://imageshack.us][img:2f3e37659d]http://img228.imageshack.us/img228/5153/imagemnildo39go.jpg[/img:2f3e37659d][/URL]
Que erros são esse professor michael :cry: :cry: :cry:
23/02/2006
Michael
dwcreationFlags não esta escrito Crying or Very sad[/quote:0e6abfb528]
Não entendi muito bem. Poste a mensagem de erro que ocorreu e se puder o código inteiro do callback.
De qualquer forma vou dar uma olhada no original do artigo para ver se o(s) erro(s) é(são) meu(s) ou não.
[]´s
23/02/2006
Michael
[]´s
23/02/2006
Marco Salles
e nesta linha , na chamada
result:=CreateProcessANext(IpApplicationName,IpCommandLine,IpProcessAtributes,
bInheritHandles,dwCreationFlags,IpCurrentDirectory,
IpStartUpInfo,IpProcessInformation)
da vários erros ..
[b:99fa3fbcb8]Tipo Incompatibilidade de tipos LoongBool and PsecurityAttributes[/b:99fa3fbcb8]
Veja a figura acima , tem mais
Obrigado
23/02/2006
Marco Salles
Mas agora os parametros parecem que estão certo e para compilar , aparece somente dois erros
Na mesma Linha
o compilador acussa erro de :
Incompatibilidade de tipos
[b:551e4ed8c7]´_STARTUPINFOA´ and ´PAnsiChar´
´_STARTUPINFOA´ and ´PROCESS_INFORMATION´[/b:551e4ed8c7]
so falta isso :cry: :cry: :cry: :cry:
23/02/2006
Michael
1) Olhando a declaração da variável [b:48ad0ef377]CreateProcessANext[/b:48ad0ef377], e analisando os parâmetros;
2) Posicionando o cursor após o primeiro parêntese da variável [b:48ad0ef377]CreateProcessANext [/b:48ad0ef377]e pressionado [b:48ad0ef377]Ctrl+Shift+Espaço[/b:48ad0ef377], para o Delphi mostrar os parâmetros que a função deve receber;
2) Abrindo a unit [b:48ad0ef377]Windows.pas[/b:48ad0ef377], como eu disse acima, e pesquisando pela API. Neste caso, seria encontrado este código:
function CreateProcessA(lpApplicationName: PAnsiChar; lpCommandLine: PAnsiChar; lpProcessAttributes, lpThreadAttributes: PSecurityAttributes; bInheritHandles: BOOL; dwCreationFlags: DWORD; lpEnvironment: Pointer; lpCurrentDirectory: PAnsiChar; const lpStartupInfo: TStartupInfo; var lpProcessInformation: TProcessInformation): BOOL; stdcall;
Feito isso, o parâmetro que falta na sua chamada é [b:48ad0ef377]lpEnvironment[/b:48ad0ef377]:
[quote:48ad0ef377=´Marcos Salles´]result:=CreateProcessANext(IpApplicationName,IpCommandLine,IpProcessAtributes,
IpThreadAttributes,bInheritHandles,dwCreationFlags, [b:48ad0ef377]lpEnvironment[/b:48ad0ef377], IpCurrentDirectory,lpStartupInfo,IpProcessInformation)[/quote:48ad0ef377]
Esteja atento na hora de escrever códigos de callbacks e variáveis next, pois se qualquer coisa não estiver rigorosamente igual à API original o processo no qual a DLL for injetado tem grandes chances de travar, e se vc injetar a DLL no sistema operacional então pode ocorrer um súbito reboot da máquina.
Uma pergunta: na revista todo este código está errado?
[]´s
23/02/2006
Martins
É sempre bom ressaltar esses pontos para quem pretende utilizar API Hooking, a atenção com o código das funções de CallBack devem ser observadas com ´carinho´.
Marco Salles, qualquer coisa post aqui novamente, vou acompanhar esse tópico.
23/02/2006
Marco Salles
De fato , temos que ter muita atenção na definição desses parametros..
mas vem ca e voltamos la ... Vamos convir que a revista tem as letras muito pequenas .. Poderia ser um pouco maiores...
Não mereço todo o credito da culpa sozinho
24/02/2006
Marco Salles
[b:002e475c03]realmente temos que ter o cuidado nas definiçoes dos parametros..[/b:002e475c03]
:evil: :evil:
Mas que :
[b:002e475c03]isto de fato esta errado na revista[/b:002e475c03]
Outra coisa michel , na revista o codigo desse evento esta assim :
procedure TfrmMain.MensagemIPC(var Msg: TMessage);
var
mensagem:TMensagem;
begin
mensagem:=TMensagem(Pointer(Msg.WParam)^);
with TfrmAviso.Create(Application) do
begin
MemoProcesso.Text:=ExtractFileName(Executor);
Delete(LinhaComando,pos(´´´,LinhaComando),1);
delete(LinhaComando,pos(´´´,linhaComando),1);
MemoAplicativo.text:=linhaComando;
end;
case Showmodal of
MrYes: Bool(Pointer(Msg.LParam)^) := True;
MrNo: Bool(Pointer(Msg.LParam)^) := False;
end;
release;
end;
[b:002e475c03]so que não compila , porque não reconhece Executor e nen linha de Mensagem... O que me parece meio obvio[/b:002e475c03]
:idea: :idea:
:arrow:
[b:002e475c03]Então eu fiz assim :[/b:002e475c03]
procedure TfrmMain.MensagemIPC(var Msg: TMessage); var mensagem:TMensagem; begin mensagem:=TMensagem(Pointer(Msg.WParam)^); with TfrmAviso.Create(Application) do begin MemoProcesso.Text:=ExtractFileName(Mensagem.Executor); Delete(Mensagem.LinhaComando,pos(´"´,Mensagem.LinhaComando),1); delete(Mensagem.LinhaComando,pos(´"´,mensagem.linhaComando),1); MemoAplicativo.text:=Mensagem.linhaComando; end; case Showmodal of MrYes: Bool(Pointer(Msg.LParam)^) := True; MrNo: Bool(Pointer(Msg.LParam)^) := False; end; release; end;
:cry: :cry: :cry: :cry: :cry: :cry:
[b:002e475c03]Agora compila beleza , mas depois de tudo compilado e salvo , na execução o Formulario Não abre com as mensagens .. E com eu não tenho o pas do Nildo , estou meio perdido para debugar o programa e verificar onde estou errando , ou melhor , o que pode estar faltando[/b:002e475c03]
Alguma sugestão..
Muito obrigado.
24/02/2006
Nildo
24/02/2006
Marco Salles
Aparentemente eu fiz conforme a revista... Mas se eu ja tinha feito um breakpoint neta liha
procedure IpcCallback(Buffer:Pointer;TamBubffer:Integer;Resposta:Pointer;TamResposta:Integer);Stdcall; begin SendMessage(FormHandle,Wm_User+10,integer(buffer),integer(Resposta)); end;
e não esta sendo executado ...Acho que deveria ser executado :cry:
24/02/2006
Nildo
24/02/2006
Michael
(...)
mas vem ca e voltamos la ... Vamos convir que a revista tem as letras muito pequenas .. Poderia ser um pouco maiores...
(...)[/quote:bc3cfc1ee8]
Isso é uma questão pessoal. De qualquer forma, mande um email para a redação da revista sugerindo sua idéia.
Sobre a definição [b:bc3cfc1ee8]TStartUpInfoA [/b:bc3cfc1ee8]e [b:bc3cfc1ee8]TStartUpInfoW[/b:bc3cfc1ee8], eu não tenho certeza se no Delphi 2005 elas estariam erradas, pois foi nessa versão que compilei os exemplos.
O problema com a variável Mensagem que vc mencionou, que não estava sendo referenciada no escopo, eu tenho certeza que escrevi corretamente. Vou apurar isso melhor para ver se meus textos estão sendo modificados antes de serem publicados, e posto aqui depois.
De qualquer forma, baixe o exemplo no site do ClubeDelphi, [url=http://www.clubedelphi.net/Novo/Revista/ed69-michael-hooking.zip]neste link[/url]. Baixei aqui, compilei e tudo funcionou corretamente.
[]´s
Clique aqui para fazer login e interagir na Comunidade :)