計算機病毒實踐彙總六:IDA Pro基礎

在嘗試學習分析的過程當中,判斷結論不必定準確,只是一些我本身的思考和探索。敬請批評指正!html

1. IDA使用

(1)搜索、下載並執行IDA Pro,對可執行程序lab05-01.dll進行裝載,分別以圖形模式和文本模式查看程序的反彙編結果

  • 運行IDA Pro,打開Lab05-01.dll,以圖形化界面顯示:windows

  • 直接定位到DLLMain開始的位置上。用空格鍵能夠切換到文本模式查看:api

(2)查看程序中的全部函數

程序中的全部函數包括:導入函數、導出函數、在中間過程當中使用的函數。
  • 咱們能夠從Import窗口查看導入函數,Export窗口查看導出函數,Function Window查看程序中全部函數:socket

(3) 查看程序中的全部字符串:

  • 打開字符串strings視圖:tcp

  • 這裏就能夠看到全部的字符串:函數

(4)查看某個函數調用其它函數的狀況

  • 隨便在左側函數欄找一個函數,雙擊到達這個函數所在位置.text節10011F40:工具

  • 使用圖形化工具查看:學習

    • Function calls 顯示全部的函數調用;插件

    • Xrefs to 查看哪些函數調用了這個函數:code

    • Xrefs from 查看這個函數調用了那些函數:

    • User Xrefs chart 可讓用戶選擇顯示內容:

      • Cross references to:顯示被那些函數調用,至關於Xrefs to
      • Cross references from:顯示調用那些函數,至關於Xrefs from
      • Recursive:遞歸顯示, 若取消則僅顯示上下直接調用函數
      • Follow only current direction:僅當前函數,若取消就變成了顯示所有的函數調用
      • Recursion depth:顯示調用的深度
      • Externals:是否忽略外部Windows API函數
      • Data:是否忽略數據
      • From Library Functions:是否忽略庫函數內部的交叉參考
      • To Library functions:是否忽略外部的交叉參考
      • Print Comment:是否對外部函數打印註釋

2. 使用IDA對lab05-01.dll進行分析

(1)DLLMain的地址是?

  • 一打開lab05-01.dll程序,自動停到入口地址DLLMain的位置:

  • 能夠看到DLLMain的地址是在.text節1000D02E的位置

(2)調用了gethostbyname的函數有?

  • 打開導入表:

  • 經過ALT+T調出查找gethostbyname:

  • 而後被定位到:

  • 雙擊該項,跳轉到其定位的地址100163CC的位置上:

  • 使用IDAPro的交叉引用功能,在上述位置用快捷鍵Ctrl+X打開交叉引用窗口:

  • p是gethostbyname被調用的引用,通過觀察可得,在5個不一樣的位置調用了gethostbyname。

(3)分析地址爲0x10001757處對gethostbyname的調用,肯定DNS請求的目標。

  • 使用快捷鍵G快速定位到0x10001757:

  • 這裏是一段彙編代碼,call指令調用gethostbyname:

  • 這一段裏面,首先在eax中壓入偏移,雙擊off_10019040能夠查看:

  • 這裏能夠經過IDA的自動註釋功能看到部份內容,雙擊aThisIsRdoPics查看完整的內容:

    • 這裏就是這個偏移指向的字符串「[This is RDO]pics.praticalmalwareanalysis.com」。
  • 接着,eax加上了0Dh,咱們經過hex界面可能看得更直觀,右擊aThisIsRdoPics選擇在新的十六進制視圖打開:

  • 光標放在網址最前位置,能夠在下方看到相對偏移,除去中括號中內容的網址部分開始位置的偏移就是0Dh:

  • 而後將這個指向這個URL的eax壓入棧,調用gethostbyname函數。

(4)字符串「\cmd.exe /c」出如今內存中的什麼位置?分析引用「\cmd.exe /c」的代碼所在區域可能完成的做用。

  • 在字符串視圖查找字符串「\cmd.exe /c」:

  • 雙擊打開:

  • 能夠看到位置是xdoors_d:10095B34。經過雙擊字符串後面註釋中的上箭頭或Ctrl+C查看交叉引用找到其引用:

  • 定位到:

  • 彙編學的很差,在這裏看彙編代碼也實在是費勁,爲了大致判斷這一部分的功能,我採用圖形化界面,直接雙擊藍色無條件跳轉指向線、綠色條件跳轉指向線查看代碼的流程。

  • 能夠看到一些有用的信息:

    call ds:GetCurrentDirectoryA:是一個系統參數,在一個緩衝區中裝載當前目錄。
      call ds:GetLocalTime:獲取本地時間。
  • 字符串位置:

  • 雙擊查看:

    • 得到關鍵信息:「Shell Session」會話

      call ds:CreatePipe:建立匿名管道的同時返回兩個句柄:管道讀句柄和管道寫句柄。
        call ds:GetStartupInfoA:獲取進程起始信息。
        call ds:recv:套接字接收函數
        call ds:closesocket:關閉套接字。
  • 綜合來看,這一部分可能完成的做用是使用套接字的一個遠程會話。

(5)函數sub_10004E79調用了哪些函數?其中的API函數有哪些?根據API函數信息猜想該函數的做用,並嘗試對該函數進行重命名。

  • 在左側函數欄查找到sub_10004E79,雙擊查看:

  • 使用圖形化工具查看這個函數調用了那些函數:

  • 函數sub_10004E79調用了直接調用了四個函數,間接調用了四個函數。

    • API函數有:

      GetSystemDefaultLangID:取得系統的默認語言ID 
        Sprintf:把格式化的數據寫入某個字符串中
    • C語言庫函數有:

      Send:向一個已經鏈接的socket發送數據
        Strlen:檢測字符串實際長度
        Malloc:向系統申請分配指定個字節的內存空間
        Free:釋放指向的存儲空間
  • 猜想這個函數應該是獲取了系統語言並打印出來,能夠在左側函數欄右擊函數編輯:

  • 重命名函數,方便進一步研究:

  • 更改後能夠看到函數名都已經被修改了:

(6)在0x10001701處是一個對socket的調用,它的三個參數分別是什麼?結合MSDN中socket幫助和IDA中的命名符號常量,你認爲這三個參數實際分別是什麼?

  • 首先到達0x10001701處,看到其三個參數分別爲:2,1,6:

  • 可使用hex-ray反彙編C語言僞代碼看得更清楚:

  • MSDN中查找socket function

  • 能夠找到咱們須要的參數:

    • AF

    • Type

    • protocol

  • Socket函數中的三個參數分別爲:

    2:AF_INET使用IPv4協議
      1:SOCK_STREAM使用流式Socket
      6:IPPROTO_TCP使用tcp協議
  • 能夠右擊更改成對應的名稱方便理解:

  • 這個標誌其實是一個枚舉型變量:

  • 更改後效果:

4. 實踐小結

  • 有同窗遇到了這樣一個問題來問我:在Function window中搜索後面某一題中調用的函數沒有找到,在Import中搜索到了,這個Function Window不該該包含這個程序裏全部的函數嗎,爲何會找不到一個確實被調用了的函數呢?

  • 我看了一下,確實是這樣,打開其它程序,一樣不顯示導入函數:

  • 查看Function Window中的標誌F,由於標誌F表示多是導入函數,也多是本身寫的函數,沒有看到有該標誌的,多是由於IDA版本問題或者是自己導入函數就不算在程序中寫的函數?

  • IDA Pro功能實在是太強大了,在這麼短的時間內只作到了根據問題粗略的使用,《惡意代碼分析實戰》用了一章的篇幅講這個強大的反彙編器,讀完了以後感受有不少可拓展的使用方法(有些插件須要付費才能下載,免費版的功能和上面說的不大同樣),還須要必定時間的學習。

  • 在作此次實踐的過程當中,我一直在想如何在沒有這些問題的提示下使用IDAPro對一個惡意代碼進行高級靜態分析。彙編和反彙編很重要,對程序及工具交互能力的利用也很重要。在接下來的學習過程當中須要逐步解決這個問題。


參考資料:《惡意代碼分析實戰》讀書筆記 靜態分析高級技術一

相關文章
相關標籤/搜索