Api Hook

23/02/2006

[b:71aa00a954]sobre a materia do clube delphi revista n=69 pag 48 , Reescrevi o codigo passado pelo Professor Michel Benford[/b:71aa00a954]

uses SysUtils, Classes, [b:71aa00a954]BmsApiHook,[/b:71aa00a954] //Biblioteca do Nildo para delphi 7.0 Windows; var CreateProcessAnext: function(IpApplicationName:PAnsiChar;IpCommandLine:PAnsiChar; IpProcessAtributes,IpThreadAttributes:PSecurityAttributes; bInhertHandles:Bool;dwCreteionFlags:Dword; IpEnvironment:Pointer;IpCurrentDirectory:PAnsiChar; Const ipStartupInfo :[b:71aa00a954]TStartupInfoA[/b:71aa00a954]; var ipProcessInformatio:TprocessInformation):Bool;stdcall;


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

Respostas

23/02/2006

Michael

Olá!

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... ;-)


Responder Citar

23/02/2006

Marco Salles

Não estou com a revista aqui em mãos, mas tem certeza de que está escrito TStartupInfoA? O correto é TStartupInfo,


com certeza esta escrito assim ;

Troquei ja compilou normalmente :P :P :P

outro problema que apareceu :cry: :cry: :cry:

result:=CreateProcessANext(IpApplicationName,IpCommandLine,IpProcessAtributes, [b:201c323d2c] bInheritHandles,dwcreationFlags,[/b:201c323d2c]IpCurrentDirectory, IpStartUpInfo,IpProcessInformation)


bInheritHandles não esta compilando :cry:
dwcreationFlags não esta escrito :cry:

tem erro tb nesta linha :?: :?: :?:

Ah, é o professor se chama Michael, e não Michel...


Cabeça quente...


Responder Citar

23/02/2006

Marco Salles

outro problema que apareceu Citação: result:=CreateProcessANext(IpApplicationName,IpCommandLine,IpProcessAtributes, bInheritHandles,dwcreationFlags,IpCurrentDirectory, IpStartUpInfo,IpProcessInformation) bInheritHandles não esta compilando dwcreationFlags não esta escrito tem erro tb nesta linha


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:


Responder Citar

23/02/2006

Michael

[quote:0e6abfb528=´Marco Salles´]bInheritHandles não esta compilando Crying or Very sad
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


Responder Citar

23/02/2006

Michael

Pela imagem, os erros parecem ser de parâmetros passados na ordem incorreta para a variavel [b:cd82901a47]CreateProcessANext[/b:cd82901a47]. Poste o código do seu callback aqui para darmos uma olhada.

[]´s


Responder Citar

23/02/2006

Marco Salles

A CreateProcessAnext esta definida assim :

CreateProcessAnext: function(IpApplicationName:PAnsiChar;IpCommandLine:PAnsiChar; IpProcessAtributes,IpThreadAttributes:PSecurityAttributes; bInhertHandles:Bool;dwCreteionFlags:Dword; IpEnvironment:Pointer;IpCurrentDirectory:PAnsiChar; Const ipStartupInfo :TStartupInfo; var ipProcessInformatio:TprocessInformation):Bool;stdcall;


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


Responder Citar

23/02/2006

Marco Salles

quase resolvido .. Os problemas de tipo , foram porque minha chamda a fubção , estava faltando um paramentro..Ja corrigi

Mas agora os parametros parecem que estão certo e para compilar , aparece somente dois erros

Na mesma Linha

result:=CreateProcessANext(IpApplicationName,IpCommandLine,IpProcessAtributes, IpThreadAttributes,bInheritHandles,dwCreationFlags, IpCurrentDirectory,[b:551e4ed8c7]lpStartupInfo[/b:551e4ed8c7],IpProcessInformation)


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:


Responder Citar

23/02/2006

Michael

O problema decorre novamente de parâmetros omitidos. Vc pode eliminar esses erros de várias maneiras:

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


Responder Citar

23/02/2006

Martins

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


É 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.


Responder Citar

23/02/2006

Marco Salles

é agora eu estou em casa , amigo martins e amigo e professor michel

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


Responder Citar

24/02/2006

Marco Salles

:lol: :lol: :lol:
[b:002e475c03]realmente temos que ter o cuidado nas definiçoes dos parametros..[/b:002e475c03]

:evil: :evil:
Mas que :

Não estou com a revista aqui em mãos, mas tem certeza de que está escrito TStartupInfoA? O correto é TStartupInfo, e sua definição está localizada dentro da unit Windows, linha 4922.


[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.


Responder Citar

24/02/2006

Nildo

Pode ser que a mensagem não esteja sendo enviada. Você configurou corretamente a inicialização do IPC? Seguiu exatamente os passos da revista?


Responder Citar

24/02/2006

Marco Salles

Pode ser que a mensagem não esteja sendo enviada. Você configurou corretamente a inicialização do IPC? Seguiu exatamente os passos da revista?


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:


Responder Citar

24/02/2006

Nildo

Coloca um MessageBox na sua DLL pra ver se o BmsComunicaIPC está sendo chamado corretamente, e se você executou o BmsCriaSessaoIPC do seu executável antes da DLL chamar a BmsComunicaIPC


Responder Citar

24/02/2006

Michael

[quote:bc3cfc1ee8=´Marco Salles´]é agora eu estou em casa , amigo martins e amigo e professor [b:bc3cfc1ee8][color=red:bc3cfc1ee8]Michael[/color:bc3cfc1ee8][/b:bc3cfc1ee8]
(...)
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


Responder Citar