Erro no Hook da API MoveFileEx
27/11/2005
0
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
Posts
28/11/2005
Michael
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
28/11/2005
Nildo
Falows! um abraço!
28/11/2005
Nerdex
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:
28/11/2005
Michael
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
28/11/2005
Crash
function MoveFileExWCallback(Origem, Destino: PWideChar; Flags: Cardinal): LongBool; stdcall; begin MessageBox(0, ´Teste´, ´Teste´, MB_OK); Result := MoveFileExWNext(Origem, Destino, Flags); end;
28/11/2005
Nildo
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
28/11/2005
Crash
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+
28/11/2005
Crash
t+
28/11/2005
Nildo
Bom, vou atraz de algum Delphi5 pra poder compilar.
Valeu pela dica!
28/11/2005
Crash
t+
28/11/2005
Nildo
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?
28/11/2005
Michael
[]´s
29/11/2005
Crash
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+
Clique aqui para fazer login e interagir na Comunidade :)