[系统安全] 四十一.APT系列(6)Python解析PE文件并获取时间戳判断来源区域
您可能之前看到過我寫的類似文章,為什么還要重復(fù)撰寫呢?只是想更好地幫助初學(xué)者了解病毒逆向分析和系統(tǒng)安全,更加成體系且不破壞之前的系列。因此,我重新開設(shè)了這個專欄,準(zhǔn)備系統(tǒng)整理和深入學(xué)習(xí)系統(tǒng)安全、逆向分析和惡意代碼檢測,“系統(tǒng)安全”系列文章會更加聚焦,更加系統(tǒng),更加深入,也是作者的慢慢成長史。換專業(yè)確實挺難的,逆向分析也是塊硬骨頭,但我也試試,看看自己未來四年究竟能將它學(xué)到什么程度,漫漫長征路,偏向虎山行。享受過程,一起加油~
前文帶大家學(xué)習(xí)了WinRAR漏洞(CVE-2018-20250),并介紹該漏洞威脅和分享惡意軟件自啟動劫持原理。這篇文章將嘗試軟件來源分析,結(jié)合APT攻擊中常見的判斷方法,利用Python調(diào)用擴(kuò)展包進(jìn)行溯源,但也存在局限性。文章同時也普及了PE文件分析和APT溯源相關(guān)基礎(chǔ),基礎(chǔ)性文章,希望對您有所幫助~
你是否想過如何判斷PE軟件或APP來源哪個國家或地區(qū)呢?你又想過印度是如何確保一鍵正確卸載中國APP呢?使用黑白名單嗎?本文嘗試進(jìn)行軟件來源溯源,目前想到的方法包括:
- 通過PE文件分析抓取創(chuàng)建文件時間戳,然后UTC定位國家地區(qū),但受樣本數(shù)量較少,活動規(guī)律不穩(wěn)定影響很大
- 通過靜態(tài)分析獲取非英文字符串,軟件中一般有供該國使用的文字,然后進(jìn)行編碼比對溯源地區(qū)
- 某些APP或軟件存在流量反饋或IP定位,嘗試進(jìn)行流量抓取分析
- 利用深度學(xué)習(xí)進(jìn)行分類,然后提取不同國家的特征完成溯源
歡迎大家討論和留言,我們一起進(jìn)行更深入的嘗試和安全測試 O(∩_∩)O
文章目錄
- 一.PE文件格式
- 二.PE文件格式解析
- 1.010Editor解析PE文件
- 2.Ollydbg動態(tài)調(diào)試程序
- 三.Python獲取時間戳
- 四.時間戳判斷來源地區(qū)
- 1.UTC時間轉(zhuǎn)換
- 2.時區(qū)APT溯源案例(白象)
- 3.時間戳分析
- 五.總結(jié)
希望這些基礎(chǔ)原理能更好地幫助大家做好防御和保護(hù),基礎(chǔ)性文章,希望對您有所幫助。作者作為網(wǎng)絡(luò)安全的小白,分享一些自學(xué)基礎(chǔ)教程給大家,主要是在線筆記,希望您們喜歡。同時,更希望您能與我一起操作和進(jìn)步,后續(xù)將深入學(xué)習(xí)網(wǎng)絡(luò)安全和系統(tǒng)安全知識并分享相關(guān)實驗。總之,希望該系列文章對博友有所幫助,寫文不易,大神們不喜勿噴,謝謝!如果文章對您有幫助,將是我創(chuàng)作的最大動力,點贊、評論、私聊均可,一起加油喔!
作者的github資源:
- 逆向分析:https://github.com/eastmountyxz/SystemSecurity-ReverseAnalysis
- 網(wǎng)絡(luò)安全:https://github.com/eastmountyxz/NetworkSecuritySelf-study
從2019年7月開始,我來到了一個陌生的專業(yè)——網(wǎng)絡(luò)空間安全。初入安全領(lǐng)域,是非常痛苦和難受的,要學(xué)的東西太多、涉及面太廣,但好在自己通過分享100篇“網(wǎng)絡(luò)安全自學(xué)”系列文章,艱難前行著。感恩這一年相識、相知、相趣的安全大佬和朋友們,如果寫得不好或不足之處,還請大家海涵!
接下來我將開啟新的安全系列,叫“系統(tǒng)安全”,也是免費的100篇文章,作者將更加深入的去研究惡意樣本分析、逆向分析、內(nèi)網(wǎng)滲透、網(wǎng)絡(luò)攻防實戰(zhàn)等,也將通過在線筆記和實踐操作的形式分享與博友們學(xué)習(xí),希望能與您一起進(jìn)步,加油~
- 推薦前文:網(wǎng)絡(luò)安全自學(xué)篇系列-100篇
前文分析:
- [系統(tǒng)安全] 一.什么是逆向分析、逆向分析基礎(chǔ)及經(jīng)典掃雷游戲逆向
- [系統(tǒng)安全] 二.如何學(xué)好逆向分析及呂布傳游戲逆向案例
- [系統(tǒng)安全] 三.IDA Pro反匯編工具初識及逆向工程解密實戰(zhàn)
- [系統(tǒng)安全] 四.OllyDbg動態(tài)分析工具基礎(chǔ)用法及Crakeme逆向
- [系統(tǒng)安全] 五.OllyDbg和Cheat Engine工具逆向分析植物大戰(zhàn)僵尸游戲
- [系統(tǒng)安全] 六.逆向分析之條件語句和循環(huán)語句源碼還原及流程控制
- [系統(tǒng)安全] 七.逆向分析之PE病毒原理、C++實現(xiàn)文件加解密及OllyDbg逆向
- [系統(tǒng)安全] 八.Windows漏洞利用之CVE-2019-0708復(fù)現(xiàn)及藍(lán)屏攻擊
- [系統(tǒng)安全] 九.Windows漏洞利用之MS08-067遠(yuǎn)程代碼執(zhí)行漏洞復(fù)現(xiàn)及深度提權(quán)
- [系統(tǒng)安全] 十.Windows漏洞利用之SMBv3服務(wù)遠(yuǎn)程代碼執(zhí)行漏洞(CVE-2020-0796)復(fù)現(xiàn)
- [系統(tǒng)安全] 十一.那些年的熊貓燒香及PE病毒行為機(jī)理分析
- [系統(tǒng)安全] 十二.熊貓燒香病毒IDA和OD逆向分析(上)病毒初始化
- [系統(tǒng)安全] 十三.熊貓燒香病毒IDA和OD逆向分析(中)病毒釋放機(jī)理
- [系統(tǒng)安全] 十四.熊貓燒香病毒IDA和OD逆向分析–病毒釋放過程(下)
- [系統(tǒng)安全] 十五.Chrome瀏覽器保留密碼功能滲透解析、藍(lán)屏漏洞及某音樂軟件漏洞復(fù)現(xiàn)
- [系統(tǒng)安全] 十六.PE文件逆向基礎(chǔ)知識(PE解析、PE編輯工具和PE修改)
- [系統(tǒng)安全] 十七.Windows PE病毒概念、分類及感染方式詳解
- [系統(tǒng)安全] 十八.病毒攻防機(jī)理及WinRAR惡意劫持漏洞(腳本病毒、自啟動、定時關(guān)機(jī)、藍(lán)屏攻擊)
- [系統(tǒng)安全] 十九.宏病毒之入門基礎(chǔ)、防御措施、自發(fā)郵件及APT28宏樣本分析
- [系統(tǒng)安全] 二十.PE數(shù)字簽名之(上)什么是數(shù)字簽名及Signtool簽名工具詳解
- [系統(tǒng)安全] 二十一.PE數(shù)字簽名之(中)Signcode、PEView、010Editor、Asn1View工具用法
- [系統(tǒng)安全] 二十二.PE數(shù)字簽名之(下)微軟證書漏洞CVE-2020-0601復(fù)現(xiàn)及Windows驗證機(jī)制分析
- [系統(tǒng)安全] 二十三.逆向分析之OllyDbg動態(tài)調(diào)試復(fù)習(xí)及TraceMe案例分析
- [系統(tǒng)安全] 二十四.逆向分析之OllyDbg調(diào)試INT3斷點、反調(diào)試、硬件斷點與內(nèi)存斷點
- [系統(tǒng)安全] 二十五.WannaCry勒索病毒分析 (1)Python復(fù)現(xiàn)永恒之藍(lán)漏洞實現(xiàn)勒索加密
- [系統(tǒng)安全] 二十六.WannaCry勒索病毒分析 (2)MS17-010漏洞利用及病毒解析
- [系統(tǒng)安全] 二十七.WannaCry勒索病毒分析 (3)蠕蟲傳播機(jī)制解析及IDA和OD逆向
- [系統(tǒng)安全] 二十八.WannaCry勒索病毒分析 (4)全網(wǎng)"最"詳細(xì)的蠕蟲傳播機(jī)制解讀
- [系統(tǒng)安全] 二十九.深信服分享之外部威脅防護(hù)和勒索病毒對抗
- [系統(tǒng)安全] 三十.CS逆向分析 (1)你的游戲子彈用完了嗎?Cheat Engine工具入門普及
- [系統(tǒng)安全] 三十一.惡意代碼檢測(1)惡意代碼攻擊溯源及惡意樣本分析
- [系統(tǒng)安全] 三十二.惡意代碼檢測(2)常用技術(shù)詳解及總結(jié)
- [系統(tǒng)安全] 三十三.惡意代碼檢測(3)基于機(jī)器學(xué)習(xí)的惡意代碼檢測技術(shù)
- [系統(tǒng)安全] 三十四.惡意代碼檢測(4)編寫代碼自動提取IAT表、字符串及時間戳溯源地區(qū)
- [系統(tǒng)安全] 三十五.Procmon工具基本用法及文件進(jìn)程、注冊表查看
- [系統(tǒng)安全] 三十六.APT系列(1)APT攻擊溯源防御與常見APT組織的攻擊案例
- [系統(tǒng)安全] 三十七.APT系列(2)遠(yuǎn)控木馬詳解與防御及APT攻擊中的遠(yuǎn)控
- [系統(tǒng)安全] 三十八.APT系列(3)惡意代碼與APT攻擊中的武器(強(qiáng)推Seak老師)
- [系統(tǒng)安全] 三十九.APT系列(4)APT攻防溯源普及和醫(yī)療數(shù)據(jù)安全防御總結(jié)
- [系統(tǒng)安全] 四十.APT系列(5)APT組織常用WinRAR漏洞復(fù)現(xiàn)(CVE-2018-20250)及惡意軟件劫持
- [系統(tǒng)安全] 四十一.APT系列(6)Python解析PE文件并獲取時間戳判斷來源區(qū)域
聲明:本人堅決反對利用教學(xué)方法進(jìn)行犯罪的行為,一切犯罪行為必將受到嚴(yán)懲,綠色網(wǎng)絡(luò)需要我們共同維護(hù),更推薦大家了解它們背后的原理,更好地進(jìn)行防護(hù)。
一.PE文件格式
什么是PE文件?
PE文件的全稱是Portable Executable,意為可移植的可執(zhí)行的文件,常見的EXE、DLL、OCX、SYS、COM都是PE文件,PE文件是微軟Windows操作系統(tǒng)上的程序文件(可能是間接被執(zhí)行,如DLL)。
EXE文件格式:
- DOS:MZ格式
- WIndows 3.0/3.1:NE(New Executable)、16位Windows可執(zhí)行文件格式
為什么要重點學(xué)習(xí)這種文件格式呢?
- PE文件是可移植、可執(zhí)行、跨Win32平臺的文件格式
- 所有Win32執(zhí)行體(exe、dll、kernel mode drivers)
- 知道PE文件本質(zhì)后,能更好進(jìn)行惡意樣本分析、APT攻擊分析、勒索病毒分析
- 了解軟件加密和加殼的思想,能夠PJ相關(guān)的PE文件
- 它是您熟悉Windows操作系統(tǒng)的第一步,包括EXE程序怎么映射到內(nèi)存,DLL怎么導(dǎo)入等
- 軟件逆向工程的基本思想與PE文件格式息息相關(guān)
- 如果您想成為一名黑客、系統(tǒng)安全工程師,那么精通PE文件是非常必要的
可執(zhí)行程序是具有不同的形態(tài)的,比如用戶眼中的QQ如下圖所示。
本質(zhì)上,QQ如下圖所示。
PE文件格式總體結(jié)構(gòu)
接著讓我們來欣賞下PE文件格式總體結(jié)構(gòu)圖,包括:MZ頭部、DOS stub、PE文件頭、可選文件頭、節(jié)表、節(jié)等。
本文的第二部分我們將對PE文件格式進(jìn)行詳細(xì)解析。比如,MZ頭文件是定位PE文件頭開始位置,用于PE文件合法性檢測。DOS下運(yùn)行該程序時,會提示用戶“This Program cannot be run in DOS mode”。
PE文件格式與惡意軟件的關(guān)系
- 何為文件感染或控制權(quán)獲取?
使目標(biāo)PE文件具備或啟動病毒功能(或目標(biāo)程序)
不破壞目標(biāo)PE文件原有功能和外在形態(tài)(如圖標(biāo))等
… - 病毒代碼如何與目標(biāo)PE文件融為一體呢?
代碼植入
控制權(quán)獲取
圖標(biāo)更改
Hook
…
PE文件解析常用工具包括:
- PEView:可按照PE文件格式對目標(biāo)文件的各字段進(jìn)行詳細(xì)解析。
- Stud_PE:可按照PE文件格式對目標(biāo)文件的各字段進(jìn)行詳細(xì)解析。
- Ollydbg:可跟蹤目標(biāo)程序的執(zhí)行過程,屬于用戶態(tài)調(diào)試工具。
- UltraEdit \ 010Editor:可對目標(biāo)文件進(jìn)行16進(jìn)制查看和修改。
二.PE文件格式解析
該部分實驗內(nèi)容:
- 使用010Editor觀察PE文件例子程序hello-2.5.exe的16進(jìn)制數(shù)據(jù)
- 使用Ollydbg對該程序進(jìn)行初步調(diào)試,了解該程序功能結(jié)構(gòu),在內(nèi)存中觀察該程序的完整結(jié)構(gòu)
- 使用010Editor修改該程序,使得該程序僅彈出第二個對話框
1.010Editor解析PE文件
PE文件結(jié)構(gòu)如下圖所示,我推薦大家使用010Editor工具及其模板來進(jìn)行PE文件分析。
MZ頭部+DOS stub+PE文件頭+可選文件頭+節(jié)表+節(jié)
(1) 使用010Editor工具打開PE文件,并運(yùn)行模板。
該P(yáng)E文件可分為若干結(jié)構(gòu),如下圖所示。
(2) MZ文件頭(000h-03fh)。
下圖為hello-2.5.exe的MZ文件頭,該部分固定大小為40H個字節(jié)。偏移3cH處字段Offset to New EXE Header,指示“NT映象頭的偏移地址”,其中000000B0是NT映象頭的文件偏移地址,定位PE文件頭開始位置,用于PE文件合法性檢驗。
000000B0指向PE文件頭開始位置。
(3) DOS插樁程序(040h-0afh)
DOS Stub部分大小不固定,位于MZ文件頭和NT映象頭之間,可由MZ文件頭中的Offset to New EXE Header字段確定。下圖為hello-2.5.exe中的該部分內(nèi)容。
(4) PE文件頭(0b0h-1a7h)
該部分包括PE標(biāo)識、映像文件頭、可選文件頭。
- Signature:字串“PE\0\0”,4個字節(jié)(0b0H~0b4H)
- 映象文件頭File Header:14H個字節(jié)(0b5H~0c7H)
偏移2H處,字段Number of Section 給出節(jié)的個數(shù)(2個字節(jié)):0003
偏移10H處,字段Size of Optional Header 給出可選映象頭的大小(2個字節(jié)):00E0 - 可選映象頭Optional Header:0c8H~1a7H
對應(yīng)解析如下圖所示,包括PE標(biāo)識、X86架構(gòu)、3個節(jié)、文件生成時間、COFF便宜、可選頭大小、文件信息標(biāo)記等。
010Editor使用模板定位PE文件各節(jié)點信息。
PE文件可選文件頭224字節(jié),其對應(yīng)的字段信息如下所示:
typedef struct _IMAGE_OPTIONAL_HEADER {WORD Magic; /*機(jī)器型號,判斷是PE是32位還是64位*/BYTE MajorLinkerVersion; /*連接器版本號高版本*/BYTE MinorLinkerVersion; /*連接器版本號低版本,組合起來就是 5.12 其中5是高版本,C是低版本*/DWORD SizeOfCode; /*代碼節(jié)的總大小(512為一個磁盤扇區(qū))*/DWORD SizeOfInitializedData; /*初始化數(shù)據(jù)的節(jié)的總大小,也就是.data*/DWORD SizeOfUninitializedData; /*未初始化數(shù)據(jù)的節(jié)的大小,也就是 .data ? */DWORD AddressOfEntryPoint; /*程序執(zhí)行入口(OEP) RVA(相對偏移)*/DWORD BaseOfCode; /*代碼的節(jié)的起始RVA(相對偏移)也就是代碼區(qū)的偏移,偏移+模塊首地址定位代碼區(qū)*/DWORD BaseOfData; /*數(shù)據(jù)結(jié)的起始偏移(RVA),同上*/DWORD ImageBase; /*程序的建議模塊基址(意思就是說作參考用的,模塊地址在哪里)*/DWORD SectionAlignment; /*內(nèi)存中的節(jié)對齊*/DWORD FileAlignment; /*文件中的節(jié)對齊*/WORD MajorOperatingSystemVersion; /*操作系統(tǒng)版本號高位*/WORD MinorOperatingSystemVersion; /*操作系統(tǒng)版本號低位*/WORD MajorImageVersion; /*PE版本號高位*/WORD MinorImageVersion; /*PE版本號低位*/WORD MajorSubsystemVersion; /*子系統(tǒng)版本號高位*/WORD MinorSubsystemVersion; /*子系統(tǒng)版本號低位*/DWORD Win32VersionValue; /*32位系統(tǒng)版本號值,注意只能修改為4 5 6表示操作系統(tǒng)支持nt4.0 以上,5的話依次類推*/DWORD SizeOfImage; /*整個程序在內(nèi)存中占用的空間(PE映尺寸)*/DWORD SizeOfHeaders; /*所有頭(頭的結(jié)構(gòu)體大小)+節(jié)表的大小*/DWORD CheckSum; /*校驗和,對于驅(qū)動程序,可能會使用*/WORD Subsystem; /*文件的子系統(tǒng) :重要*/WORD DllCharacteristics; /*DLL文件屬性,也可以成為特性,可能DLL文件可以當(dāng)做驅(qū)動程序使用*/DWORD SizeOfStackReserve; /*預(yù)留的棧的大小*/DWORD SizeOfStackCommit; /*立即申請的棧的大小(分頁為單位)*/DWORD SizeOfHeapReserve; /*預(yù)留的堆空間大小*/DWORD SizeOfHeapCommit; /*立即申請的堆的空間的大小*/DWORD LoaderFlags; /*與調(diào)試有關(guān)*/DWORD NumberOfRvaAndSizes; /*下面的成員,數(shù)據(jù)目錄結(jié)構(gòu)的項目數(shù)量*/IMAGE_DATA_DIRECTORY DataDirectory[16]; /*數(shù)據(jù)目錄,默認(rèn)16個,16是宏,這里方便直接寫成16*/ } IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;(5) 節(jié)表(1a8h-21fh)
- 表項大小固定,28H個字節(jié);表項個數(shù)由映象文件頭的字段Number of Section 給出。
- 每個表項的起始位置起(8個字節(jié)),字段Name給出對應(yīng)節(jié)的名稱。
- 每個表項的偏移14H處(4個字節(jié)),字段Offset to Raw Data給出對應(yīng)節(jié)的起始文件偏移。
該結(jié)構(gòu)包括3個節(jié),對應(yīng)上圖的3個struct IMAGE_SECTION_HEADER,即“.test”、“.rdata”、“.data”節(jié),其偏移地址對應(yīng)下圖紫色區(qū)域,分別是400、600、800的位置。
(6) 3個節(jié)
- 400H-5ffH:代碼節(jié)
- 600H-7ffH:引入函數(shù)節(jié)
- 800H-9ffH:數(shù)據(jù)節(jié)
注意,代碼節(jié)“.text”前46H為數(shù)據(jù),后面全是0位填充值,為了實現(xiàn)文件的200H對齊,所以代碼節(jié)是400H到5ffH。
(7) 引入函數(shù)節(jié)
?來從其他DLL中引?函數(shù),引入了kernel32.dll和user32.dll,這個節(jié)一般名為“.rdata”。引入函數(shù)是被某模塊調(diào)用的但又不在調(diào)用者模塊中的函數(shù),用來從其他(系統(tǒng)或第三方寫的)DLL中引入函數(shù),例如kernel32.dll、gdi32.dll等。
010Editor打開如下圖所示:
詳細(xì)標(biāo)注信息如下圖所示:(圖引自HYQ同學(xué),再此感謝)
(8) 數(shù)據(jù)節(jié)
數(shù)據(jù)節(jié)實際大小58h,對齊后大小200h,地址為800h-9ffh,包括對話框彈出的具體內(nèi)容。
2.Ollydbg動態(tài)調(diào)試程序
使用Ollydbg對該程序進(jìn)行初步調(diào)試,了解該程序功能結(jié)構(gòu),在內(nèi)存中觀察該程序的完整結(jié)構(gòu)。注意,內(nèi)存對齊單位和文件對齊單位的不同,內(nèi)容和文件中IAT表內(nèi)容的不同。
第一步,打開OD加載PE文件。
OD是一款PE文件動態(tài)調(diào)試器,此時程序斷點自動停止在程序入口點00401000H位置。
在010Editor中,我們可以看到,該P(yáng)E程序基地址是400000h,程序入口地址是1000h,兩個相加為加載至內(nèi)存中的地址,即401000h。
第二步,動態(tài)調(diào)試程序。
當(dāng)我們雙擊地址位置,則可以下斷點且變紅,比如0040100Fh。
接著查看對應(yīng)調(diào)試快捷鍵,F7是單步步入,F8是單步步過。
我們直接按F8單步步過,此時的位置會CALL一個MessageBoxA函數(shù)。
直接單步步過,此時會彈出第一個對話框,點擊“確定”按鈕。
第三步,動態(tài)調(diào)試程序之?dāng)?shù)據(jù)跟隨。
接著我們看左下角部分的內(nèi)存數(shù)據(jù),在該區(qū)域按下“Ctrl+G”在數(shù)據(jù)窗口中跟隨,輸入基地址400000。
此時可以看到加載到內(nèi)存中的數(shù)據(jù),可以看到該數(shù)據(jù)與010Editor打開的PE文件數(shù)據(jù)一致的。
接著繼續(xù)按F8單步步過彈出第二個窗口。
右上角是它寄存器的值,包括各個寄存器中的數(shù)據(jù),我們實驗中主要使用的寄存器包括EAX、ECX、EDX、EBX等。
接著步過0040102E,它是退出進(jìn)程ExitProcess的位置,此時進(jìn)程已經(jīng)終止,如下圖所示。
實驗講到這里,使用OD動態(tài)調(diào)試的PE文件的基礎(chǔ)流程就講解完畢,后續(xù)隨著實驗深入,我們還會使用該工具。
三.Python獲取時間戳
接著我們嘗試通過Python來獲取時間戳,python的PE庫是pefile,它是用來專門解析PE文件的,可靜態(tài)分析PE文件。pefile能完成的任務(wù)包括:
- 檢查頭
- 分析部分?jǐn)?shù)據(jù)
- 檢索嵌入式數(shù)據(jù)
- 從資源中讀取字符串
- 警告值可疑和格式錯誤
- PE的基本分析,喜歡寫一些領(lǐng)域和其他部分的PE的
- 帶有PEiD簽名的打包程序檢測
- PEiD簽名 生成
推薦大家學(xué)習(xí)官方資料和github文檔。
- https://github.com/erocarrera/pefile
- https://pypi.org/project/pefile/
- https://github.com/erocarrera/pefile/releases
安裝擴(kuò)展包的方法如下:
- pip install pefile
假設(shè)安裝成功之后,我們需要對下圖所示的軟件進(jìn)行分析,該軟件是我在第85篇博客中生成的,大家直接使用即可(文章開頭的github鏈接能下載)。
- 八十五.Windows黑客編程之注入技術(shù)詳解(全局鉤子、遠(yuǎn)線程鉤子、突破Session 0注入、APC注入)
第一步,我們通過010Editor分析PE文件。
其時間戳的輸出結(jié)果如下:
- 06/19/2020 10:46:21
我們希望通過Python寫代碼實現(xiàn)自動化提取,為后續(xù)自動化溯源提供幫助。
第二步,撰寫Python代碼實現(xiàn)簡單分析。
import pefile import os,string,shutil,rePEfile_Path = "MFCApplication.exe"pe = pefile.PE(PEfile_Path) print(type(pe)) print(pe)輸出如下圖所示結(jié)果,這是Python包自定義的PE結(jié)構(gòu)。
squeezed text表示python的一種編程規(guī)范要求,簡稱pep8,你只需要將鼠標(biāo)放到Squeezed上,右鍵Copy即可查看內(nèi)容,顯示的是該P(yáng)E文件的基本結(jié)構(gòu),如下所示:
----------Parsing Warnings----------Byte 0xcc makes up 17.8750% of the file's contents. This may indicate truncation / malformation.Suspicious flags set for section 0. Both IMAGE_SCN_MEM_WRITE and IMAGE_SCN_MEM_EXECUTE are set. This might indicate a packed executable.----------DOS_HEADER----------[IMAGE_DOS_HEADER] 0x0 0x0 e_magic: 0x5A4D 0x2 0x2 e_cblp: 0x90 0x4 0x4 e_cp: 0x3 0x6 0x6 e_crlc: 0x0 0x8 0x8 e_cparhdr: 0x4 0xA 0xA e_minalloc: 0x0 0xC 0xC e_maxalloc: 0xFFFF 0xE 0xE e_ss: 0x0 0x10 0x10 e_sp: 0xB8 0x12 0x12 e_csum: 0x0 0x14 0x14 e_ip: 0x0 0x16 0x16 e_cs: 0x0 0x18 0x18 e_lfarlc: 0x40 0x1A 0x1A e_ovno: 0x0 0x1C 0x1C e_res: 0x24 0x24 e_oemid: 0x0 0x26 0x26 e_oeminfo: 0x0 0x28 0x28 e_res2: 0x3C 0x3C e_lfanew: 0x108 ----------NT_HEADERS----------[IMAGE_NT_HEADERS] 0x108 0x0 Signature: 0x4550 ----------FILE_HEADER----------[IMAGE_FILE_HEADER] 0x10C 0x0 Machine: 0x14C 0x10E 0x2 NumberOfSections: 0xA 0x110 0x4 TimeDateStamp: 0x5EEC977D [Fri Jun 19 10:46:21 2020 UTC] 0x114 0x8 PointerToSymbolTable: 0x0 0x118 0xC NumberOfSymbols: 0x0 0x11C 0x10 SizeOfOptionalHeader: 0xE0 0x11E 0x12 Characteristics: 0x102 Flags: IMAGE_FILE_32BIT_MACHINE, IMAGE_FILE_EXECUTABLE_IMAGE----------OPTIONAL_HEADER----------[IMAGE_OPTIONAL_HEADER] 0x120 0x0 Magic: 0x10B 0x122 0x2 MajorLinkerVersion: 0xE 0x123 0x3 MinorLinkerVersion: 0x1A 0x124 0x4 SizeOfCode: 0x700C00 0x128 0x8 SizeOfInitializedData: 0x2F1E00 0x12C 0xC SizeOfUninitializedData: 0x0 0x130 0x10 AddressOfEntryPoint: 0x36CE65 0x134 0x14 BaseOfCode: 0x1000 0x138 0x18 BaseOfData: 0x1000 0x13C 0x1C ImageBase: 0x400000 0x140 0x20 SectionAlignment: 0x1000 0x144 0x24 FileAlignment: 0x200 0x148 0x28 MajorOperatingSystemVersion: 0x6 0x14A 0x2A MinorOperatingSystemVersion: 0x0 0x14C 0x2C MajorImageVersion: 0x0 0x14E 0x2E MinorImageVersion: 0x0 0x150 0x30 MajorSubsystemVersion: 0x6 0x152 0x32 MinorSubsystemVersion: 0x0 0x154 0x34 Reserved1: 0x0 0x158 0x38 SizeOfImage: 0xD54000 0x15C 0x3C SizeOfHeaders: 0x400 0x160 0x40 CheckSum: 0x0 0x164 0x44 Subsystem: 0x2 0x166 0x46 DllCharacteristics: 0x8140 0x168 0x48 SizeOfStackReserve: 0x100000 0x16C 0x4C SizeOfStackCommit: 0x1000 0x170 0x50 SizeOfHeapReserve: 0x100000 0x174 0x54 SizeOfHeapCommit: 0x1000 0x178 0x58 LoaderFlags: 0x0 0x17C 0x5C NumberOfRvaAndSizes: 0x10 DllCharacteristics: IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE, IMAGE_DLLCHARACTERISTICS_NX_COMPAT, IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE----------PE Sections----------[IMAGE_SECTION_HEADER] 0x200 0x0 Name: .textbss 0x208 0x8 Misc: 0x35B30B 0x208 0x8 Misc_PhysicalAddress: 0x35B30B 0x208 0x8 Misc_VirtualSize: 0x35B30B 0x20C 0xC VirtualAddress: 0x1000 0x210 0x10 SizeOfRawData: 0x0 0x214 0x14 PointerToRawData: 0x0 0x218 0x18 PointerToRelocations: 0x0 0x21C 0x1C PointerToLinenumbers: 0x0 0x220 0x20 NumberOfRelocations: 0x0 0x222 0x22 NumberOfLinenumbers: 0x0 0x224 0x24 Characteristics: 0xE00000A0 Flags: IMAGE_SCN_CNT_CODE, IMAGE_SCN_CNT_UNINITIALIZED_DATA, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ, IMAGE_SCN_MEM_WRITE Entropy: 0.000000 (Min=0.0, Max=8.0) MD5 hash: d41d8cd98f00b204e9800998ecf8427e SHA-1 hash: da39a3ee5e6b4b0d3255bfef95601890afd80709 SHA-256 hash: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 SHA-512 hash: cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e ....對應(yīng)于010Editor分析的結(jié)果,前后是一致的。
同時,我們可以輸入help(pefile.PE) 查看幫助信息,它定義了pefile包的一些函數(shù)和屬性。
Help on class PE in module pefile:class PE(builtins.object)| PE(name=None, data=None, fast_load=None)| | A Portable Executable representation.| | This class provides access to most of the information in a PE file.| | It expects to be supplied the name of the file to load or PE data| to process and an optional argument 'fast_load' (False by default)| which controls whether to load all the directories information,| which can be quite time consuming.| | pe = pefile.PE('module.dll')| pe = pefile.PE(name='module.dll')| | would load 'module.dll' and process it. If the data is already| available in a buffer the same can be achieved with:| | pe = pefile.PE(data=module_dll_data)| | The "fast_load" can be set to a default by setting its value in the| module itself by means, for instance, of a "pefile.fast_load = True".| That will make all the subsequent instances not to load the| whole PE structure. The "full_load" method can be used to parse| the missing data at a later stage.| | Basic headers information will be available in the attributes:| | DOS_HEADER| NT_HEADERS| FILE_HEADER| OPTIONAL_HEADER| | All of them will contain among their attributes the members of the| corresponding structures as defined in WINNT.H| | The raw data corresponding to the header (from the beginning of the| file up to the start of the first section) will be available in the| instance's attribute 'header' as a string.| | The sections will be available as a list in the 'sections' attribute.| Each entry will contain as attributes all the structure's members.| | Directory entries will be available as attributes (if they exist):| (no other entries are processed at this point)| | DIRECTORY_ENTRY_IMPORT (list of ImportDescData instances)| DIRECTORY_ENTRY_EXPORT (ExportDirData instance)| DIRECTORY_ENTRY_RESOURCE (ResourceDirData instance)| DIRECTORY_ENTRY_DEBUG (list of DebugData instances)| DIRECTORY_ENTRY_BASERELOC (list of BaseRelocationData instances)| DIRECTORY_ENTRY_TLS| DIRECTORY_ENTRY_BOUND_IMPORT (list of BoundImportData instances)| | The following dictionary attributes provide ways of mapping different| constants. They will accept the numeric value and return the string| representation and the opposite, feed in the string and get the| numeric constant:| | DIRECTORY_ENTRY| IMAGE_CHARACTERISTICS| SECTION_CHARACTERISTICS| DEBUG_TYPE| SUBSYSTEM_TYPE| MACHINE_TYPE| RELOCATION_TYPE| RESOURCE_TYPE| LANG| SUBLANG ......第三步,撰寫代碼獲取PE文件的方法和屬性,比如section。
import pefile import os,string,shutil,rePEfile_Path = "MFCApplication.exe"#解析PE文件 pe = pefile.PE(PEfile_Path) print(type(pe)) print(pe)#查看方法和屬性 print(dir(pefile.PE)) for section in pe.sections:print(section)輸出如下結(jié)果:
獲取導(dǎo)入表信息代碼如下:
import pefile import os,string,shutil,rePEfile_Path = "MFCApplication.exe"#解析PE文件 pe = pefile.PE(PEfile_Path) print(type(pe)) print(pe)#獲取導(dǎo)入表信息 for item in pe.DIRECTORY_ENTRY_IMPORT:print(item.dll)for con in item.imports:print(con.name)print("") #換行輸出如下所示的結(jié)果,包括KERNEL32.dll、USER32.dll等。
b'KERNEL32.dll' b'RtlUnwind' b'GetModuleHandleExW' b'GetCommandLineA' b'GetSystemInfo' b'CreateThread' ...b'USER32.dll' b'DlgDirSelectExA' b'FindWindowExA' b'FindWindowA' b'SetParent' b'ChildWindowFromPointEx' ...b'GDI32.dll' b'CreateEllipticRgn' b'CreateFontIndirectA' b'CreateHatchBrush' b'CreateICA' b'CreatePalette' b'CreatePen' ...b'MSIMG32.dll' b'AlphaBlend' b'GradientFill' b'TransparentBlt'b'ADVAPI32.dll' b'RegCloseKey' b'RegQueryValueExA' b'RegCreateKeyExA' b'RegDeleteKeyA' ...b'SHELL32.dll' b'SHGetPathFromIDListA' b'SHGetSpecialFolderLocation' b'SHBrowseForFolderA' b'SHGetDesktopFolder' b'DragAcceptFiles' ...b'COMCTL32.dll' b'InitCommonControlsEx'...對應(yīng)010editor的PE軟件分析結(jié)果如下:
第四步,分析文件結(jié)構(gòu)及時間戳位置。
同樣,我們可以使用stud_PE查看文件屬性,該軟件用于顯示頭部、DOs、區(qū)段、函數(shù)等信息,包括導(dǎo)入表、導(dǎo)出表等,顯示該EXE程序加載的DLL文件及函數(shù)。
這里我們最關(guān)心的內(nèi)容是“TimeDateStamp”,接下來想辦法獲取它即可。
typedef struct _IMAGE_FILE_HEADER {+04h WORD Machine; // 運(yùn)行平臺+06h WORD NumberOfSections; // 文件的區(qū)塊數(shù)目+08h DWORD TimeDateStamp; // 文件創(chuàng)建日期和時間+0Ch DWORD PointerToSymbolTable; // 指向符號表(主要用于調(diào)試)+10h DWORD NumberOfSymbols; // 符號表中符號個數(shù)(同上)+14h WORD SizeOfOptionalHeader; // IMAGE_OPTIONAL_HEADER32 結(jié)構(gòu)大小+16h WORD Characteristics; // 文件屬性 } IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;對應(yīng)的Python包返回的值如下所示:
第五步,接著我們通過pe.DOS_HEADER、pe.FILE_HEADER等方法獲取對應(yīng)的內(nèi)容。
import pefile import os,string,shutil,rePEfile_Path = "MFCApplication.exe"#解析PE文件 pe = pefile.PE(PEfile_Path, fast_load=True) print(type(pe)) print(pe)#顯示DOS_HEADER print(pe.DOS_HEADER,"\n")#顯示NT_HEADERS print(pe.NT_HEADERS,"\n")#顯示FILE_HEADER print(pe.FILE_HEADER,"\n")#顯示OPTIONAL_HEADER print(pe.OPTIONAL_HEADER,"\n")輸出如下圖所示的結(jié)構(gòu),其中時間戳也在其中。
作者本想通過它指定的方法提取對應(yīng)的值,但一直失敗,但作為長期從事NLP和數(shù)據(jù)挖掘的程序員,這都不是事,我們通過正則表達(dá)式即可提取所需知識。
import pefile import os,string,shutil,rePEfile_Path = "MFCApplication.exe"#解析PE文件 pe = pefile.PE(PEfile_Path, fast_load=True) print(type(pe)) print(pe) print(pe.get_imphash())#顯示DOS_HEADER dh = pe.DOS_HEADER#顯示NT_HEADERS nh = pe.NT_HEADERS#顯示FILE_HEADER fh = pe.FILE_HEADER#顯示OPTIONAL_HEADER oh = pe.OPTIONAL_HEADERprint(type(fh)) #<class 'pefile.Structure'> print(str(fh))#通過正則表達(dá)式獲取時間 p = re.compile(r'[[](.*?)[]]', re.I|re.S|re.M) #最小匹配 res = re.findall(p, str(fh)) print(res[1]) #第一個值是IMAGE_FILE_HEADER # Fri Jun 19 10:46:21 2020 UTC最終輸出結(jié)果如下所示,這樣我們就完成了Python自動化提取PE軟件的時間戳過程。任何一個PE軟件都能進(jìn)行提取,該時間戳也記錄了軟件的編譯時間。
<class 'pefile.PE'> Squeezed text(347 lines).<class 'pefile.Structure'> [IMAGE_FILE_HEADER] 0x10C 0x0 Machine: 0x14C 0x10E 0x2 NumberOfSections: 0xA 0x110 0x4 TimeDateStamp: 0x5EEC977D [Fri Jun 19 10:46:21 2020 UTC] 0x114 0x8 PointerToSymbolTable: 0x0 0x118 0xC NumberOfSymbols: 0x0 0x11C 0x10 SizeOfOptionalHeader: 0xE0 0x11E 0x12 Characteristics: 0x102 Fri Jun 19 10:46:21 2020 UTC四.時間戳判斷來源地區(qū)
1.UTC時間轉(zhuǎn)換
協(xié)調(diào)世界時,又稱世界統(tǒng)一時間、世界標(biāo)準(zhǔn)時間、國際協(xié)調(diào)時間。由于英文(CUT)和法文(TUC)的縮寫不同,作為妥協(xié),簡稱UTC。協(xié)調(diào)世界時是以原子時秒長為基礎(chǔ),在時刻上盡量接近于世界時的一種時間計量系統(tǒng)。Python時間解析代碼如下:
import pefile import time import datetime import os,string,shutil,rePEfile_Path = "MFCApplication.exe"#----------------------------------第一步 解析PE文件------------------------------- pe = pefile.PE(PEfile_Path, fast_load=True) print(type(pe)) print(pe) print(pe.get_imphash())#顯示DOS_HEADER dh = pe.DOS_HEADER#顯示NT_HEADERS nh = pe.NT_HEADERS#顯示FILE_HEADER fh = pe.FILE_HEADER#顯示OPTIONAL_HEADER oh = pe.OPTIONAL_HEADERprint(type(fh)) #<class 'pefile.Structure'> print(str(fh))#----------------------------------第二步 獲取UTC時間------------------------------- #通過正則表達(dá)式獲取時間 p = re.compile(r'[[](.*?)[]]', re.I|re.S|re.M) #最小匹配 res = re.findall(p, str(fh)) print(res[1]) #第一個值是IMAGE_FILE_HEADER res_time = res[1].replace(" UTC","") # Fri Jun 19 10:46:21 2020 UTC#獲取當(dāng)前時間 t = time.ctime() print(t) # Thu Jul 16 20:42:18 2020 final_time = datetime.datetime.strptime(res_time, '%a %b %d %H:%M:%S %Y') print(final_time) # 2020-06-19 10:46:21輸出結(jié)果如下,可以看到該EXE的創(chuàng)建時間。如果想轉(zhuǎn)換成時間戳可以進(jìn)一步處理。
- Fri Jun 19 10:46:21 2020 UTC
- 2020-06-19 10:46:21
接下來我們需要進(jìn)一步分析,根據(jù)時間戳判斷所在區(qū)域。
2.時區(qū)APT溯源案例(白象)
作者在“七十四.APT攻擊檢測溯源與常見APT組織的攻擊案例”文章中普及過,安天公司通過時區(qū)溯源白象APT來自南亞地區(qū),這里再進(jìn)行回顧下。
在過去的四年中,安天的工程師們關(guān)注到了中國的機(jī)構(gòu)和用戶反復(fù)遭遇來自“西南方向”的網(wǎng)絡(luò)入侵嘗試。這些攻擊雖進(jìn)行了一些掩蓋和偽裝,我們依然可以將其推理回原點——來自南亞次大陸的某個國家。
- 參考文章:白象的舞步——來自南亞次大陸的網(wǎng)絡(luò)攻擊
安天在2014年4月相關(guān)文章中披露的針對中國兩所大學(xué)被攻擊的事件,涉及以下六個樣本。其中五個樣本投放至同一個目標(biāo),這些樣本間呈現(xiàn)出模塊組合作業(yè)的特點。
- 4號樣本是初始投放樣本,其具有下載其他樣本功能
- 3號樣本提取主機(jī)相關(guān)信息生成日志文件
- 5號樣本負(fù)責(zé)上傳
- 6號樣本采集相關(guān)文檔文件信息
- 2號樣本則是一個鍵盤記錄器
那么,如何溯源該組織所來自的區(qū)域呢?
安天通過對樣本集的時間戳、時區(qū)分析進(jìn)行分析,發(fā)現(xiàn)其來自南亞。樣本時間戳是一個十六進(jìn)制的數(shù)據(jù),存儲在PE文件頭里,該值一般由編譯器在開發(fā)者創(chuàng)建可執(zhí)行文件時自動生成,時間單位細(xì)化到秒,通常可以認(rèn)為該值為樣本生成時間(GMT時間)。
時間戳的分析需要收集所有可用的可執(zhí)行文件時間戳,并剔除過早的和明顯人為修改的時間,再將其根據(jù)特定標(biāo)準(zhǔn)分組統(tǒng)計,如每周的天或小時,并以圖形的形式體現(xiàn),下圖是通過小時分組統(tǒng)計結(jié)果:
從上圖的統(tǒng)計結(jié)果來看,如果假設(shè)攻擊者的工作時間是早上八九點至下午五六點的話,那么將工作時間匹配到一個來自UTC+4或UTC+5時區(qū)的攻擊者的工作時間。根據(jù)我們匹配的攻擊者所在時區(qū)(UTC+4 或UTC+5),再對照世界時區(qū)分布圖,就可以來推斷攻擊者所在的區(qū)域或國家。
接著對該攻擊組織進(jìn)行更深入的分析。對這一攻擊組織繼續(xù)綜合線索,基于互聯(lián)網(wǎng)公開信息,進(jìn)行了畫像分析,認(rèn)為這是一個由10~16人的組成的攻擊小組。其中六人的用戶ID是cr01nk 、neeru rana、andrew、Yash、Ita nagar、Naga。
在安天的跟蹤分析中,發(fā)現(xiàn)該組織的部分C&C地址是一些正常的網(wǎng)站,經(jīng)過分析我們認(rèn)為,有可能該組織入侵了這些網(wǎng)站,將自己的C&C服務(wù)控制代碼放到它們的服務(wù)器上,以此來隱藏自己的IP信息。同時這種方式還會使安全軟件認(rèn)為連接的是正常的網(wǎng)站,而不會觸發(fā)安全警報。
基于現(xiàn)有資源可以分析出,“白象二代”組織一名開發(fā)人員的ID為“Kanishk”,通過維基百科查詢到一個類似單詞“Kanishka”,這是一個是梵文譯音,中文翻譯為“迦膩色迦”,迦膩色伽是貴霜帝國(Kushan Empire)的君主,貴霜帝國主要控制范圍在印度河流域。至此推測該APT組織來自南亞某國。
通過這個案例,我們可以通過時區(qū)、公開信息、黑客ID、C&C域名進(jìn)行溯源,并一步步遞進(jìn)。
3.時間戳分析
比如當(dāng)前北京時間是2020年7月16日晚上9點3分,而UTC時間是13點3分。
但這里存在一個問題,當(dāng)有很多惡意樣本的時候,我們基于多個樣本時間戳并結(jié)合正常作息時間進(jìn)行分析,才能判斷其來源。但是,如果僅從一個樣本進(jìn)行分析,其準(zhǔn)確率還是會有影響,有的惡意軟件是深夜發(fā)布,也影響了該方法的準(zhǔn)確性,同時混淆、加殼、對抗樣本也能影響我們的實驗效果,但作者僅是提供了一種方法,更深入的研究還在繼續(xù),如果您有好的方法也歡迎和我討論。
這里我們PE軟件獲取的時間是“2020-06-19 10:46:21”,對應(yīng)北京時間是19點46分。因為作者習(xí)慣晚上寫代碼,但如果是軟件或惡意樣本,大公司通常會有正常的作息,從而可以結(jié)合海量數(shù)據(jù)分析來確定最終的軟件來源地區(qū)或國家。
- Fri Jun 19 10:46:21 2020 UTC
- 2020-06-19 10:46:21
此時的Python代碼如下:
import pefile import time import warnings import datetime import os,string,shutil,re#忽略警告 warnings.filterwarnings("ignore")PEfile_Path = "MFCApplication.exe"#----------------------------------第一步 解析PE文件------------------------------- pe = pefile.PE(PEfile_Path, fast_load=True) print(type(pe)) print(pe) print(pe.get_imphash())#顯示DOS_HEADER dh = pe.DOS_HEADER#顯示NT_HEADERS nh = pe.NT_HEADERS#顯示FILE_HEADER fh = pe.FILE_HEADER#顯示OPTIONAL_HEADER oh = pe.OPTIONAL_HEADERprint(type(fh)) #<class 'pefile.Structure'> print(str(fh))#----------------------------------第二步 獲取UTC時間------------------------------- #通過正則表達(dá)式獲取時間 p = re.compile(r'[[](.*?)[]]', re.I|re.S|re.M) #最小匹配 res = re.findall(p, str(fh)) print(res[1]) #第一個值是IMAGE_FILE_HEADER res_time = res[1].replace(" UTC","") # Fri Jun 19 10:46:21 2020 UTC#獲取當(dāng)前時間 t = time.ctime() print(t,"\n") # Thu Jul 16 20:42:18 2020 utc_time = datetime.datetime.strptime(res_time, '%a %b %d %H:%M:%S %Y') print("UTC Time:", utc_time) # 2020-06-19 10:46:21#----------------------------------第三步 全球時區(qū)轉(zhuǎn)換------------------------------- #http://zh.thetimenow.com/india #UTC時間比北京時間晚八個小時 故用timedelta方法加上八個小時 china_time = datetime.datetime.strptime(res_time, '%a %b %d %H:%M:%S %Y') + datetime.timedelta(hours=8) print("China Time:",china_time)#美國 UTC-5 america_time = datetime.datetime.strptime(res_time, '%a %b %d %H:%M:%S %Y') - datetime.timedelta(hours=5) print("America Time:",america_time)#印度 UTC+5 india_time = datetime.datetime.strptime(res_time, '%a %b %d %H:%M:%S %Y') + datetime.timedelta(hours=5) print("India Time:",india_time)#澳大利亞 UTC+10 australia_time = datetime.datetime.strptime(res_time, '%a %b %d %H:%M:%S %Y') + datetime.timedelta(hours=10) print("Australia Time",australia_time)#俄羅斯 UTC+3 russia_time = datetime.datetime.strptime(res_time, '%a %b %d %H:%M:%S %Y') + datetime.timedelta(hours=3) print("Russia Time",russia_time)#英國 UTC+0 england_time = datetime.datetime.strptime(res_time, '%a %b %d %H:%M:%S %Y') print("England Time",england_time)#日本 UTC+9 japan_time = datetime.datetime.strptime(res_time, '%a %b %d %H:%M:%S %Y') + datetime.timedelta(hours=9) print("Japan Time",england_time)#德國 UTC+1 germany_time = datetime.datetime.strptime(res_time, '%a %b %d %H:%M:%S %Y') + datetime.timedelta(hours=1) print("Germany Time",germany_time)#法國 UTC+1 france_time = datetime.datetime.strptime(res_time, '%a %b %d %H:%M:%S %Y') + datetime.timedelta(hours=1) print("France Time",france_time)#加拿大 UTC-5 canada_time = datetime.datetime.strptime(res_time, '%a %b %d %H:%M:%S %Y') - datetime.timedelta(hours=5) print("Canada Time:",canada_time)#越南 UTC+7 vietnam_time = datetime.datetime.strptime(res_time, '%a %b %d %H:%M:%S %Y') + datetime.timedelta(hours=7) print("Vietnam Time:",vietnam_time)輸出結(jié)果如下圖所示,不同地區(qū)有對應(yīng)的時間分布,如果正常作息是早上9點到12點、下午2點到5點,從結(jié)果看更像是來自India、England、Japan等地區(qū)。當(dāng)然,只有惡意樣本很多的時候,我們才能進(jìn)行更好的溯源,哈哈~
五.總結(jié)
寫到這里,這篇文章就介紹完畢,希望對您有所幫助,最后進(jìn)行簡單的總結(jié)下作者的猜想。
- 通過PE文件分析抓取創(chuàng)建文件時間戳,然后UTC定位國家地區(qū),但受樣本數(shù)量較少,活動規(guī)律不穩(wěn)定影響很大
- 通過靜態(tài)分析獲取非英文字符串,軟件中一般有供該國使用的文字,然后進(jìn)行編碼比對溯源地區(qū)
- 某些APP或軟件存在流量反饋或IP定位,嘗試進(jìn)行流量抓取分析
- 利用深度學(xué)習(xí)進(jìn)行分類,然后提取不同國家的特征完成溯源
本文嘗試的是最簡單的方法,所以也存在很多問題,比如當(dāng)有很多惡意樣本的時候,我們才能基于多個樣本時間戳并結(jié)合正常作息時間進(jìn)行分析,才能判斷其來源。如果僅從一個樣本進(jìn)行分析,其準(zhǔn)確率還是會有影響,有的惡意軟件是深夜發(fā)布,也影響了該方法的準(zhǔn)確性,同時混淆、加殼、對抗樣本也能影響我們的實驗效果,但作者僅是提供了一種方法,更深入的研究還在繼續(xù),如果您有好的方法也歡迎和我討論。
最后歡迎大家討論如何判斷PE軟件或APP來源哪個國家或地區(qū)呢?印度又是如何確保一鍵正確卸載中國APP呢?哈哈,未知攻,焉知防。加油~
學(xué)安全一年,認(rèn)識了很多安全大佬和朋友,希望大家一起進(jìn)步。這篇文章中如果存在一些不足,還請海涵。作者作為網(wǎng)絡(luò)安全初學(xué)者的慢慢成長路吧!希望未來能更透徹撰寫相關(guān)文章。同時非常感謝參考文獻(xiàn)中的安全大佬們的文章分享,深知自己很菜,得努力前行。
最后感謝CSDN和讀者們十年的陪伴,不論外面如何評價CSDN,這里始終是我的家,在這里寫文章很溫馨,也認(rèn)識了很多大佬和朋友。此外,個人感覺今年是我近十年文章質(zhì)量最高的一年,每一篇都寫得很用心,都是我的血肉,很多都要自己從零去學(xué)習(xí)再分享,也希望幫助更多初學(xué)者。總之,希望自己還能寫二十年,五十年,一輩子。這些年CSDN改進(jìn)真挺多的,也一直為博主著想,希望越來越好。感恩同行,一起加油喔,以后沒準(zhǔn)小珞珞接管“Eastmount”這個賬號,哈哈!
(By:Eastmount 2021-12-17 星期五夜于武漢 http://blog.csdn.net/eastmount/ )
參考文獻(xiàn):
[1] [網(wǎng)絡(luò)安全自學(xué)篇] 六十二.PE文件逆向之PE文件解析、PE編輯工具使用和PE結(jié)構(gòu)修改(三)
[2] 白象的舞步——來自南亞次大陸的網(wǎng)絡(luò)攻擊
[3] https://xz.aliyun.com/t/2688
[4] [原創(chuàng)]利用python+pefile庫做PE格式文件的快速開發(fā) - jmpjerryy
[5] python 時間類型和相互轉(zhuǎn)換 - shhnwangjian
總結(jié)
以上是生活随笔為你收集整理的[系统安全] 四十一.APT系列(6)Python解析PE文件并获取时间戳判断来源区域的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [Python人工智能] 三十四.Ber
- 下一篇: [系统安全] 四十四.APT系列(9)M