一、什么是Windows服務(wù)
Windows服務(wù)也稱(chēng)為Windows
Service,它是Windows操作系統(tǒng)和Windows網(wǎng)絡(luò)的基礎(chǔ),屬于系統(tǒng)核心的一部分,它支持著整個(gè)Windows的各種操作。諸如DNS客戶(hù)端、打印程序、Windows更新服務(wù)、計(jì)劃任務(wù)、Windows時(shí)間服務(wù)、告警器等服務(wù),它們關(guān)系到機(jī)器能否正確運(yùn)行。如果不能適當(dāng)?shù)毓芾磉@些服務(wù),就會(huì)影響到機(jī)器的正常操作。
一個(gè)服務(wù)首先是一個(gè)Win32可執(zhí)行程序,或者是是rundll32.exe來(lái)運(yùn)行一個(gè).dll的方式形成的進(jìn)程。
跟普通應(yīng)用程序不一樣,如打開(kāi)WORD,有一個(gè)界面出來(lái),但服務(wù)沒(méi)有用戶(hù)界面。也不能通過(guò)直接雙擊運(yùn)行相應(yīng)的.exe程序來(lái)運(yùn)行。那Windows又是如何控制一個(gè)服務(wù)的?
Windows的服務(wù)由更上一級(jí)的services.exe這個(gè)服務(wù)來(lái)管理,由它來(lái)管理,負(fù)責(zé)進(jìn)行服務(wù)的啟動(dòng)、停止、運(yùn)行,暫停等。我們最常用的操作就是通過(guò)Windows的服務(wù)MMC界面來(lái)完成相關(guān)操作。
二、如何刪除Windows服務(wù)
現(xiàn)在的流氓軟件,越來(lái)越多把自己注冊(cè)為一個(gè)服務(wù)。在Hijackthis的掃描日志中,一般會(huì)把非Windows系統(tǒng)的服務(wù)以023的方式列出來(lái),如下面這段:
O23 - 未知 - Service: BKMARKS
[提供傳輸協(xié)議的數(shù)據(jù)安全保護(hù)機(jī)制,有效維護(hù)數(shù)據(jù)傳輸中的安全及完整。] - C:\WINDOWS\SYSTEM32\RUNDLL.EXE
O23 -
未知 - Service: ewido anti-spyware 4.0 guard [ewido anti-spyware 4.0 guard] -
D:\Program Files\ewido anti-spyware 4.0\guard.exe
O23 - 未知 - Service:
KSD2Service [KSD2Service] - C:\WINDOWS\system32\SVCH0ST.exe
對(duì)于這些流氓軟件,需要?jiǎng)h除相關(guān)的.exe文件,使它不能再運(yùn)行,或者直接清除這個(gè)服務(wù)本身,使計(jì)算機(jī)重啟的時(shí)候,它不會(huì)再啟動(dòng)。
刪除的辦法有兩個(gè):
辦法一:
用sc.exe這個(gè)Windows命令
開(kāi)始——運(yùn)行——cmd.exe,然后輸入sc就可以看到了。使用辦法很簡(jiǎn)單:
sc delete "服務(wù)名"
(如果服務(wù)名中間有空格,就需要前后加引號(hào))
如針對(duì)上面的: sc delete KSD2Service
方法二:直接進(jìn)行注冊(cè)表編輯(不推薦)
打開(kāi)注冊(cè)表編輯器,找到下面的鍵值:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services
一般服務(wù)會(huì)以相同的名字在這里顯示一個(gè)主健,直接刪除相關(guān)的鍵值便可。
三、特殊情況
1、如果服務(wù)顯示的是rundll32.exe,并且這個(gè)文件是位于system32目錄下,那么就不能刪除這個(gè)rundll32.exe文件,它是Windows系統(tǒng)的文件。這時(shí)只要清除相關(guān)的服務(wù)就可以了
2、如果一個(gè)服務(wù)刪除了馬上又自動(dòng)建立了,說(shuō)明后臺(tái)有進(jìn)程在監(jiān)視、保護(hù)。需要先在進(jìn)程管理器中殺掉相應(yīng)的進(jìn)程,或者啟動(dòng)后按F8,到安全模式下刪除。
SC用法
我們知道在MStools SDK,也就是在Resource Kit有一個(gè)很少有人知道的命令行軟件,SC.exe,這個(gè)軟件向所有的Windows
NT和Windows
2000要求控制他們的API函數(shù)。我們可以在命令行里通過(guò)對(duì)這些函數(shù)設(shè)定參數(shù)的方式來(lái)設(shè)定他們(API)。SC.exe也可以顯示服務(wù)的狀態(tài),同時(shí)也可以從狀態(tài)結(jié)構(gòu)區(qū)域里重新找到存儲(chǔ)在里面的數(shù)值。它還可以列出遠(yuǎn)程計(jì)算機(jī)的服務(wù)函數(shù)或者是服務(wù)狀況結(jié)構(gòu)。
SC.exe這個(gè)開(kāi)發(fā)工具至少可以比服務(wù)控制面板程序和網(wǎng)絡(luò)命令行界面(net.exe,這個(gè)東西可以告訴你一個(gè)服務(wù)是在運(yùn)行中,還是停止,還是暫停。)這兩個(gè)東西提供更多的細(xì)節(jié)和準(zhǔn)確的信息。雖然上述兩個(gè)東西在正常工作的情況下,對(duì)于完整的調(diào)試是非常好用的,但是如果有新的服務(wù),或者新的代碼被開(kāi)發(fā)出來(lái)的時(shí)候,這兩個(gè)工具提供的信息可能造成誤導(dǎo)。這也就是我們需要用到SC的原因。
下面舉列說(shuō)明,如果在開(kāi)發(fā)階段,你的服務(wù)在掛住在一個(gè)start-pending的時(shí)候,控制面板和net.exe同樣報(bào)告服務(wù)是在運(yùn)行的。但它掛在一個(gè)stop-pending的時(shí)候,net.exe報(bào)告它運(yùn)行,而控制面板著報(bào)告它停止,如果你試著啟動(dòng)它,這是控制面板則會(huì)告訴你這個(gè)服務(wù)正在運(yùn)行。難道這不是很困惑嗎?呵呵!
SC.exe可以讓你詢(xún)問(wèn)服務(wù)的狀況和取出存儲(chǔ)在狀態(tài)結(jié)構(gòu)區(qū)域內(nèi)的數(shù)值,控制面板和net.exe不提供服務(wù)完整的狀況。但是無(wú)論如何,SC程序可以告訴你這個(gè)服務(wù)準(zhǔn)確的情形,同樣也可以給你看最后的checkpoint數(shù)和等待提示。這個(gè)checkpoint,我叫它檢查點(diǎn)(我覺(jué)得他就像一個(gè)程序調(diào)試時(shí)置的斷點(diǎn)),所以我們也可以把看作為一個(gè)調(diào)試工具,因?yàn)樗梢蕴峁┮粋€(gè)關(guān)于在程序停止時(shí)還要沿著初始化繼續(xù)前進(jìn)多久準(zhǔn)確報(bào)告。
SC.exe也可以允許你調(diào)用很多的服務(wù)控制API函數(shù),可以讓你從命令行里改變大量的參數(shù)。這位服務(wù)開(kāi)發(fā)者們提供了很多的優(yōu)勢(shì)。例如,它提供了一個(gè)方便的方式來(lái)創(chuàng)建或者在注冊(cè)表和服務(wù)控制管理數(shù)據(jù)庫(kù)中配置服務(wù)信息。開(kāi)發(fā)者們不需要在手動(dòng)的在注冊(cè)表里單獨(dú)的設(shè)置鍵值來(lái)配置服務(wù),也不用重起機(jī)器來(lái)強(qiáng)迫服務(wù)控制管理數(shù)據(jù)庫(kù)升級(jí)。作為一個(gè)命令很工具,SC.exe可以用來(lái)測(cè)試你自己的系統(tǒng),你可以設(shè)置一個(gè)批處理文件來(lái)使用不同的參數(shù)調(diào)用SC.exe來(lái)控制服務(wù)。這個(gè)很有用,如果你想看看你的服務(wù)不斷的啟動(dòng)和停止,我沒(méi)有試過(guò)哦!讓一個(gè)服務(wù)一下子打開(kāi),一下子關(guān)閉,聽(tīng)上去很不錯(cuò)的。如果你的服務(wù)進(jìn)程里面有多個(gè)進(jìn)程的話(huà),你可以保持一個(gè)進(jìn)程繼續(xù)運(yùn)行不讓它走開(kāi),然后讓另一個(gè)不斷的打開(kāi)在關(guān)閉,還可以尋找一下內(nèi)存缺乏導(dǎo)致不完全清楚的證據(jù)。
下面介紹SC,SC QC,and SC QUERY
SC使用這樣的語(yǔ)法:
1. SC [Servername] command
Servicename [Optionname= Optionvalue]
2. SC [command]
這里使用第一種語(yǔ)法使用SC,使用第二種語(yǔ)法顯示幫助。
下面介紹各種參數(shù)。
Servername
可選擇:可以使用雙斜線(xiàn),如\\myserver,也可以是\\192.168.0.1來(lái)操作遠(yuǎn)程計(jì)算機(jī)。如果在本地計(jì)算機(jī)上操作
就不用添加任何參數(shù)。
Command
下面列出SC可以使用的命令。
config----改變一個(gè)服務(wù)的配置。(長(zhǎng)久的)
continue--對(duì)一個(gè)服務(wù)送出一個(gè)繼續(xù)控制的要求。
control----對(duì)一個(gè)服務(wù)送出一個(gè)控制。
create----創(chuàng)建一個(gè)服務(wù)。(增加到注冊(cè)表中)
delete----刪除一個(gè)服務(wù)。(從注冊(cè)表中刪除)
EnumDepend--列舉服務(wù)的從屬關(guān)系。
GetDisplayName--獲得一個(gè)服務(wù)的顯示名稱(chēng)。
GetKeyName--獲得一個(gè)服務(wù)的服務(wù)鍵名。
interrogate--對(duì)一個(gè)服務(wù)送出一個(gè)詢(xún)問(wèn)控制要求。
pause----對(duì)一個(gè)服務(wù)送出一個(gè)暫停控制要求。
qc----詢(xún)問(wèn)一個(gè)服務(wù)的配置。
query----詢(xún)問(wèn)一個(gè)服務(wù)的狀態(tài),也可以列舉服務(wù)的狀態(tài)類(lèi)型。
start----啟動(dòng)一個(gè)服務(wù)。
stop----對(duì)一個(gè)服務(wù)送出一個(gè)停止的要求。
Servicename
在注冊(cè)表中為service key制定的名稱(chēng)。注意這個(gè)名稱(chēng)是不同于顯示名稱(chēng)的(這個(gè)名稱(chēng)可以用net
start和服務(wù)控制面板看到),而SC是使用服務(wù)鍵名來(lái)鑒別服務(wù)的。
Optionname
這個(gè)optionname和optionvalue參數(shù)允許你指定操作命令參數(shù)的名稱(chēng)和數(shù)值。注意,這一點(diǎn)很重要在操作名稱(chēng)和等號(hào)之間是沒(méi)有空格的。一開(kāi)始我不知道,結(jié)果………………,比如,start=
optionvalue,這個(gè)很重要。
optionvalue可以是0,1,或者是更多的操作參數(shù)名稱(chēng)和數(shù)值對(duì)。
如果你想要看每個(gè)命令的可以用的optionvalue,你可以使用sc command這樣的格式。這會(huì)為你提供詳細(xì)的幫助。
Optionvalue
為optionname的參數(shù)的名稱(chēng)指定它的數(shù)值。有效數(shù)值范圍常常限制于哪一個(gè)參數(shù)的optionname。如果要列表請(qǐng)用sc
command來(lái)詢(xún)問(wèn)每個(gè)命令。
Comments
很多的命令需要管理員權(quán)限,所以我想說(shuō),在你操作這些東西的時(shí)候最好是管理員。呵呵!
當(dāng)你鍵入SC而不帶任何參數(shù)時(shí),SC.exe會(huì)顯示幫助信息和可用的命令。當(dāng)你鍵入SC緊跟著命令名稱(chēng)時(shí),你可以得到一個(gè)有關(guān)這個(gè)命令的詳細(xì)列表。比如,鍵入sc
create可以得到和create有關(guān)的列表。
但是除了一個(gè)命令,sc query,這會(huì)導(dǎo)出該系統(tǒng)中當(dāng)前正在運(yùn)行的所有服務(wù)和驅(qū)動(dòng)程序的狀態(tài)。
當(dāng)你使用start命令時(shí),你可以傳遞一些參數(shù)(arguments)給服務(wù)的主函數(shù),但是不是給服務(wù)進(jìn)程的主函數(shù)。
SC
create
這個(gè)命令可以在注冊(cè)表和服務(wù)控制管理數(shù)據(jù)庫(kù)建立一個(gè)入口。
語(yǔ)法1
sc [servername] create
Servicename [Optionname= Optionvalue]
這里的servername,servicename,optionname,optionvalue和上面的一樣,這里就不多說(shuō)了。這里我們?cè)敿?xì)說(shuō)
明一下optionname和optionvalue。
Optionname--Optionvalue
描述
type=----own, share, interact, kernel, filesys
關(guān)于建立服務(wù)的類(lèi)型,選項(xiàng)值包括驅(qū)動(dòng)程序使用的類(lèi)型,默認(rèn)是share。
start=----boot, system, auto,
demand, disabled
關(guān)于啟動(dòng)服務(wù)的類(lèi)型,選項(xiàng)值包括驅(qū)動(dòng)程序使用的類(lèi)型,默認(rèn)是demand(手動(dòng))。
error=----normal, severe, critical, ignore
當(dāng)服務(wù)在導(dǎo)入失敗錯(cuò)誤的嚴(yán)重性,默認(rèn)是normal。
binPath=--(string)
服務(wù)二進(jìn)制文件的路徑名,這里沒(méi)有默認(rèn)值,這個(gè)字符串是必須設(shè)置的。
group=----(string)
這個(gè)服務(wù)屬于的組,這個(gè)組的列表保存在注冊(cè)表中的ServiceGroupOrder下。默認(rèn)是nothing。
tag=----(string)
如果這個(gè)字符串被設(shè)置為yes,sc可以從CreateService
call中得到一個(gè)tagId。然而,SC并不顯示這個(gè)標(biāo)簽,所
以使用這個(gè)沒(méi)有多少意義。默認(rèn)是nothing
depend=----(space separated string)有空格的字符串。
在這個(gè)服務(wù)啟動(dòng)前必須啟動(dòng)的服務(wù)的名稱(chēng)或者是組。
obj=----(string)
賬號(hào)運(yùn)行使用的名稱(chēng),也可以說(shuō)是登陸身份。默認(rèn)是localsystem
Displayname=--(string)
一個(gè)為在用戶(hù)界面程序中鑒別各個(gè)服務(wù)使用的字符串。
password=--(string)
一個(gè)密碼,如果一個(gè)不同于localsystem的賬號(hào)使用時(shí)需要使用這個(gè)。
Optionvalue
Optionname參數(shù)名稱(chēng)的數(shù)值列表。參考o(jì)ptionname。當(dāng)我們輸入一個(gè)字符串時(shí),如果輸入一個(gè)空的引用這意味著一個(gè)空的字符串將被導(dǎo)入。
Comments
The SC CREATE command performs the operations of the
CreateService API function.
這個(gè)sc create命令執(zhí)行CreateService
API函數(shù)的操作。詳細(xì)請(qǐng)見(jiàn)CreateService。
例1
下面這個(gè)例子在一臺(tái)叫做(\\myserver)的計(jì)算機(jī)上為一個(gè)叫“NewService”的服務(wù)建立的一個(gè)注冊(cè)表登記。
sc \\myserver
create NewService binpath= c:\winnt\system32\NewServ.exe
按照默認(rèn),這個(gè)服務(wù)會(huì)建立一個(gè)WIN32_SHARE_PROCESS使用SERVICE_DEMAND_START啟動(dòng)方式。這將不會(huì)有任何從屬關(guān)系,也將會(huì)按照l(shuí)ocalsystem安全上下關(guān)系來(lái)運(yùn)行。
例2
下面這個(gè)例子將在本地計(jì)算機(jī)上,建立一個(gè)服務(wù),它將會(huì)是一個(gè)自動(dòng)運(yùn)行服務(wù),并且運(yùn)行在他自己的進(jìn)程上。它從屬于TDI組和NetBios服務(wù)上。注意,你必須在從屬中間增加一個(gè)空格的引用。
sc create NewService binpath= c:\winnt\system32\NewServ.exe type= own
start= auto depend= "+TDI Netbios"
例3
服務(wù)開(kāi)發(fā)者可以通過(guò)臨時(shí)改變二進(jìn)制路徑(影像路徑)的方式來(lái)將這個(gè)服務(wù)運(yùn)行在內(nèi)核調(diào)試器的上下關(guān)系中。下面這個(gè)例子就可以讓我們看到如何改變服務(wù)的配置。
sc config NewService binpath= "ntsd -d c:\winnt\system32\Newserv.exe"
這個(gè)例子會(huì)引起服務(wù)控制管理器調(diào)用ntsd.exe使用下例的參數(shù)字符串:
"-d c:\nt\system32\NewServ.exe"
當(dāng)系統(tǒng)裝入newserv.exe時(shí)ntsd將會(huì)轉(zhuǎn)而打斷調(diào)試器,所以斷點(diǎn)可以被設(shè)置在服務(wù)代碼里。
SC QC
這個(gè)SC
QC“詢(xún)問(wèn)配置”命令可以列出一個(gè)服務(wù)的配置信息和QUERY_SERVICE_CONFIG結(jié)構(gòu)。
語(yǔ)法1
sc [Servername]
qc Servicename [Buffersize]
Parameters
servername和servicename前面已經(jīng)介紹過(guò)了,這里不再多說(shuō)。
Buffersize,可選擇的,列出緩沖區(qū)的尺寸。
Comments
SC QC命令顯示了QUERY_SERVICE_CONFIG結(jié)構(gòu)的內(nèi)容。
以下是QUERY_SERVICE_CONFIG相應(yīng)的區(qū)域。
TYPE------dwServiceType
START_TYPE----dwStartType
ERROR_CONTROL----dwErrorControl
BINARY_PATH_NAME--lpBinaryPathName
LOAD_ORDER_GROUP--lpLoadOrderGroup
TAG------dwTagId
DISPLAY_NAME----lpDisplayName
DEPENDENCIES----lpDependencies
SERVICE_START_NAME--lpServiceStartName
例1
下面這個(gè)例子詢(xún)問(wèn)了在上面例子中建立的“NewService”服務(wù)的配置:
sc \\myserver qc
NewService
sc顯示下面的信息:
SERVICE_NAME: NewService
TYPE : 20
WIN32_SHARE_PROCESS
START_TYPE : 3 DEMAND_START
ERROR_CONTROL : 1 NORMAL
BINARY_PATH_NAME : c:\winnt\system32\NewServ.exe
LOAD_ORDER_GROUP :
TAG : 0
DISPLAY_NAME : NewService
DEPENDENCIES :
SERVICE_START_NAME : LocalSystem
NewService有能力和其他的服務(wù)共享一個(gè)進(jìn)程。但是它不是自動(dòng)啟動(dòng)的。二進(jìn)制文件名是NewServ.exe。這個(gè)服務(wù)不依靠與其它的的服務(wù),而且運(yùn)行在lcoalsystem的安全上下關(guān)系中。這些都是調(diào)用QueryServiceStatus基本的返回,如果還需要更多的細(xì)節(jié)屆時(shí),可以看看API函數(shù)文件。
SC QUERY
SC QUERY命令可以獲得服務(wù)的信息。
語(yǔ)法:
sc [Servername]
query { Servicename | Optionname= Optionvalue... }
參數(shù):
servername, servicename, optionname, optionvalue不在解釋。只談一下這個(gè)命令提供的數(shù)值。
Optionname--Optionvalue
Description
type=----driver,
service, all
列舉服務(wù)的類(lèi)型,默認(rèn)是service
state=----active, inactive, all
列舉服務(wù)的狀態(tài),默認(rèn)是active
bufsize=--(numeric value)
列舉緩沖區(qū)的尺寸,默認(rèn)是1024
bytes
ri=----(numeric value)
但開(kāi)始列舉時(shí),恢復(fù)指針的數(shù)字,默認(rèn)是0
Optionvalue
同上。
Comments
SC QUERY命令可以顯示SERVICE_STATUS結(jié)構(gòu)的內(nèi)容。
下面是SERVICE_STATUS結(jié)構(gòu)相應(yīng)的信息:
TYPE------dwServiceType
STATE------dwCurrentState, dwControlsAccepted
WIN32_EXIT_CODE----dwWin32ExitCode
SERVICE_EXIT_CODE--dwServiceSpecificExitCode
CHECKPOINT----dwCheckPoint
WAIT_HINT----dwWaitHint
在啟動(dòng)計(jì)算機(jī)后,使用SC
QUERY命令會(huì)告訴你是否,或者不是一個(gè)啟動(dòng)服務(wù)的嘗試。如果這個(gè)服務(wù)成功啟動(dòng),WIN32_EXIT_CODE區(qū)間會(huì)將會(huì)包含一個(gè)0,當(dāng)嘗試不成功時(shí),當(dāng)它意識(shí)到這個(gè)服務(wù)不能夠啟動(dòng)時(shí),這個(gè)區(qū)間也會(huì)提供一個(gè)退出碼給服務(wù)。
例子
查詢(xún)“NewService"服務(wù)狀態(tài),鍵入:
sc query NewService
顯示一下信息:
SERVICE_NAME: NewService
TYPE : 20
WIN32_SHARE_PROCESS
STATE : 1 STOPPED
(NOT_STOPPABLE,NOT_PAUSABLE,IGNORES_SHUTDOWN)
WIN32_EXIT_CODE : 1077
(0x435)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x0
WAIT_HINT : 0x0
注意,這里存在一個(gè)給這個(gè)服務(wù)的退出碼,即使這個(gè)服務(wù)部不在運(yùn)行,鍵入net helpmsg 1077,將會(huì)得到對(duì)1077錯(cuò)誤信息的說(shuō)明:
上次啟動(dòng)之后,仍未嘗試引導(dǎo)服務(wù)。
所以,這里我想說(shuō)一句,希望大家可以活用net helpmsg,這會(huì)對(duì)你的學(xué)習(xí)有很大的幫助。
下面在對(duì)SC query的命令在說(shuō)明一下:
列舉活動(dòng)服務(wù)和驅(qū)動(dòng)程序狀態(tài),使用以下命令:
sc query
顯示messenger服務(wù),使用以下命令:
sc query messenger
只列舉活動(dòng)的驅(qū)動(dòng)程序,使用以下命令:
sc query type= driver
列舉Win32服務(wù),使用以下命令:
sc query type= service
列舉所有的服務(wù)和驅(qū)動(dòng)程序,使用以下命令:
sc query state= all
用50
byte的緩沖區(qū)來(lái)進(jìn)行列舉,使用以下命令:
sc query bufsize= 50
在恢復(fù)列舉時(shí)使用index=14,使用以下命令:
sc query ri=14
列舉所有的交互式服務(wù),使用以下命令:
sc query type= service type=
interact