進一步,我們甚至可以利用這點實現一個自定義的安全認證機制,根據用戶要求限制運行的程序。有興趣的朋友可以試驗一下,一定很有意思。
有一點要注意的是,在Execute方法下不能調用ShellExecute和ShellExecuteEx函數外部程序,如果是這樣的話,我們的Execute方法又會被新的ShellExecute調用,這樣系統就會進入死循環。如果我們確實想在Execute方法中調用外部程序的話,可以使用CreateProcess或WinExec函數來替代。這兩個函數不會被ShellExecuteHook截獲。
對於外殼動作記錄器來說,只要在Execute方法中記錄程序信息到日志文件中就可以了,代碼非常簡單,因為所有需要的信息都在TShellExecuteInfo記錄中包含了,這裡只記錄運行的動作、文件名和時間,需要記錄其他信息的話,大家可自行修改,代碼示意如下:
function TTShellExecuteHook.Execute(
注冊ShellExecuteHook
var ShellExecuteInfo: TShellExecuteInfo): HResult;
var
FileStream: TFileStream;
a:TStringList;
S:string;
begin
Result := S_FALSE;
with ShellExecuteInfo do
begin
FileStream:=TFileStream.Create('c:\shellexecutehook.txt',fmopenwrite);
S:=string(lpVerb)+':'+string(lpFile)+DateTimeToStr(Now)+#13#10;
FileStream.Seek(FileStream.Size,soFromBeginning);
FileStream.Write(PChar(S)^,Length(S));
FileStream.Free;
end;
end;
要想使COM對象被外殼加載,需要在注冊表中注冊一些信息。在下面這個子鍵中添加COM類的GUID及描述字符串後就可以了(描述字符串可以不賦值,但不妨給一個以便於識別)。