Api Hook

Delphi

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

Marco Salles

Curtidas 0

Respostas

Michael

Michael

23/02/2006

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


GOSTEI 0
Marco Salles

Marco Salles

23/02/2006

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


GOSTEI 0
Marco Salles

Marco Salles

23/02/2006

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:


GOSTEI 0
Michael

Michael

23/02/2006

[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


GOSTEI 0
Michael

Michael

23/02/2006

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


GOSTEI 0
Marco Salles

Marco Salles

23/02/2006

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


GOSTEI 0
Marco Salles

Marco Salles

23/02/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

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:


GOSTEI 0
Michael

Michael

23/02/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 [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


GOSTEI 0
Martins

Martins

23/02/2006

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.


GOSTEI 0
Marco Salles

Marco Salles

23/02/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


GOSTEI 0
Marco Salles

Marco Salles

23/02/2006

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


GOSTEI 0
Nildo

Nildo

23/02/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?


GOSTEI 0
Marco Salles

Marco Salles

23/02/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?


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:


GOSTEI 0
Nildo

Nildo

23/02/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


GOSTEI 0
Michael

Michael

23/02/2006

[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


GOSTEI 0
Michael

Michael

23/02/2006

Agora que o [b:c657e310b4]Nildo [/b:c657e310b4]entrou no debate eu não preciso mais falar nada... ;-)

[]s


GOSTEI 0
Marco Salles

Marco Salles

23/02/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 :cry: :cry:


GOSTEI 0
Nildo

Nildo

23/02/2006

[quote:4ef8a0b8f1=´Marco Salles´]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 :cry: :cry:[/quote:4ef8a0b8f1]

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.


GOSTEI 0
Marco Salles

Marco Salles

23/02/2006

Desculpa , esta na dll


GOSTEI 0
Michael

Michael

23/02/2006

A propósito, colega [b:0034a9ca85]Marcos Salles[/b:0034a9ca85], 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?

[quote:0034a9ca85=´Marcos Salles´]Mas o BmsComunicaIPC este eu nun to vendo na revista[/quote:0034a9ca85]

Esse função é chamada de dentro da DLL, mais especificamente pela rotina [b:0034a9ca85]ExecutarIPC[/b:0034a9ca85]:

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

  Result := Resposta;
end;


[quote:0034a9ca85=´Nildo, meu amigão´]Ps.: Na edição 69, página 47, nosso professor Michael nos mostra o comando BmsComunicaIPC.[/quote:0034a9ca85]

Muito obrigado [b:0034a9ca85]Bruno[/b:0034a9ca85]! Estou sem a revista aqui, mas lembrava de onde sua rotina era chamada.

[]´s


GOSTEI 0
Marco Salles

Marco Salles

23/02/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?


estou usando o computador de um amigo que tem o delphi 7.0

Marcos Salles escreveu: Mas o BmsComunicaIPC este eu nun to vendo na revista Esse função é chamada de dentro da DLL, mais especificamente pela rotina ExecutarIPC:


Sim , ja achei..

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.


[b:8b2fc498fd]No delphi 7.0 elas não compilam ....[/b:8b2fc498fd]


GOSTEI 0
Michael

Michael

23/02/2006

[quote:088252bfa1=´Marco Salles´]No delphi 7.0 elas não compilam....[/quote:088252bfa1]

Sim, constatei isso aqui. Minha dúvida é em relação ao Delphi 2005. Aqui na empresa não tenho uma cópia dele para testar. Verei em casa à noite.

[]´s


GOSTEI 0
Marco Salles

Marco Salles

23/02/2006

[b:91a4e0ddb5]o amigo cabelo diz uma coisa muito interresante : Mia sou menos assim :[/b:91a4e0ddb5]

´Não deu , porque ainda não chegou a hora´


[color=darkred:91a4e0ddb5]Acho que essa expressão , se aplica de corpo e alma no nosso na Informatica[/color:91a4e0ddb5]

:!: :!: :!: :!:
Qauntas vezes ja aconteceu com voce , comigo e com todos algo do tipo :
[b:91a4e0ddb5]Isto eu ja tinha tentado , mas estava dando erro , agora esta funcionando[/b:91a4e0ddb5] :evil: :evil: :evil: :evil:

:idea: :idea:
[b:91a4e0ddb5]Pois bem , aqui nesse tópico , vasculhei o seu código e o comparei com o seu... [/b:91a4e0ddb5]

De fato quando voce disse :

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.


[b:91a4e0ddb5]Não sei porque , mas agora compila sem usar a palavra Mensagem.. Então segue certo o conteudo da revista[/b:91a4e0ddb5]

:P :P :P :P :P :P :P
[b:91a4e0ddb5][color=darkblue:91a4e0ddb5]Finalmente cheguei a Solução do Problema , comparando o seu código (Passado pelo Link) Com o meu código[/color:91a4e0ddb5][/b:91a4e0ddb5]
O erro foi em :

[b:91a4e0ddb5]ERRADO[/b:91a4e0ddb5]
bmsRemoteLoadLibrary(bmsGetProcessId(´explorer.exe´),
               ExtractFilePath(ParamStr(0)+´CPHook.dll´));

[b:91a4e0ddb5]CERTO[/b:91a4e0ddb5]
BmsRemoteLoadLibrary(BmsGetProcessID(´explorer.exe´), ExtractFilePath(ParamStr(0)) + ´CPHook.dll´);


[b:91a4e0ddb5]como voce mesmo disse na edição anterior sobre a importancia desse caminho...[/b:91a4e0ddb5]
:cry: :cry: :cry:
De fato , ja tinha verificado sobre esse erro , criando um botão e chamando um showmessage com a função ExtractFilePatc.. So que tinha dado certo então deixei esta linha de raciocineo e partir para outras... :evil:

O fato é que o Duplo parenteses na minha instrução , foi um descuido mortal e fez uma atomicidade de um coisa tão pequena

[b:91a4e0ddb5]Peço muito obrigado pela atenção , da sua parte e do nildo a do martins , e vou continuar a amolar voces sobre esse tema, que como devem ter percebido sou extremamente leigo no assunto[/b:91a4e0ddb5]

Para finalizar quero deixar registrado que :

citação de marco salles
mas vem ca e voltamos la ... Vamos convir que a revista tem as letras muito pequenas .. Poderia ser um pouco maiores... (...)


citação de michel
Isso é uma questão pessoal. De qualquer forma, mande um email para a redação da revista sugerindo sua idéia.


Foge dos meus principios , a qualidade de um produto deve ser sempre de quem o faz.. Se eles acham que o tamanho esta bom e é o suficiente , então que sigam nesse caminho.. O futuro é o juiz em todas as situaçoes

Abração , to esperando a edição 70 ....


GOSTEI 0
Martins

Martins

23/02/2006

[quote:df986a88a5=´Marco Salles´]No delphi 7.0 elas não compilam....


Sim, constatei isso aqui. Minha dúvida é em relação ao Delphi 2005. Aqui na empresa não tenho uma cópia dele para testar. Verei em casa à noite.

[]´s[/quote:df986a88a5]

vou ver aqui, quem dos meus contatos tá rodando o D2005, e pedir para testarem.


GOSTEI 0
Michael

Michael

23/02/2006

[quote:e81831b81e=´Marcos Salles´]Não sei porque , mas agora compila sem usar a palavra Mensagem.. Então segue certo o conteudo da revista[/quote:e81831b81e]
Poste seu código aqui para vermos pq funcionou agora e não antes.

[quote:e81831b81e=´Marcos Salles´]Peço muito obrigado pela atenção , da sua parte e do nildo a do martins , e vou continuar a amolar voces sobre esse tema, que como devem ter percebido sou extremamente leigo no assunto[/quote:e81831b81e]
Sem problemas. Amole o quanto quiser... ;-)

[quote:e81831b81e=´Marco Salles´]Foge dos meus principios , a qualidade de um produto deve ser sempre de quem o faz.. Se eles acham que o tamanho esta bom e é o suficiente , então que sigam nesse caminho.. O futuro é o juiz em todas as situaçoes[/quote:e81831b81e]
Qualquer revista depende do feedback dos seus leitores para evoluir. A ClubeDelphi não foge a esta regra.

Sempre é bom ouvir as sugestões e críticas dos leitores. ;-)

[quote:e81831b81e=´Marcos Salles´]Abração , to esperando a edição 70....[/quote:e81831b81e]
A edição 70 já está nas bancas há quase um mês. Aliás a 71 está estourando aí.

[]´s

P.S: Diga 10 vezes em voz alta: [b:e81831b81e]Michael[/b:e81831b81e], não Michel. [b:e81831b81e]Michael[/b:e81831b81e], não Michel. Diga tbm outras 10 vezes ´[b:e81831b81e]Maicou[/b:e81831b81e]´, ´[b:e81831b81e]Maicou[/b:e81831b81e]´, ´[b:e81831b81e]Maicou[/b:e81831b81e]´... ;-)


GOSTEI 0
Michael

Michael

23/02/2006

vou ver aqui, quem dos meus contatos tá rodando o D2005, e pedir para testarem.


Peça para abrirem a unit [b:a8589c140e]Windows[/b:a8589c140e], e pesquisar por [b:a8589c140e]TStartUpInfoA [/b:a8589c140e]e [b:a8589c140e]TStartUpInfoW[/b:a8589c140e]. Se não acharem nada, diga para tentarem então [b:a8589c140e]TStartUpInfo [/b:a8589c140e]apenas.

[]´s


GOSTEI 0
Marco Salles

Marco Salles

23/02/2006

Marcos Salles escreveu: Não sei porque , mas agora compila sem usar a palavra Mensagem.. Então segue certo o conteudo da revista Poste seu código aqui para vermos pq funcionou agora e não antes


a primeira vez que tentei compilar , não estva dando certo.. Eu não tenho mais o código antigo ja que agora esta funcionando.. Verifiquei pelo seu código que não tinha o Message.. Pra mim tinha que ser assim:

[b:e9a29f019d]MemoProcesso.tetx:=ExtractFileName(Mensagem.Executor);[/b:e9a29f019d]

e não como esta escrito

[b:e9a29f019d]MemoProcesso.tetx:=ExtractFileName(Executor);[/b:e9a29f019d]


Mas esta compilando e funcionando da segunda maneira , o que não estava acontecendo antes.. Vai entender..


Qualquer revista depende do feedback dos seus leitores para evoluir. A ClubeDelphi não foge a esta regra.


Mas existem muitas ...Nao com relação ao conteudo.. Mas sim com relaçao ao acabamento .. Existem muitas comparaçoes com relaçao a qualidade da outra Revista do mesmo editor.... Em ves de conta tem alguem aqui no site botando a boca no trombone

A edição 70 já está nas bancas há quase um mês. Aliás a 71 está estourando aí.


Mas eu sou assinante.. diga-se passagem duas coisa:

1)a minha edição vem pelo correio

2)assinei por causa especificamente desse artigo.. e com estava esgotada a edição 69 eles conseguiram arruma-la para mim


P.S: Diga 10 vezes em voz alta: Michael, não Michel. Michael, não Michel. Diga tbm outras 10 vezes ´Maicou´, ´Maicou´, ´Maicou´...

Michael ,
Michael ,
Michael ,
Michael ,
Michael ,
Michael ,
Michael ,
Michael ,
Michael ,

hi , faltou uma : Michael ... Pronto ,agora e so copiar daqui e colar nos proximos post...


GOSTEI 0
Michael

Michael

23/02/2006

[quote:42caf57633=´Marco Salles´]a primeira vez que tentei compilar , não estva dando certo.. Eu não tenho mais o código antigo ja que agora esta funcionando.. Verifiquei pelo seu código que não tinha o Message.. Pra mim tinha que ser assim:

[b:42caf57633]MemoProcesso.tetx:=ExtractFileName(Mensagem.Executor);[/b:42caf57633]

e não como esta escrito

[b:42caf57633]MemoProcesso.tetx:=ExtractFileName(Executor);[/b:42caf57633]

Mas esta compilando e funcionando da segunda maneira , o que não estava acontecendo antes.. Vai entender..[/quote:42caf57633]
Não existe um [b:42caf57633]with Mensagem[/b:42caf57633] algumas linhas antes de [b:42caf57633]MemoProcesso.Text := ExtractFileName(Executor)[/b:42caf57633];?

[quote:42caf57633=´Marcos Salles´]Mas existem muitas ...Nao com relação ao conteudo.. Mas sim com relaçao ao acabamento .. Existem muitas comparaçoes com relaçao a qualidade da outra Revista do mesmo editor.... Em ves de conta tem alguem aqui no site botando a boca no trombone[/quote:42caf57633]
Está questão não é tão simples como muitos pensam. Infelizmente não basta querer que a ClubeDelphi seja colorida, etc. Existem vários fatores que influenciam isso. Como este segmento está fora do meu escopo na revista, não posso comentar melhor.

[quote:42caf57633=´Marcos Salles´]Mas eu sou assinante.. diga-se passagem duas coisa:
1)a minha edição vem pelo correio[/quote:42caf57633]
Sua edição 70 ainda não chegou? Se não, entre em contado com o departamento de atendimento da DevMedia.

[quote:42caf57633=´Marcos Salles´]
2)assinei por causa especificamente desse artigo..[/quote:42caf57633]
Legal! :-D

[quote:42caf57633=´Marcos Salles´]Michael ,
Michael ,
Michael ,
Michael ,
Michael ,
Michael ,
Michael ,
Michael ,
Michael ,

hi , faltou uma : Michael ... Pronto ,agora e so copiar daqui e colar nos proximos post...[/quote:42caf57633]
:lol:

[]´s


GOSTEI 0
Marco Salles

Marco Salles

23/02/2006

a primeira vez que tentei compilar , não estva dando certo.. Eu não tenho mais o código antigo ja que agora esta funcionando.. Verifiquei pelo seu código que não tinha o Message.. Pra mim tinha que ser assim


acho com 99,999999¬ de certeza , que não compilou porque omite o With

Voce fez assim

With mensagem do
begin
end;

e eu não o fiz ... Por isso que tive que declarar message em todas as demais linhas.. etaaaaaaaaaaaaaaaa


GOSTEI 0
Marco Salles

Marco Salles

23/02/2006

Michel , eu não sei se vai fazer parte da sua nova edição(Revista n=70), acontece que ainda não chegou aqui... Acredito que ira ter outras tecnicas interresantes e deliciosas( Minha mulher fala como eu posso achar isso numeros matemáticos e coisa e tal de delicioso , mas ela que não sabe) .. Mas gostaria de perguntar se da para dar uma rapida explicação(Para não consumir muito o seu tempo) , se ao inves de Hookar o explorer.exe , o objetivo fosse especificamente dois processos qualquer ..

Por exemplo , suponha que meu fio (Conforme o nildo introduziu assim o conceito de ApiHook em um artigo) , fica-se de ollho no dbd32.exe e
rundll32.exe por exemplo..

[b:f73a93a8f4]mudaria muita coisa [/b:f73a93a8f4] :?: :?: :?:


GOSTEI 0
Nildo

Nildo

23/02/2006

[quote:632e353259=´Marco Salles´]Michel , eu não sei se vai fazer parte da sua nova edição(Revista n=70), acontece que ainda não chegou aqui... Acredito que ira ter outras tecnicas interresantes e deliciosas( Minha mulher fala como eu posso achar isso numeros matemáticos e coisa e tal de delicioso , mas ela que não sabe) .. Mas gostaria de perguntar se da para dar uma rapida explicação(Para não consumir muito o seu tempo) , se ao inves de Hookar o explorer.exe , o objetivo fosse especificamente dois processos qualquer ..

Por exemplo , suponha que meu fio (Conforme o nildo introduziu assim o conceito de ApiHook em um artigo) , fica-se de ollho no dbd32.exe e
rundll32.exe por exemplo..

[b:632e353259]mudaria muita coisa [/b:632e353259] :?: :?: :?:[/quote:632e353259]

Marco, vá pela lógica.
Se você chama um comando por exemplo:

InjetaNoProcesso( ´explorer.exe´ );

Então, nesse caso, como fazer ele injetar no ´dbd32.exe´ e no ´calc.exe´??


GOSTEI 0
Marco Salles

Marco Salles

23/02/2006

Marco, vá pela lógica. Se você chama um comando por exemplo: InjetaNoProcesso( ´explorer.exe´ ); Então, nesse caso, como fazer ele injetar no ´dbd32.exe´ e no ´calc.exe´??


ta . mas a injeçao poderia continuar via explorer.exe , o que eu pergunto e se o que quero abrir for o databaseDeskto ou o relogio do windows , então façao que tem que ser feito , se não for desconsidere...

tecnamente a pergunta pode estar cheia de erros , acredito que ate esteja , afinal o conceito e novo para mim...


GOSTEI 0
Nildo

Nildo

23/02/2006

[quote:bc80ae0986=´Marco Salles´]
Marco, vá pela lógica. Se você chama um comando por exemplo: InjetaNoProcesso( ´explorer.exe´ ); Então, nesse caso, como fazer ele injetar no ´dbd32.exe´ e no ´calc.exe´??


ta . mas a injeçao poderia continuar via explorer.exe , o que eu pergunto e se o que quero abrir for o databaseDeskto ou o relogio do windows , então façao que tem que ser feito , se não for desconsidere...

tecnamente a pergunta pode estar cheia de erros , acredito que ate esteja , afinal o conceito e novo para mim...[/quote:bc80ae0986]

Marco, para de desenvolver o que você está fazendo e estude sobre essa tecnica senão as duvidas nunca irão acabar a não ser que você entenda o conceito da coisa. A injeção não é feita via explorer.exe. Uma injeção nada mais é do que fazer com que algum outro processo carregue uma DLL sua.


GOSTEI 0
Michael

Michael

23/02/2006

[quote:ddaf9f099e=´Marco Salles´][b:ddaf9f099e]Michel [/b:ddaf9f099e](...)[/quote:ddaf9f099e]
Tsic, tsic, tsic... :?

[quote:ddaf9f099e=´Marcos Salles´]eu não sei se vai fazer parte da sua nova edição(Revista n=70) (...)[/quote:ddaf9f099e]
Na edição 70 eu sintetizei o que foi ensinado nas duas anteriores através de uma aplicação que protege arquivos executáveis que o usuário selecionar de uma série de operações, como cópia, exclusão, renomeação, etc. Tbm falo de como usar meu add-in para o IDE do Delphi para API Hooking.

Marco, vá pela lógica. Se você chama um comando por exemplo: InjetaNoProcesso( ´explorer.exe´ ); Então, nesse caso, como fazer ele injetar no ´dbd32.exe´ e no ´calc.exe´??

É isso aí...

[quote:ddaf9f099e=´Marcos Salles´]ta . mas a injeçao poderia continuar via explorer.exe ...[/quote:ddaf9f099e]

O que o [b:ddaf9f099e]Nildo [/b:ddaf9f099e]quer dizer é que vc pode injetar em vários processos, bastando chamar para cada um a função de ´injeção´.

InjetaNoProcess(´explorer.exe´);
InjetaNoProcesso(´notepad.exe´);
InjetaNoProcess(´mspaint.exe´);


[]´s


GOSTEI 0
Martins

Martins

23/02/2006

Marco, para de desenvolver o que você está fazendo e estude sobre essa tecnica senão as duvidas nunca irão acabar a não ser que você entenda o conceito da coisa. A injeção não é feita via explorer.exe. Uma injeção nada mais é do que fazer com que algum outro processo carregue uma DLL sua.


Isso vale para todos e para qualquer inovação na maneira de se desenvolver aplicações, eu levei uns dois puxões de orelha do [color=green:d9af08a58f][b:d9af08a58f]Nildo[/b:d9af08a58f][/color:d9af08a58f] hehehe! Mas valeu!!!

Boa sorte Marco, e lembre-se q o nome do Colega é [b:d9af08a58f]Michael[/b:d9af08a58f] ou então coloca logo só Benford.


GOSTEI 0
Marco Salles

Marco Salles

23/02/2006

Enviada: Sex Fev 24, 2006 8:04 pm Assunto:

--------------------------------------------------------------------------------

Marco Salles escreveu:
Michel (...)

Tsic, tsic, tsic...

Marcos Salles escreveu:
eu não sei se vai fazer parte da sua nova edição(Revista n=70) (...)

Na edição 70 eu sintetizei o que foi ensinado nas duas anteriores através de uma aplicação que protege arquivos executáveis que o usuário selecionar de uma série de operações, como cópia, exclusão, renomeação, etc. Tbm falo de como usar meu add-in para o IDE do Delphi para API Hooking.

Nildo escreveu:
Marco, vá pela lógica.
Se você chama um comando por exemplo:

InjetaNoProcesso( ´explorer.exe´ );

Então, nesse caso, como fazer ele injetar no ´dbd32.exe´ e no ´calc.exe´??

É isso aí...

Marcos Salles escreveu: ta . mas a injeçao poderia continuar via explorer.exe ... O que o Nildo quer dizer é que vc pode injetar em vários processos, bastando chamar para cada um a função de ´injeção´. Código: InjetaNoProcess(´explorer.exe´); InjetaNoProcesso(´notepad.exe´); InjetaNoProcess(´mspaint.exe´);


engraçado , foi a primeira coisa que eu fiz.. mas não deu certo Michael

pesei que fosse receber a mensagem fazendo simplesmente assim assim

BmsRemoteLoadLibrary(BmsGetProcessID(´notpad.exe´), ExtractFilePath(ParamStr(0)) + ´CPHook.dll´);


mas não acontece nada :cry: :cry: :cry:


GOSTEI 0
Nildo

Nildo

23/02/2006

Não é notpad.exe, é NOTEPAD


GOSTEI 0
Michael

Michael

23/02/2006

[quote:0c2e8c334a=´Marco Salles´]engraçado , foi a primeira coisa que eu fiz.. mas não deu certo [b:0c2e8c334a]Michael[/b:0c2e8c334a][/quote:0c2e8c334a]

Wohoo! :D

[quote:0c2e8c334a=´Marcos Salles´]pesei que fosse receber a mensagem fazendo simplesmente assim assim

BmsRemoteLoadLibrary(BmsGetProcessID(´notpad.exe´), ExtractFilePath(ParamStr(0)) + ´CPHook.dll´);


mas não acontece nada :cry: :cry: :cry:[/quote:0c2e8c334a]

Se não me engano, a CPHook.dll contém os callbacks e funções de ´hookagem´ para as API´s CreateProcessA/W, certo? Se não aconteceu nada é pq os processos hookados não chamaram estas rotinas. Acredito que a calculadora (calc.exe), por exemplo, não invoque essa API.

O que exatamente vc quer fazer ao ´injetar´ a DLL em mais de um processo?

[]´s


GOSTEI 0
Marco Salles

Marco Salles

23/02/2006

o que eu quero por exemplo , e proteger um executavel...

Quando ele for acionado que apareça o formulario Aviso

em vez de ser qualquer programa via explorer , quero que este processo so aconteça com alguns

por exemplo , toda vez que o calc.exe for acionado que apareça o formulario aviso


GOSTEI 0
Michael

Michael

23/02/2006

[quote:6da149f510=´Marco Salles´]o que eu quero por exemplo , e proteger um executavel...

Quando ele for acionado que apareça o formulario Aviso

em vez de ser qualquer programa via explorer , quero que este processo so aconteça com alguns

por exemplo , toda vez que o calc.exe for acionado que apareça o formulario aviso[/quote:6da149f510]
Bom, a primeira coisa que vou te dizer é o que o [b:6da149f510]Nildo [/b:6da149f510]falou: aprofunde mais seus conhecimentos sobre API Hooking. Leia novamente os artigos que estão aí com vc, e aguarde a edição 70 da revista. Nela vc vai ver como fazer o que vc quer.

Agora, vc não deve injetar a DLL nos processos que quer impedir de executar. Quem inicia o Notepad, por exemplo, não é ele mesmo, e sim o Windows. É por isso que injetamos no [b:6da149f510]explorer.exe[/b:6da149f510] - que é sinônimo de shell do Windows.

Se quiser quem um arquivo específico seja bloqueado, então dentro dos callback´s da sua DLL vc vai ter que checar se o nome do executável passado para a API é o que vc quer impedir de bloquear. Se for, então faça [b:6da149f510]Result [/b:6da149f510]retornar [b:6da149f510]False[/b:6da149f510], e de preferência gere algum erro para o sistema operacional (usando [b:6da149f510]SetLastError[/b:6da149f510]).

Veja o primeiro artigo, onde foi mostrado como impedir que arquivos com a string ´ClubeDelphi´ no nome fossem impedidos de serem excluídos. É a mesma coisa.

Na edição 70 vc vai entender melhor isso.

[]´s


GOSTEI 0
Marco Salles

Marco Salles

23/02/2006

show de bola .. Vou esperar a edição 70 e tentyar aqui fazer uma analogia com o exemplo da edição 68

quero agradecer e dizer que todo o conhecimento por mim adquirido mediante voces serão imediatamente repassados para todos da comunidade , como tento sempre , dar o maximo de mim durante esses longos anos que estamos juntos

Muito obrigado


GOSTEI 0
Ricardo_engsoft

Ricardo_engsoft

23/02/2006

Amigos, estou desenvolvendo uma aplicação q fará a transferência de arquvios com base no monitoramento de um determinado diretório.

Para a transferência estou usando sockets (TServerSocket / TClientSocket), mas estou encontrando problemas no momento de transferir os arquivos, que dizer, na hora de monitorar o diretório.

Tentei alguns componentes, mas não tive sucesso. O mais próximo que cheguei foi usando o componente TDirWatch, mas quando eu vou monitorar o diretório sei lá por que uma Thread é iniciada (a thread de controle que eu mesmo disparo), mas para minha surpresa, imediatamente ela é finalizada.

Então revirando minha coleção de revistas Clube Delphi eu vi que é possível usar API Hook para fazer essa monitoração.

Porém os exemplo que eu achei não foram fáceis de se entender. E nisso surge a minha pergunta: como fazer para monitorar um diretório qualquer (que seria selecionado na minha aplicação) e usar API Hooking para fazer o monitoramento desse diretório (e outros subdiretórios dentro desse) de modo a criar um log de operações efetuadas, como por exemplo horário em que um arquivo foi criado, excluido, alterado, etc.

Grato,
Ricardo


GOSTEI 0
POSTAR