2011-07-01 19 views
2

CreateFile用のフックを作成しようとしていますので、プロセスがファイルを作成しようとしたとき 作成したhookdllは「このプロセスxx.exeはxx.exeを作成しようとしていますか? proceceedしたいですか?CreateFile Hook

は、これまでのところ私はここにいるので、私はこのコードに変更する必要は何:

library CreateFileHook; 

uses 
Windows, Dialogs, SysUtils; 

type 
OldCode = packed record 
One: dword; 
two: word; 
end; 

far_jmp = packed record 
PuhsOp: byte; 
PushArg: pointer; 
RetOp: byte; 
end; 

var 
    JmpCfw, JmpCfa: far_jmp; 
    OldCfw, OldCfa: OldCode; 
    CfwAdr, CfaAdr: pointer; 

function NewCreateFileA(lpFileName: PChar; 
         dwDesiredAccess: DWORD; 
         dwShareMode: DWORD; 
         lpSecurityAttributes: PSecurityAttributes; 
         dwCreationDisposition: DWORD; 
         dwFlagsAndAttributes: DWORD; 
         hTemplateFile: THandle): THandle; stdcall; 
var 
    file_name: PWideChar; 
    name_len: dword; 
begin 
    name_len := lstrlen(lpFileName) * SizeOf(WideChar) + 2; 
    GetMem(file_name, name_len); 
    StringToWideChar(lpFileName, file_name, name_len); 

    CreateFileW(file_name, dwDesiredAccess, dwShareMode, lpSecurityAttributes, 
       dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile); 

    FreeMem(file_name); 
end; 

function TrueCreateFileW(lpFileName: PWideChar; 
         dwDesiredAccess: DWORD; 
         dwShareMode: DWORD; 
         lpSecurityAttributes: PSecurityAttributes; 
         dwCreationDisposition: DWORD; 
         dwFlagsAndAttributes: DWORD; 
         hTemplateFile: THandle): THandle; stdcall; 
var 
Written: dword; 
begin 
WriteProcessMemory(INVALID_HANDLE_VALUE, CfwAdr, 
        @OldCfw, SizeOf(OldCode), Written); 

CreateFileW(lpFileName, 
      dwDesiredAccess, 
      dwShareMode, 
      lpSecurityAttributes, 
      dwCreationDisposition, 
      dwFlagsAndAttributes, 
      hTemplateFile); 

WriteProcessMemory(INVALID_HANDLE_VALUE, CfwAdr, 
        @JmpCfw, SizeOf(far_jmp), Written); 
end; 

function NewCreateFileW(lpFileName: PWideChar; 
         dwDesiredAccess: DWORD; 
         dwShareMode: DWORD; 
         lpSecurityAttributes: PSecurityAttributes; 
         dwCreationDisposition: DWORD; 
         dwFlagsAndAttributes: DWORD; 
         hTemplateFile: THandle): THandle; stdcall; 
begin 
TrueCreateFileW(lpFileName, 
       dwDesiredAccess, 
       dwShareMode, 
       lpSecurityAttributes, 
       dwCreationDisposition, 
       dwFlagsAndAttributes, 
       hTemplateFile); 
end; 

Procedure SetHook(); 
var 
    kernel32: dword; 
    Bytes: dword; 
begin 
    kernel32 := GetModuleHandle('Kernel32.dll'); 
    CfwAdr := GetProcAddress(kernel32, 'CreateFileW'); 
    CfaAdr := GetProcAddress(kernel32, 'CreateFileA'); 
    ReadProcessMemory(INVALID_HANDLE_VALUE, CfwAdr, @OldCfw, SizeOf(OldCode), Bytes); 
    ReadProcessMemory(INVALID_HANDLE_VALUE, CfaAdr, @OldCfa, SizeOf(OldCode), Bytes); 
    JmpCfw.PuhsOp := $68; 
    JmpCfw.PushArg := @NewCreateFileW; 
    JmpCfw.RetOp := $C3; 
    JmpCfa.PuhsOp := $68; 
    JmpCfa.PushArg := @NewCreateFileA; 
    JmpCfa.RetOp := $C3; 
    WriteProcessMemory(INVALID_HANDLE_VALUE, CfwAdr, @JmpCfw, SizeOf(far_jmp), Bytes); 
    WriteProcessMemory(INVALID_HANDLE_VALUE, CfaAdr, @JmpCfa, SizeOf(far_jmp), Bytes); 
end; 

Procedure Unhook(); 
var 
Bytes: dword; 
begin 
WriteProcessMemory(INVALID_HANDLE_VALUE, CfaAdr, @OldCfa, SizeOf(OldCode), Bytes); 
WriteProcessMemory(INVALID_HANDLE_VALUE, CfwAdr, @OldCfw, SizeOf(OldCode), Bytes); 
end; 

Function MessageProc(code : integer; wParam : word; 
        lParam : longint) : longint; stdcall; 
begin 
    CallNextHookEx(0, Code, wParam, lparam); 
    Result := 0; 
end; 

Procedure SetGlobalHookProc(); 
begin 
    SetWindowsHookEx(WH_GETMESSAGE, @MessageProc, HInstance, 0); 
    Sleep(INFINITE); 
end; 

Procedure SetGlobalHook(); 
var 
    hMutex: dword; 
    TrId: dword; 
begin 
    hMutex := CreateMutex(nil, false, 'CreateFileHook'); 
    if GetLastError = 0 then 
    CreateThread(nil, 0, @SetGlobalHookProc, nil, 0, TrId) else 
    CloseHandle(hMutex); 
end; 

procedure DLLEntryPoint(dwReason: DWord); 
begin 
case dwReason of 
    DLL_PROCESS_ATTACH: begin 
         SetGlobalHook(); 
         Randomize(); 
         SetHook() 
         end; 
    DLL_PROCESS_DETACH: UnHook(); 
end; 
end; 

begin 
    DllProc := @DLLEntryPoint; 
    DLLEntryPoint(DLL_PROCESS_ATTACH); 
end. 
+0

*どのようなプログラム*は* CreateFileを呼び出さないのですか? –

+0

あなたは*あなたがそのコードで変更する必要があると思いますか?どのようにコードはあなたのためにうまくいきませんか? –

+0

Weel、私は、ファイルを作成しようとするたびにファイルの作成を監視したいと思っています。私のプログラムが通知を受け取ると、ユーザにアクションを許可するか許可しないかを尋ねると、FileMonitor source here:http://delphi.about.com/library /code/ncaa030403a.htmしかし、作成できないようにする方法を禁止するファイル!!! –

答えて

1

を一目で、私はこのコードにはいくつかの問題を参照してください。どこからこれを取得しましたか?便利なリファレンスはありませんが、Web上で何をしようとしているのかの実例を見つけることができます。

あなたが修正しようとしているプロセスの中にあるので、Read/WriteProcessMemoryを使う必要はありません.Windowsはあなたのためにコピーライトを行います。

Read/WriteProcessMemoryを使用する必要がある場合、ハンドルを使用する方法はOpenProcessです。

このフックコードはリエントラントではありません。あるスレッドが別のスレッドが呼び出す直前にリダイレクトコードを復元するReadFileを終了している可能性があります。

これを行うよりきれいな方法は、フックしたい関数を指し示すインポートアドレステーブルにポインタを保存し、それを修正してフックルーチンを呼び出すことです。これで、保存されたポインタを使用して、フック内から元のルーチンを呼び出すことができます。

この作業が完了したら、CreateFileの呼び出しをたくさん見てください。 CreateFileは、物理ファイルのほかにたくさんのものを作成/開くために使用されます。 COMポート、パイプ、コンソールバッファなど。

+0

なぜ?私はそこにソースがあるFileMonitorsの多くがあるファイルの作成を監視したい:http://delphi.about.com/library/code/ncaa030403a.htm誰も私はソースから作成のためのアクションを許可しないように教えてくれますか? ! –

+0

私は実際にこれをしたことはありませんが、いったん作業フックがあれば、元の関数を呼び出す代わりにINVALID_HANDLE_VALUEを呼び出し元に返す必要があります。 –