Erro no Hook da API MoveFileEx

27/11/2005

eu tenho a seguinte dll que hooka algumas funcoes da api:

library DllHook;

uses
  MadCodeHook, madStrings, Windows, Registry;

var
  DeleteFileWNext: function(IpFileName: PWideChar): LongBool; stdcall;
  DeleteFileANext: function(IpFileName: PChar): LongBool; stdcall;
  CopyFileWNext: function(ExistingFileName, NewFileName: PWideChar; FalhaSeExist: LongBool): LongBool; stdcall;
  CopyFileANext: function(ExistingFileName, NewFileName: PChar; FalhaSeExist: LongBool): LongBool; stdcall;
  CopyFileExWNext: function(Origem, Destino: PWideChar; Progresso, Data: Pointer; Cancel: PBool; Flags: Cardinal): LongBool; stdcall;
  CopyFileExANext: function(Origem, Destino: PChar; Progresso, Data: Pointer; Cancel: PBool; Flags: Cardinal): LongBool; stdcall;
  CreateFileWNext: function(Arquivo: PWideChar; Acesso, Compartilhado: Cardinal; Seguranca: PSecurityAttributes;
    Disposicao, FlagsAtributos, Template: Cardinal): LongBool; stdcall;
  CreateFileANext: function(Arquivo: PChar; Acesso, Compartilhado: Cardinal; Seguranca: PSecurityAttributes;
    Disposicao, FlagsAtributos, Template: Cardinal): LongBool; stdcall;
  MoveFileWNext: function(Origem, Destino: PWideChar): LongBool; stdcall;
  MoveFileANext: function(Origem, Destino: PChar): LongBool; stdcall;
  MoveFileExWNext: function(Origem, Destino: PWideChar; Flags: Cardinal): LongBool; stdcall;
  MoveFileExANext: function(Origem, Destino: PChar; Flags: Cardinal): LongBool; stdcall;
  CreateDirectoryWNext: function(Pasta: PWideChar; Seguranca: PSecurityAttributes): LongBool; stdcall;
  CreateDirectoryANext: function(Pasta: PChar; Seguranca: PSecurityAttributes): LongBool; stdcall;
  CreateDirectoryExWNext: function(TemplateDir, NovoDir: PWideChar; Segurnca: PSecurityAttributes): LongBool; stdcall;
  CreateDirectoryExANext: function(TemplateDir, NovoDir: PChar; Segurnca: PSecurityAttributes): LongBool; stdcall;

function GetDesktopDir: String;
var
  R: TRegistry;
begin
  R := TRegistry.Create;
  R.RootKey := HKEY_CURRENT_USER;
  R.OpenKey(´Software\MicroSoft\Windows\CurrentVersion\Explorer\Shell Folders´, False);
  Result := R.ReadString(´Desktop´);
  R.Free;
end;

function DeleteFileWCallback(IpFileName: PWideChar): LongBool; stdcall;
begin
  if PosStr(GetDesktopDir, IpFileName) > 0 then
    Result := False
  else
    Result := DeleteFileWNext(IpFileName);
end;

function DeleteFileACallback(IpFileName: PChar): LongBool; stdcall;
begin
  if PosStr(GetDesktopDir, IpFileName) > 0 then
    Result := False
  else
    Result := DeleteFileANext(IpFileName);
end;

function CopyFileWCallback(ExistingFileName, NewFileName: PWideChar; FalhaSeExist: LongBool): LongBool; stdcall;
begin
  if PosStr(GetDesktopDir, NewFileName) > 0 then
    Result := False
  else
    Result := CopyFileWNext(ExistingFileName, NewFileName, FalhaSeExist);
end;

function CopyFileACallback(ExistingFileName, NewFileName: PChar; FalhaSeExist: LongBool): LongBool; stdcall;
begin
  if PosStr(GetDesktopDir, NewFileName) > 0 then
    Result := False
  else
    Result := CopyFileANext(ExistingFileName, NewFileName, FalhaSeExist);
end;

function CopyFileExWCallback(Origem, Destino: PWideChar; Progresso, Data: Pointer; Cancel: PBool; Flags: Cardinal): LongBool; stdcall;
begin
  if PosStr(GetDesktopDir, Destino) > 0 then
    Result := False
  else
    Result := CopyFileExWNext(Origem, Destino, Progresso, Data, Cancel, Flags);
end;

function CopyFileExACallback(Origem, Destino: PChar; Progresso, Data: Pointer; Cancel: PBool; Flags: Cardinal): LongBool; stdcall;
begin
  if PosStr(GetDesktopDir, Destino) > 0 then
    Result := False
  else
    Result := CopyFileExANext(Origem, Destino, Progresso, Data, Cancel, Flags);
end;

function CreateFileWCallback(Arquivo: PWideChar; Acesso, Compartilhado: Cardinal; Seguranca: PSecurityAttributes;
  Disposicao, FlagsAtributos, Template: Cardinal): LongBool; stdcall;
begin
  if PosStr(GetDesktopDir, Arquivo) > 0 then
    Result := False
  else
    Result := CreateFileWNext(Arquivo, Acesso, Compartilhado, Seguranca, Disposicao, FlagsAtributos, Template);
end;

function CreateFileACallback(Arquivo: PChar; Acesso, Compartilhado: Cardinal; Seguranca: PSecurityAttributes;
  Disposicao, FlagsAtributos, Template: Cardinal): LongBool; stdcall;
begin
  if PosStr(GetDesktopDir, Arquivo) > 0 then
    Result := False
  else
    Result := CreateFileANext(Arquivo, Acesso, Compartilhado, Seguranca, Disposicao, FlagsAtributos, Template);
end;

function MoveFileWCallback(Origem, Destino: PWideChar): LongBool; stdcall;
begin
  if (PosStr(GetDesktopDir, Origem) > 0) or (PosStr(GetDesktopDir, Destino) > 0) then
    Result := False
  else
    Result := MoveFileWNext(Origem, Destino);
end;

function MoveFileACallback(Origem, Destino: PChar): LongBool; stdcall;
begin
  if PosStr(GetDesktopDir, Origem) > 0 then
    Result := False
  else
    Result := MoveFileANext(Origem, Destino);
end;

function MoveFileExWCallback(Origem, Destino: PWideChar; Flags: Cardinal): LongBool; stdcall;
begin
  if PosStr(GetDesktopDir, Destino) > 0 then
    Result := False
  else
    Result := MoveFileExWNext(Origem, Destino, Flags);
end;

function MoveFileExACallback(Origem, Destino: PChar; Flags: Cardinal): LongBool; stdcall;
begin
  if PosStr(GetDesktopDir, Destino) > 0 then
    Result := False
  else
    Result := MoveFileExANext(Origem, Destino, Flags);
end;

function CreateDirectoryWCallback(Pasta: PWideChar; Seguranca: PSecurityAttributes): LongBool; stdcall;
begin
  if (PosStr(GetDesktopDir, Pasta) > 0) then
    Result := False
  else
    Result := CreateDirectoryWNext(Pasta, Seguranca);
end;

function CreateDirectoryACallback(Pasta: PWideChar; Seguranca: PSecurityAttributes): LongBool; stdcall;
begin
  if (PosStr(GetDesktopDir, Pasta) > 0) then
    Result := False
  else
    Result := CreateDirectoryWNext(Pasta, Seguranca);
end;

function CreateDirectoryExWCallBack(TemplateDir, NovoDir: PWideChar; Segurnca: PSecurityAttributes): LongBool; stdcall;
begin
  if (PosStr(GetDesktopDir, NovoDir) > 0) then
    Result := False
  else
    Result := CreateDirectoryExWNext(TemplateDir, NovoDir, Segurnca);
end;

function CreateDirectoryExACallBack(TemplateDir, NovoDir: PChar; Segurnca: PSecurityAttributes): LongBool; stdcall;
begin
  if (PosStr(GetDesktopDir, NovoDir) > 0) then
    Result := False
  else
    Result := CreateDirectoryExANext(TemplateDir, NovoDir, Segurnca);
end;

begin
  HookAPI(´kernel32.dll´, ´DeleteFileW´, @DeleteFileWCallback, @DeleteFileWNext);
  HookAPI(´kernel32.dll´, ´DeleteFileA´, @DeleteFileACallback, @DeleteFileANext);
  HookAPI(´kernel32.dll´, ´CopyFileW´, @CopyFileWCallback, @CopyFileWNext);
  HookAPI(´kernel32.dll´, ´CopyFileA´, @CopyFileACallback, @CopyFileANext);
  HookAPI(´kernel32.dll´, ´CopyFileExW´, @CopyFileExWCallback, @CopyFileExWNext);
  HookAPI(´kernel32.dll´, ´CopyFileExA´, @CopyFileExACallback, @CopyFileExANext);
  HookAPI(´kernel32.dll´, ´CreateFileW´, @CreateFileWCallback, @CreateFileWNext);
  HookAPI(´kernel32.dll´, ´CreateFileA´, @CreateFileACallback, @CreateFileANext);
  HookAPI(´kernel32.dll´, ´DeleteFileA´, @DeleteFileACallback, @DeleteFileANext);
  HookAPI(´kernel32.dll´, ´MoveFileW´, @MoveFileWCallback, @MoveFileWNext);
  HookAPI(´kernel32.dll´, ´MoveFileA´, @MoveFileACallback, @MoveFileANext);
  HookAPI(´kernel32.dll´, ´MoveFileExW´, @MoveFileExWCallback, @MoveFileExWNext);
  HookAPI(´kernel32.dll´, ´MoveFileExA´, @MoveFileExACallback, @MoveFileExANext);
  HookAPI(´kernel32.dll´, ´CreateDirectoryW´, @CreateDirectoryWCallback, @CreateDirectoryWNext);
  HookAPI(´kernel32.dll´, ´CreateDirectoryA´, @CreateDirectoryACallback, @CreateDirectoryANext);
  HookAPI(´kernel32.dll´, ´CreateDirectoryExW´, @CreateDirectoryExWCallback, @CreateDirectoryExWNext);
  HookAPI(´kernel32.dll´, ´CreateDirectoryExA´, @CreateDirectoryExACallback, @CreateDirectoryExANext);
end.


essa dll eh pra protecao da pasta do Desktop do windows. Todas as funcoes sao hookadas corretamente e funcionam, somente a funcao MoveFileEx que nao funciona. Ajuda ai...

t+


Crash

Respostas

28/11/2005

Michael

Olá!

Recentemente, para um artigo da revista ClubeDelphi, desenvolvi um aplicativo parecido com o seu, que hooka tbm a API MoveFileEx. Mas tudo funcionou corretamente. Qual teste vc realizou para constatar o não-funcionamento dela?

Falando em API Hooking, tenho uma notícia que vc vai gostar: eu criei um expert para o IDE do Delphi, que gera todo o código da DLL para vc. Basta selecionar quais API´s vc quer hookar, escolher uma biblioteca, configurar alguns parâmetros da DLL e todos os callbacks, variáveis Next e chamadas às funções de hook são geradas. No final basta apenas implementar os callbacks. Pergunta para o [b:5175d94ea6]Nildo[/b:5175d94ea6], ele já viu um vídeo e será um dos beta testers.

Vai estar disponível em breve, no site do Projeto BMS. Acho que vc vai gostar. ;-)

[]´s


Responder Citar

28/11/2005

Nildo

Olá! Como assim o Hook da MoveFileEX nao funciona? Ele não é chamado? Dá erro? Não hooka?

Falows! um abraço!


Responder Citar

28/11/2005

Nerdex

[b:8584763cd6]Michael[/b:8584763cd6]

Este artigo sairá para a próxima edição da revista CD?
Se sim... não perderei esta edição! Será uma das melhores devido a relevância do que é a API Hook?
Gostaria de ter todo este material de primeira qualidade e único, disponível sobre o assunto para eu definitivamente poder entender tudo de uma vez...:

:lol:

Inclusive vídeo e talz...: 8)

E viva o Projeto BMS! ...: :o Aee Nildera! ...: :wink:


Responder Citar

28/11/2005

Michael

Olá NerdeX!

Sim, na próxima edição (68). Eu dividi o artigo em 3 partes:

[b:f288fd172b]I)[/b:f288fd172b] Apresentação do que é API Hooking, conceitos de como funciona, bibliotecas, callbacks, variáveis next, regras, etc;
[b:f288fd172b]II)[/b:f288fd172b] Introdução a IPC (Inter Process Communication);
[b:f288fd172b]III)[/b:f288fd172b] Desenvolvimento passo a passo de uma aplicação completa usando a técnica juntamente com o meu wizard, que, modéstia a parte, ficou muito bom. ;-)

Então, começa na edição 68 e vai até a 71, em janeiro. Vou pedir ao Nildo para colocar o vídeo para donwload no site dele, para vcs poderem ver como funciona.

[]´s


Responder Citar

28/11/2005

Crash

Parece que a funcao nao eh hookada, eu coloquei uma caixa de msg pra aparecer e retirei todo o codigo e nada acontece. O windows executa como se nao tivesse com hook nessa funcao.

function MoveFileExWCallback(Origem, Destino: PWideChar; Flags: Cardinal): LongBool; stdcall; 
begin 
  MessageBox(0, ´Teste´, ´Teste´, MB_OK);
  Result := MoveFileExWNext(Origem, Destino, Flags); 
end;



Responder Citar

28/11/2005

Nildo

Parece que a funcao nao eh hookada, eu coloquei uma caixa de msg pra aparecer e retirei todo o codigo e nada acontece. O windows executa como se nao tivesse com hook nessa funcao.
function MoveFileExWCallback(Origem, Destino: PWideChar; Flags: Cardinal): LongBool; stdcall; 
begin 
  MessageBox(0, ´Teste´, ´Teste´, MB_OK);
  Result := MoveFileExWNext(Origem, Destino, Flags); 
end;


As vezes essa API nem é chamada mesmo! Tenta trocar, ao invéz de usar a MadCodeHook, faz um teste com a BmsAPiHook (é só mudar o nome das funções. A biblioteca vc baixa no meu site www.ProjetoBMS.net) Tenta ver se a função HookApi returna TRUE ou FALSE!

Falows


Responder Citar

28/11/2005

Crash

Olá! Recentemente, para um artigo da revista ClubeDelphi, desenvolvi um aplicativo parecido com o seu, que hooka tbm a API MoveFileEx. Mas tudo funcionou corretamente. Qual teste vc realizou para constatar o não-funcionamento dela? Falando em API Hooking, tenho uma notícia que vc vai gostar: eu criei um expert para o IDE do Delphi, que gera todo o código da DLL para vc. Basta selecionar quais API´s vc quer hookar, escolher uma biblioteca, configurar alguns parâmetros da DLL e todos os callbacks, variáveis Next e chamadas às funções de hook são geradas. No final basta apenas implementar os callbacks. Pergunta para o [b:8f22987ed6]Nildo[/b:8f22987ed6], ele já viu um vídeo e será um dos beta testers. Vai estar disponível em breve, no site do Projeto BMS. Acho que vc vai gostar. ;-) []´s


Pelo que vc ta falando isso vai ser de grande utilidade mesmo... eu tamebem quero ser um beta tester... Eu utilizo mto hook de api e eu sei que demora mto pra olhar os parametros da funcao e escrever o Next e callback. As vezes demora mais do que implementar o Callback. Vo ficar esperando.

vlw e t+


Responder Citar

28/11/2005

Crash

Nildo, Teria alguma chance de vc na proxima versao dessa dll disponibilizar tambem para Delphi 5? Eu testei o delphi 6 e 7 e nao gostei mto por isso ainda uso o 5.

t+


Responder Citar

28/11/2005

Nildo

Nildo, Teria alguma chance de vc na proxima versao dessa dll disponibilizar tambem para Delphi 5? Eu testei o delphi 6 e 7 e nao gostei mto por isso ainda uso o 5. t+


Bom, vou atraz de algum Delphi5 pra poder compilar.
Valeu pela dica!


Responder Citar

28/11/2005

Crash

nildo, com sua biblioteca tambem nao funcionou. testei aki agora e compliei com o delphi 7 e nao funciona. E eu queria saber uma coisa.. essa funcao MoveFileEx eh a que o windows utiliza pra mover um arquivo? Pelo que li no help ela renomeia o arquivo... mais em algumas vezes o windows quando vai mover um arquivo nao simplismente renomeia... exemplo eh qdo vc vai mover um arquivo de uma unidade pra outra.

t+


Responder Citar

28/11/2005

Nildo

nildo, com sua biblioteca tambem nao funcionou. testei aki agora e compliei com o delphi 7 e nao funciona. E eu queria saber uma coisa.. essa funcao MoveFileEx eh a que o windows utiliza pra mover um arquivo? Pelo que li no help ela renomeia o arquivo... mais em algumas vezes o windows quando vai mover um arquivo nao simplismente renomeia... exemplo eh qdo vc vai mover um arquivo de uma unidade pra outra. t+


Não saberei te dizer exatamente em que momento o windows chama essa API, e nem se ela chega a chamar. Talvez não chave, senão deveria cair no CallBack. Mas se não ta caindo, talvez hookando a [b:19dc10286c]MoveFileWithProgress[/b:19dc10286c] funcione?


Responder Citar

28/11/2005

Crash

deu certinho aki.

vlw


t+


Responder Citar

28/11/2005

Nildo

deu certinho aki. vlw t+


Hookando a MoveFileWithProgress?


Responder Citar

28/11/2005

Michael

Tanto para mover qto para renomear um arquivo se usa a(s) mesma(s) API´s. Renomear é mover para a mesma pasta com um nome diferente.

[]´s


Responder Citar

29/11/2005

Crash

foi com o MoveFileWithProgress...


agora soh mais uma perguntinha.

Qdo eu aplico esse hook.. dessa dll ai em cima, eu nao posso fazer nada com os items do desktop a nao ser executar certo? ERRADO. Deve ser alguma coisa q eu fiz errado mais eu nao posso executar nada que esteja no desktop. A minha intencao eh fazer o desktop do windows ficar somente leitura. Vc tem alguma ideia do que pode estar fazendo isso?

t+


Responder Citar