惡意程式碼防範-熟悉給定工具
惡意程式碼防範 實驗一
實驗目的
瞭解並熟悉給定的工具:
- PEiD
- Ollydbg
- Upxshell
- UPX脫殼終結者
使用所給檔案完成以下問題
- 這些檔案何時編譯的?
- 這兩個檔案是否有跡象被加殼或混淆?證據何在?
- 是否有匯入函式?功能?
- 是否有任何其他檔案或基於主機的跡象,讓你可以再受感染系統上查詢?
- 是否有關於網路的惡意程式碼感染跡象?
1、這些檔案何時編譯的
使用PEiD
開啟檔案,可以看到這個檔案編譯時間的時間戳,把這個十六進位制時間戳轉換成十進位制就可以在站長工具 > Unix時間戳查到這個時間戳對應的北京時間。
說明這個檔案編譯於北京時間2010/12/20 0:16:19
2、這兩個檔案是否有跡象被加殼或者混淆?證據何在?
我們用PEiD開啟這兩個檔案,發現底下都寫著Microsoft Visual C++ 6.0
,就此看來,以這個軟體掃描的能力內這兩個檔案都是沒有加殼、沒有被混淆的。
為了驗證這個結論,我把其中一個檔案Lab01_01.exe
使用工具Upxshell
加殼,再用PEiD
檢視,發現底下不再是原來的VC6.0了,變成了UPX加殼的資訊,說明加殼成功了。
我發現Olldbg
不僅在後面的實驗內容中可以使用到,這個地方我們還可以用Olldbg
自帶的脫殼指令碼和脫殼功能來為我們自己加殼的檔案脫殼。
我們能驗證到脫殼後的檔案和原始檔在PEiD
3、是否有匯入函式?功能?
可以用Ollydbg
開啟檔案,可以看到這個檔案有哪些匯入函式。
所屬庫 | 函式名 | 函式功能 |
---|---|---|
> |
Lab01_01.exe | <<<<< |
Kernel32.dll | CloseHandle | 關閉一個核心物件。其中包括檔案、檔案對映、程序、執行緒、安全和同步物件等。在CreateThread成功之後會返回一個hThread的handle,且核心物件的計數加1,CloseHandle之後,引用計數減1,當變為0時,系統刪除核心物件。若線上程執行完之後,沒有呼叫CloseHandle,在程序執行期間,將會造成核心物件的洩露,相當於控制代碼洩露,但不同於記憶體洩露,這勢必會對系統的效率帶來一定程度上的負面影響。但當程序結束退出後,系統會自動清理這些資源。 |
Kernel32.dll | UnmapViewOfFile | 不再需要把檔案的資料對映到程序的地址空間中時,可以該函式來釋放記憶體區域。 |
Kernel32.dll | IsBadReadPtr | 該函式檢查呼叫程序是否有讀取指定記憶體的內容的許可權。 |
Kernel32.dll | MapViewOfView | 為檔案的資料保留一個地址空間區域,並將檔案的資料作為對映到這個區域的物理儲存器進行提交。 |
Kernel32.dll | CreateFileMapping | 建立一個新的檔案對映核心物件。 |
Kernel32.dll | CreateFile | 這是一個多功能的函式,可開啟或建立以下物件,並返回可訪問的控制代碼:控制檯,通訊資源,目錄(只讀開啟),磁碟驅動器,檔案,郵槽,管道。 |
Kernel32.dll | FindNextFile | 用來遍歷目錄或檔案時,判斷當前目錄下是否有下一個目錄或檔案。 |
Kernel32.dll | FindFirstFile | 根據檔名查詢檔案。 |
Kernel32.dll | CopyFile | 拷貝檔案。 |
MSVCRT.dll | malloc | 向系統申請分配指定size個位元組的記憶體空間。 |
MSVCRT.dll | exit | 終止函式。 |
MSVCRT.dll | XcptFilter | 標識要執行的異常和相關事件。 |
MSVCRT.dll | _p___initenv | 初始化環境變數。 |
MSVCRT.dll | getmainargs | 呼叫分析的命令列並複製引數傳遞給 main() 返回傳遞的指標。 |
MSVCRT.dll | initterm | 內部方法指瀏覽函式指標表並初始化它們。 |
MSVCRT.dll | _setusermatherr | 指定使用者提供的事務來處理算術錯誤,而不是_matherr事務。 |
MSVCRT.dll | adjust_fdiv | 找不到具體函式功能,猜測為連結時自動呼叫的 |
MSVCRT.dll | _p__commode | 指向_commode 全域性變數,它為檔案 I/O 操作指定預設 檔案提交模式。函式僅供內部使用,使用者程式碼不應呼叫它。 |
MSVCRT.dll | _p__fmode | _p__fmode 函式僅供內部使用,使用者程式碼不應呼叫它。特定模式的檔案。_open_pipe 和 I/O 操作指定 binary 或 text 轉換。 |
MSVCRT.dll | _set_app_type | 找不到具體函式功能,猜測是定義應用程式型別。 |
MSVCRT.dll | except_handler3 | 異常處理函式。 |
MSVCRT.dll | controlfp | 獲取和設定浮點控制字。 |
MSVCRT.dll | stricmp | 比較字串s1和s2,但不區分字母的大小寫。 |
> |
Lab01_01.dll | <<<<< |
Kernel32.dll | Sleep | 將呼叫它的程序掛起(暫停)dwMilliseconds毫秒後繼續執行,掛起時不僅不會迴應使用者操作,還會停止自身的執行。 |
Kernel32.dll | CreateProcess | 用來建立一個新的程序和它的主執行緒,這個新程序執行指定的可執行檔案。 |
Kernel32.dll | CreateMutex | 找出當前系統是否已經存在指定程序的例項。如果沒有則建立一個互斥體。 |
Kernel32.dll | OpenMutex | 現有的一個已命名互斥體物件建立一個新控制代碼。 |
MSVCRT.dll | free | 釋放記憶體空間。 |
MSVCRT.dll | strncmp | 是指定比較size個字元。也就是說,如果字串s1與s2的前size個字元相同,函式返回值為0。 |
ws2_32.dll | socket | 建立套接字。 |
ws2_32.dll | WSAStartup | 即WSA(Windows Sockets Asynchronous,Windows非同步套接字)的啟動命令。 |
ws2_32.dll | inet_addr | 將一個點分十進位制的IP轉換成一個長整數型數(u_long型別)。 |
ws2_32.dll | connect | 建立套接字網路連線。 |
ws2_32.dll | send | 傳送資料包。 |
ws2_32.dll | shutdown | 關閉套接字。 |
ws2_32.dll | recv | 接收資料包。 |
ws2_32.dll | closesocket | 關閉套接字。 |
ws2_32.dll | WSACleanup | 終止Winsock 2 DLL (Ws2_32.dll) 的使用。 |
ws2_32.dll | ntohs | 將一個16位數由網路位元組順序轉換為主機位元組順序。 |
4、是否有任何其他檔案或基於主機的跡象,讓你可以再受感染系統上查詢?
上面我把呼叫的系統API函式和其功能都列出來了,可以看到在這個程式中有有關於檔案拷貝的函式,說明會產生基於主機的檔案感染。具體的感染細節可以通過閱讀彙編原始碼瞭解。
由上圖可知,Lab01_01.exe
把Lab01-01.dll
拷貝到了系統API資料夾下並重命名為了kernel132.dll
。
5、是否有關於網路的惡意程式碼感染跡象?
根據前面找到的這兩個檔案所呼叫的系統API函式和功能可以瞭解到,在Lab01_01.dll中呼叫了大量系統的網路API,所以可以確定這些檔案有關於網路的惡意程式碼感染的跡象。
查看了這個dll檔案的彙編程式碼之後,由上圖可以發現這個dll檔案向ip地址為127.26.152.13
的主機發送了資料包。
由上圖可以知道這個資料包封裝了字串“hello”
。
實驗環境
作業系統:Windows XP Professional SP2
虛擬機器:Parallels Desktop
參考文件
- 北京交通大學《惡意程式碼防範》課程實驗文件
- MSDN