1. 程式人生 > >病毒木馬查殺實戰第026篇:“白加黑”惡意程式研究(上)

病毒木馬查殺實戰第026篇:“白加黑”惡意程式研究(上)

前言

       眾所周知,傳統的惡意程式都是由單一檔案構成的,從而實現某一種或者幾種惡意功能。而這類的惡意程式為了避免被發現以及被查殺,往往會採用五花八門的自我隱藏技術以及免殺技術,病毒程式的作者很多時候也是腦洞大開,為了對抗殺軟的查殺也是無所不用其極。我們每天所處理的惡意檔案裡面,反查殺手段運用得最好的就是指令碼木馬,關於這類程式,我在之前的《病毒木馬查殺實戰第025篇:JS下載者指令碼木馬的分析與防禦》這篇博文中也做過簡單的論述。可是,不論惡意程式如何進化,殺軟廠商總有各種各樣的方法來應對現有的以及未知的威脅,因此,惡意程式的作者就勢必要採用更加隱蔽的方式來保護自己,免於被查殺。也許正是由於這個原因,“白加黑”惡意程式就應運而生了。

 

“白加黑”惡意程式概述

       所謂的“白加黑”惡意程式,最為顯著的特徵是由之前的單獨作案,發展為團伙“犯罪”。也就是為了實現惡意的目的,往往會由多個程式協作完成。而這些程式如果單獨拿一個出來,似乎並沒有什麼惡意的行為,但是隻要把這些檔案放在一起,執行其中的某一個檔案,那麼就會誘發一系列的連鎖反應,從而令計算機被感染。

       在這樣的一個“團伙”裡面,一般來說至少會擁有一個.dll檔案。這個.dll檔案自身不見得包含有惡意行為,也許只是為了實現惡意行為鏈條其中的一環。由於.dll檔案自身並不能直接執行,因此很多朋友往往會對其放鬆警惕,所以從某種意義上來說,.dll檔案天生就帶有自我隱藏惡意行為的效果。而“白加黑”惡意程式(們)不可能單獨放出來一個.dll檔案,還需要包含有至少一個.exe程式(或指令碼程式等)來啟用.dll檔案,也就是說這個“團伙”至少也得有兩個成員構成才行。而這篇博文,主要討論的就是這種最為簡單的情況。

 

是真的“酷狗”程式嗎

       話說前段時間的某一天,我收到了由我們技術支援發來的一批樣本。其中有兩個程式引起了我的注意,這兩個檔案一個叫做KuGou.exe,另一個叫做kugou.dll。按照常理,我們一般都會對.exe這樣的可以直接執行的程式抱有很大的戒心。而且又看到這個檔案的名稱是“KuGou”,那麼給我的第一印象就是,要麼這真的就是一個由“酷狗”官方出品的正常程式,要麼就是某個惡意程式弄虛作假,混淆視聽,讓我們錯誤地以為它是真的“酷狗”,降低我們的戒心,讓我們不假思索地去點選。

       “酷狗”畢竟是一款非常知名的程式,那麼為了驗證它究竟是不是官方正品行貨,最簡單的方法可以使用由Sysinternals出品的sigcheck.exe來檢測一下這個程式的數字簽名:


       其中Verified後面的Signed表明該程式的數字簽名有效,加上檔案的各個資訊也是填寫得非常完整,那麼基本就可以確定這個程式的真實性了。不放心的話可以進一步驗證這個數字簽名的真偽:


       數字簽名信息都能夠對得上,那麼就可以把這個程式歸類到“乾淨”資料夾中了。當然了,更為嚴謹的做法是需要對其進行逆向分析,確保百分百沒問題之後才可以放到“乾淨”資料夾,關於這個我們後面再討論。

       如果大家不相信“數字簽名”的神奇,我這裡不妨做一個實驗,我利用二進位制編輯器(這裡我所使用的是Free Hex Editor Neo)將KuGou.exe的第4個位元組(偏移為0x3),由原來的00改為01:

       這裡請大家注意的是,儘管我修改了這個檔案,但是一般來說並不會影響這個程式的正常執行,因為PE結構的這個偏移位置並沒有多大用處,至少不會對全域性產生致命的影響。然後我們再用sigcheck.exe來檢測一下:


       可以看到,現在的數字簽名處於無效的狀態,說明要麼它被病毒感染了,要麼它就是一個虛假的程式。

 

進一步驗證

       本著求真務實的工作態度,儘管.dll程式並不能直接執行,但既然是由客戶發給我們分析的,我還是要認真看一看的。首先還是要利用sigcheck.exe來檢測一下這個kugou.dll檔案:


       可見,這個檔案的資訊可以說是一片空白。此時我心中是有疑問的,難道“酷狗”的.dll檔案就是不帶數字簽名的嗎?於是我到“酷狗”的官方網站下載了程式的安裝包,安裝後就得到了絕對官方正品的kugou.dll檔案,檢視一下它的數字簽名信息:


       結果很明顯,即便是.dll檔案,也是帶有數字簽名的。但是現在還不能草率下結論,畢竟我所下載的版本較新(8.1.32.19628),而我收到的樣本較舊(8.1.00.19303),有沒有可能舊的版本就是這樣的呢?好,那麼不妨再深入對比一下。既然是.dll檔案,那就從二者的匯出函式入手吧。首先看一下已經確認為官方正品的匯出函式情況:


       可以看到,一共有三個匯出函式(不知道為啥第三個匯出函式的編號是4呢?)。接下來再看一下那個可疑檔案的匯出函式:


       對比發現,可疑檔案多出來了一個叫做“FlashboxMain”的函式,而且還有一點很奇怪的是,編號為1、2、3的這三個函式的地址竟然全都是0x100011E0,也就是說這三個函式實際上呼叫的是同一處程式碼,正常的程式怎麼可能會這麼幹呢?不妨再看一下這個位置的程式碼:


       可以看到,它實現的功能就是eax異或自身,也就是自身清零,接下來就利用retn直接返回了。可以理解為這段程式碼並沒有實現什麼有用的功能,然後也就結束了。至此,我可以百分百確定說,這就是一個惡意程式。再總結一下我的理由:

       1、這個檔案的名稱是kugou.dll,儘管你起什麼名字我是管不著的,但是既然你的名字與一家知名公司的知名軟體相同,那我就必需要懷疑一下了,萬一你是想欺騙無知大眾呢?

       2、既然你覺得你是“酷狗”的元件,但是為什麼沒有檔案資訊以及數字簽名呢?

       3、對比真實的kugou.dll檔案,你們匯出函式的數量不一樣也就算了(畢竟不是一個版本),但為什麼有三個匯出函式的地址是一模一樣的呢?而且檢視反彙編程式碼發現,這三個函式其實什麼功能都沒有實現,你還想說你是清白的?真正大公司的程式設計師,誰會寫這麼無聊的程式碼啊?

       可見,我們分析惡意程式,很多時候就是判斷目標檔案有哪些不正常的地方。也許出現一兩個不正常的地方,我還可以理解為是程式設計師的惡作劇,但是如果不正常的地方實在是太多,那麼我就只能理解為是黑客在搞鬼了。

       儘管我還沒有分析這個惡意程式究竟是想要實現什麼功能,但是分析到目前這一步其實基本也就夠用了。一般來說,這類程式屬於後門或者遠控木馬,或者屬於DLL劫持,給它分個類,起個名字,提個特徵,加入病毒庫,也就完成了整個分析的流程。可能大家看我在這裡囉哩吧嗦地講了這麼多覺得時間很漫長,但在我們的日常工作中,判斷一個檔案是不是乾淨的,僅僅幾分鐘就夠用了。畢竟世界上每天都會出現非常多的惡意程式,那麼分析的速度以及準確率的高低,就是我們每天能不能按時下班以及會不會收到很多投訴的關鍵因素了。

 

kugou.dll是怎麼實現惡意功能的

       不知道大家想過沒有,這個假的kugou.dll是怎麼執行的呢?其實在正常的軟體開發中,程式猿們不可能把要實現的所有功能都寫在一個.exe程式裡面,這樣的話必然會讓這個程式越來越大,同時也不利於功能的升級,所以將一些常用的功能寫成.dll的形式,有需要的時候再進行呼叫就可以了。簡單來說,在有需要的時候,KuGou.exe可以利用LoadLibrary()函式將kugou.dll載入到記憶體中,然後再利用GetProcAddress()函式呼叫kugou.dll中的匯出函式就可以了。一般情況下,對於KuGou.exe這樣的程式來說,它一般不會去驗證自己呼叫的.dll程式是不是真的由自己公司出品的.dll程式(我並沒有做逆向分析,僅僅是感覺),只會依據檔案路徑、檔名稱以及匯出函式的名字來直接進行呼叫。畢竟程式開發人員不可能把所有方面都考慮到,但是在呼叫.dll檔案之前,先進行驗證,比如進行雜湊運算再進行雜湊值的對比,雖說大大增加了工作量,但卻不失為一種安全的做法。但這麼做到底有沒有必要,還是需要好好討論一下的。

       其實根據我的理解,隨著軟體工程開發方法的不斷完善,軟體的安全也越來越被開發者所重視。推動安全開發方法學發展的,正是那些“孜孜不倦”地研究如何黑掉那些軟體,從而為自己牟利的黑客們,正是他們推動了整個開發理論的不斷進步。當然了,像是.dll劫持這類的惡意利用方法,還是比較初級的,現在流行的是五花八門的漏洞利用技術,令即便是資深軟體開發工程師也防不勝防,也是頂級黑客們的腦力競賽。關於這個,以後有機會,我再好好討論一下。

 

再說說數字簽名

       在上面的內容中,我判斷一個程式是不是惡意程式的一個關鍵方法是檢視它是否具有數字簽名。但是這段時間以來,我還是遇到了很多檔名為dllhost.exe、svchost.exe以及explorer.exe這一類的程式,乍一看還不敢隨便下判斷,因為Windows中的很多自有檔案就是這個名字,如果再檢視一下他們的簽名信息,可能是這樣的:


       檔案基本資訊倒是很全,但是唯獨最重要的數字簽名反而沒有,難道這是偽造的嗎?其實,如果從系統中把這個explorer.exe給找出來,那麼同樣會發現,微軟官方系統中的檔案也是沒有數字簽名的,有的只是諸如上圖那樣的基本資訊,這可就麻煩了,難道真的要反彙編一點一點地逆向分析可疑檔案功能了?

       其實也不用那麼麻煩,畢竟我擁有各式各樣的Windows系統,虛擬機器和工作機中就有Windows XP以及兩個版本的Windows 7,再加上我筆記本中的Windows 10,那麼就足以應付日常分析的需要了。畢竟黑客再牛,也不可能把檔案雜湊也做出來一模一樣的吧?於是每次遇到這種情況,為了保險起見,我都會依據檔案的版本號,從對應的Windows系統中找到真正的檔案出來,對比他們的雜湊值,一下就能夠知道真假了。不曉得這算不算是投機取巧呢?

       大部分情況下,黑客想“偽造”一個Windows檔案,還是比較用心的,檔案資訊就如同上圖那樣,和真的一模一樣。但我有些時候也會遇到一些做事不嚴謹的黑客,他們偽造的檔案資訊可能會是這樣:


    其中最大的問題是Publisher後面多打了一個回車,使得公司名稱到下一行了,那麼很明顯,這就是一個惡意程式了。僅僅幾秒鐘,就完成了檔案黑白的判斷。

 

小結

       大家從我的這篇文章也可以看到數字簽名的重要性。包括在寫程式碼的時候,千萬不要寫得過於晦澀難懂,不要搞惡作劇,免得就被當作病毒給誤殺了。當然了,“白加黑”惡意程式其實遠遠沒有這麼簡單,我這次討論的僅僅是快速判斷的方法,詳細的分析我會在接下來的文章中為大家討論一下。


     《從蘇寧電器到卡巴斯基》終稿完整版,請訪問

       https://user.qzone.qq.com/3149487460/blog/1494822165