前言
惡意代碼分析是安全從業人員非常重要的一個技能。
之前提到過SSDT hook隱藏和PEB斷鏈隱藏,今天接觸一下其他的。
參考書籍:<<惡意代碼分析實戰>>
Lab13-1
這里先運行一下,可以看到對一個網站的請求。
然后用IDA查看,沒有看到這個域名相關的信息。
看到這里抽取資源文件,并對資源文件進行了異或操作。
這里我們對資源文件提取,進行異或操作,可以看到域名。
之后再調用了一個函數,獲得主機名。
這里之后調用一個函數,我們用od看一下這里干了啥。
可以知道這里進行了base64編碼
然后發送請求
讀取返回內容。
然后進行判斷。
Lab13-2
用IDA打開。
GetTickCount
GetTickCount返回(retrieve)從操作系統啟動所經過(elapsed)的毫秒數,它的返回值是Dword。
函數解除鎖定的內存塊,使指向該內存塊的指針無效
GlobalFree
釋放指定的全局內存塊
GetSystemMetries
通過設置不同的標識符就可以獲取系統分辨率、窗體顯示區域的寬度和高度、滾動條的寬度和高度。
GetDesktopwindows
該函數返回桌面窗口的句柄。桌面窗口覆蓋整個屏幕。桌面窗口是一個要在其上繪制所有的圖標和其他窗口的區域。
該函數檢索一指定窗口的客戶區域或整個屏幕的顯示設備上下文環境的句柄,以后可以在GDI函數中使用該句柄來在設備上下文環境中繪圖。
該函數創建一個與指定設備兼容的內存設備上下文環境(DC)。
CreateCompatibleBitmap
該函數創建與指定的設備環境相關的設備兼容的位圖。
SelectObject
該函數選擇一對象到指定的設備上下文環境中,該新對象替換先前的相同類型的對象。
GetObjectA
t函數得泛指得到對象,到指定圖形對象的信息,根據圖形對象,函數把填滿的或結構,或表項(用于邏輯調色板)數目放入一個指定的緩沖區。
GlobalAlloc
該函數從堆中分配一定數目的字節數。Win32內存管理器并不提供相互分開的局部和全局堆。提供這個函數只是為了與16位的Windows相兼容。簡稱全局堆分配
GlobalLock
鎖定內存中指定的內存塊,并返回一個地址值,令其指向內存塊的起始處。
GlobalUnlock
函數解除鎖定的內存塊,使指向該內存塊的指針無效,GlobalLock鎖定的內存,一定要用GlobalUnlock解鎖。
GlobalFree
釋放指定的全局內存塊
ReleaseDC
函數釋放設備上下文環境(DC)供其他應用程序使用。函數的效果與設備上下文環境類型有關。它只釋放公用的和設備上下文環境,對于類或私有的則無效。
DeleteDC
函數刪除指定的設備上下文環境(Dc)。
DeleteObject
該函數刪除一個邏輯筆、畫筆、字體、位圖、區域或者調色板,釋放所有與該對象有關的系統資源,在對象被刪除之后,指定的句柄也就失效了。
先獲得操作系統的時間,作為文件名
然后截圖
之后進入一個加密函數
最后寫入文件
那么怎么看到這個截圖呢,一種方法是在加密前直接返回。
還有一種是將加密后的圖片內容取出來,放到加密的參數,這里是先假設自定義加密是可逆的進行嘗試。按住第一個字節,shift往下脫,在最后一個字節上面按一下。
Lab13-3
放入PEid,無殼,并且可以看到有加密字段。
放入IDA中查看,這里通過插件可以看到先是調用了AES相關的函數
接著啟用了socket初始化,與服務器通信
然后這里創建了兩個管道
之后創建了cmd的進程。
之后創建了一個線程,從socket讀取內容。
這里還涉及到了一個函數,點進去查看,可以得知是base64
然后調用了另一個函數,也是讀和寫的操作,這里進行了AES加密操作。
理一下,就是socket獲取服務器base64編碼后的數據,然后解碼傳遞給cmd,然后cmd運行結果aes加密,然后傳遞給服務器。
這里通過插件和字符串可以判斷出AES加密和base64編碼,AES的私鑰可以從main函數中得知。