GARANTIR DESCONTO

Fórum [Dúvida] Hooking/DLL #311810

05/02/2006

0

Olá, sou novato aqui no fórum, e gostaria de parabenizar pois tem um conteúdo mto bom..

Estou com algumas dúvidas sobre Hooking..
Eu estou querendo fazer uma aplicação que não seje fechada..
Para isso eu precisaria de usar um hook né? No TerminateProcess ou ExitProcess?
Eu preciso criar um DLL pra fazer isso ou só pelo EXE ja dá? E se eu quiser impedir outras aplicações de serem fechadas? Preciso de ter uma DLL ou só EXE?

Gostaria de saber tb, se por exemplo eu tiver q usar DLL, num teria como eu ´acoplar´ a DLL ao EXE e ao executar o programa, ele extrai-se a DLL para uma pasta que eu quisesse e assim usá-la?

Sei que tem uns mágicos do hooking por ae(nildo, michael, etc..) :roll:

Se qlqer um ae puder ajudar eu agradeço...

Vlw!!


Mrmick

Mrmick

Responder

Posts

06/02/2006

Michael

Olá!

Respostas:

1) Vc deve ´hookar´ a API [b:932301d7f7]TerminateProcess[/b:932301d7f7], da [b:932301d7f7]kernel32.dll[/b:932301d7f7]. Veja [url=http://help.madshi.net/HowToUseMadCodeHook.htm]neste link[/url] um exemplo usando a [b:932301d7f7]MadCodeHook[/b:932301d7f7]. Note que vc pode usar a lib do [b:932301d7f7]Nildo [/b:932301d7f7]sem problemas: basta trocar os nomes das funções;

2) O código do hook no EXE só tem efeito sobre ele mesmo. Para interceptar as chamadas à API´s em outros processos vc precisa usar uma DLL e injetá-la no sistema;

3) Vc pode incluir a DLL no executável, extraí-la e injetá-la. Mas, pq faria isso? Apenas para não precisar distribuir o arquivo?

[]´s


Responder

Gostei + 0

06/02/2006

Nildo

Completando a resposta do Michael, se quiser realmente colocar sua DLL no seu exe e extrair na hora da execução, pode se basear nesse meu artigo: http://www.clubedelphi.net/artigos/U_DLLnoDelphi.asp

Falows


Responder

Gostei + 0

06/02/2006

Martins

Pronto [b:6ab3906e33]MrMick[/b:6ab3906e33], o [b:6ab3906e33]Michael [/b:6ab3906e33]e o [b:6ab3906e33]Nildo[/b:6ab3906e33] já postaram as respostas e soluções para o q desejar, quanto ao código, vc poderá discutir tanto aqui quanto no fórum do projetobms.

Boa sorte!!!


Responder

Gostei + 0

06/02/2006

Mrmick

Sem comentários.. mto obrigado á vocês...

Vo dar uma lida, uma fuçada..

Dúvidas vo postar aqui, ok?

Vlw pessoal!

:wink:


Responder

Gostei + 0

06/02/2006

Mrmick

Bom, já estou eu aqui com umas dúvidas hehehe...

Bom, no exemplo lá do madshi, tem essa função:
function ThisIsOurProcess(processHandle: dword) : boolean;
var pid   : dword;
    arrCh : array [0..MAX_PATH] of char;
begin
  pid := ProcessHandleToId(processHandle);
  result := (pid <> 0) and ProcessIdToFileName(pid, arrCh) and
            (PosText(´OurApplication.exe´, arrCh) > 0);
end;


Só que na biblioteca BmsApiHook, não tem o [b:b56d4f8760]ProcessHandleToId[/b:b56d4f8760], [b:b56d4f8760]ProcessIdToFileName[/b:b56d4f8760] e nem o [b:b56d4f8760]PosText[/b:b56d4f8760], ae tipw como eu adaptaria para a biblioteca Bms?

Tava olhando no help e vi que tem a função [b:b56d4f8760]BmsGetProcessID[/b:b56d4f8760], ela poderia substituir a [b:b56d4f8760]ProcessHandleToId[/b:b56d4f8760] né?

Ah, otra coisa fora disso ae, se por exemplo tem uma DLL injetada no explorer.exe, teria como eu fazer um aplicativo pra ´desinjetar´ essa DLL sem fechar ou danificar o explorer.exe ?

Bom, é isso.. Malz ae eu estar incomodando, mas é pq qdo tá se aprendendo é assim mesmo. uma confusão na kbeça.. mto foda..

Vlw ae pessoal!

:wink:


Responder

Gostei + 0

06/02/2006

Nildo

BmsGetProcessID retorna o ID de um processo pelo seu nome.
Entao vc pode verificar assim:

function ThisIsOurProcess(processID: dword) : boolean;
begin
   Result := GetCurrentProcessID = BmsGetProcessID( ´OurApplication.exe´ );
end;


Ah, otra coisa fora disso ae, se por exemplo tem uma DLL injetada no explorer.exe, teria como eu fazer um aplicativo pra ´desinjetar´ essa DLL sem fechar ou danificar o explorer.exe ?


Tem sim!
BmsRemoteUnloadLibrary( BmsGetProcessID( ´explorer.exe´ ), ´c:\suaDLL.dll´ );



Responder

Gostei + 0

06/02/2006

Titanius

Olá nildo, só me intrometendo um pouquinho no assunto..

Tem como eu usar Hook, pra proteger uma pasta? tipo, ninguem acessar ela? se alguem tentar acessar, ele pede uma senha, e se tiver certo libera o acesso?

Se sim, teria como funcionar em modo de seguranca? pois senao cara entra em modo de seguranca e acessa a pasta.. :D

[]s


Responder

Gostei + 0

06/02/2006

Martins

[b:c3f0c20e36]BmsRemoteLoadLibrary - Injeta sua DLL no processo desejado.[/b:c3f0c20e36]
BmsRemoteUnloadLibrary( BmsGetProcessID( ´explorer.exe´ ), ´c:\suaDLL.dll´ );


[b:c3f0c20e36]BmsRemoteUnloadLibrary - Reove a sua DLL do processo.[/b:c3f0c20e36]
BmsRemoteUnloadLibrary( BmsGetProcessID( ´explorer.exe´ ), ´c:\suaDLL.dll´ );



Responder

Gostei + 0

06/02/2006

Mrmick

Poxa, rápido héin??

Tipw, MUITO OBRIGADO! Vlw mesmo! É bom d+ qdo as coisas vão ficando mais claras.. vlw!

Tipw, testei aqui e consigo fechar o programa normalmente.. Não dá erro nem nada pra compilar e Hookar.. mas ele não bloqueia o fechamento do processo..

DLL:
library funcoes;

uses Windows, BmsAPIHook;

var TerminateProcessNext : function (processHandle, exitCode: dword) : bool; stdcall;

function ProcessoProtegido(processID: dword) : boolean;
begin
   Result := GetCurrentProcessID = BmsGetProcessID(´notepad.exe´);
end;

function TerminateProcessCallback(processHandle, exitCode: dword) : bool; stdcall;
begin
  if ProcessoProtegido(processHandle) then begin
    result := false;
    SetLastError(ERROR_ACCESS_DENIED);
  end else
    result := TerminateProcessNext(processHandle, exitCode);
end;

begin
  BmsHookApi(´kernel32.dll´, ´TerminateProcess´, @TerminateProcessCallback, @TerminateProcessNext);
end.


MeuProg:
procedure TForm1.BloqueiaClick(Sender: TObject);
begin
  BmsRemoteLoadLibrary(TODOS_PROCESSOS, ´funcoes.dll´);
  MessageBox(0, ´Bloqueado!´, ´Aviso...´, MB_ICONINFORMATION);
end;

procedure TForm1.DesbloqueiaClick(Sender: TObject);
begin
  BmsRemoteUnloadLibrary(TODOS_PROCESSOS, ´funcoes.dll´);
end;


Tem algo errado?

valewww!!

:D


Responder

Gostei + 0

06/02/2006

Martins

Olá nildo, só me intrometendo um pouquinho no assunto.. Tem como eu usar Hook, pra proteger uma pasta? tipo, ninguem acessar ela? se alguem tentar acessar, ele pede uma senha, e se tiver certo libera o acesso? Se sim, teria como funcionar em modo de seguranca? pois senao cara entra em modo de seguranca e acessa a pasta.. :D []s


Uma ótima pergunta [b:5cf0e57f10]Titanius[/b:5cf0e57f10], acho até q já perguntei algo parecido para o [b:5cf0e57f10]Nildo[/b:5cf0e57f10].


Responder

Gostei + 0

06/02/2006

Nildo

[b:a1d679c9d5]MrMick[/b:a1d679c9d5], a API TerminateProcess não é chamada quando você fecha um processo normalmente.. ela é chamada pelo Gerenciador de processos por exemplo, quando você mata um processo.

Já sobre a função

function ProcessoProtegido(processID: dword) : boolean;
begin
   Result := GetCurrentProcessID = BmsGetProcessID(´notepad.exe´);
end;


não é usado Handle mas sim ID.. Então passar o Handle como parametro não vai ser a mesma coisa que passar um ID. Creio que você deva usar as funções da MadCodeHook para obter o Handle de um ID de um processo.


Responder

Gostei + 0

06/02/2006

Nildo

Olá nildo, só me intrometendo um pouquinho no assunto.. Tem como eu usar Hook, pra proteger uma pasta? tipo, ninguem acessar ela? se alguem tentar acessar, ele pede uma senha, e se tiver certo libera o acesso?


Sim, é só você saber as APIs de acesso a pasta, enumeração de arquivos, e não deixar processar a API caso se trate de sua pasta.

Se sim, teria como funcionar em modo de seguranca? pois senao cara entra em modo de seguranca e acessa a pasta.. :D


Até dá, porém quando você inicia o micro em modo de segurança, nenhum programa que deve inicializar junto com o Windows vai carregar. Então até que o cara não execute seu programa que vai proteger as pastas ele terá acesso.

Sabe o que alguns programas desse tipo fazem? Eles criam um tipo de extensão, exemplo: [b:8789c9a396]*.AAA[/b:8789c9a396]. Então quando você manda proteger uma pasta ele encripta todo o conteúdo da pasta e joga em um unico arquivo com a extensão [b:8789c9a396]*.AAA[/b:8789c9a396], tudo encriptado nesse único arquivo. Esse programa vai e atrela o ícone de uma pasta normal aos arquivos do tipo [b:8789c9a396]*.AAA[/b:8789c9a396]. Dai quando você acessa esse arquivo pelo Windows Explorer, vai executar o programa do cara que pede uma senha e desencripita esse arquivo e cria a pasta com todas as sub-pastas e arquivos que continha nesse arquivo [b:8789c9a396]*.AAA[/b:8789c9a396]. Mas dai fica um problema, você vai ver sua pasta com uma extensão, e isso fica esquisito. Então esse progra

Dai esse arquivo fica totalmente protegido até em modo de segurança, e se o usuário nao tiver o seu programa pra acessar essa pasta, ele nao acessa nunca. Dai se o engraçadinho desinstalar seu programa por pirraça, já era!

Espero que tenha sanado suas dúvidas!

Um abraço!


Responder

Gostei + 0

06/02/2006

Nildo

ma vai e hooka as APIs de enumeração de arquivos (FindFirstFileA/W, FindNextFileA/W, etc) e toda vez que aparecer esse arquivo com a extensão [b:8789c9a396]*.AAA[/b:8789c9a396] ele muda o nome do arquivo (somente na API) pra retornar sem a extensão, e altera os atributos do Record de tipo de arquivo dessas APIs pra identificar que é uma pasta. Hooka também algumas APIs de arquivos e pastas pra fazer com que o Shell identifique que aquele arquivo é uma pasta (só pra mostrar nas listinhas da Shell como sendo pasta).
Responder

Gostei + 0

06/02/2006

Mrmick

Sobre o TerminateProcess eu já tinha uma noção..

Agora sobre o Handle e ID, eu não tinha reparado mto bem nessa função..

Infelizmente tenho que partir por concorrente (Madshi) auhhauhuahu :lol:

Vlw ae, vo ir tentando aki ;)


Responder

Gostei + 0

06/02/2006

Nildo

Infelizmente tenho que partir por concorrente (Madshi) auhhauhuahu :lol:


Hehehehe Sem problemas, sem mágoas :lol:


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar