日期:2011-03-20 18:14:00 来源:本站整理
<b>Delphi深度摸索之外壳履行操作记录器</b>[Delphi编程]
本文“<b>Delphi深度摸索之外壳履行操作记录器</b>[Delphi编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
记录外壳活动有很多好处,比方当需求监控用户的行为,回溯系统崩溃前的历程.实现这一功效的关键工具相当简单,它就是COM接口IShellExecuteHook.编写一个实现了这一接口的COM对象后,再在系统中注册,便可以简单地掌握并影响Windows外壳的运行.Windows 98和Windows 2000都支持IShellExecuteHook外壳扩大,而在Windows 95和Windows NT 4.0上则必须安装活动桌面扩大后才支持(也就是说必须安装IE 4.01).
一个实现了IShellExecuteHook接口的COM对象可以截获全部对ShellExecute和ShellExecuteEx函数的调用.ShellExecute和ShellExecuteEx函数主要用于履行利用程序,它们可以接纳一个文件名并能自动得到同文件名相关的可履行文件名.此外,它们还支持系统安全认证.假如在NT上设定了用户的可履行权限,ShellExecute和ShellExecuteEx函数将会在成立新的进程前查抄权限(CreateProcess和WinExec函数则没有这项功效).函数调用的流程以下:
(1)得到将要运行的可履行文件名.
(2)按照程序名查抄用户履行权限.
(3)激活全部已注册的IshellExecuteHook扩大.
(4)当全部扩大和权限都赞成履行,成立新的进程并返回.
Windows外壳大量调用ShellExecute和ShellExecuteEx函数来履行几近是全部的资源管理器的操作,比方双击目录、浏览文件夹内容、打印编辑文档、查看文件属性、挑选文档的上下文相关菜单等等.此外,开始菜单的运行对话框和DOS方法下的Start.exe也利用ShellExecuteEx函数来执路程序.简单地说几近用户的全部外壳操作都可以被扩大截获,包含其他利用程序对ShellExecute和ShellExecteEx的调用.
编写外壳活动记录器
首先需求成立一个进程内COM对象,选菜单号令New | ActiveX Library,然后点击菜单New|Com Object,成立COM对象框架,按图2.14填充对话框的内容,然后点击OK按钮.Delphi就会自动生成框架文件,并保存生成的文件.
IShellExecuteHook的接口定义在shlobj.pas单元中,增添shlobj到单元uses部份,然后增添IShellExecuteHooko办法原型到COM对象声明部份,声明部份代码以下:
unit ShellExecuteHookObj; interface uses Windows, ActiveX, ComObj, ShlObj, ShellAPI; type TTShellExecuteHook = class (TComObject, IShellExecuteHook) protected function Execute(var ShellExecuteInfo: TShellExecuteInfo): HResult; stdcall; end; const Class_TShellExecuteHook: TGUID = '{935FA400-243D-11D3-B06E-857B2AE2BE64}'; |
下面就是用来截获并记录外壳操作的实现部份,一旦外壳扩大被注册后,每次ShellExecute 和ShellExecuteEx函数运行时城市调用COM对象的Execute函数.我们的核心代码就是通过Execute办法实现的.办法定义以下:
function TTShellExecuteHook.Execute( var ShellExecuteInfo: TShellExecuteInfo): HResult; |
Execute办法会从外壳得到一个范例为TshellExecuteInfo的参数,参数定义以下:
_SHELLEXECUTEINFOA = record cbSize: DWORD; fMask: ULONG; Wnd: HWND; lpVerb: PAnsiChar; lpFile: PAnsiChar; lpParameters: PAnsiChar; lpDirectory: PAnsiChar; nShow: Integer; hInstApp: HINST; { Optional fields } lpIDList: Pointer; lpClass: PAnsiChar; hkeyClass: HKEY; dwHotKey: DWORD; hIcon: THandle; hProcess: THandle; end; |
这个记录构造中的lpFile包含了要运行的文件名,而lpVerb则表明履行的行动,行动由一些尺度的字符串代表,比方,open(翻开)、print(打印)、edit(编辑)、explore(浏览)、properties(属性)、find(查找)和其他上下文菜单的号令名. 有时,lpFile并不包含可履行文件名,这是因为ShellExecute接到的运行参数是一个文档名.比方当我们在资源管理器中双击文本文件时,Windows用文本文件名作为参数调用ShellExecute函数,而ShellExecute函数则得到同文本文件相关联的可履行文件名,然后履行.
TShellExecuteInfo构造中还记录了要运路程序的很多信息,但是这里我们只能在Execute办法中改正nCmdShow参数,nCmdShow参数定义了窗口在运行后的显示状况,包含最大化、最小化、正常等选项,关于其他参数的改正城市被外壳忽视.除此之外,在Execute办法中可以按照情形答应外壳持续缺省的任务或告诉外壳撤消履行,这可以通过Execute函数的返回值来实现.
假如Execute的返回值为S_FALSE,外壳就持续缺省的任务,假如返回S_OK,则外壳认为扩大已经成功,就不再持续履行了.别的假如返回一个错误代码或系统无法辨认的值,则外壳会弹出错误信息.这给了我们一个掌握程序运行的机会,比方可以限制任何对记事本的调用,代码以下:
function TTShellExecuteHook.Execute(var ShellExecuteInfo: TShellExecuteInfo): HResult; var FileName: String; begin Result := S_FALSE; with ShellExecuteInfo do begin FileName := UpperCase(ExtractFileName(lpFile)); if Pos('NOTEPAD', FileName) = 1 then begin Result := S_OK; hInstApp := 32; MessageBox(Wnd, '不答应记事本运行!', '错误', MB_OK or MB_ICONERROR); end; end; end; |
进一步,我们乃至可以操纵这点实现一个自定义的安全认证机制,按照用户要求限制运行的程序.有爱好的朋友可以试验一下,一定很有意思.
有一点要注意的是,在Execute办法下不能调用ShellExecute和ShellExecuteEx函数外部程序,假如是这样的话,我们的Execute办法又会被新的ShellExecute调用,这样系统就会进入死循环.假如我们确切想在Execute办法中调用外部程序的话,可以利用CreateProcess或WinExec函数来替换.这两个函数不会被ShellExecuteHook截获.
关于外壳行动记录器来说,只要在Execute办法中记录程序信息到日记文件中便可以了,代码非常简单,因为全部需求的信息都在TShellExecuteInfo记录中包含了,这里只记录运行的行动、文件名和时间,需求记录其他信息的话,大家可自行改正,代码表示以下:
function TTShellExecuteHook.Execute( 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; |
以上是“<b>Delphi深度摸索之外壳履行操作记录器</b>[Delphi编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |
评论内容只代表网友观点,与本站立场无关!
评论摘要(共 0 条,得分 0 分,平均 0 分)
查看完整评论