Fórum Api hook, proteção de arquivo #285326

20/06/2005

0

estou com uma dúvida sobre hook, preciso da ajuda dos colegas.
Nildo, essa eh pra vc, que manja tudo de api hook. Quero hookar a função deletefile da kernel32.dll, afim de mostrar o nome do arquivo que esta sendo deletado num showmessage, e queria que isso funcionasse independente do meu programa estar em foco ou não, ou seja, para o sistem inteiro.

o codigo abaixo está errado, alé de soente funcionar com a funçao deletefile chamada de dentro do programa, dá um access violation estranho, não sei porque. Vc poderia me dar uma luz? estou usando o madshi.

unit protegepasta;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, madcodehook, shellapi, StdCtrls, madremote;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

  DeleteFileNextHookA : function (filename: pchar): longint;
  DeleteFileNextHookW : function (filename: pchar): longint;

  function DeleteFileProcA (filename: pchar): longint;
  function DeleteFileProcW(filename: pchar): longint;


implementation

{$R *.dfm}



function DeleteFileProcW(filename: pchar): longint;
begin
  showmessage(filename);
  result := 0;
end;

function DeleteFileProcA(filename: pchar): longint;
begin
  showmessage(filename);
  result := 0;
end;



procedure TForm1.Button1Click(Sender: TObject);
begin

  HookAPI(´kernel32.dll´, ´DeleteFileA´, @DeleteFileProcA, @DeleteFileNextHookA);

  deletefile(´C:\Documents and Settings\rubio\Desktop\teste\teste.txt´);

end;


Agradeço de antemão!


Vitor Rubio

Vitor Rubio

Responder

Posts

20/06/2005

Nildo

Olá Vitor!
Primeiramente, você pode utilizar a minha biblioteca ( www.ProjetoBMS.net ) :D

Mas vamos ao que interessa, você esqueceu de colocar o STDCALL e também usou VCL dentro do CallBack (não pode!)

O código abaixo deve funcionar:


unit protegepasta;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, madcodehook, shellapi, StdCtrls, madremote;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

  DeleteFileNextHookA : function (filename: pchar): longint; stdcall;
  DeleteFileNextHookW : function (filename: pchar): longint; stdcall;


implementation

{$R *.dfm}


function DeleteFileProcW(filename: pchar): longint; stdcall;
begin
   // Substituimos aqui VCL pela API MessageBox
  MessageBox( 0, filename, ´Atenção´, 0 );
  result := 0;
end;

function DeleteFileProcA(filename: pchar): longint; stdcall;
begin
   // Substituimos aqui VCL pela API MessageBox
  MessageBox( 0, filename, ´Atenção´, 0 );
  result := 0;
end;



procedure TForm1.Button1Click(Sender: TObject);
begin

  HookAPI(´kernel32.dll´, ´DeleteFileA´, @DeleteFileProcA, @DeleteFileNextHookA);

  deletefile(´C:\Documents and Settings\rubio\Desktop\teste\teste.txt´);

end;



Responder

Gostei + 0

20/06/2005

Nildo

E substituindo para que funcione com a minha biblioteca ao invez da do Madshi:

unit protegepasta;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, BmsApiHook, shellapi, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

  DeleteFileNextHookA : function (filename: pchar): longint; stdcall;
  DeleteFileNextHookW : function (filename: pchar): longint; stdcall;


implementation

{$R *.dfm}


function DeleteFileProcW(filename: pchar): longint; stdcall;
begin
   // Substituimos aqui VCL pela API MessageBox
  MessageBox( 0, filename, ´Atenção´, 0 );
  result := 0;
end;

function DeleteFileProcA(filename: pchar): longint; stdcall;
begin
   // Substituimos aqui VCL pela API MessageBox
  MessageBox( 0, filename, ´Atenção´, 0 );
  result := 0;
end;



procedure TForm1.Button1Click(Sender: TObject);
begin

  BmsHookAPI(´kernel32.dll´, ´DeleteFileA´, @DeleteFileProcA, @DeleteFileNextHookA);

  deletefile(´C:\Documents and Settings\rubio\Desktop\teste\teste.txt´);

end;



Responder

Gostei + 0

20/06/2005

Vitor Rubio

Valeu cara, obrigadão mesmo!

faltou stdcall..... burrice minha :$

agora uma duvida: porque funções da vcl não funcionam dentro do callback?

Já estou usando a sua biblioteca ^^

Só mais uma pergunta: fiz hooks para as funções deletefile, movefile e shfileopeation, porém elas só funcionam quando meu programa está em foco, como eu devo fazer para funcionar em todo o windows?

se for via dll, as funções de callback ficam na dll e os hooks no programa principal ou é de outro jeito?

Valew cara!


Responder

Gostei + 0

20/06/2005

Nildo

[quote:a46a87623d=´vitor^_^´]agora uma duvida: porque funções da vcl não funcionam dentro do callback?[/quote:a46a87623d]

Porque os CallBacks são chamados de dentro da DLL que está a API que você chamou, e essa DLL não possui VCL (no caso a Kernel32.dll).

[quote:a46a87623d=´vitor^_^´]Já estou usando a sua biblioteca ^^[/quote:a46a87623d]

:D

[quote:a46a87623d=´vitor^_^´]Só mais uma pergunta: fiz hooks para as funções deletefile, movefile e shfileopeation, porém elas só funcionam quando meu programa está em foco, como eu devo fazer para funcionar em todo o windows?

se for via dll, as funções de callback ficam na dll e os hooks no programa principal ou é de outro jeito?
[/quote:a46a87623d]

Seu CallBack deve estar dentro da DLL, e a chamada para a BmsHookApi deve estar na sua DLL também (entre o Begin e o End). Então, no seu programa, você deve injetar essa DLL nos processos que você quer que o Hook tenha efeito. Na minha biblioteca eu implementei uma rotina que faz isso para você, basta você chamar a

BmsRemoteLoadLibrary( TODOS_PROCESSOS, ´c:\blabla\SuaDLL.dll´ );


Essa DLL vai ser carregada em todo o sistema operacional (todos os processos), inclusive os processos que abrirão futuramente, até que você chame a BmsRemoteUnloadLibrary.


Responder

Gostei + 0

20/06/2005

Massuda

Apenas curiosidade minha...

Teve um post anterior do vitor^_^ sobre como impedir que uma pasta/arquivo seja excluída e porisso imagino que este tópico seja parte de um esquema para evitar a exclusão da pasta/arquivo (ou ao menos para logar que isso aconteceu...).

Já percebi que é impossível determinar se o hook está ou não instalado, mas seria possível criar um outro hook para tapear o hook que evita/loga a exclusão?


Responder

Gostei + 0

20/06/2005

Nildo

Já percebi que é impossível determinar se o hook está ou não instalado, mas seria possível criar um outro hook para tapear o hook que evita/loga a exclusão?


É possível saber;
É possível tapear; :wink:


Responder

Gostei + 0

20/06/2005

Nildo

Para desfazer o Hook eu preciso saber se o mesmo foi Hookado. Eu não uso nenhuma flag pra isso, eu verifico no próprio código da API pra saber se os primeiros bytes foram alterados. Porém, cada biblioteca utiliza um método diferente, o que dificulta a verificação de existencia de Hook. Como fui eu quem construí o método de Instalação do Hook, então fazer a egenharia reversa disso não foi tão dificil. Porém as outras bibliotecas utilizam outros métodos de instação, o que torna quase impossível fazer algo global.

Porém, tudo é feito na memória. Isso é: A DLL que está no HD não foi alterada, logo, se eu soubesse a posição da API na DLL que está no HD (na memória eu pego pelo GetProcAddress), então eu poderia facilmente desfazer qualquer hook de qualquer biblioteca independente do método utilizado. Funcionaria como um Deshookador global, ou um protetor contra Hooks.

Espero que isso tenha respondido sua pergunta, massuda.


Responder

Gostei + 0

20/06/2005

Massuda

Espero que isso tenha respondido sua pergunta, massuda.
Valeu Nildo!


Responder

Gostei + 0

21/06/2005

Vitor Rubio

puxa vida :shock: eu com minhas perguntinhas básicas e modestas sobre hook e os caras vem com antihook? huaahauhauaha

Bom, nildo, desculpa te aborrecer com outra dúvida tão básica, mas, eu queria saber: que função faz o contrário da

BmsRemoteLoadLibrary( TODOS_PROCESSOS,


ou seja, descarrega a biblioteca?

porque qdo eu uso essa função no evento oncreate da form acontece um acces violation e abre aquela janela do debugger com os hexadecimais?

ah! Não se preocupem, não estou fazendo nenhum virus ou coisa parecida, estou apenas fazendo um anti-cunhado, ou anti-irmao-caçula, sabe? seguinte, o que eu quero fazer é: Sempre q o cara mala deleta uma pasta com certo nome, a pasta ao invés de ser deletada é movida pra dentro de outra pasta oculta e do sistema, e essa pasta, se ele tentar deletar, vai receber uma mensagem dizendo que esta pasta é uma pasta importantíssima do windows e não pode ser deletada, senão comprometerá o funcionamento do sistema...... hehe, é só uma bricadeira pra eu aprender um pouco mesmo.

Mas o mala não pode perceber que os arquivos não estão sendo deletados como ele gostaria que fosse, e nem pode visualizar a pasta secreta. Pesquisei por hooks porque, como o massuda disse, eu tinha postado essa dúvida antes e me mandaram pesquisar hooks :shock: até 2 dias atrás eu nem sabia conceitualmente o que era isso... mas toda vez que eu pergunto sobre isso pra alguém, esse alguém me pergunta: ´o que vc pretende com isso?´ ....... afinal, o que há de tão místico nos hooks? huahauaha
[/code]


Responder

Gostei + 0

21/06/2005

Nildo

[quote:ab2aaa2f70=´vitor^_^´]
BmsRemoteLoadLibrary( TODOS_PROCESSOS,


ou seja, descarrega a biblioteca?[/quote:ab2aaa2f70]

BmsRemoteUnloadLibrary( TODOS_PROCESSOS


porque qdo eu uso essa função no evento oncreate da form acontece um acces violation e abre aquela janela do debugger com os hexadecimais?


Qual seu sistema operacional? Delphi? Service pack? Voce pode me mandar seu projeto pra eu dar uma verificada? O fonte do EXE e da DLL para bruno@projetobms.net

Té +


Responder

Gostei + 0

21/06/2005

Nerdex

procedure TForm1.Button1Click(Sender: TObject); 
begin 

  BmsHookAPI(´kernel32.dll´, ´DeleteFileA´, @DeleteFileProcA, @DeleteFileNextHookA); 

  deletefile(´C:\Documents and Settings\rubio\Desktop\teste\teste.txt´); 

end;


Olá ... Eu estou começando com o Hook agora ... e, eu reparei neste exemplo que a ´ação´ de deletar o arquivo, parte da própria aplicação, onde recebe a notificação pela APIHook ... tudo bem...

No meu caso ... desejo capturar uma notificação externa a aplicação (acredito que seja este o real objetivo do pacote). Enfim ... gostaria de um exemplo que eu recebesse a notificação automaticamente de um arquivo que alguém deletou pelo WinExplorer ... por exemplo.

Já fiz testes numa rede interna ... e não obtive resultados ...


Responder

Gostei + 0

21/06/2005

Nildo

Olá ... Eu estou começando com o Hook agora ... e, eu reparei neste exemplo que a ´ação´ de deletar o arquivo, parte da própria aplicação, onde recebe a notificação pela APIHook ... tudo bem... No meu caso ... desejo capturar uma notificação externa a aplicação (acredito que seja este o real objetivo do pacote). Enfim ... gostaria de um exemplo que eu recebesse a notificação automaticamente de um arquivo que alguém deletou pelo WinExplorer ... por exemplo. Já fiz testes numa rede interna ... e não obtive resultados ...


Olá NerdeX, vou desenvolver então um outro aplicativo de demonstração onde notifique o executável sobre as exclusões e permite que o usuário possa bloquear ou não. Assim que terminar eu coloco aqui o Link para baixar.

Obrigado!


Responder

Gostei + 0

21/06/2005

Nildo

Olá NerdeX, vou desenvolver então um outro aplicativo de demonstração onde notifique o executável sobre as exclusões e permite que o usuário possa bloquear ou não. Assim que terminar eu coloco aqui o Link para baixar. Obrigado!


Ok NerdeX, finalizei o Demo. Porém descobri um bugzinho na biblioteca e amanhã de manhã eu vou disponibilizar a atualização da biblioteca e também o novo aplicativo de demonstração.

Um abraço!


Responder

Gostei + 0

22/06/2005

Nildo

NerdeX, finalizei a demonstração, o código-fonte com os binários podem ser encontrados aqui:

http://www.projetobms.net/downloads.php?id=8

E por favor, atualize a biblioteca antes de utilizar:

http://www.projetobms.net/downloads.php?id=1

Um abraço, e espero que funcione hehehehe


Responder

Gostei + 0

22/06/2005

Vitor Rubio

Oi nildo, desculpe a demora^^

Fiz ums modificações no meu código pra ficar mais simples, estou hookando a api shFileOperation, para impedira que uma pasta seja deletada pelo explore, e ao invés disso seja movida para outra pasta, assim o usuario que tentou deletar vai pensar que foi deletado mesmo.

Abaixo vai o código da minha dll

library protegeDll;

uses
  SysUtils,
  Classes,
  shellapi,
  windows,
  bmsapihook;

var
  FileOperationNextHookA: function(op: _SHFILEOPSTRUCTA): dword; stdcall;
  FileOperationNextHookW: function(op: _SHFILEOPSTRUCTW): dword; stdcall;


function FileOperationHookProcA(op: _SHFILEOPSTRUCTA): dword;
begin
  if extractfilename(op.pFrom) = ´zica´ then
  begin
    op.pTo := ´c:\temp\zica´;
    if op.wFunc = fo_delete then
      op.wFunc := FO_MOVE;
    MessageBox(0, op.pFrom, ´Atenção´, 0);
  end;
  result := SHFileOperation(op);
end;

function FileOperationHookProcW(op: _SHFILEOPSTRUCTW): dword;
begin
  if extractfilename(op.pFrom) = ´zica´ then
  begin
    op.pTo := ´c:\temp\zica´;
    if op.wFunc = fo_delete then
      op.wFunc := FO_MOVE;
    MessageBox(0, pchar(op.pFrom), ´Atenção´, 0);
  end;
  result := SHFileOperationW(op);
end;


{$R *.res}

begin
  bmsHookAPI(´shell32.dll´, ´SHFileOperationA´, @FileOperationHookProcA,
    @FileOperationNextHookA);
  bmsHookAPI(´shell32.dll´, ´SHFileOperationW´, @FileOperationHookProcW,
    @FileOperationNextHookW);

end.



Agora, o código do programa, com o loadLibrary no oncreate

procedure TForm1.FormCreate(Sender: TObject);
begin
  BmsRemoteLoadLibrary( TODOS_PROCESSOS, pathexe+´protegeDll.dll´);
end;


Seguinte: se eu dou um run pra debugar o projeto, abre aquela tela que eu falei, se eu compilo depois executo, dá um erro de buffer overflow ou coisa parecida.

Será que é o mesmo problema do nerdex?


Responder

Gostei + 0

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

Aceitar