1. 程式人生 > >惡意程式碼防範-熟悉給定工具

惡意程式碼防範-熟悉給定工具

惡意程式碼防範 實驗一

實驗目的

瞭解並熟悉給定的工具:

  • PEiD
  • Ollydbg
  • Upxshell
  • UPX脫殼終結者

使用所給檔案完成以下問題

  1. 這些檔案何時編譯的?
  2. 這兩個檔案是否有跡象被加殼或混淆?證據何在?
  3. 是否有匯入函式?功能?
  4. 是否有任何其他檔案或基於主機的跡象,讓你可以再受感染系統上查詢?
  5. 是否有關於網路的惡意程式碼感染跡象?

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.exeLab01-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

參考文件

  1. 北京交通大學《惡意程式碼防範》課程實驗文件
  2. MSDN