0x00 前言
這個病毒應該是比較簡單的,別人給我的樣本,讓我幫忙看看,看樣子是很早的一個病毒,針對Windows XP系統的,行為分析很簡單,但是想着不能就僅僅分析關鍵點,要不就把整個結構給逆向出來,弄了兩天,搞的差不多了,簡單的記錄一下。
0x01 基本介紹
整個病毒是4個文件組成:27.exe,27.dll,27.sys和27.dlx。當然都是設置的為隱藏屬性,雙擊exe以后,exe文件和dll文件被復制到系統system32目錄下,偽裝起來,sys驅動文件復制到system32\drivers\目錄下,刪除原文件。
整個病毒大致的過程也就是:先是exe文件自己運行時解密出加密的字符串,然后讀取自己的配置文件,再注冊服務,加載驅動,在驅動中會進行對SSDT進行Hook來隱藏自己,把驅動和exe都注冊成自啟動服務,開機自啟動。功能性的代碼就在dll文件中,聯網以后不停的發送數據包,然后逆着逆着發現,遠程文件傳送,遠程桌面抓取......我去,這不活生生就是大灰狼的gh0st的功能代碼嗎?
非常簡單的壓縮殼,最開始直接就用OD把殼給脫了,然后就傻眼了,雙擊以后就直接崩潰了,沒辦法,只能帶殼調了,發現真的是只能帶殼調啊。整個字符串的解密代碼全是用硬編碼寫的,一脫殼,偏移全變了,然后就崩潰。雖然是帶殼調的,但是脫殼了就可以用上最喜歡的Ida了。
0x02 應用層分析
只能用OD帶殼去跟整,慶幸的是殼比較簡單,首先就是字符串的解密了,解密出來就是這樣子,然后該暴露的都暴露了,IP好像都暴露了,哈哈。
然后就可以用解密出來的字符串了,然后讀取復制的C:\Windows\System32\27.dlx配置文件,小於0x10,表明是第一次運行,寫入配置文件。
在“0123456780ABCDEF”中選取字串生成27.dlx的內容
解密算法:
調用WritePrivateProfileStirng寫進27.dlx的值
接下來就可以看到非常明顯的格式化
C:\Windows\System32\27.exe
C:\Windows\System32\27.dll
C:\Windows\System32\drivers\27.sys
然后還要偽裝起來,將原來的27.exe偽裝成System32下的win32.hlp文件
偽裝的文件:
func_copyfile(這是我自己取的名字)的調用參數
在函數func_SQLClose()(自己的命名)中,將C:\Windows\system32\drivers\27.sys作為參數,調用了27.dll中的SQLClose()函數。之后就是路徑的解析工作,然后開始操作注冊表
這里第一次失敗,因為沒有這個鍵值
接着打開服務的鍵值:
創建目標子鍵:
創建HKEY_LOCAL_MACHINE\SYSTEM\STEUP\SERVICE的注冊表項,添加27的鍵,在27鍵下設置的值
通過在ntdll.dll中搜索ZwLoadDriver() 加載驅動27.sys
驅動加載完畢以后開始清理現場,刪除無關的注冊表項
也就是說在27.exe中調用27.dll中的SQLClose()函數,實際上做的最重要的工作就是創建了注冊表項和加載了27.sys的驅動程序。
在驅動程序的DriverEntry中創建了設備對象和鏈接符號
回到27.exe之后,CreateFile打開 \\.\usbmouseb 設備對象,然后調用27.dll中的InitSQLConnect()函數。
我在這里之前沒有往下分析驅動的代碼,我還以為是真的是向USB驅動發送的控制碼,然后還在WDK中找USB驅動像應用層提供的接口,傻傻的分析IO控制碼,感覺好蠢。
找了好久還真給我發現了WDK中的說明,參考路徑為Windows Driver KitàDevice and Driver TechnologiesàBus and Port DriversàBueseàUSBàReferenceàI/O Requests for Client Drivers。
實際上27.sys自己創建的符號鏈接就是這個\\.\usbmousb
在27.exe調用的27.dll中的InitSQLConnect實際上就是將cmd.exe作為input調用DeviceIoControl像27.sys發送了一個控制碼。
字符串格式化的CommandLine,然后作為CreateProcess的路徑創建進程:
創建的進程:
再一次格式化的結果:
接下來調用func_CreateServices() 參數列表:
CreateServiceS()的參數:
創建的服務:
之后調用ChangeSeevicesConfigA()來改變服務的配置:
調用ChangeServiceConfig2A()來設置服務的描述信息:
之后就是調用CreateServices()開啟服務運行:
如果進程是以服務狀態啟動的,則會調用注冊服務的處理函數,並啟動服務線程
在服務線程中鏈接了27.dll並調用其中的SQLAlloc函數
在SQLAlloc中以27.sys為路徑又創建了內核服務,便於27.sys加載
OpenService()默認的就是SERVICE_AVTIVE_DATABASE
在func_Uninstall中會調用CreateRemoteThread注入。
上面就是應用層大概的分析,有點亂,主要是自己在分析過程中記錄的一些東西,免得把自己給搞忘,整個exe分析的主要函數如下:
dll沒有進行過多的分析,因為主要是遠控實現的功能性代碼,驅動基本上全都分析了,因為對於驅動比較熟悉,而這里的驅動也不難,所以分析過程中沒有記錄太多的東西,貼出了最開始分析的一點,有興趣的話,我會在最后附上整個文件和我分析的idb文件。
0x03 簡要的驅動分析
驅動比較簡單,主要是剛開始記錄的一些東西,后來發現沒有記錄的必要了,就沒有記錄了。
這里是DriverEntry中設置一些根據系統不同的偏移量
通過在Eprocess中搜索”System”字符串確定ProcName的偏移量:
這里確定KeServiceDescriptorTable硬編碼0x5C7通過ntos中代碼確定的,是在KiInitSystem()中調用的:
然后就是一些分析PE文件的HOOk工作:
Hook NtWriteVirtualMemory:
Hook NtQueryDirectoryFile ()和NtDeviceIoControlFile()
驅動的大致函數就是這樣的;
0x04 小結
之前用OD和Ida主要都是用來做crack,找key,還真沒弄過“這么大”的工作量,這應該算第一次吧。過程中也是新學到了很多東西,最主要的就是ida的各種“高級”玩法,當然這里的高級玩法是相對自己之前的"低級"玩法來說的,ida這個工具,怎么說呢,越深入越能感覺到它的強大!最深的感觸大概就是在分析應用層的時候,如果一些手段自己玩過用過,會一看就很眼熟,稍微一思考就知道他想干什么,如果沒有接觸過,估計就得在那死磕了,如果不是之前弄過gh0st的遠控程序,可能我現在還是那分析dll中的功能性代碼呢!
最后再安利一個工具,64位下的動態調試工具“xdbg”,目前x64可以用來匯編級調試的,我所知道的就只有這一個了,其中開源的Snowman插件挺好用的,和Ida的F5功能類似,github上有源碼:https://github.com/smartdec/smartdec
病毒樣本及分析文件: http://files.cnblogs.com/files/lanrenxinxin/Desktop.7z