惡意代碼分析實(shí)戰(zhàn) 第七章 分析惡意Windows程序

Windows API

Windows總體上使用匈牙利表達(dá)法作為API函數(shù)標(biāo)識(shí)符休傍,表達(dá)式使用前綴命名模式征绎,一個(gè)32位無(wú)符號(hào)整數(shù)的變量或者DWORD,會(huì)以dw開(kāi)頭磨取。
Windows API常見(jiàn)類型見(jiàn)下圖


windows_api.png

句柄

句柄是在操作系統(tǒng)中被打開(kāi)或被創(chuàng)建的項(xiàng)(一個(gè)窗口人柿,進(jìn)程,模塊忙厌,菜單凫岖,文件等)
句柄不能用來(lái)做數(shù)學(xué)操作
我們所能做的只有保存它,并在后續(xù)函數(shù)調(diào)用中使用它來(lái)引用同一個(gè)對(duì)象

文件系統(tǒng)函數(shù)

惡意代碼與系統(tǒng)交互的一個(gè)最常用的方式就是創(chuàng)建或修改文件
獨(dú)特文件名或修改為既有文件名是明顯的基于主機(jī)的感染跡象
文件活動(dòng)可以提示這個(gè)惡意文件在做什么逢净,如果惡意代碼創(chuàng)建的文件保存web瀏覽習(xí)慣哥放,那么這個(gè)軟件可能是間諜軟件;如果這個(gè)文件創(chuàng)建的文件執(zhí)行挖礦操作爹土,那么這個(gè)軟件就可能是挖礦軟件甥雕。

  • CreateFile
    用來(lái)創(chuàng)建和打開(kāi)文件,可打開(kāi)已存在的文件胀茵,管道社露,流,及I/O設(shè)備琼娘,能創(chuàng)建新文件
  • ReadFile和WriteFile
    讀寫文件
  • CreatFileMapping和MapViewOfFile
    從磁盤加載一個(gè)文件到內(nèi)存和返回一個(gè)指向映射的基地址指針(可用來(lái)訪問(wèn)內(nèi)存中的文件)
    Tips:文件映射被普遍用來(lái)復(fù)制windows加載器的功能峭弟。在獲得一個(gè)文件的映射以后,惡意代碼可以解析PE頭轨奄,并對(duì)內(nèi)存中的文件進(jìn)行所有需要的修改孟害,因此使PE文件就像被操作系統(tǒng)加載器加載一樣執(zhí)行起來(lái)。

特殊文件

共享文件

以\serverName\share或\?\serverName\share開(kāi)頭命名的特殊文件挪拟,用來(lái)訪問(wèn)在共享目錄中的目錄或文件

通過(guò)名字空間訪問(wèn)的文件

名字空間可以被認(rèn)為是固定數(shù)目的文件夾挨务,每一個(gè)文件夾中保存不同類型的對(duì)象。底層的名字空間是NT名字空間,以前綴\開(kāi)始谎柄。NT名字空間可以訪問(wèn)所有設(shè)備丁侄,以及所有在NT名字空間中存在的其他名字空間。


以前綴\.\開(kāi)始的Win32設(shè)備名字空間朝巫,經(jīng)常被惡意代碼用來(lái)直接訪問(wèn)物理設(shè)備鸿摇,并且像一個(gè)文件一樣進(jìn)行讀寫操作

使用\Device\PhysicalMemory 來(lái)直接訪問(wèn)物理內(nèi)存,這允許用戶空間程序?qū)懙絻?nèi)核空間中劈猿。這個(gè)技術(shù)已經(jīng)被惡意代碼用來(lái)修改內(nèi)核拙吉,并隱藏用戶空間的程序。

備用數(shù)據(jù)流

備用數(shù)據(jù)流(ADS)特性允許附加數(shù)據(jù)被添加到一個(gè)已存在的NTFS文件中揪荣,相當(dāng)于添加一 個(gè)文件到另外一 文件中筷黔。額外數(shù)據(jù)在列一 個(gè)目錄時(shí)不會(huì)被顯示出來(lái),并且當(dāng)顯示文件內(nèi)容時(shí)也不顯示仗颈;而只有在你訪問(wèn)流時(shí)佛舱,它才是可見(jiàn)的。
ADS數(shù)據(jù)流根據(jù)約定normalFile.txt:Stream:$DATA來(lái)命名挨决,這允許一個(gè)程序去讀寫一個(gè)流请祖。惡意代碼作者喜歡ADS,因?yàn)樗鼙挥脕?lái)隱藏?cái)?shù)據(jù)脖祈。

CTF雜項(xiàng)--隱寫中有相關(guān)內(nèi)容

Windows注冊(cè)表

Windows注冊(cè)表被用來(lái)保存操作系統(tǒng)與程序的配置信息肆捕,它能夠很好的揭示出關(guān)于惡意代碼功能的有關(guān)信息。
注冊(cè)表相關(guān)術(shù)語(yǔ)

  • 根鍵

注冊(cè)表被劃分為稱為根鍵的五個(gè)頂層節(jié)撒犀,有時(shí)術(shù)語(yǔ)HKEY和儲(chǔ)巢也被使用福压。

  • 子鍵

一個(gè)子鍵就像一個(gè)文件夾中的子文件夾

一個(gè)鍵是一個(gè)注冊(cè)表中的文件夾,它可以包含額外的文件夾或鍵值或舞。根鍵個(gè)子鍵都是鍵荆姆。

  • 值項(xiàng)

一個(gè)值項(xiàng)是一個(gè)配對(duì)的名字和值。

  • 值或數(shù)據(jù)

值或數(shù)據(jù)是存儲(chǔ)在注冊(cè)表項(xiàng)中的數(shù)據(jù)映凳。

注冊(cè)表根鍵

regedit.png

打開(kāi)注冊(cè)表編輯器(regedit)就可以看到注冊(cè)表根鍵胆筒。

hkey-classes-root該主關(guān)鍵字包含了有關(guān)的OLE信息,以便在系統(tǒng)工作過(guò)程中實(shí)現(xiàn)對(duì)各種文件和文檔信息的訪問(wèn)诈豌。具體的內(nèi)容有已經(jīng)注冊(cè)的文件擴(kuò)展名仆救、文件類型、文件圖標(biāo)等矫渔。

hkey-current-user(HKCU)是一個(gè)指向HKEY_USERS結(jié)構(gòu)中某個(gè)分支的指針彤蔽,它包含當(dāng)前用戶的登錄信息。實(shí)際上它就是HKEY_USERS\Default下面的一部分內(nèi)容庙洼,如果在HKEY_USERS\Default下面沒(méi)有用戶登錄的其它內(nèi)容顿痪,那么這兩個(gè)主關(guān)鍵字包含的內(nèi)容是完全相同的镊辕。

hkey-local-machine(HKLM)該關(guān)鍵字包含了本地計(jì)算機(jī)(相對(duì)網(wǎng)絡(luò)環(huán)境而言)的硬件和軟件的全部信息。當(dāng)系統(tǒng)的配置和設(shè)置發(fā)生變化時(shí)蚁袭,本關(guān)鍵字下面的登錄項(xiàng)也將隨之改變征懈。

hkey-users 所有登錄用戶的信息。

hkey-current-config這個(gè)關(guān)鍵字實(shí)際上也是指向HKEY_LOCAL _MACHINE\Config結(jié)構(gòu)中的某個(gè)分支的指針揩悄。HKEY_CURRENT_CONFIG下面的子關(guān)鍵字及內(nèi)容與HKEY_LOCAL _MACHINE\Config\0001分支下面的子關(guān)鍵字及內(nèi)容是完全相同的卖哎。本關(guān)鍵字包含的主要內(nèi)容是計(jì)算機(jī)的當(dāng)前配置情況,如顯示器删性、打印機(jī)等可選外部設(shè)備及其設(shè)置信息等亏娜,而且這個(gè)配置信息均將根據(jù)當(dāng)前連接的網(wǎng)絡(luò)類型、硬件配置以及應(yīng)用軟件的安裝不同而有所變化镇匀。

Regedit

注冊(cè)表編輯器(Regedit)照藻,是Windows內(nèi)建的用來(lái)查看和編輯注冊(cè)表的工具袜啃。

regedit2.png

自啟動(dòng)程序

注冊(cè)表以下路徑保存了開(kāi)機(jī)自啟動(dòng)的文件汗侵,經(jīng)常被惡意代碼用來(lái)啟動(dòng)自身

計(jì)算機(jī)\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
autorun.png

向Run子鍵中寫入項(xiàng),可設(shè)置程序自啟動(dòng)
Autoruns工具列舉在操作系統(tǒng)啟動(dòng)時(shí)會(huì)自動(dòng)啟動(dòng)運(yùn)行的代碼

常用注冊(cè)表函數(shù)

惡意代碼常使用一些注冊(cè)表函數(shù)來(lái)操作注冊(cè)表群发,以便可以實(shí)現(xiàn)開(kāi)機(jī)自啟動(dòng)晰韵,下面是常見(jiàn)的注冊(cè)表。

  • RegOpenKeyEx打開(kāi)一個(gè)注冊(cè)表進(jìn)行編輯和查詢熟妓。有些函數(shù)允許你查詢和編輯-一個(gè)注冊(cè)表鍵雪猪,而不用先打開(kāi)它,但是大多數(shù)程序還是會(huì)先使用RegOpenKeyEx起愈。

  • RegSetValueEx添加- -個(gè)新值到注冊(cè)表只恨,并設(shè)置它的數(shù)值。

  • RegGetValue返回注冊(cè) 表中- -個(gè)值項(xiàng)的數(shù)值抬虽。

練習(xí)分析注冊(cè)表操作代碼

reg.png

前四行是參數(shù)官觅,第五行顯示調(diào)用了RegOpenKeyExW修改注冊(cè)表。

使用.reg文件的注冊(cè)表腳本

.reg格式的文件是一種自動(dòng)修改注冊(cè)表的腳本

reg2.png

網(wǎng)絡(luò)API

識(shí)別和理解常見(jiàn)的網(wǎng)絡(luò)函數(shù)阐污,了解惡意代碼都做了什么休涤。

伯克利兼容套接字

網(wǎng)絡(luò)功能在Windows系統(tǒng)中由Winsock庫(kù)實(shí)現(xiàn),主要在ws2_32.dll中

socket.png

WSAStartup函數(shù)必須在其他網(wǎng)絡(luò)函數(shù)之前被調(diào)用
調(diào)試代碼查找網(wǎng)絡(luò)接口時(shí),可在WSAStartup函數(shù)中設(shè)置斷點(diǎn)

網(wǎng)絡(luò)的服務(wù)器和客戶端

一個(gè)網(wǎng)絡(luò)程序通常有兩個(gè)端點(diǎn):服務(wù)器端,它維護(hù)一個(gè)打開(kāi)套接字并等待入站連接:客戶端俩檬,它連接到一個(gè)正在等待的套接字琳钉。而惡意代碼可以是這兩端中的任意一個(gè)。

WinINet API

WinINet比Winsocket更加高級(jí)凿叠,實(shí)現(xiàn)了應(yīng)用層的協(xié)議。

  • InternetOpen 被用來(lái)初始化- -個(gè)到互聯(lián)網(wǎng)的連接。

  • InternetOpenUrl 被用來(lái)訪問(wèn)一個(gè)URL (它可以是一個(gè)HTTP頁(yè)面或-一個(gè)FTP資源)跺涤。

  • InternetReadFile 和ReadFile函數(shù)工作原理相似踱阿,允許程序從-一個(gè)來(lái)自互聯(lián)網(wǎng)的下載文件中讀取數(shù)據(jù)。

跟蹤惡意代碼的運(yùn)行

搞清惡意代碼如何調(diào)用其他代碼執(zhí)行很重要钦铁。

DLL

動(dòng)態(tài)鏈接庫(kù)(英語(yǔ):Dynamic-link library软舌,縮寫為DLL)是微軟公司在windows系統(tǒng)中實(shí)現(xiàn)共享函數(shù)庫(kù)概念的一種實(shí)現(xiàn)方式。這些庫(kù)函數(shù)的擴(kuò)展名是.DLL牛曹、.OCX(包含ActiveX控制的庫(kù))或者.DRV(舊式的系統(tǒng)驅(qū)動(dòng)程序)佛点。

所謂動(dòng)態(tài)鏈接,就是把一些經(jīng)常會(huì)共享的代碼(靜態(tài)鏈接的OBJ程序庫(kù))制作成DLL檔黎比,當(dāng)可執(zhí)行文件調(diào)用到DLL檔內(nèi)的函數(shù)時(shí)超营,Windows操作系統(tǒng)才會(huì)把DLL檔加載存儲(chǔ)器內(nèi),DLL檔本身的結(jié)構(gòu)就是可執(zhí)行檔阅虫,當(dāng)程序有需求時(shí)函數(shù)才進(jìn)行鏈接演闭。通過(guò)動(dòng)態(tài)鏈接方式,存儲(chǔ)器浪費(fèi)的情形將可大幅降低颓帝。靜態(tài)鏈接庫(kù)則是直接鏈接到可執(zhí)行文件米碰。

DLL的文件格式與視窗EXE文件一樣——也就是說(shuō),等同于32位視窗的可移植執(zhí)行文件(PE)和16位視窗的New Executable(NE)购城。作為EXE格式吕座,DLL可以包括源代碼、數(shù)據(jù)和資源的多種組合瘪板。

DLL的最初目的是節(jié)約應(yīng)用程序所需的磁盤和內(nèi)存空間吴趴。在一個(gè)傳統(tǒng)的非共享庫(kù)中,一部分代碼簡(jiǎn)單地附加到調(diào)用的程序上侮攀。如果兩個(gè)程序調(diào)用同一個(gè)子程序锣枝,就會(huì)出現(xiàn)兩份那段代碼。相反兰英,許多應(yīng)用共享的代碼能夠切分到一個(gè)DLL中撇叁,在硬盤上存為一個(gè)文件,在內(nèi)存中使用一個(gè)實(shí)例(instance)箭昵。DLL的廣泛應(yīng)用使得早期的視窗能夠在緊張的內(nèi)存條件下運(yùn)行税朴。

惡意代碼作者如何使用DLL

通常利用以下三種方式使用DLL

  • 保存惡意代碼
  • 通過(guò)使用Windows DLL
  • 通過(guò)使用第三方DLL

基本DLL結(jié)構(gòu)

DLL使用PE文件格式,并且只有一個(gè)單一標(biāo)志家制,指示這個(gè)文件是一個(gè)DLL,而不是一個(gè).exe
DLL經(jīng)常有更多導(dǎo)出函數(shù)正林,并且通常導(dǎo)入函數(shù)較少。
DLL的主函數(shù)是DllMain颤殴。它沒(méi)有標(biāo)記觅廓,而且并不是一個(gè)DLL中的導(dǎo)出函數(shù),但是它在PE頭中被指定為文件的入口點(diǎn)涵但。任何時(shí)候一個(gè)進(jìn)程加載或卸載庫(kù)杈绸,會(huì)創(chuàng)建一個(gè)新線程帖蔓,或一個(gè)已程結(jié)束時(shí),這個(gè)函數(shù)都會(huì)被調(diào)用來(lái)通知DLL瞳脓。這個(gè)通知允許DLL來(lái)管理每個(gè)進(jìn)程或每個(gè)線程的資源存在的線程的資源塑娇。

進(jìn)程

傳統(tǒng)上,惡意代碼有一個(gè)獨(dú)立的進(jìn)程劫侧,但是更新型的惡意代碼普遍將自身代碼作為其他進(jìn)程的一部分執(zhí)行埋酬。

創(chuàng)建一個(gè)新進(jìn)程

惡意代碼最常使用的創(chuàng)建新進(jìn)程函數(shù)是CreateProcess。惡意代碼通常使用CreateProcess,來(lái)創(chuàng)建一個(gè)簡(jiǎn)單的遠(yuǎn)程shell- CreateProcess函數(shù)的一個(gè)參數(shù)烧栋,STARTUPINFO結(jié)構(gòu)写妥,包含一個(gè)進(jìn)程的標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出以及標(biāo)準(zhǔn)錯(cuò)誤流的句柄审姓。一個(gè)惡意程序可以設(shè)置這些值為套接字珍特,這樣當(dāng)這個(gè)程序?qū)懭霕?biāo)準(zhǔn)輸出時(shí),它實(shí)際上會(huì)寫到套接字上魔吐,因而允許一個(gè)攻擊者執(zhí)行遠(yuǎn)程shell,而不需要運(yùn)行除CreateProcess之外的任何函數(shù)扎筒。

惡意代碼經(jīng)常在-一個(gè)程序的資源節(jié)存儲(chǔ)另-一個(gè)程序,并創(chuàng)建- -個(gè)新進(jìn)程画畅。 在第1章中砸琅,我們討論了PE文件的資源節(jié)如何保存任意文件。惡意代碼有時(shí)會(huì)在資源節(jié)中保存另外一個(gè)可執(zhí)行文件轴踱。當(dāng)程序運(yùn)行時(shí),它會(huì)從PE頭中提取附加的可執(zhí)行文件谚赎,將它寫到磁盤上淫僻,然后調(diào)用CreateProcess來(lái)運(yùn)行這個(gè)程序。這也可以通過(guò)DLL程序和其他可執(zhí)行文件完成壶唤。

線程

進(jìn)程是執(zhí)行代碼的容器雳灵,線程才是Windows操作系統(tǒng)真正要執(zhí)行的內(nèi)容。線程是被CPU執(zhí)行的獨(dú)立指令序列闸盔,而不需要等待其他線程悯辙。一個(gè)進(jìn)程包含一個(gè)或多個(gè)線程,它們執(zhí)行進(jìn)程中的一部分代碼迎吵。一個(gè)進(jìn)程中的所有線程共享同樣的內(nèi)存空間躲撰,但是每一個(gè)有它自己的處理器、寄存器和棧击费。

線程上下文

當(dāng)一個(gè)線程運(yùn)行時(shí)拢蛋,它對(duì)CPU或CPU核有著完全的控制,并且其他線程不能影響CPU或核的狀態(tài)蔫巩。當(dāng)一個(gè)線程改變CPU中某個(gè)寄存器的值時(shí)谆棱,它不會(huì)影響任何其他線程快压。一個(gè)操作系統(tǒng)在線程間切換之前,在CPU中的所有值會(huì)被保存到一個(gè)稱為線程上下文的結(jié)構(gòu)體中垃瞧。然后操作系統(tǒng)加載這個(gè)線程上下文到一個(gè)新的線程中蔫劣,并使這個(gè)新線程在CPU中執(zhí)行(線程上下文是線程切換期間操作系統(tǒng)保持的臨時(shí)值)

  • CreateThread函數(shù)被用來(lái)創(chuàng)建一個(gè)新線程。函數(shù)的調(diào)用者指定一個(gè)起始地址个从,它經(jīng)常被叫做sta rt函數(shù)拦宣。執(zhí)行從這個(gè)起始地址開(kāi)始直到這個(gè)函數(shù)返回,盡管這個(gè)函數(shù)不需要返回信姓,這個(gè)線程可以在進(jìn)程結(jié)束前一直運(yùn)行鸵隧。

  • CreateThread的調(diào)用者可以指定線程開(kāi)始的函數(shù)位置,并且一個(gè)單一參數(shù)可以被傳遞給這個(gè)start函數(shù)意推。這個(gè)參數(shù)可以是任意值豆瘫,依賴于這個(gè)線程要開(kāi)始執(zhí)行的函數(shù)。

  • 惡意代碼可以使用CreateThread,來(lái)加載一個(gè)新的惡意庫(kù)文件到進(jìn)程中菊值,通過(guò)在調(diào)用CreateThread時(shí)將起始地址設(shè)置為L(zhǎng)oad Library的地址外驱。 (傳遞給CreateThread的參數(shù)是要被加載庫(kù)的名字。新的DLL被加載到這個(gè)進(jìn)程的內(nèi)存中腻窒,然后DllMain被調(diào)用昵宇。)

  • 惡意代碼可以為輸入和輸出創(chuàng)建兩個(gè)線程:一個(gè)用來(lái)在套接字或管道上監(jiān)聽(tīng),并輸出到一個(gè)進(jìn)程的標(biāo)準(zhǔn)輸入里儿子,另一個(gè)用來(lái)從標(biāo)準(zhǔn)輸出讀取數(shù)據(jù)瓦哎,并發(fā)送到套接字或管道上,惡意代碼的目標(biāo)是發(fā)送所有信息到單一的套接字或管道柔逼,來(lái)和運(yùn)行的應(yīng)用程序進(jìn)行無(wú)縫通信蒋譬。

使用互斥量的進(jìn)程間協(xié)作

  • 互斥量(mutex), 在內(nèi)核中也稱為互斥門(mutant)是全局對(duì)象,用于協(xié)調(diào)多個(gè)進(jìn)程和線程愉适》钢互斥量主要用于控制共享資源的訪問(wèn),并且經(jīng)常被惡意代碼所使用维咸。
    同一時(shí)刻剂买,只有一個(gè)線程擁有一個(gè)互斥量。

  • 線程通過(guò)一個(gè)對(duì)WaitForSingleObject的調(diào)用癌蓖,獲取對(duì)互斥量的訪問(wèn)瞬哼,井且任何后續(xù)線程試圖獲取對(duì)它的訪問(wèn)時(shí),都必須等待费坊。當(dāng)一個(gè)線程完成對(duì)互斥量的使用后倒槐,需要使用ReleaseMutex函數(shù)。

  • 一個(gè)互斥量可以通過(guò)CreateMutex函數(shù)進(jìn)行創(chuàng)建附井。而進(jìn)程可以通過(guò)OpenMutex調(diào)用來(lái)獲取另一個(gè)進(jìn)程中互斥量的句柄讨越。惡意代碼通常創(chuàng)建一個(gè)互斥量两残,并試圖使用同一個(gè)名字來(lái)打開(kāi)一個(gè)已存在的互斥量,通過(guò)這種方式把跨,可以確定惡意代碼一次只有一個(gè)唯一實(shí)例在運(yùn)行人弓。

mutex1.png
mutex2.png

服務(wù)

惡意代碼執(zhí)行附加代碼的另一種方式是將它作為服務(wù)安裝。Windows允許通過(guò)使用服務(wù)着逐,來(lái)使任務(wù)作為后臺(tái)應(yīng)用程序運(yùn)行崔赌,而不需要它們自己的進(jìn)程或線程;代碼被Windows服務(wù)管理器調(diào)度和運(yùn)行耸别,但沒(méi)有用戶輸入健芭。在Windows操作系統(tǒng)上的任何指定時(shí)間,都會(huì)有多個(gè)服務(wù)在運(yùn)行秀姐。

服務(wù)也提供另一種在系統(tǒng)上維護(hù)持久化駐留的方式慈迈,因?yàn)樗鼈兛梢员辉O(shè)置成當(dāng)操作系統(tǒng)啟動(dòng)時(shí) 自動(dòng)運(yùn)行,并且可能甚至不在任務(wù)管理器中作為一個(gè)進(jìn)程顯示出來(lái)省有。一個(gè)用戶查找所有運(yùn)行的應(yīng)用程序痒留,也不會(huì)找到任何可疑的東西,因?yàn)閻阂獯a不是運(yùn)行在一個(gè)獨(dú)立進(jìn)程中蠢沿。

使用net start可以列出正在運(yùn)行的服務(wù)伸头,但是只有服務(wù)名稱,使用Autoruns可以列出正在運(yùn)行服務(wù)的更多信息舷蟀。

service.png

服務(wù)可以通過(guò)一些Windows API函數(shù)來(lái)進(jìn)行安裝和操作

  • OpenSCManager: 返回一個(gè)服務(wù)控制管理器的句柄恤磷,它被用來(lái)進(jìn)行所有后續(xù)與服務(wù)相關(guān)的函數(shù)調(diào)用。所有要和服務(wù)交互的代碼會(huì)調(diào)用這個(gè)函數(shù)雪侥。
  • CreateService: 添加一個(gè)新服務(wù)到服務(wù)控制管理器碗殷,并且允許調(diào)用者指定服務(wù)是否在引導(dǎo)時(shí)自動(dòng)啟動(dòng),或者必須手動(dòng)啟動(dòng)速缨。
  • StartService: 啟動(dòng)一個(gè)服務(wù),并且僅在服務(wù)被設(shè)置成手動(dòng)啟動(dòng)時(shí)使用代乃。

Windows操作系統(tǒng)支持多種服務(wù)類型旬牲,它們以獨(dú)特的方式執(zhí)行。惡意代碼最常使用的是WIN32_SHARE_PR0CESS類型搁吓,這種類型將這個(gè)服務(wù)的代碼保存在一個(gè)DLL中原茅,并且在一個(gè)共享的進(jìn)程中組合多個(gè)同的服務(wù)。在任務(wù)管理器中堕仔,你可以找到一個(gè)名為svchost.exe進(jìn)程的多個(gè)實(shí)例擂橘,它們?cè)谶\(yùn)行WIN32_SHARE_PR0CESS類型的服務(wù)。

WIN32_OWN_PROCESS類型有時(shí)也被使用摩骨,因?yàn)樗谝粋€(gè).exe文件中保存代碼通贞,而且作為一個(gè)獨(dú)立進(jìn)程運(yùn)行朗若。
最后一個(gè)常見(jiàn)的服務(wù)類型是KERNEL_DRIVER,它被用來(lái)加載代碼到內(nèi)核中執(zhí)行。
關(guān)于本地系統(tǒng)上服務(wù)的信息被保存在注冊(cè)表中昌罩。每個(gè)服務(wù)在HKLM\SYSTEM\CurrentControlSet\Services下面有一個(gè)子鍵哭懈。

VMware NAT Service的注冊(cè)表項(xiàng)如下,保存在計(jì)算機(jī)\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\VMware NAT Service位置茎用,VMware NAT Service的代碼保存在C:\WINDOWS\SysWOW64\vmnat.exe位置遣总。

service2.png

組件對(duì)象模型

微軟組件對(duì)象模型(COM)是一個(gè)接口標(biāo)準(zhǔn),它使得不同軟件組件在不知道其他組件代碼的接口規(guī)范時(shí)轨功,相互之間可以進(jìn)行調(diào)用旭斥。

COM可以支持任何編程語(yǔ)言,并且被設(shè)計(jì)成一種可復(fù)用的軟件組件古涧,并可以被所有程序所利用垂券。COM使用了一個(gè)對(duì)象結(jié)構(gòu),在與面向?qū)ο蟮木幊陶Z(yǔ)言中可以很好配合使用蒿褂,COM也并不排斥非面向?qū)ο蟮木幊陶Z(yǔ)言圆米。

COM被實(shí)現(xiàn)成一個(gè)客戶-服務(wù)器框架∽乃ǎ客戶端是那些使用COM對(duì)象的程序娄帖,服務(wù)器是那些可復(fù)用的軟件組件——也就是COM對(duì)象本身。微軟提供了很多COM對(duì)象給程序使用昙楚。

每一個(gè)使用COM的線程近速,必須在調(diào)用任何其他COM庫(kù)函數(shù)之前,至少調(diào)用一次Olelnitialize或CoInitializeEx函數(shù)堪旧。所以削葱,一個(gè)惡意代碼分析師可以搜索這些調(diào)用,來(lái)判斷一個(gè)程序是否使用了COM功能淳梦,然而析砸,知道惡意代碼片段作為客戶端程序使用COM對(duì)象并沒(méi)有提供很多信息,因?yàn)镃OM對(duì)象是繁雜且廣泛的爆袍。一旦你判斷程序在使用COM,你就需要找到一些正在被使用對(duì)象的標(biāo)識(shí)符來(lái)繼續(xù)分析首繁。

CLSID、IID ,以及COM對(duì)象的使用

COM對(duì)象通過(guò)它們的全局唯一標(biāo)識(shí)符(GUID),分為類型標(biāo)識(shí)符(CLSID)以及接口標(biāo)識(shí)符(IID)來(lái)進(jìn)行訪問(wèn)陨囊。

CoCreatelnstance函數(shù)被用來(lái)獲取對(duì)COM功能的訪問(wèn)弦疮。惡意代碼使用的一個(gè)常用函數(shù)是Navigate , 它允許一個(gè) 程 序 啟 動(dòng) Internet Explorer, 并訪問(wèn)一 個(gè) Web地 址。Navigate函數(shù)是IWebBrowser2組件接口的一部分蜘醋,這個(gè)接口指定了一個(gè)必須被實(shí)現(xiàn)的函數(shù)列表胁塞,但是它沒(méi)有指定哪個(gè)程序會(huì)提供這個(gè)功能。提供這個(gè)功能的程序就是實(shí)現(xiàn)了IWebBrowser2接口的COM類。在多數(shù)例子中啸罢,IWebBrowser2接口被Internet Explorer實(shí)現(xiàn)编检。接口通過(guò)一個(gè)叫做IID的GUID來(lái)標(biāo)識(shí),而COM類通過(guò)一個(gè)叫做CLS1D的GUID來(lái)標(biāo)識(shí)伺糠。

COM服務(wù)器惡意代碼

有些惡意代碼實(shí)現(xiàn)了一個(gè)惡意COM服務(wù)器蒙谓,繼而被其他應(yīng)用使用。對(duì)惡意代碼來(lái)說(shuō)训桶,常用的COM服務(wù)器功能是通過(guò)瀏覽器幫助對(duì)象(B H O ), 這是Internet Explorer的第三方插件累驮。BHO沒(méi)有限制,所以惡意代碼作者使用它們?cè)贗nternet Explorer?程中運(yùn)行代碼舵揭,這允許他們監(jiān)控互聯(lián)網(wǎng)流量谤专、跟蹤瀏覽器的使用,以及與互聯(lián)網(wǎng)通信午绳,而且并不使用它們自己的進(jìn)程置侍。

實(shí)現(xiàn)一個(gè)COM服務(wù)器的惡意代碼通常很容易檢測(cè),因?yàn)樗鼘?dǎo)出了幾個(gè)函數(shù)拦焚,包括DllCanUnloadNow蜡坊、DllGetClassObject、Dlllnstall赎败、DI 1 RegisterServer, 以及DllUnregisterServer秕衙,它們都必須由COM服務(wù)器軟件導(dǎo)出。

異常:當(dāng)事情出錯(cuò)時(shí)

異常機(jī)制允許一個(gè)程序在普通執(zhí)行流程之外處理事件僵刮。多數(shù)時(shí)間里据忘,異常是由錯(cuò)誤引起的,諸如除零錯(cuò)誤搞糕。當(dāng)一個(gè)異常發(fā)生時(shí)勇吊,執(zhí)行轉(zhuǎn)移到處理這個(gè)異常的特殊例程。有些異常窍仰,比如除零異常汉规,是由硬件拋出的;其他的驹吮,比如無(wú)效內(nèi)存訪問(wèn)鲫忍,是由操作系統(tǒng)拋出的。你也可以在代碼中使用RaiseException調(diào)用钥屈,顯式地拋出一個(gè)異常。

結(jié)構(gòu)化異常處理(SEH)是Windows的異常處理機(jī)制坝辫。在一個(gè)32位系統(tǒng)中篷就,SEH信息被保存在桟上。

異常處理器是可嵌套的近忙,并且不是所有的處理器都會(huì)對(duì)應(yīng)著所有異常竭业。如果當(dāng)前幀的異常處理器不處理這個(gè)異常智润,這個(gè)異常會(huì)被傳遞給調(diào)用者幀的異常處理器。最終未辆,如果這些異常處理器中沒(méi)有一個(gè)響應(yīng)這個(gè)異常窟绷,那么頂層的異常處理器將使應(yīng)用程序崩潰。

異常處理器可以讓惡意代碼獲得執(zhí)行機(jī)會(huì)咐柜。一個(gè)指向異常處理信息的指針被保存在棧上兼蜈,在棧溢出時(shí),一個(gè)攻擊者可以覆蓋這個(gè)指針拙友。通過(guò)指定一個(gè)新的異常處理器为狸,攻擊者可以在一個(gè)異常發(fā)生時(shí)獲得執(zhí)行機(jī)會(huì)。

內(nèi)核與用戶模式

Windows使用兩種處理器特權(quán)級(jí)別:內(nèi)核模式與用戶模式遗契。

幾乎所有代碼都運(yùn)行在用戶模式辐棒,除了操作系統(tǒng)和硬件驅(qū)動(dòng),它們運(yùn)行在內(nèi)核模式牍蜂。在用戶模式漾根,每一個(gè)進(jìn)程有它自己的內(nèi)存、安全權(quán)限鲫竞,以及資源辐怕。如果一個(gè)用戶模式程序執(zhí)行一個(gè)無(wú)效指令并崩潰,Windows可以回收所有資源贡茅,并終止這個(gè)程序

通常秘蛇,用戶模式不能直接訪問(wèn)硬件,并且它被限制只能訪問(wèn)CPU上所有寄存器和可用指令的一個(gè)子集顶考。為了在用戶模式中操作硬件或改變內(nèi)核中的狀態(tài)赁还,你必須依賴于Windows API。

當(dāng)你調(diào)用一個(gè)Windows API函數(shù)操作內(nèi)核結(jié)構(gòu)體時(shí)驹沿,它會(huì)通過(guò)一個(gè)調(diào)用進(jìn)入內(nèi)核艘策。在反匯編中SYSENTER、SYSCALL或者INT 0x2E的存在渊季,指明一個(gè)調(diào)用被使用進(jìn)入到內(nèi)核朋蔫。直接通過(guò)跳轉(zhuǎn)從用戶模式到內(nèi)核模式是不可能的,這些指令使用查找表來(lái)定位一個(gè)預(yù)定義函數(shù)却汉,從而在內(nèi)核中執(zhí)行代碼驯妄。

所有運(yùn)行在內(nèi)核的進(jìn)程共享資源和內(nèi)存地址。內(nèi)核模式代碼有更少的安全檢查合砂。如果在內(nèi)核運(yùn)行的代碼執(zhí)行并且包含無(wú)效指令青扔,操作系統(tǒng)就不能繼續(xù)運(yùn)行,產(chǎn)生的結(jié)果就是著名的Windows藍(lán)屏。

運(yùn)行在內(nèi)核中的代碼可以操縱運(yùn)行在用戶空間的代碼微猖,但是運(yùn)行在用戶空間的代碼只能通過(guò)定義好的接口來(lái)影響內(nèi)核谈息。即使所有運(yùn)行在內(nèi)核的代碼共享內(nèi)存和資源,處于活躍狀態(tài)的進(jìn)程上下文也總是只有一個(gè)凛剥。

原生API

原生API是用來(lái)和Windows進(jìn)行交互的底層API侠仇。
調(diào)用原生API函數(shù)可以繞過(guò)普通的Windows API。

當(dāng)調(diào)用Windows API中的一個(gè)函數(shù)時(shí)犁珠,這個(gè)函數(shù)通常不會(huì)直接執(zhí)行請(qǐng)求的動(dòng)作逻炊,因?yàn)榇蠖鄶?shù)重要數(shù)據(jù)結(jié)構(gòu)都被保存在內(nèi)核中,在內(nèi)核外面的代碼 (用戶模式代碼)是無(wú)法訪問(wèn)它們的盲憎。微軟為了使用戶應(yīng)用程序能夠達(dá)到必需的功能嗅骄,創(chuàng)建了一個(gè)多步驟的調(diào)用過(guò)程。

model.png

用戶應(yīng)用程序被給予對(duì)用戶API (比如kernel32.dll和其他DLL)的訪問(wèn)饼疙,這些DLL會(huì)調(diào)用ntdlLdll,這是一個(gè)特殊的DLL程序溺森,它管理用戶空間與內(nèi)核的交互。然后處理器切換到內(nèi)核模式,并執(zhí)行一個(gè)內(nèi)核中的函數(shù)窑眯,通常它位于ntoskrnl.exe中屏积。這個(gè)過(guò)程是令人費(fèi)解的,但是內(nèi)核和用戶API之間的分離磅甩,允許微軟修改內(nèi)核而不會(huì)影響應(yīng)用程序炊林。

ntdll函數(shù)像內(nèi)核中的函數(shù)一樣,使用API和結(jié)構(gòu)體卷要。這些函數(shù)組成了原生API渣聚。

盡管微軟不提供關(guān)于原生API的完整文檔,還是有網(wǎng)站和書來(lái)文檔化這些函數(shù)僧叉。最好的參考書是由GaryNebbett (Sams, 2000)撰寫的Windows NT/2000 Native API Reference奕枝,盡管它已經(jīng)很舊了。在線資源如 http://undocumented.ntinternals.net 以提供最近的信息瓶堕。

有一系列的原生API調(diào)用可以被用來(lái)獲取關(guān)于系統(tǒng)的信息隘道、進(jìn)程、線程郎笆、句柄谭梗,以及其他項(xiàng)目。這 些 包 括 NtQuerySystemlnformation , NtQuerylnformationProcess > NtQuerylnformationThread > NtQuerylnformationFile, 以及NtQuerylnformationKey宛蚓。這些調(diào)用提供比任何可用Win32調(diào)用更詳細(xì)的信息激捏,并且其中一些函數(shù)允許你給文件、進(jìn)程凄吏、線程等設(shè)置細(xì)粒度的屬性缩幸。

另一個(gè)惡意代碼普遍使用的原生API函數(shù)是NtContinue壹置。這個(gè)函數(shù)被用來(lái)從一個(gè)異常處理返回,并且它的意圖是在一個(gè)異常被處理后轉(zhuǎn)移執(zhí)行回到一個(gè)程序的主線程表谊。然而,要返回的位置在異常上下文中被指定盖喷,并且它可以被修改爆办。惡意代碼經(jīng)常使用這個(gè)函數(shù)來(lái)以復(fù)雜的方式轉(zhuǎn)移執(zhí)行,從而使一個(gè)分析師感到困惑课梳,并且使一個(gè)程序更加難調(diào)試距辆。

原生應(yīng)用程序是那些不使用Win32子系統(tǒng)而只調(diào)用原生API的應(yīng)用程序。這樣的應(yīng)用程序?qū)阂獯a來(lái)說(shuō)是罕見(jiàn)的暮刃,對(duì)非惡意代碼來(lái)說(shuō)幾乎是不存在的跨算,所以一個(gè)原生應(yīng)用程序很可能就是惡意的。在PE頭中的子系統(tǒng)指明了一個(gè)程序是不是原生應(yīng)用程序椭懊。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末诸蚕,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子氧猬,更是在濱河造成了極大的恐慌背犯,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,383評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件盅抚,死亡現(xiàn)場(chǎng)離奇詭異漠魏,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)妄均,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門柱锹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人丰包,你說(shuō)我怎么就攤上這事禁熏。” “怎么了烫沙?”我有些...
    開(kāi)封第一講書人閱讀 157,852評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵匹层,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我锌蓄,道長(zhǎng)升筏,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 56,621評(píng)論 1 284
  • 正文 為了忘掉前任瘸爽,我火速辦了婚禮您访,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘剪决。我一直安慰自己灵汪,他們只是感情好檀训,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著享言,像睡著了一般峻凫。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上览露,一...
    開(kāi)封第一講書人閱讀 49,929評(píng)論 1 290
  • 那天荧琼,我揣著相機(jī)與錄音,去河邊找鬼差牛。 笑死命锄,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的偏化。 我是一名探鬼主播脐恩,決...
    沈念sama閱讀 39,076評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼侦讨!你這毒婦竟也來(lái)了驶冒?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 37,803評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤搭伤,失蹤者是張志新(化名)和其女友劉穎只怎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體怜俐,經(jīng)...
    沈念sama閱讀 44,265評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡身堡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了拍鲤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贴谎。...
    茶點(diǎn)故事閱讀 38,716評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖季稳,靈堂內(nèi)的尸體忽然破棺而出擅这,到底是詐尸還是另有隱情,我是刑警寧澤景鼠,帶...
    沈念sama閱讀 34,395評(píng)論 4 333
  • 正文 年R本政府宣布仲翎,位于F島的核電站,受9級(jí)特大地震影響铛漓,放射性物質(zhì)發(fā)生泄漏溯香。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評(píng)論 3 316
  • 文/蒙蒙 一浓恶、第九天 我趴在偏房一處隱蔽的房頂上張望玫坛。 院中可真熱鬧,春花似錦包晰、人聲如沸湿镀。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,798評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)勉痴。三九已至赫模,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蚀腿,已是汗流浹背嘴瓤。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,027評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留莉钙,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,488評(píng)論 2 361
  • 正文 我出身青樓筛谚,卻偏偏與公主長(zhǎng)得像磁玉,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子驾讲,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容