原理
程式靜態分析(Program Static Analysis)是指在不運行代碼的方式下,通過詞法分析、語法分析、控制流、資料流分析等技術對程式代碼進行掃描,驗證代碼是否滿足規范性、安全性、可靠性、可維護性等指標的一種代碼分析技術,可利用該技術來驗證軟體是否為病毒,一般重以下幾個方面進行分析:
字串查殺
在程式未運行的情況下,使用一些工具,提取程式字串,查看是否有可疑資訊,來判斷是否為病毒,原理與決議如下:
- 定義:字串或串(String)是由數字、字母、下劃線組成的一串字符,主要用于編程,概念說明、函式解釋等,補充知識:字串在存盤上類似字符陣列,所以它每一位的單個元素都是可以提取的
- 常用于:輸出資訊、URL地址、檔案名稱、路徑資訊等等,
- 因計算機只能識別0和1兩種數字,為了使用輸入指定的字串,常使用編碼技術來解決這一問題
- 定義:編碼是資訊從一種形式或格式轉換為另一種形式的程序也稱為計算機編程語言的代碼簡稱編碼,用預先規定的方法將文字、數字或其它物件編成數碼,或將資訊、資料轉換成規定的電脈沖信號,編碼在電子計算機、電視、遙控和通訊等方面廣泛使用,編碼是資訊從一種形式或格式轉換為另一種形式的程序,解碼,是編碼的逆程序,
- 常見編碼技術
- ASCII編碼:是基于拉丁字母的一套電腦編碼系統,主要用于顯示現代英語和其他西歐語言,
- Unicode編碼:是計算機科學領域里的一項業界標準,包括字符集、編碼方案等,Unicode是為了解決傳統的字符編碼方案的局限而產生的,它為每種語言中的每個字符設定了統一并且唯一的二進制編碼,以滿足跨語言、跨平臺進行文本轉換、處理的要求,
- GB 2312編碼:適用于漢字處理、漢字通信等系統之間的資訊交換,通行于中國大陸;新加坡等地也采用此編碼,中國大陸幾乎所有的中文系統和國際化的軟體都支持GB 2312,
- GBK編碼:GBK編碼標準兼容GB2312,共收錄漢字21003個、符號883個,并提供1894個造字碼位,簡、繁體字融于一庫,
- 如何從計算機的二進制編碼中,提取出字串,可以使用以下工具
- Strings
- 官網:https://docs.microsoft.com/zh-cn/sysinternals/downloads/strings
- 功能:在物件檔案或二進制檔案中查找可列印的字串
- 缺陷:但是它將忽略背景關系格式,搜索出的可能是:記憶體地址、CPU指令序列、一段資料等等
- 限制:它只搜索三個或以上連續的ASCII(2個0結尾)或Unicode(4個0結尾)字符,并以終結符結尾的可列印字串,
- 針對:計算機病毒可利用該搜索限制,導致Strings搜索不到有用字串(例如:將所有字符變成兩個字符,在進行拼接)
- 技巧:搜索時修改檔案后綴名,避免運行
- SDL Passolo
- 官網:https://www.sdltrados.cn/cn/products/passolo/
- 功能:軟體本地化工具,當然也可以搜索字串
- 缺陷:程式體積大
- Resource Hacker
- 官網:https://www.sdltrados.cn/cn/products/passolo/
- Lingobit Localizer
- 官網:http://www.lingobit.com/zh/index.html
- Resource Tuner
- 官網:http://www.restuner.com/
- Restorator
- 官網:https://www.bome.com/products/restorator
- Sisulizer
- 官網:https://www.sisulizer.com/
一般搜索到url或其它IP地址就要小心了,很有可能就是病毒,做好防護再訪問驗證,避免網頁掛馬,
- 官網:https://www.sisulizer.com/
PE查殺
由于大多數感染型病毒都是感染的PE檔案,因為這樣才可以在PE檔案運行的同時運行自身的病毒代碼,從而繼續感染其他的正常檔案,以達到傳播的自身的目的,所以從殺毒角度講,應該先判斷一個檔案是否為PE結構,再去進一步決定應該使用何種方法對檔案進行掃描處理,那么,如何判斷一個檔案是否為PE結構呢,先從pe的概念開始入手:
- PE概念:PE( Portable Execute)檔案是Windows下可執行檔案的總稱,常見的有 DLL,EXE,OCX,SYS 等
- 適用范圍:Windows可執行程式和元件
- 包含資訊:Windows如何將檔案從硬碟裝載到記憶體中執行所需的必要資訊
事實上,一個檔案是否是 PE 檔案與其擴展名無關,PE檔案可以是任何擴展名,那 Windows 是怎么區分可執行檔案和非可執行檔案的呢?我們呼叫 LoadLibrary 傳遞了一個檔案名,系統是如何判斷這個檔案是一個合法的動態庫呢?這就涉及到PE檔案結構了, - PE結構
- DOS頭:
DOS頭中宣告用的暫存器(可以看到e_ss、e_sp、e_ip、e_cs還是16位的暫存器),所以在32位/64為系統中用到的只有兩個:- e_magic:判斷一個檔案是不是PE檔案,使用MZ標記;//(WORD 2位元組變數)
- e_lfanew:相對于檔案首的偏移量,用于找到PE頭;//(DWORD 4位元組變數)
- struct _IMAGE_DOS_HEADER
- typedef struct _IMAGE_DOS_HEADER {
WORD e_magic; //※Magic DOS signature MZ(4Dh 5Ah):MZ標記:用于標記是否是可執行檔案
WORD e_cblp; //檔案最后一頁的位元組數
WORD e_cp; //檔案中的頁面
WORD e_crlc; //重新安置
WORD e_cparhdr; //段落標題大小
WORD e_minalloc; //最少的額外段落需求
WORD e_maxalloc; //最大的額外段落需求
WORD e_ss; //初始(相對)SS值
WORD e_sp; //初始SP值
WORD e_csum; //校驗和
WORD e_ip; //初始IP值
WORD e_cs; //初始(相對)CSS值
WORD e_lfarlc; //重定位表的檔案地址
WORD e_ovno; //疊加數
WORD e_res[4]; //保留字
WORD e_oemid; //OEM識別符號(用于e_oeminfo)
WORD e_oeminfo; //OEM資訊;特定于e_oemid
WORD e_res2[10]; //保留字
DWORD e_lfanew; //※Offset to start of PE header:定位PE檔案,PE頭相對于檔案的偏移量
}IMAGE_DOS_HEADER, * PIMAGE_DOS_HEADER;
- PE檔案頭:
PE頭分為標準PE頭和可選PE頭,其同為NT結構的成員記錄可執行代碼資訊
包含:程式的型別,exe可執行程式、dll元件程式
作用:Windows基于PE檔案頭來將可執行程式和所依賴的元件映射到記憶體中 - 標準PE頭:
struct IMAGE_FILE_HEADER
typedef struct _IMAGE_FILE_HEADER
{
WORD Machine; //※程式執行的CPU平臺:0X0:任何平臺,0X14C:intel i386及后續處理器
WORD NumberOfSections; //※PE檔案中區塊數量
ULONG TimeDateStamp; //時間戳:連接器產生此檔案的時間距1969/12/31-16:00P:00的總秒數
ULONG PointerToSymbolTable;//COFF符號表格的偏移位置,此欄位只對COFF除錯資訊有用
ULONG NumberOfSymbols; //COFF符號表格中的符號個數,該值和上一個值在release版本的程式里為0
WORD SizeOfOptionalHeader;//IMAGE_OPTIONAL_HEADER結構的大小(位元組數):32位默認E0H,64位默認F0H(可修改)
WORD Characteristics; //※描述檔案屬性(單屬性(只有1bit為1):#define IMAGE_FILE_DLL 0x2000 //File is a DLL;組合屬性(多個bit為1,單屬性或運算):0X010F 可執行檔案)
} IMAGE_FILE_HEADER; //*PIMAGE_FILE_HEADER; - 可選PE頭:
struct IMAGE_OPTIONAL_HEADER
typedef struct _IMAGE_OPTIONAL_HEADER
{
WORD Magic; //※ 說明檔案型別:10B 32位、20B 64位
UCHAR MajorLinkerVersion; //鏈接程式的主版本號
UCHAR MinorLinkerVersion; //鏈接程式的副版本號
ULONG SizeOfCode; //所有代碼段的總和大小,注意:必須是FileAlignment的整數倍
ULONG SizeOfInitializedData; //已經初始化資料的大小,注意:必須是FileAlignment的整數倍
ULONG SizeOfUninitializedData; //未經初始化資料的大小,注意:必須是FileAlignment的整數倍
ULONG AddressOfEntryPoint; //※程式入口地址OEP,這是一個RVA(Relative Virtual Address),通常會落在.textsection,此欄位對于DLLs/EXEs都適用,
ULONG BaseOfCode; //代碼段起始地址(代碼基址),(代碼的開始和程式無必然聯系)
ULONG BaseOfData; //資料段起始地址(資料基址)
ULONG ImageBase; //※記憶體鏡像基址(默認裝入起始地址),默認為4000H
ULONG SectionAlignment; //※記憶體中的區塊的對齊大小:一旦映像到記憶體中,每一個section保證從一個「此值之倍數」的虛擬地址開始
ULONG FileAlignment; //※檔案中的區塊的對齊大小:最初是200H,現在是1000H
WORD MajorOperatingSystemVersion; //所需作業系統主版本號
WORD MinorOperatingSystemVersion; //所需作業系統副版本號
WORD MajorImageVersion; //自定義主版本號,使用連接器的引數設定,eg:LINK /VERSION:2.0 myobj.obj
WORD MinorImageVersion; //自定義副版本號,使用連接器的引數設定
WORD MajorSubsystemVersion; //所需子系統主版本號,典型數值4.0(Windows 4.0/即Windows 95)
WORD MinorSubsystemVersion; //所需子系統副版本號
ULONG Win32VersionValue; //※莫須有欄位,不被病毒利用的話一般為0
ULONG SizeOfImage; //※PE檔案在記憶體中映像總大小,sizeof(ImageBuffer),SectionAlignment的倍數
ULONG SizeOfHeaders; //※DOS頭(64B)+PE標記(4B)+標準PE頭(20B)+可選PE頭+節表的總大小,按照檔案對齊(FileAlignment的倍數)
ULONG CheckSum; //※PE檔案CRC校驗和,判斷檔案是否被修改
WORD Subsystem; //用戶界面使用的子系統型別
WORD DllCharacteristics; //DllMain()函式何時被呼叫,默認為 0
ULONG SizeOfStackReserve; //默認執行緒初始化執行緒堆疊的保留大小
ULONG SizeOfStackCommit; //初始化時實際提交的執行緒堆疊大小
ULONG SizeOfHeapReserve; //默認保留給初始化的執行緒堆疊的虛擬記憶體大小
ULONG SizeOfHeapCommit; //初始化時實際提交的堆大小
ULONG LoaderFlags; //與除錯有關,默認為 0
ULONG NumberOfRvaAndSizes; //目錄項數目:總為0X00000010H(16),這個欄位自Windows NT 發布以來一直是16
IMAGE_DATA_DIRECTORY DataDirectory[16]; //定義IMAGE_NUMBEROF_DIRECTORY_ENTRIES 16
} IMAGE_OPTIONAL_HEADER, *PIMAGE_OPTIONAL_HEADER; - PE節表:
PE檔案中所有節的屬性都被定義在節表中,節表由一系列的IMAGE_SECTION_HEADER結構排列而成,每個結構用來描述一個節,結構的排列順序和它們描述的節在檔案中的排列順序是一致的,全部有效結構的最后以一個空的IMAGE_SECTION_HEADER結構作為結束,所以節表中總的IMAGE_SECTION_HEADER結構數量等于節的數量加一,節表總是被存放在緊接在PE檔案頭的地方,
另外,節表中 IMAGE_SECTION_HEADER 結構的總數總是由PE檔案頭 IMAGE_NT_HEADERS 結構中的 FileHeader.NumberOfSections 欄位來指定的,
struct IMAGE_SECTION_HEADER
typedef struct _IMAGE_SECTION_HEADER
{
BYTE Name[IMAGE_SIZEOF_SHORT_NAME]; //區塊名,這是一個由8位的ASCII 碼名,用來定義區塊的名稱,多數區塊名都習慣性以一個“.”作為開頭(例如:.text),這個“.” 實際上是不是必須的,值得我們注意的是,如果區塊名超過 8 個位元組,則沒有最后的終止標志“NULL” 位元組,并且前邊帶有一個“$” 的區塊名字會從連接器那里得到特殊的待遇,前邊帶有“$” 的相同名字的區塊在載入時候將會被合并,在合并之后的區塊中,他們是按照“$” 后邊的字符的字母順序進行合并的,
另外每個區塊的名稱都是唯一的,不能有同名的兩個區塊,但事實上節的名稱不代表任何含義,他的存在僅僅是為了正規統一編程的時候方便程式員查看方便而設定的一個標記而已,所以將包含代碼的區塊命名為“.Data” 或者說將包含資料的區塊命名為“.Code” 都是合法的,當我們要從PE 檔案中讀取需要的區塊時候,不能以區塊的名稱作為定位的標準和依據,正確的方法是按照 IMAGE_OPTIONAL_HEADER32 結構中的資料目錄欄位結合進行定位,
union {
DWORD PhysicalAddress; //物理地址
DWORD VirtualSize; //該區塊表對應的區塊的大小,這是區塊的資料在沒有進行對齊處理前的實際大小,
} Misc;
DWORD VirtualAddress; //該區塊裝載到記憶體中的RVA 地址,這個地址是按照記憶體頁來對齊的,因此它的數值總是 SectionAlignment 的值的整數倍,在Microsoft 工具中,第一個快的默認 RVA 總為1000h,在OBJ 中,該欄位沒有意義地,并被設為0
DWORD SizeOfRawData; //該區塊在磁盤中所占的大小,在可執行檔案中,該欄位是已經被FileAlignment 處理過的長度
DWORD PointerToRawData; //該區塊在磁盤中的偏移,這個數值是從檔案頭開始算起的偏移量
DWORD PointerToRelocations; //在EXE檔案中沒有意義,在OBJ 檔案中,表示本區塊重定位資訊的偏移值
DWORD PointerToLinenumbers; //行號表在檔案中的偏移值,檔案的除錯資訊
WORD NumberOfRelocations; //在EXE檔案中也沒有意義,在OBJ 檔案中,是本區塊在重定位表中的重定位數目
WORD NumberOfLinenumbers; //該區塊在行號表中的行號數目
DWORD Characteristics; //該區塊的屬性,該欄位是按位來指出區塊的屬性(如代碼/資料/可讀/可寫等)的標志
} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER; - PE節:
每個節實際上是一個容器,可以包含 代碼、資料 等等,每個節可以有獨立的記憶體權限,比如代碼節默認有讀/執行權限,節的名字和數量可以自己定義 - 常見的節:
.text:包含了CPU的執行指令、所有其它分節存盤資料、支持性的資訊,一般來說,它是唯一可以執行的分節,也是唯一包含代碼的節,其中的資料是可讀、可執行的,并且利用CPU指令動態生成技術,可讓資料具有可讀、可寫、可執行功能,
.rdata:包含的資料只具有只讀功能,通常用來包含匯入匯出函式資訊,還可以存盤程式所使用的其它只讀資料,比如匯入的元件、匯入的函式資訊等,
.date:程式所用的全域變數資訊保存在這里,它的資料是可讀、可寫的,
.rsrc:該位元組包含由可執行檔案所使用的資源資訊,但這些內容并不能執行的,比如圖示、圖片、選單項和字串,也可以用來存盤其它程式,危害的是也可被用來存盤病毒,在程式運行的時候將這些病毒加載到記憶體當中
- DOS頭:
- 常用的PE分析工具
- PEview(roguekillerpe):https://www.adlice.com/download/roguekillerpe/

- StudyPE:https://www.chinapyg.com/forum.php?mod=viewthread&tid=137051&highlight=study%2Bpe

- PPEE:https://mzrst.com/

- CFF Explorer:https://ntcore.com/?page_id=388

- PE Explorer:http://www.heaventools.com/overview.htm

查殺技巧:
### 判斷PE檔案中程式入口點是否例外
很多病毒在感染了PE檔案后,通常都會向PE檔案中添加一部分代碼, 然后更改P E 頭中的AddressOfEntryPoint,將他指向的地址定位到病毒插入的代碼處,這樣每當這個檔案運行時,病毒代碼都會最先得到運行,
一般情況,很多病毒都將插入到PE檔案中的代碼放到PE檔案的后面,然后在代碼尾部放置一條陳述句再跳回到原來PE檔案真正入口點處,使得用戶在毫無察覺的情況下執行病毒代碼,殺毒軟體可以根據PE檔案入口點是否例外來判斷檔案是否有被病毒感染的嫌疑,通常入口點所指的相對虛擬地址比較靠前,不會在靠近檔案末尾處,或者指向最后一個節后的內容,如果一個PE檔案的入口點的指向不是這樣,那么就說明這個檔案有被病毒感染的嫌疑,當然,這種主觀的判斷不一定準確,但是可以算是一種判斷的依據,上期我們提到的啟發式掃描就會用到這樣的特征來幫助判斷未知病毒,
有些病毒為了防止反病毒軟體的這種探測,也想出了很多不修改入口點改變程式流程的方法,例如,改變原入口點程式的代碼,再跳轉到病毒體,
### 根據PE結構取特征碼
特征碼的提取是將檔案劃分為不同的部分,然后從每部分中提取一定長度的內容作為特征碼,這樣提取特征碼的方法存在著一個問題就是很多病毒的特征碼有類似的部分,例如我們討論的PE結構,很多PE檔案開頭部分有很大一部分是相同的,所以按照等分劃分檔案的方法來提取特征碼是不理想的,這時我們考慮到了利用PE結構,從每個節中提取一定的內容作為特征碼,或者以各種關鍵點為參照,在附近找特征碼,這樣一來,可以大大避免了上面所提到的等分劃分檔案提取特征碼方法的弊端,增強了不同病毒間特征碼的差異性,例如本次對于CIH 病毒的檢測,就檢查了PE Header 附近和入口點附近的特征,
#### CIH病毒的識別
取3 個特征:
首先是在PE Header前一個位元組如果非0,就有可能感染了,CIH 自己也利用了這個來判斷,
但是這個特征是不一定可靠的,沒有感染CIH病毒的程式這個地方也可能因為各種原因變成非0,所以還加了兩條代碼特征,
CIH會改變代碼入口,指向自己,根據這個,我們取了入口點偏移特征,將sidt動作和后面掛檔案系統鉤子兩個動作作為了特征,這樣就比較可靠了,
當然,這3個特征都集中在病毒頭部,如果要更可靠,避免家族內的誤報,還可以增加一些病毒體后面的代碼,
鏈接庫與函式
在計算機病毒分析中鏈接庫與函式可以給病毒分析帶來很多有用的資訊,那它們又是如何被計算機病毒盯上的呢?懷著這個疑問,進行進一步的學習:
盯上原因:病毒利用PE結構中的匯入表將計算機病毒需要的鏈接庫、函式等含有惡意內容的東西匯入到計算機記憶體里面,并呼叫元件中的函式(通過鏈接庫將計算機病毒代碼與元件連接在一起)進行準備作業
* 引入問題:鏈接是什么都有什么鏈接方法
鏈接所解決的問題即是將我們自己寫的代碼和別人寫的庫集成在一起,
* 靜態鏈接:是Windows平臺鏈接代碼庫最不常用的方法,但在UNIX和Linux程式中是比較常見的,
特點:在生成可執行檔案的時候(鏈接時間),把所有需要的函式的二進制代碼都包含到可執行檔案中去,因此,聯結器需要知道參與鏈接的目標檔案需要哪些函式,同時也要知道每個目標檔案都能提供什么函式,這樣聯結器才能知道是不是每個目標檔案所需要的函式都能正確地鏈接,
如果某個目標檔案需要的函式在參與鏈接的目標檔案中找不到的話,聯結器就報錯了,
目標檔案中有兩個重要的介面來提供這些資訊:一個是符號表,另外一個是重定位表,
當一個庫被靜態鏈接到可執行程式時,所有這個庫中的代碼都會復制到可執行程式中去,
優點:在程式發布的時候就不需要的依賴庫,也就是不再需要帶著庫一塊發布,程式可以獨立執行,
缺點:但在PE檔案頭中沒有鏈接庫的資訊,這種方法會導致可執行程式體積變大,占用更多的記憶體空間;如果靜態庫有更新的話,所有可執行檔案都得重新鏈接才能用上新的靜態庫,通常計算機病毒為減小病毒體積一般不使用這種鏈接方法,
鏈接時間:在生成可執行檔案的時候(編譯程序中進行的鏈接)
* 動態鏈接:動態鏈接時最常見的,對于惡意代碼分析師也應該時最關注的,動態鏈接資訊寫在匯入表中,當代碼庫被動態鏈接時,宿主作業系統會在程式被裝載時搜索所需要的代碼庫,如果程式呼叫了被鏈接的庫函式,這個函式會在代碼庫中執行
特點:在編譯的時候不直接拷貝可執行代碼,而是通過記錄一系列符號和引數,在程式運行或加載時將這些資訊傳遞給作業系統,作業系統負責將需要的動態庫加載到記憶體中,然后程式在運行到指定的代碼時,去共享執行記憶體中已經加載的動態庫可執行代碼,最終達到運行時連接的目的,
優點:多個程式可以共享同一段代碼,而不需要在磁盤上存盤多個拷貝,
缺點:由于是運行時加載,可能會影響程式的前期執行性能,
鏈接時間:在程式運行或加載時
運行時鏈接:當應用程式呼叫LoadLibrary 或 LoadLibraryEx 函式時,系統就會嘗試按載入時動態鏈接搜尋次序(參見載入時動態鏈接)定位DLL,如果找到,系統就把DLL模塊映射到行程的虛地址空間中,并增加參考計數,如果呼叫LoadLibrary或LoadLibraryEx 時指定的DLL其代碼已經映射到呼叫行程的虛地址空間,函式就會僅回傳DLL的句柄并增加DLL參考計數,注意:兩個具有相同檔案名及擴展名但不在同一目錄的DLL被認為不是同一個DLL,
* 備注:雖然運行時鏈接在合法程式中并不流行,但是惡意代碼中是常用的,特別是當惡意代碼被加殼或混淆的時候,因為加殼或混淆會破壞計算機病毒的匯入表,沒有匯入表Windows系統不會幫助病毒完成鏈接作業,所以需要在運行的時候利用運行時鏈接這種方法,將所需要的鏈接庫和函式裝載到記憶體空間中,
特點:需要的適合才進行鏈接
優點:使用運行時鏈接的可執行程式,只有當需要使用函式時,才鏈接到庫,而并不是像動態鏈接模式一樣在程式啟動時就會鏈接
缺點:需要使用相關函式才可以呼叫
鏈接時間:遇到呼叫函式時
基于鏈接的分析:
PE檔案頭列出了計算機病毒代碼所需的所有元件和函式
元件和函式名字可以用來分析計算機病毒的功能
常用的元件的資訊:
常用的分析工具:
Dependency Walker:包含在Visual Studio的一些版本與其它微軟開發包中,支持列出可執行檔案的動態鏈接函式
病毒中常見的函式:
LoadLibrary:將元件動態的從硬碟裝載到計算機病毒的記憶體空間
GetProcAddress:在元件中找到對應函式的地址
URLDownloadToFile():會從Internet上下載一個檔案
* 匯入函式
PE檔案頭中也包含了可執行檔案使用的特定函式相關資訊,因為在匯入函式只能看到這個函式的名字,為了了解函式的引數資訊、功能資訊以及使用方法,可以在微軟的MSDN中找到這些資訊,當然了使用搜索引擎也是可以的,
* 匯出函式
與匯入函式類似,DLL和EXE的匯出函式,是用來與其它程式和代碼進行互動時所使用的,
通常,一個DLL會實作一個或多個功能函式,然后將它們匯出,是的別的程式可以匯入并使用這些函式,
PE檔案中也包含了一個檔案中匯出了哪些函式資訊
輔助查殺
常用殺毒軟體、惡意軟體查殺平臺、惡意軟體分析平臺等進行輔助查殺,它們具有如下優勢:
* 擁有病毒特征庫:一個資料庫,它里面記錄著已知病毒的種種“相貌特征”,根據這些專屬特征,可鑒定軟體是否為病毒,主要針對已知病毒,
* 病毒針對:計算機病毒的撰寫者可以很容易的修改自己的代碼,從而改變這些病毒的各種特征,常通過如下技術來躲避殺毒軟體的檢測
* 多型技術:語意不變,語法混淆,增加逆向分析難度,
* 變形技術:功能不變,語意混淆,增加逆向分析難度,
* 單向執行技術:未解密數字猜想、哈希值,增加逆向分析難度,
* 垃圾指令:使用大量對分析時無用的指令,增加逆向分析難度,
* 擁有啟發式規則:因有的病毒特征在特征庫沒有,殺毒軟體未查殺這些未知病毒,就根據已知的病毒分析經驗總結出一些規則,來鑒定軟體是否為病毒,主要針對未知病毒,
* 病毒針對:開發新型病毒,不使用也被殺毒軟體知道的特征與行為已避開殺毒軟體檢測
當本地無殺毒軟體,流量不是很多等條件存在限制的情況下,可通過進算檔案Hash值,到一些網站利用Hash值進行查殺,原理以及常見的查詢平臺如下:
* 原理:哈希值是一種獨特的演算法(哈希函式)計算出檔案的唯一識別符號,不同檔案都不相同,影響因素可以是檔案大小,內容,創建日期等……計算出哈希值,利用這些特性可以了解檔案沒有損壞或被修改也可用來在查詢平臺查詢分析結果,
* 計算工具:
Hasher Pro:http://www.den4b.com/
HashOnClick : https://www.2brightsparks.com
Hash Generator Pro:http://insili.co.uk/
MD5 File Hasher Pro:http://www.digital-tronic.com/md5-file-hasher/
Advanced Hash Calculator:http://www.filesweb.com/
* 查詢平臺:
微步云沙箱:https://s.threatbook.cn/

Virus Toal:https://www.virustotal.com/gui/home/search

道高一尺魔高一丈
病毒未避免被靜態分析技術分析出來,常使用加殼、混淆技術,來躲避靜態分析
* 目的:躲避殺毒軟體的檢測并增加病毒分析作業的難度
* 混淆:隱藏計算機病毒程式的資訊
* 常用工具:
DotFuscator:https://www.preemptive.com/
DashO Pro:https://www.preemptive.com/
ProGuard:https://www.guardsquare.com/en/proguard
Virbox Protector:https://shell.virbox.com/
Code Virtualizer:https://www.oreans.com/
Skater .NET obfuscator:http://www.rustemsoft.com/
* 加殼:壓縮計算機病毒檔案的大小,并使用加密技術保護病毒的核心代碼
常用工具:
360加固保:https://jiagu.360.cn/
UPXShell:http://upxshell.sourceforge.net/download.html
DRMsoft EncryptEXE:http://www.drmsoft.com/
Vmproject:https://vmpsoft.com/
針對病毒的防護策略,常通過脫殼、反混淆技術來進行協助分析
* 脫殼:脫殼即去掉軟體所加的殼,軟體脫殼有手動脫和自動脫殼之分
常用工具:
QuickUnpack:http://qunpack.ahteam.org/?p=458#more-458
frida-unpack:https://github.com/WeiEast/frida-unpack
de4dot:https://github.com/0xd4d/de4dot
drizzleDumper:https://github.com/DrizzleRisk/drizzleDumper
de4js:https://github.com/lelinhtinh/de4js
wxappUnpacker:https://github.com/gzh4213/wxappUnpacker
Android_unpacker:https://github.com/CheckPointSW/android_unpacker
unpacker:https://github.com/malwaremusings/unpacker
* 反混淆:讓代碼還原到美觀,高可讀性的狀態
常用工具:
simplify:https://github.com/CalebFenton/simplify
de4dot:https://github.com/0xd4d/de4dot
flare-floss:https://github.com/fireeye/flare-floss
Tigress_protection:https://github.com/JonathanSalwan/Tigress_protection
VTIL-Core:https://github.com/vtil-project/VTIL-Core
dex-oracle:https://github.com/CalebFenton/dex-oracle
malware-jail:https://github.com/HynekPetrak/malware-jail
de4js:https://github.com/lelinhtinh/de4js
dnpatch:https://github.com/ioncodes/dnpatch
etacsufbo:https://github.com/ChiChou/etacsufbo
samsung-firmware-magic:https://github.com/chrivers/samsung-firmware-magic
JRemapper:https://github.com/Col-E/JRemapper
碼字不易,還請多多支持!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/69513.html
標籤:其他
上一篇:RSA(攻防世界)Rsa256 -- cr4-poor-rsa
下一篇:ms12-020死亡藍屏漏洞復現
