恶意代码分析(一)
惡意代碼分析(一)
- 樣本來源
- 樣本概況
- 分析環境
- 初步分析
- 調試分析
- 第一個線程
- 第二個線程
- 第三個線程
- 第四個線程
- 第五個線程
- 其它思路
- 總結
樣本來源
https://www.52pojie.cn/thread-1377686-1-2.html
樣本概況
| 樣本名稱 | 免費外紀.exe |
| 樣本大小 | 4.62MB(4,853,850 Byte) |
| MD5 | bcfc56704ea9b62650bec0349532b7d7 |
| SHA1 | 176fbfb56e401f1043532377c1b67bd207c32bb9 |
| 時間戳 | 28/10/2020 |
| 殼信息 | 無 |
| 數字簽名 | 無 |
分析環境
| 操作系統 | windows 10 |
| 病毒掃描 | https://www.virscan.org |
| 行為分析 | 火絨劍 |
| 調試工具 | OllyDbg、IDA Pro |
初步分析
VirSCAN掃描:
火絨劍分析:
雙擊運行結果:
調試器運行結果:
結論:若通過調試器運行樣本,初步得到樣本會做以下幾件事情
驗證:
1)比對源文件和svchost.exe的MD5值:
2)比對源文件的MD5和52993656.bak的MD5值:
3)查看注冊表鍵值
由于進行過多次調試,因此存在多行不同的值
調試分析
第一個線程
1)首先使用IDA從WinMain開始靜態分析
2)查看sub_4010F5
3)使用OllyDbg調試sub_4010AF得到關鍵數據
發現循環結束后,地址0x408578的數據出現了熟悉的PE頭部特征“MZ”
4)將解密后的數據dump下來,并刪除無用數據
5)查殼,發現存在nsp殼
6)使用IDA進行反編譯,發現入口函數為DllEntryPointer,說明該文件類型為DLL動態鏈接庫,不方便使用手動脫殼的方法進行脫殼
7)繼續向下調試,直到樣本調用這個DLL
可以看到調用的地址是0x10009c70,由于在此之前調用了qmemcpy拷貝DLL各個區段到新內存,以及進行了一系列LoadLibrary和GetPorcAddress操作,猜測這是樣本在對DLL進行脫殼,因此這個時候嘗試再次dump,代碼基址和數據基址可以在內存中定位
順利得到了脫殼后的DLL文件,IDA打開發現存在進程操作,文件操作和注冊表操作等相關API調用
7)OD繼續向下調試分析
分析一部分后的DllEntryPointer函數注釋如下,有些函數還不知道具體是什么含義
隨后創建了兩個新的線程,暫時先不分析,接著往下看
8)查看sub_10002450
9)最后調用sub_10009570,里面創建了第四個線程sub_10009200,然后進入sleep
第二個線程
1)首先分析sub_100076d0(由于IDA中數據為空,因此使用OD調試)
在內存中生成了一些字符串并調用了sub_10002f50
2)sub_10002f50中生成了字符串SYSTEM\CurrentControlSet\Services\Bcdefg
再將這個字符串作為參數傳入sub_1000bc70并調用
sub_1000bc70存在大量的CALL ESI這樣的指令,無法反編譯為C代碼
3)sub_1000bc70存在大量的CALL ESI這樣的指令,無法反編譯為C代碼,繼續使用OD調試
導入了一些注冊表相關的API
打開了注冊表鍵SYSTEM\CurrentControlSet\Services\Bcdefg
讀取了鍵名MarkTiny的值
調用sub_1000bed1關閉了注冊表
然后釋放了ADVAPI32.dll并return
4)之后sub_100076d0又調用了兩次sub_10002f50獲取了月份和日期
在棧里生成rundll32.exe并調用了GetModuleFileNameA得到了當前路徑
之后比較了一下當前進程名是否為rundll32.exe
如果不相同的話,會調用三個函數
首先調用sub_10003830遍歷進程模塊查找是否存在下面五個進程
cthlp.exe pythonw.exe xService.exe pgradeHelper.exe AcrylicService.exe然后調用sub_10004990比較了下面第一條圖片路徑和后三條圖片路徑,暫時不清楚具體作用
C:\Windows\web\wallpaper\Windows\img0.jpg C:\Users\test\Pictures\maldun_background.jpg C:\Users\vbccsb\Pictures\Desktop.jpg C:\Users\vbccsb\Pictures\Desktop.jpg接著又調用了sub_10005fc0檢測進程模塊
C:\delete C:\create erAToolClient.exe SandboxieRpcSs.exe SandboxieDcomLaunch.exe后面進入了一段很長的Sleep,猜測是為了執行其他線程,Sleep結束后又會重新回到線程頭部開始執行
這個線程暫時先分析到這里
第三個線程
1)開啟了一個新線程sub_1000b500
2)分析sub_1000b500
3)查看sub_10009ba0
4)分析sub_100099d0
第四個線程
1)啟動套接字
隨后進入一個大循環,共三層
2)分析sub_10001560
在sub_1000b580中再次調用了sub_1000b500
調試分析看看與之前有什么不同
3)分析sub_1000b7b0
3)分析sub_1000b6a0
首先加載了一些函數
然后調用這些函數,獲取桌面信息,值位Default
函數結束后回到父函數,向下執行調用sub_10001680
第五個線程
1)分析sub_10001680
其它思路
之前有一個地方判斷了一下當前程序的文件名是否為rundll32.dll,看一下若比對成功的情況
若比對成功會經過這里
由于sub_1000788A在IDA中為空數據,因此使用OD調試分析
首先通過獲得當前年月日
后面也沒做什么,函數結束后回到判斷文件名的位置開始循環這個操作
總結
通過分析,該樣本大致有以下幾大明顯行為
唯一的遺憾是第五個線程中存在一個大量算法的函數,由于socket連接不成功,因此無法分析函數的目的是什么
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
- 上一篇: Windows消息机制学习笔记(二)——
- 下一篇: pwn学习总结(五) —— ret2dl