病毒介紹
病毒名稱:Worm.Win32. RavMon
檔案MD5:5D8CC0712927E07A1BAB416493F43036
感染系統:windows 98 及以上版本
開發工具:python
病毒描述
病毒還會嘗試收集感染
主機的信息,如:感染的
主機名,當前windows版本等。如果當前系統為xp,則病毒還會通過運行“netsh firewall delete portopening TCP”來刪除
防火牆連線埠配置協定中的
傳輸控制協定,進而降低系統的安全性。病毒嘗試連線網路,獲取一個shell,通過運行rundll32.exe並載入shdocvw.dll來打開一個URL
地址。病毒還具有結束進程功能。此病毒通過隨身碟和移動設備來進行傳播。
行為分析
1、HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\RavAV
鍵值: 字串: "C:\WINNT\RavMon.exe"
3、開啟本機一個隨機連線埠並傳送獲得的計算機信息。如:計算機名、連線埠、版本信息等。
4、猜測該病毒的某些功能對應的python
模組檔案名:
終止進程對應的python模組名為:killProcName.pyo
url
地址對應的python
模組名為: urllib.pyo、urlparse.pyo
獲取目標
主機信息對應的python
模組名為:os.pyo
http相關的python
模組名為:httplib.pyo
刪除cookiess對應的python
模組名為:cookiess.pyo
base64/quopri編碼功能對應的python
模組名為:base64.pyo
cmd功能對應的python
模組名為:cmd.pyo
修改註冊表對應的python
模組名為:copy_reg.pyo
ftp相關的python
模組名為:ftplib.pyo
調用socket相關的python
模組名為:socket.pyo
--------------------------------------------------------------------------------
代碼分析
python2exe使用python的modualfinder來調入要運行的scripts並且尋找運行它所需要的所有python
模組和擴展模組。
純python的
模組在臨時目錄里被編譯成.pyc(debug)和.pyo(optimized)的
檔案。編譯後的擴展
模組pyd
檔案也能找到。
最後生成一個與zip兼容的包,包含一個dependency目錄和你的script,這個包最後提供給一個py2exe自帶的python解釋器。
運行生成的程式,將建立一個重要的關聯,這樣在script開始運行的時候,必要的
模組可以從包中的正確地import。
由於擴展
模組不能從zip包中包含或import,它們以被單讀提供。放在dist\myscript目錄下。
解碼的過程:
main, winmain調用start函式。
start:
(1) 獲得目錄名和
檔案名(GetModuleFileName)
(2) 取出執行
檔案的數據(MapExistingFile)
(3) 獲得script的信息(GetScriptInfo)
(4) 用_putenv設定用戶的
環境變數(PYTHONHOME,PYTHONPATH,PYTHONOPTIMIZE,PYTHONDEBUG等)
(5) 將scriptinfo種的信息來設定python內部變數(Py_NoSiteFlag, Py_VerboseFlag等)
(6) Py_Initialize()
(7) PySys_SetArgv(argc, argv)
(8) 調用BuildToc獲得toc(dict對象)
(9) 調用PyRun_SimpleString執行"import sys; sys.path=[r'%s']"
(10)調用Load_Module調入imputil
模組,調用PyRun_SimpleString執行"import imputil"
(11)Py_InitModule("__main__", methods);
(12)解出Scripts\\並運行它
(13)解出Scripts\\__main__.py並運行它(這裡的__main__.py就是要打包的python
檔案,被
重命名為__main__.py)
source\start.c:
1. MapExistingFile:用
檔案映像的方法打開檔案,讀處理裡面的內容。
2. GetScriptInfo: 從archive.h中定義的(central directory record)格式的數據中取出script info(optimize, verbose, tag)到全局變數p_script_info中。
3. BuildToc:構造一個新的dict對象,在arch
檔案中做一個循環,取出所有的name放入dict中(PyDict_SetItem),其中調用了fixpath來解決"\"和"/"的統一問題,並將dict返回(注意,name好像是不帶後綴的)。
4. extract_data: 使用zlib.h中定義的zstream結構,從archive結構中獲得指定的長度的數據 5. GetContentsFromOffset:計算位置,調用extract獲得數據。
6. GetContents:利用PyDict_GetItemString從toc中得到指定的名字的
檔案的位置,調用GetContentsFromOffset獲得數據。
7. Load_Module:檢查p_script_info->optimize,判斷
檔案名的後綴是".pyo"還是".pyc",調用GetContents從數據中調出這個檔案。
8. get_code:指定名字,獲得這個
檔案的內容:GetContents + PyString_FromString。