如何捕获磁盘上新生成一个文件的消息_第1页
如何捕获磁盘上新生成一个文件的消息_第2页
如何捕获磁盘上新生成一个文件的消息_第3页
如何捕获磁盘上新生成一个文件的消息_第4页
如何捕获磁盘上新生成一个文件的消息_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、以下内容为网上转载文档! 前几天给上级部门的领导修笔记本电脑,中了病毒,重装系统比较费时,就带回家帮她安装。装XP的时候等待的时间很漫长,我就坐在电脑前胡想乱想了: 嘿嘿,她的电脑现在我想装什么都可以呀,我该怎么利用这机会呢?以前每次处调考以后,学校派我到她那里去弄回各个学校的成绩,她总是严格按照她的领导的规定严密封锁成绩,无论我用什么办法她都不肯泄露半点。嘿嘿,要不我在她电脑里装个木马,以后我远程控制她的电脑把成绩弄到? 但是有几个麻烦的地方: 1、她会装杀毒软件把我装的木马杀掉,任何现成的木马都不能保证永远不被查杀。 2、如果正好是在我需要成绩的那几天,她的电脑不上网,我装再好的木马也没用

2、。 因此我想干脆自己写个木马装上吧。这个木马也不需要太多功能,就只需要在她上网的时候,把她电脑里新保存的EXCEL文件自动发送到我的邮箱里就行了。呵呵。我好黑啊! 转念一想,她信任我,把自己的笔记本电脑交给我修,我总不能这么黑心吧?再说了,平时有公开课竞赛课,她也总是给我机会,对我算是很不错,我这么做是不是有点太 呵呵,算了,不能这么做。不过这个木马的思路是不错的,有点冲动要写出来,丢了可惜。只是这些天忙于学校工作以及ASP和网站,没时间写,就暂且把想法先放在blog这里,也许以后用得着。 具体编程思路是这样的: 木马自动开机隐藏运行,通过截获文件操作消息,探测电脑中新建、复制、重命名、修改E

3、XCEL文件的操作,把该文件改名复制一份到隐藏的目录中(避免该文件被删除后成绩文件丢失),并且建立一个log文件记录其文件路径和最新日期,然后不断探测该电脑是否接入因特网,一旦上网,就按照log中的记录把隐藏保存的文件以附件形式发送到我的电子邮箱(反正有1G,可以放n多xls文件),最后在本机删除已经发送的文件及其相应的log记录。 仔细想了想,主要技术有这样几个: 1、自动隐藏运行。这个好说,以前写过这样的代码,无窗口无程序名,都能做到。只有隐藏进程可能麻烦一些。 2、探测文件操作。比较麻烦,需要捕获文件操作消息,没写过这样的代码。 3、探测上网。有很多方法。 4、发送邮件。也不算太麻烦,写

4、过。 最麻烦的地方就是怎么获取新生成一个文件的消息了。但是Windows在删除、复制、移动、访问文件时并不发送消息,因此无法截获。而像杀毒软件那样写Vxd程序截获API又很麻烦,而且我还不会,没写过。到网络上查了半天,找到个这样的,复制在这里保存: 在WIN32下 用DELPHI侦测目录变化,可用WIN32提供的文件改变通知API来完成。FindFirstChangeNotification, FindNextChangeNotification,FindCloseChangeNotification。 在应用程序中调用这些函数时,产生一个监控这个变化的句柄,可用WAIT函数集来等待这个变化。

5、这样,当监控程序运行时,可以达到监控文件变化的动作。更进一步,可把此程序做成一个状态区图标(TRAY)来完成监控。 Windows在删除、复制、移动、访问文件时并不发送消息,当然截获不到。要截取这些操作过程的唯一办法就是截获API,这又需要你编写Vxd程序了,杀毒软件都是这样作的。你注意一下杀毒软件一般都带有一个vxd程序。光有vxd还不行,还需截获文件API。还有另外一个办法,就是CIH病毒采用的办法,直接跳到系统零层去操作。具体办法如下: 一、SIDT指令( 将中断描述符表寄存器IDTR64位宽,1647Bit存有中断描述符表IDT基地址的内容存入指定地址单元)不是特权指令,就是说我们可以

6、在Ring3下执行该指令,获得IDT的基地址,从而修改IDT,增加一个中断门安置我们的中断服务,一旦Ring3程序中产生此中断,VMM就会调用此中断服务程序,而此中断服务程序就运行在Ring0下了。这一点与在DOS下非常相似。 二、要实现对系统中所有文件I/O操作的实时监视,还要用到另一种关键技FileHooking,通过挂接一个处理函数,截获所有与文件I/O操作有关的系 统调用。Windows9x使用32位保护模式可安装文件系统(IFS,由可安装文件系统管理器(IFSManager协调对文件系统和设备的访问,它接收以Win32API函数调用形式向系统发出的文件I/O请求,再将请求转给文件系统

7、驱动程序FSD,由它调用低级别的IOS系统实现最终访问。每个文件I/OAPI调用都有一个特定的FSD函数与之对应,IFSManager负责完成由API到FSD的参数装配工作,在完成文件I/OAPI函数参数的装配之后转相应FSD执行之前,它会调用一个称为FileSystemApiHookFunction的Hooker函数。通过安装自己的Hooker函数,就可以截获系统内所有对文件I/O的API调用,从而实现实时监控。 = procedure TForm1.Button2Click(Sender: TObject; begin establish a notification for file n

8、ame changes on the selected directory NotificationHandle := FindFirstChangeNotification(PChar(DirectoryListBox1.Directory, FALSE,FILE_NOTIFY_CHANGE_FILE_NAME; if the notification was set up correctly, modify some UI elements. if (NotificationHandle INVALID_HANDLE_VALUE then begin Button1.Enabled :=

9、TRUE; Button2.Enabled := FALSE; end else begin .otherwise indicate that there was an error ShowMessage(There was an error setting the notification; Exit; end; end; procedure TForm1.Button1Click(Sender: TObject; var dwResult: DWORD; / holds the result of waiting on the notification Waiting: Boolean;

10、/ loop control variable begin setup the loop control for a continuous loop Waiting := TRUE; indicate that the application is waiting for the change notification to fire Button1.Enabled := FALSE; StatusBar1.SimpleText := Now waiting for a filename change; Application.ProcessMessages; enter the loop w

11、hile Waiting do begin at this point, the application is suspended until the notification object is signaled that a filename change has occured in the selected directory (this includes file deletions dwResult := WaitForSingleObject(NotificationHandle,INFINITE; if (dwResult = WAIT_OBJECT_0 then begin

12、indicate that the notification object was signaled ShowMessage(The selected directory signaled a filename change; query the user to see if they wish to continue monitoring this directory if Application.MessageBox(Do you wish to continue monitoring this directory?, Continue?, MB_ICONQUESTION or MB_YE

13、SNO = IDYES then if the user wishes to continue monitoring the directory, reset the notification object and continue the loop. FindNextChangeNotification(NotificationHandle else .otherwise break out of the loop Waiting := FALSE; end; end; close the notification object FindCloseChangeNotification(Not

14、ificationHandle; reset UI elements Button1.Enabled := FALSE; Button2.Enabled := TRUE; StatusBar1.SimpleText := ; FileListBox1.Update; end; = 下面是一个监视的控件: unit dirnotify; interface uses Windows,Messages,SysUtils,Classes, Graphics,Controls,Forms,Dialogs; type EDirNotificationError = class(Exception; TD

15、irNotify = class; TNotifyFilter = (nfFileName,nfDirName,nfAttributes,nfSize,nfLastWrite, nfSecurity; TNotifyFilters = set of TNotifyFilter; TNotificationThread = class(TThread Owner: TDirNotify; procedure Execute; override; procedure DoChange; end; TDirNotify = class(TComponent private FEnabled: Boo

16、lean; FOnChange: TNotifyEvent; FNotificationThread: TNotificationThread; FPath: String; FWatchSubTree: Boolean; FFilter: TNotifyFilters; procedure SetEnabled( Value: Boolean ; procedure SetOnCh ange( Value: TNotifyEvent ; procedure SetPath( Value: String ; procedure SetWatchSubTree( Value: Boolean ;

17、 procedure SetFilter( Value: TNotifyFilters ; procedure RecreateThread; protected procedure Change; procedure Loaded; override; public constructor Create(AOwner: TComponent; override; destructor Destroy; override; published property Enabled: Boolean read FEnabled write SetEnabled default True; prope

18、rty OnChange: TNotifyEvent read FOnChange write SetOnChange; property Path: String read FPath write SetPath; property WatchSubTree: Boolean read FWatchSubTree write SetWatchSubTree; property Filter: TNotifyFilters read FFilter write SetFilter default nfFileName, nfDirName, nfAttributes, nfLastWrite,

19、 nfSecurity; end; procedure Register; implementation const LASTERRORTEXTLENGTH = 500; var LastErrorText: array 0.LASTERRORTEXTLENGTH of char; function GetLastErrorText: PChar; begin FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM, nil, GetLastError, 0, LastErrorText, LASTERRORTEXTLENGTH, nil ; Result := L

20、astErrorText; end; procedure TNotificationThread.Execute; var h: THandle; nf: Longint; wst: LongBool; begin nf := 0; if (nfFileName in Owner.Filter then nf := FILE_NOTIFY_CHANGE_FILE_NAME; if (nfDirName in Owner.Filter then nf := nf or FILE_NOTIFY_CHANGE_DIR_NAME; if (nfAttributes in Owner.Filter th

21、en nf := nf or FILE_NOTIFY_CHANGE_ATTRIBUTES; if (nfSize in Owner.Filter then nf := nf or FILE_NOTIFY_CHANGE_SIZE; if (nfLastWrite in Owner.Filter then nf := nf or FILE_NOTIFY_CHANGE_LAST_WRITE; if (nfSecurity in Owner.Filter then nf := nf or FILE_NOTIFY_CHANGE_SECURITY; / yeahh, this one is stupid

22、but Win98 malfunctions in any other value than 0 or 1 if Owner.FWatchSubTree then wst := Longbool(1 else wst := Longbool(0; h := FindFirstChangeNotification( Pointer(Owner.Path, wst, nf ; if (h = INVALID_HANDLE_VALUE then raise EDirNotificationError.Create( GetLastErrorText ; repeat if (WaitForSingl

23、eObject( h, 1000 = WAIT_OBJECT_0 then begin Synchronize(DoChange; if not FindNextChangeNotification( h then raise EDirNotificationError.Create( GetLastErrorText ; end; until Terminated; end; procedure TNotificationThread.DoChange; begin Owner.Change; end; constructor TDirNotify.Create(AOwner: TCompo

24、nent; begin inherited Create(AOwner; FEnabled := True; FFilter := nfFileName; end; destructor TDirNotify.Destroy; begin FNotificationThread.Free; inherited Destroy; end; procedure TDirNotify.Loaded; begin inherited; RecreateThread; end; procedure TDirNotify.SetEnabled(Value: Boolean; begin if Value

25、FEnabled then begin FEnabled := Value; RecreateThread; end; end; procedure TDirNotify.SetPath( Value: String ; begin if Value FPath then begin FPath := Value; RecreateThread; end; end; procedure TDirNotify.SetWatchSubTree( Value: Boolean ; begin if Value FWatchSubTree then begin FWatchSubTree := Val

26、ue; RecreateThread; end; end; procedure TDirNotify.SetFilter( Value: TNotifyFilters ; begin if Value FFilter then begin FFilter := Value; RecreateThread; end; end; procedure TDirNotify.SetOnChange(Value: TNotifyEvent; begin FOnChange := Value; end; procedure TDirNotify.Change; begin if Assigned(FOnC

27、hange then FOnChange(Self; end; procedure TDirNotify.RecreateThread; begin / destroy thread FNotificationThread.Free; FNotificationThread := nil; if FEnabled and not(csDesigning in ComponentState and not(csLoading in ComponentState and (FPath then begin / create thread FNotificationThread := TNotifi

28、cationThread.Create(True; FNotificationThread.Owner := self; FNotificationThread.Resume; end; end; procedure Register; begin RegisterComponents(System, TDirNotify; end; end. 还有另外一种办法: 需要用到一个未公开的API函数SHChangeNotifyRegister,看以下例子: 你是否想为你的Windows加上一双眼睛,察看使用者在机器上所做的各种操作(例如建立、删除文件;改变文件或目录名字)呢? 这里介绍一种利用Wi

29、ndows未公开函数实现这个功能的方法。 在Windows下有一个未公开函数SHChangeNotifyRegister可以把你的窗口添加到系统的系统消息监视链中,该函数在Delphi中的定义如下: Function SHChangeNotifyRegister(hWnd,uFlags,dwEventID,uMSG,cItems:LongWord;lpps:PIDLSTRUCT:integer;stdcall;external Shell32.dll index 2; 其中参数hWnd定义了监视系统操作的窗口得句柄,参数uFlags dwEventID定义监视操作参数,参数uMsg定义操作消息

30、,参数cItems定义附加参数,参数lpps指定一个PIDLSTRUCT结构,该结构指定监视的目录。 当函数调用成功之后,函数会返回一个监视操作句柄,同时系统就会将hWnd指定的窗口加入到操作监视链中,当有文件操作发生时,系统会向hWnd发送uMsg指定的消息,我们只要在程序中加入该消息的处理函数就可以实现对系统操作的监视了。 如果要退出程序监视,就 要调用另外一个未公开得函数SHChangeNotifyDeregister来取消程序监视。 下面是使用Delphi编写的具体程序实现范例,首先建立一个新的工程文件,然后在Form1中加入一个Button控件和一个Memo控件, 程序的代码如下:

31、unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,shlobj,Activex; const SHCNE_RENAMEITEM = $1; SHCNE_CREATE = $2; SHCNE_DELETE = $4; SHCNE_MKDIR = $8; SHCNE_RMDIR = $10; SHCNE_MEDIAINSERTED = $20; SHCNE_MEDIAREMOVED = $40; SHCNE_DRIVEREMOVE

32、D = $80; SHCNE_DRIVEADD = $100; SHCNE_NETSHARE = $200; SHCNE_NETUNSHARE = $400; SHCNE_ATTRIBUTES = $800; SHCNE_UPDATEDIR = $1000; SHCNE_UPDATEITEM = $2000; SHCNE_SERVERDISCONNECT = $4000; SHCNE_UPDATEIMAGE = $8000; SHCNE_DRIVEADDGUI = $10000; SHCNE_RENAMEFOLDER =$20000; SHCNE_FREESPACE = $40000; SHC

33、NE_ASSOCCHANGED = $8000000; SHCNE_DISKEVENTS = $2381F; SHCNE_GLOBALEVENTS = $C0581E0; SHCNE_ALLEVENTS = $7FFFFFFF; SHCNE_INTERRUPT = $80000000; SHCNF_IDLIST = 0; / LPITEMIDLIST SHCNF_PATHA = $1; / path name SHCNF_PRINTERA = $2; / printer friendly name SHCNF_DWORD = $3; / DWORD SHCNF_PATHW = $5; / pa

34、th name SHCNF_PRINTERW = $6; / printer friendly name SHCNF_TYPE = $FF; SHCNF_FLUSH = $1000; SHCNF_FLUSHNOWAIT = $2000; SHCNF_PATH = SHCNF_PATHW; SHCNF_PRINTER = SHCNF_PRINTERW; WM_SHNOTIFY = $401; NOERROR = 0; type TForm1 = class(TForm Button1: TButton; Memo1: TMemo; procedure FormClose(Sender: TObj

35、ect; var Action: TCloseAction; procedure Button1Click(Sender: TObject; procedure FormCreate(Sender: TObject; private Private declarations procedure WMShellReg(var Message:TMessage;message WM_SHNOTIFY; public Public declarations end; type PSHNOTIFYSTRUCT=SHNOTIFYSTRUCT; SHNOTIFYSTRUCT = record dwItem

36、1 : PItemIDList; dwItem2 : PItemIDList; end; Type PSHFileInfoByte=SHFileInfoByte; _SHFileInfoByte = record hIcon :Integer; iIcon :Integer; dwAttributes : Integer; szDisplayName : array 0.259 of char; szTypeName : array 0.79 of char; end; SHFileInfoByte=_SHFileInfoByte; Type PIDLSTRUCT = IDLSTRUCT; _

37、IDLSTRUCT = record pidl : PItemIDList; bWatchSubFolders : Integer; end; IDLSTRUCT =_IDLSTRUCT; function SHNot ify_Register(hWnd : Integer : Bool; function SHNotify_UnRegister:Bool; function SHEventName(strPath1,strPath2:string;lParam:Integer:string; Function SHChangeNotifyDeregister(hNotify:integer:

38、integer;stdcall; external Shell32.dll index 4; Function SHChangeNotifyRegister(hWnd,uFlags,dwEventID,uMSG,cItems:LongWord; lpps:PIDLSTRUCT:integer;stdcall;external Shell32.dll index 2; Function SHGetFileInfoPidl(pidl : PItemIDList; dwFileAttributes : Integer; psfib : PSHFILEINFOBYTE; cbFileInfo : Integer; uFlags : Integer:Integer;stdcall; external Shell32.dll name SHGetFileInfoA; var Form1: TForm1; m_hSHNotify:Integer; m_pidlDesktop : PItemIDList; implementation $R *.DFM function SHE

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论