在一些系統,為了特定目的,經常要求程序隱藏起來運行,例如DCS(集散控制系統)中的後台監控系統、木馬控制程序、源碼防拷貝等,以減少被發現、截殺和反匯編的風險。這種功能模塊要求程序在運行期間不僅不會在桌面出現,也不允許被操作者從任務管理器列表中發現。
程序隱形的原理
對於一個隱形程序而言,最基本的要求是:
1.不在桌面出現界面;
2.不在任務欄出現圖標;
3.程序名從任務管理器名單中消失。
對於上述第一點,可以將Form的Visible屬性設為False。
要將圖標從任務欄中屏蔽掉,可以把Form的ShowInTaskBar改為False。
在Windows環境下,可以調用WINAPI函數中的RegisterviceProcess來實現第三個要求。
上述功能,不論用VC、Delphi、VB,還是PB等任何一種高級編程語言都是比較容易實現的。
隱形功能多用於木馬程序,但木馬程序在許多國家和地區是不合法的,為便於理解,本文用VB結合一個程序防拷貝的實例來講解。通過獲取軟件安裝路徑所在磁盤序列號(磁盤ID),用做對合法用戶的判斷。以下程序的目的是用於講解隱形程序的編制和應用,對程序防拷貝內容作了一定程度的簡化。
程序隱形的示例
程序的具體編制操作如下:
1.在VB6.0編程環境中,新建一個工程Project1。
2.在Project1中添加模塊Modulel,在工程屬性中將工程名稱改為HiddenMen,應用程序標題也改為HiddenMen(以下程序都經過實際運行測試,可以原樣復制使用)。
在模塊Module1中加入如下聲明:
->PublicDeclareFunctionGetCurrentProcessIdLib“kernel32”()AsLong
'獲得當前進程ID函數的聲明
PublicDeclareFunctionRegisterServiceProcessLib“kernel32”(ByValProcessIdAsLong,ByValServiceFlagsAsLong)AsLong
'在系統中注冊當前進程ID函數的聲明->
3.在Project1中新建一個窗體Form1,設置Form1的屬性:
->form1.Visible=False
form1.ShowInTaskBar=False->
在代碼窗口添加如下代碼:
->PrivateDeclareFunctionGetDriveTypeLib“kernel32”Alias“GetDriveTypeA”(ByValnDriveAsString)AsLong
'獲得當前驅動器類型函數的聲明
PrivateDeclareFunctionGetVolumeInformationLib“kernel32”Alias“GetVolumeInformationA”(ByVallpRootPathNameAsString,ByVallpVolumeNameBufferAsString,ByValnVolumeNameSizeAsLong,lpVolumeSerialNumberAsLong,lpMaximumComponentLengthAsLong,lpFileSystemFlagsAsLong,ByVallpFileSystemNameBufferAsString,ByValnFileSystemNameSizeAsLong)AsLong
'獲得當前驅動器信息函數的聲明
PrivateSubForm_Load()
Dimdrive_noAsLong,drive_flagAsLong
Dimdrive_chrAsString,drive_diskAsString
Dimserial_noAsLong,kkkAsLong
Dimstemp3AsString,dflagAsBoolean
DimstrlabelAsString,strtypeAsString,strcAsLong
RegisterServiceProcessGetCurrentProcessId,1'從系統中取消當前進程
strlabel=String(255,Chr(0))
strtype=String(255,Chr(0))
stemp3=“172498135”'這是作者C盤的序列號(十進制),讀者可根據自己情況更改。
dflag=False
Fordrive_no=0To25
drive_disk=Chr(drive_no 67)
drive_chr=drive_disk&“:”
drive_flag=GetDriveType(drive_chr)
Ifdrive_flag=3Then
kkk=GetVolumeInformation(drive_chr,strlabel,Len(strlabel),serial_no,0,0,strtype,Len(strtype))'通過GetVolumeInformation獲得磁盤序列號
SelectCasedrive_no
Case0
strc=serial_no
EndSelect
Ifserial_no=stemp3Then
dflag=True
ExitFor
EndIf
EndIf
Nextdrive_no
Ifdrive_no=26Anddflag=FalseThen'非法用戶
GoToerr:
EndIf
MsgBox(“HI,合法用戶!”)
ExitSub
err:
MsgBox(“錯誤!你的C:盤ID號是”&strc)
EndSub
PrivateSubForm_Unload(CancelAsInteger)
RegisterServiceProcessGetCurrentProcessId,0'從系統中取消當前程序的進程
EndSub->
將上述程序代碼編譯後運行,在出現類似“錯誤!你的C盤ID號是172498135”對話框時,按下Ctrl Alt Del鍵,看看程序名叫“HiddenMen”是否在任務管理器名單列表裡。如果把上述程序稍加改動,可以加到自己特定的程序中去。該程序在隱形運行之中,不知不覺就完成了預定功能。
以上程序在簡體中文Windows98和VB6.0環境中調試通過。->