版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、以下內(nèi)容為網(wǎng)上轉(zhuǎn)載文檔! 前幾天給上級部門的領(lǐng)導修筆記本電腦,中了病毒,重裝系統(tǒng)比較費時,就帶回家?guī)退惭b。裝XP的時候等待的時間很漫長,我就坐在電腦前胡想亂想了: 嘿嘿,她的電腦現(xiàn)在我想裝什么都可以呀,我該怎么利用這機會呢?以前每次處調(diào)考以后,學校派我到她那里去弄回各個學校的成績,她總是嚴格按照她的領(lǐng)導的規(guī)定嚴密封鎖成績,無論我用什么辦法她都不肯泄露半點。嘿嘿,要不我在她電腦里裝個木馬,以后我遠程控制她的電腦把成績弄到? 但是有幾個麻煩的地方: 1、她會裝殺毒軟件把我裝的木馬殺掉,任何現(xiàn)成的木馬都不能保證永遠不被查殺。 2、如果正好是在我需要成績的那幾天,她的電腦不上網(wǎng),我裝再好的木馬也沒用
2、。 因此我想干脆自己寫個木馬裝上吧。這個木馬也不需要太多功能,就只需要在她上網(wǎng)的時候,把她電腦里新保存的EXCEL文件自動發(fā)送到我的郵箱里就行了。呵呵。我好黑啊! 轉(zhuǎn)念一想,她信任我,把自己的筆記本電腦交給我修,我總不能這么黑心吧?再說了,平時有公開課競賽課,她也總是給我機會,對我算是很不錯,我這么做是不是有點太 呵呵,算了,不能這么做。不過這個木馬的思路是不錯的,有點沖動要寫出來,丟了可惜。只是這些天忙于學校工作以及ASP和網(wǎng)站,沒時間寫,就暫且把想法先放在blog這里,也許以后用得著。 具體編程思路是這樣的: 木馬自動開機隱藏運行,通過截獲文件操作消息,探測電腦中新建、復(fù)制、重命名、修改E
3、XCEL文件的操作,把該文件改名復(fù)制一份到隱藏的目錄中(避免該文件被刪除后成績文件丟失),并且建立一個log文件記錄其文件路徑和最新日期,然后不斷探測該電腦是否接入因特網(wǎng),一旦上網(wǎng),就按照log中的記錄把隱藏保存的文件以附件形式發(fā)送到我的電子郵箱(反正有1G,可以放n多xls文件),最后在本機刪除已經(jīng)發(fā)送的文件及其相應(yīng)的log記錄。 仔細想了想,主要技術(shù)有這樣幾個: 1、自動隱藏運行。這個好說,以前寫過這樣的代碼,無窗口無程序名,都能做到。只有隱藏進程可能麻煩一些。 2、探測文件操作。比較麻煩,需要捕獲文件操作消息,沒寫過這樣的代碼。 3、探測上網(wǎng)。有很多方法。 4、發(fā)送郵件。也不算太麻煩,寫
4、過。 最麻煩的地方就是怎么獲取新生成一個文件的消息了。但是Windows在刪除、復(fù)制、移動、訪問文件時并不發(fā)送消息,因此無法截獲。而像殺毒軟件那樣寫Vxd程序截獲API又很麻煩,而且我還不會,沒寫過。到網(wǎng)絡(luò)上查了半天,找到個這樣的,復(fù)制在這里保存: 在WIN32下 用DELPHI偵測目錄變化,可用WIN32提供的文件改變通知API來完成。FindFirstChangeNotification, FindNextChangeNotification,F(xiàn)indCloseChangeNotification。 在應(yīng)用程序中調(diào)用這些函數(shù)時,產(chǎn)生一個監(jiān)控這個變化的句柄,可用WAIT函數(shù)集來等待這個變化。
5、這樣,當監(jiān)控程序運行時,可以達到監(jiān)控文件變化的動作。更進一步,可把此程序做成一個狀態(tài)區(qū)圖標(TRAY)來完成監(jiān)控。 Windows在刪除、復(fù)制、移動、訪問文件時并不發(fā)送消息,當然截獲不到。要截取這些操作過程的唯一辦法就是截獲API,這又需要你編寫Vxd程序了,殺毒軟件都是這樣作的。你注意一下殺毒軟件一般都帶有一個vxd程序。光有vxd還不行,還需截獲文件API。還有另外一個辦法,就是CIH病毒采用的辦法,直接跳到系統(tǒng)零層去操作。具體辦法如下: 一、SIDT指令( 將中斷描述符表寄存器IDTR64位寬,1647Bit存有中斷描述符表IDT基地址的內(nèi)容存入指定地址單元)不是特權(quán)指令,就是說我們可以
6、在Ring3下執(zhí)行該指令,獲得IDT的基地址,從而修改IDT,增加一個中斷門安置我們的中斷服務(wù),一旦Ring3程序中產(chǎn)生此中斷,VMM就會調(diào)用此中斷服務(wù)程序,而此中斷服務(wù)程序就運行在Ring0下了。這一點與在DOS下非常相似。 二、要實現(xiàn)對系統(tǒng)中所有文件I/O操作的實時監(jiān)視,還要用到另一種關(guān)鍵技FileHooking,通過掛接一個處理函數(shù),截獲所有與文件I/O操作有關(guān)的系 統(tǒng)調(diào)用。Windows9x使用32位保護模式可安裝文件系統(tǒng)(IFS,由可安裝文件系統(tǒng)管理器(IFSManager協(xié)調(diào)對文件系統(tǒng)和設(shè)備的訪問,它接收以Win32API函數(shù)調(diào)用形式向系統(tǒng)發(fā)出的文件I/O請求,再將請求轉(zhuǎn)給文件系統(tǒng)
7、驅(qū)動程序FSD,由它調(diào)用低級別的IOS系統(tǒng)實現(xiàn)最終訪問。每個文件I/OAPI調(diào)用都有一個特定的FSD函數(shù)與之對應(yīng),IFSManager負責完成由API到FSD的參數(shù)裝配工作,在完成文件I/OAPI函數(shù)參數(shù)的裝配之后轉(zhuǎn)相應(yīng)FSD執(zhí)行之前,它會調(diào)用一個稱為FileSystemApiHookFunction的Hooker函數(shù)。通過安裝自己的Hooker函數(shù),就可以截獲系統(tǒng)內(nèi)所有對文件I/O的API調(diào)用,從而實現(xiàn)實時監(jiān)控。 = 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; = 下面是一個監(jiān)視的控件: 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函數(shù)SHChangeNotifyRegister,看以下例子: 你是否想為你的Windows加上一雙眼睛,察看使用者在機器上所做的各種操作(例如建立、刪除文件;改變文件或目錄名字)呢? 這里介紹一種利用Wi
29、ndows未公開函數(shù)實現(xiàn)這個功能的方法。 在Windows下有一個未公開函數(shù)SHChangeNotifyRegister可以把你的窗口添加到系統(tǒng)的系統(tǒng)消息監(jiān)視鏈中,該函數(shù)在Delphi中的定義如下: Function SHChangeNotifyRegister(hWnd,uFlags,dwEventID,uMSG,cItems:LongWord;lpps:PIDLSTRUCT:integer;stdcall;external Shell32.dll index 2; 其中參數(shù)hWnd定義了監(jiān)視系統(tǒng)操作的窗口得句柄,參數(shù)uFlags dwEventID定義監(jiān)視操作參數(shù),參數(shù)uMsg定義操作消息
30、,參數(shù)cItems定義附加參數(shù),參數(shù)lpps指定一個PIDLSTRUCT結(jié)構(gòu),該結(jié)構(gòu)指定監(jiān)視的目錄。 當函數(shù)調(diào)用成功之后,函數(shù)會返回一個監(jiān)視操作句柄,同時系統(tǒng)就會將hWnd指定的窗口加入到操作監(jiān)視鏈中,當有文件操作發(fā)生時,系統(tǒng)會向hWnd發(fā)送uMsg指定的消息,我們只要在程序中加入該消息的處理函數(shù)就可以實現(xiàn)對系統(tǒng)操作的監(jiān)視了。 如果要退出程序監(jiān)視,就 要調(diào)用另外一個未公開得函數(shù)SHChangeNotifyDeregister來取消程序監(jiān)視。 下面是使用Delphi編寫的具體程序?qū)崿F(xiàn)范例,首先建立一個新的工程文件,然后在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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025湖南省建筑安全員《C證》考試題庫及答案
- 2025甘肅省建筑安全員-C證(專職安全員)考試題庫
- 2025年山西省建筑安全員A證考試題庫及答案
- XX科技集團開工大吉課件模板
- 班主任工作經(jīng)驗交流52
- 《心理健康案例》課件
- 《撲動及纖顫》課件
- 三年級科學復(fù)習
- 單位人力資源管理制度范文大全十篇
- 單位管理制度展示大全人員管理篇
- 手術(shù)室安全核查制度及流程課件
- 2024-2025學年高中英語選擇性必修 第二冊北師大版(2019)教學設(shè)計合集
- 高標準農(nóng)田跟蹤審計、工程中間計量、變更價格調(diào)整及竣工結(jié)算審核項目 投標方案(技術(shù)方案)
- 感恩節(jié)英文課件
- 慈溪市2024-2025學年四上數(shù)學期末教學質(zhì)量檢測模擬試題含解析
- 人教版小學一年級語文上冊全冊試卷全套含答案
- 2025年高考化學二、三輪復(fù)習策略講座
- 2024-2025學年哈爾濱市平房區(qū)四上數(shù)學期末調(diào)研試題含解析
- 2022年高考數(shù)學試卷(上海)(秋考)(空白卷)
- 山東省濟南市語文小升初2024年模擬試題與參考答案
- 裝配式建筑復(fù)習試題及答案
評論
0/150
提交評論