Array
(
)

Api Hook

Marco Salles
   - 23 fev 2006

sobre a materia do clube delphi revista n=69 pag 48 , Reescrevi o codigo passado pelo Professor Michel Benford


Citação:
uses
SysUtils,
Classes,
BmsApiHook, //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 :TStartupInfoA;
var ipProcessInformatio:TprocessInformation):Bool;stdcall;


conforme o exemplo do livro... Ai mandei compilar e me retorna o erro

Undeclared Indentifier : TStartupInfoA

procurei no windows.pas e nada definido para esta ´Classe´ .. Se pudemos dizer assim

Alguem sabe aonde esta o erro ????


Michael
   - 23 fev 2006

Olá!

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. Achei estranho pq o artigo é revisado e o editor técnico - Luciano Pimenta - 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 Windows.pas, então qdo uma dúvida como esta surgir é só abrir este arquivo e pesquisar pela assinatura da API (CreateProcessA neste caso) e conferir os parâmetros.

Aproveitando, vou responder ao email que vc me mandou ontem:


Citação:
Professor Michael 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


1) Tanto a BmsApiHook do Nildo qto a MadCodeHook do Madshi não possuem o código fonte para download. Vc deve comprá-lo para poder acessá-lo. Entre em contato com o Bruno 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 Michael, e não Michel... ;-)


Marco Salles
   - 23 fev 2006


Citação:
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


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 :?: :?: :?:


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


Cabeça quente...


Marco Salles
   - 23 fev 2006


Citação:
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


Michael
   - 23 fev 2006


Citação:
bInheritHandles não esta compilando Crying or Very sad
dwcreationFlags não esta escrito Crying or Very sad


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


Michael
   - 23 fev 2006

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

[]´s


Marco Salles
   - 23 fev 2006

A CreateProcessAnext esta definida assim :


Citação:
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 ..
Tipo Incompatibilidade de tipos LoongBool and PsecurityAttributes
Veja a figura acima , tem mais

Obrigado


Marco Salles
   - 23 fev 2006

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


Citação:
result:=CreateProcessANext(IpApplicationName,IpCommandLine,IpProcessAtributes,
IpThreadAttributes,bInheritHandles,dwCreationFlags, IpCurrentDirectory,lpStartupInfo,IpProcessInformation)


o compilador acussa erro de :

Incompatibilidade de tipos

´_STARTUPINFOA´ and ´PAnsiChar´
´_STARTUPINFOA´ and ´PROCESS_INFORMATION´

so falta isso


Michael
   - 23 fev 2006

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 CreateProcessANext, e analisando os parâmetros;

2) Posicionando o cursor após o primeiro parêntese da variável CreateProcessANext e pressionado Ctrl+Shift+Espaço, para o Delphi mostrar os parâmetros que a função deve receber;

2) Abrindo a unit Windows.pas, como eu disse acima, e pesquisando pela API. Neste caso, seria encontrado este código:

#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 é lpEnvironment:


Citação:
result:=CreateProcessANext(IpApplicationName,IpCommandLine,IpProcessAtributes,
IpThreadAttributes,bInheritHandles,dwCreationFlags, lpEnvironment, IpCurrentDirectory,lpStartupInfo,IpProcessInformation)


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


Martins
   - 23 fev 2006


Citação:

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.


Marco Salles
   - 23 fev 2006

é 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


Marco Salles
   - 24 fev 2006

:lol: :lol: :lol:
realmente temos que ter o cuidado nas definiçoes dos parametros..


Mas que :


Citação:
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.


isto de fato esta errado na revista


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;

so que não compila , porque não reconhece Executor e nen linha de Mensagem... O que me parece meio obvio

:idea: :idea:
:arrow:
Então eu fiz assim :

#Código

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;



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
Alguma sugestão..

Muito obrigado.


Nildo
   - 24 fev 2006

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


Marco Salles
   - 24 fev 2006


Citação:
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

#Código

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


Nildo
   - 24 fev 2006

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


Michael
   - 24 fev 2006


Citação:
é agora eu estou em casa , amigo martins e amigo e professor Michael
(...)
mas vem ca e voltamos la ... Vamos convir que a revista tem as letras muito pequenas .. Poderia ser um pouco maiores...
(...)


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 TStartUpInfoA e TStartUpInfoW, 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


Michael
   - 24 fev 2006

Agora que o Nildo entrou no debate eu não preciso mais falar nada... ;-)

[]s


Marco Salles
   - 24 fev 2006

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

o BmsCriaSessaoIPC estou criando no FormCrete do form conforme sugerido

Mas o BmsComunicaIPC este eu nun to vendo na revista


Nildo
   - 24 fev 2006


Citação:
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

o BmsCriaSessaoIPC estou criando no FormCrete do form conforme sugerido

Mas o BmsComunicaIPC este eu nun to vendo na revista


Mas como você quer enviar uma mensagem pro seu executavel sem dar o comando de enviar mensagem (no caso, BmsComunicaIPC)?

Ps.: Na edição 69, página 47, nosso professor Michael nos mostra o comando BmsComunicaIPC.


Marco Salles
   - 24 fev 2006

Desculpa , esta na dll


Michael
   - 24 fev 2006

A propósito, colega Marcos Salles, como contornou o problema da versão da biblioteca de hooking para o Delphi 5? Está usando a MadCodeHook, ou o Bruno arrumou um DCU compilado na versão 5 para vc?


Citação:
Mas o BmsComunicaIPC este eu nun to vendo na revista


Esse função é chamada de dentro da DLL, mais especificamente pela rotina ExecutarIPC:

#Código

function ExecutarIPC(const Mensagem : TMensagem) : BOOL;
var
Resposta: BOOL;
begin
BmsComunicaIpc(ID_SECAO_IPC, @Mensagem, SizeOf(TMensagem), @Resposta, SizeOf(BOOL));

Result := Resposta;
end;



Citação:
Ps.: Na edição 69, página 47, nosso professor Michael nos mostra o comando BmsComunicaIPC.


Muito obrigado Bruno! Estou sem a revista aqui, mas lembrava de onde sua rotina era chamada.

[]´s