Api Hook
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
Michael
23/02/2006
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... ;-)
Marco Salles
23/02/2006
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...
Marco Salles
23/02/2006
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:
Michael
23/02/2006
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
Michael
23/02/2006
[]´s
Marco Salles
23/02/2006
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
Marco Salles
23/02/2006
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:
Michael
23/02/2006
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
Martins
23/02/2006
É 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/02/2006
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
23/02/2006
[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.
Nildo
23/02/2006
Marco Salles
23/02/2006
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:
Nildo
23/02/2006
Michael
23/02/2006
(...)
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
Michael
23/02/2006
[]s
Marco Salles
23/02/2006
o BmsCriaSessaoIPC estou criando no FormCrete do form conforme sugerido
Mas o BmsComunicaIPC este eu nun to vendo na revista :cry: :cry:
Nildo
23/02/2006
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.
Marco Salles
23/02/2006
Michael
23/02/2006
[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
Marco Salles
23/02/2006
estou usando o computador de um amigo que tem o delphi 7.0
Sim , ja achei..
[b:8b2fc498fd]No delphi 7.0 elas não compilam ....[/b:8b2fc498fd]
Michael
23/02/2006
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
Marco Salles
23/02/2006
[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 :
[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
citação de michel
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 ....
Martins
23/02/2006
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.
Michael
23/02/2006
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]´... ;-)
Michael
23/02/2006
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
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:
[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..
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
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
Michael ,
Michael ,
Michael ,
Michael ,
Michael ,
Michael ,
Michael ,
Michael ,
Michael ,
hi , faltou uma : Michael ... Pronto ,agora e so copiar daqui e colar nos proximos post...
Michael
23/02/2006
[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
Marco Salles
23/02/2006
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
Marco Salles
23/02/2006
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] :?: :?: :?:
Nildo
23/02/2006
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´??
Marco Salles
23/02/2006
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...
Nildo
23/02/2006
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.
Michael
23/02/2006
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.
É 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
Martins
23/02/2006
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.
Marco Salles
23/02/2006
--------------------------------------------------------------------------------
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í...
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:
Nildo
23/02/2006
Michael
23/02/2006
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
Marco Salles
23/02/2006
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
Michael
23/02/2006
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
Marco Salles
23/02/2006
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
Ricardo_engsoft
23/02/2006
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