Array
(
)

Erro no Hook da API MoveFileEx

Crash
   - 27 nov 2005

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

#Código

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+


Michael
   - 28 nov 2005

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 Nildo, 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


Nildo
   - 28 nov 2005

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

Falows! um abraço!


Nerdex
   - 28 nov 2005

Michael

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:


Michael
   - 28 nov 2005

Olá NerdeX!

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

I) Apresentação do que é API Hooking, conceitos de como funciona, bibliotecas, callbacks, variáveis next, regras, etc;
II) Introdução a IPC (Inter Process Communication);
III) 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


Crash
   - 28 nov 2005

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.

#Código

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



Nildo
   - 28 nov 2005


Citação:
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.

#Código

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


Crash
   - 28 nov 2005


Citação:
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 Nildo, 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+


Crash
   - 28 nov 2005

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+


Nildo
   - 28 nov 2005


Citação:
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!


Crash
   - 28 nov 2005

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+


Nildo
   - 28 nov 2005


Citação:
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 MoveFileWithProgress funcione?


Crash
   - 28 nov 2005

deu certinho aki.

vlw


t+


Nildo
   - 28 nov 2005


Citação:
deu certinho aki.

vlw


t+


Hookando a MoveFileWithProgress?


Michael
   - 28 nov 2005

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


Crash
   - 29 nov 2005

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+


Crash
   - 29 nov 2005

outra coisa interessante:

Quando o hook esta feito, eu vou no menu de contexto do arquivo (botao direito do mouse) e tudo fica mto lento... o winamp para de tocar e etc.
algumas vezes da um erro estranho qdo tento acessar alguma pasta no explorer.

sabe me informar o q seria?

t+


Nildo
   - 29 nov 2005


Citação:
outra coisa interessante:

Quando o hook esta feito, eu vou no menu de contexto do arquivo (botao direito do mouse) e tudo fica mto lento... o winamp para de tocar e etc.
algumas vezes da um erro estranho qdo tento acessar alguma pasta no explorer.

sabe me informar o q seria?

t+


Sei sim! Essas APIs são constantemente chamadas pelo sistema operacional. Você possui uma função chamada GetDesktopDir. Você chama essa função que acessa o registro cada vez que cair no hook. Você não poderia criar uma variável global, e atribuir o GetDesktopDir a ela logo na inicialização da DLL? Vai economizar muito processamento.

Outra coisa é que você está hookando, por exemplo, a CopyFileW e a CopyFileWEx. Logo, se o explorer chamar a CopyFileW, vai cair em dois de seus callbacks, um seguido do outro, pois a API CopyFileW chama a CopyFileWEx internamente:

[URL=http://img204.imageshack.us/my.php?image=crash5bq.png][img:7ad64d2764]http://img204.imageshack.us/img204/522/crash5bq.th.png[/img:7ad64d2764][/URL]

Então você decide: Ou instala um hook na CopyFileW ou na CopyFileWEx. Essa regra vale para todos as suas APIs com o sufixo EX.

Qualquer coisa estamos aí