[AI安全論文] 15.Powershell惡意代碼檢測論文總結及抽象語法樹(AST)提取
一.Powershell論文總結
近年來,Powershell 由于其易用性強、隱蔽性高的特點被廣泛應用于 APT 攻擊中,傳統的基于人工特征提取和機器學習方法的惡意代碼檢測技術在 Powershell 惡意代碼檢測中越來越難以有效。該部分以學術界論文為主,介紹Powershell惡意代碼檢測相關現狀。

當你打開DBLP或谷歌,會發現Powershell相關的文章很少,主要以那篇CCS解混淆為主。這里,大家不妨也讀讀JavaScript惡意代碼相關的論文。下面介紹比較相關的幾個工作(排名不分先后)。


1.Light-Weight Deobfuscation and Semantic-Aware Attack Detection (CCS19 反混淆)
Zhenyuan Li, et al. Effective and Light-Weight Deobfuscation and Semantic-Aware Attack Detection for PowerShell Scripts. CCS, 2019: 1831-1847.
- https://dl.acm.org/doi/pdf/10.1145/3319535.3363187
- 浙江大學,最經典的一篇Powershell論文,詳細介紹解混淆工作
近年來,PowerShell 越來越多地出現在各種網絡攻擊中,從高級持續威脅、勒索軟件、網絡釣魚電子郵件、加密劫持、金融威脅到無文件攻擊。但是,由于 PowerShell 語言在設計上是動態的,并且可以在不同級別構建腳本片段,因此基于最新靜態分析的 PowerShell 攻擊檢測方法本質上容易受到混淆。
為了克服這一挑戰,本文為 PowerShell 腳本設計了第一個有效且輕量級的反混淆方法。為了解決精確識別可恢復腳本片段的挑戰,設計了一種新穎的基于子樹的反混淆方法。該方法在 PowerShell 腳本的抽象語法樹(Abstract Syntax Tree)中的子樹級別執行混淆檢測和基于仿真的恢復。

基于新的反混淆方法,我們進一步設計了第一個語義感知的 PowerShell 攻擊檢測系統。為了實現基于語義的檢測,我們利用了經典的面向目標的關聯挖掘算法,并為 PowerShell 攻擊新識別了 31 個語義簽名。我們對 2342 個良性樣本和 4141 個惡意樣本的集合進行了評估,發現我們的去混淆方法平均耗時不到 0.5 秒,同時將混淆后的腳本與原始腳本之間的相似度從僅 0.5% 提高到 80% 左右,這因此既有效又輕便。

此外,應用我們的去混淆處理后,Windows Defender 和 VirusTotal 的攻擊檢測率分別從 0.3% 和 2.65% 大幅提高到 75.0% 和 90.0%。同時,當應用我們的去混淆處理時,我們的語義感知攻擊檢測系統以 92.3% 的平均真陽性率和 0% 的假陽性率優于 Windows Defender 和 VirusTotal。

評價:這篇文章寫得非常棒,值得大家學習。之后,由于去混淆做得非常好,關于Powershell的惡意檢測文章很少。同時,文章的摘要非常棒,推薦給大家。

2.字符級CNN (AsiaCCS18)
Danny Hendler, et al. Detecting Malicious PowerShell Commands using Deep Neural Networks. AsiaCCS, 2018: 187-197.
- BGU、微軟
- https://dl.acm.org/doi/pdf/10.1145/3196494.3196511
Microsoft 的 PowerShell 是一種命令行 shell 和腳本語言,默認安裝在 Windows 機器上。它基于微軟的.NET 框架,包括一個允許程序員訪問操作系統服務的接口。雖然管理員可以配置 PowerShell 以限制訪問和減少漏洞,但可以繞過這些限制。此外,PowerShell 命令可以輕松地動態生成、從內存中執行、編碼和混淆,從而使 PowerShell 執行的代碼的日志記錄和取證分析具有挑戰性。
由于這些原因,PowerShell 越來越多地被網絡犯罪分子用作其攻擊工具鏈的一部分,主要用于下載惡意內容和橫向移動。事實上,賽門鐵克最近一份關于 PowerShell 被網絡犯罪分子濫用的綜合技術報告報告稱,他們收到的惡意 PowerShell 樣本數量以及使用 PowerShell 的滲透工具和框架的數量急劇增加。這凸顯了開發檢測惡意 PowerShell 命令的有效方法的迫切需要。

在這項工作中,我們通過實施幾個新穎的惡意 PowerShell 命令檢測器并評估它們的性能來應對這一挑戰。我們實現了基于“傳統”自然語言處理 (NLP) 的檢測器和基于字符級卷積神經網絡 (CNN) 的檢測器。使用大型真實數據集評估檢測器的性能。
評估結果表明,盡管我們的檢測器(尤其是傳統的基于 NLP 的檢測器)單獨產生了高性能,但將基于 NLP 的分類器與基于 CNN 的分類器相結合的集成檢測器提供了最佳性能,因為后者的分類器是能夠檢測成功規避前者的惡意命令。通過對這些規避命令的分析表明,CNN 分類器自動檢測到的一些混淆模式本質上很難使用我們應用的 NLP 技術檢測到。我們的檢測器提供高召回值,同時保持非常低的誤報率,使我們謹慎樂觀地認為它們具有實用價值。


評價:分別利用NLP和4層CNN實現Powershell檢測,方法比較簡單,但由于其2018年完成,做得比較早,仍能為我們提供一種思路。
3.AMSI-Based Detection Using Contextual Embeddings (Token-Char架構 AsiaCCS20)
Danny Hendler, et al. AMSI-Based Detection of Malicious PowerShell Code Using Contextual Embeddings. AsiaCCS, 2020: 679-693
- BGU、微軟(上篇相同團隊)
- https://dl.acm.org/doi/pdf/10.1145/3320269.3384742
繼上一個工作后,這個團隊在2020年提出了一種融合字符級和Token級的深度學習方法,并運用于AMSI較真實的數據集中。
PowerShell 是一個命令行 shell,支持腳本語言。它在組織中廣泛用于配置管理和任務自動化,但也越來越多地用于對組織發起網絡攻擊,主要是因為它預裝在 Windows 機器上并暴露出可能被攻擊者利用的強大功能。這使得檢測惡意 PowerShell 代碼的問題既緊迫又具有挑戰性。 Microsoft反惡意軟件掃描接口 (Microsoft’s Antimalware Scan Interface, AMSI) 內置于 Windows 10 中,允許防御系統在執行之前掃描傳遞給腳本引擎(如 PowerShell)的所有代碼。在這項工作中,我們使用 AMSI 提供的信息對惡意 PowerShell 代碼檢測進行了首次研究。

本文提出幾種新穎的基于深度學習的惡意 PowerShell 代碼檢測器,它們使用來自 PowerShell 語言的單詞預訓練上下文嵌入(Contextual Embeddings)。上下文詞嵌入能夠將語義相似的詞投影到嵌入空間中的近似向量。網絡安全領域的一個已知問題是,與未標記數據相比,標記數據相對稀缺,因此難以設計對多種類型的惡意活動的有效監督檢測。PowerShell 代碼也是如此。我們的工作表明,可以通過學習基于未標記數據的預訓練上下文嵌入來緩解這個問題。
- Token-Char模型架構

本文使用 AMSI 收集的真實數據來訓練和評估我們的模型。上下文嵌入是使用從公共存儲庫收集的大量未標記的 PowerShell 腳本和模塊來學習的。我們的性能分析表明,使用未標記的數據進行嵌入顯著提高了檢測器的性能。我們表現最佳的模型使用的架構能夠處理來自字符和標記級別的文本信號,并獲得接近 90% 的真陽性率,同時保持低于 0.1% 的低假陽性率。



評價:本文的創新在于提出了Token-Char模型架構,并進行了詳細的對比實驗,證明了方法的有效性,推薦大家學習該論文的施壓描述。
4.FC-PSDS檢測方法 (RF+DNN 信安學報)
劉岳, 劉寶旭, 等. 基于特征組合的Powershell惡意代碼檢測方法[J]. 信息安全學報, 2021, 6(1): 40-53.
- 中科院信工所劉老師團隊
本文提出了一種基于隨機森林特征組合和深度學習的Powershell 惡意代碼檢測方法。該方法使用隨機森林生成更好表征原始數據的新特征組合,隨后使用深度學習神經網絡訓練并進行分類識別。該方法可以彌補人工特征工程經驗不足的問題,更好表征原始數據從而提高檢測效果。
- 原始數據處理
- 特征組合
- 模型訓練與分類識別
FC-PSDS 方法設計的目標是使用隨機森林和深度神經網絡檢測惡意 Powershell 代碼。通過混淆去除和標準化從 Powershell 代碼中抽取特征組成原始特征集,根據集成學習思想使用原始特征集生成對原始數據表達更有效的新特征組合,并據此訓練深度神經網絡分類器模型,以此解決傳統方法對于Powershell惡意代碼的檢測困難,以及冗余特征導致的模型檢測能力較差的問題。

實驗結果如下圖所示:

評價:這是來自中科院劉老師他們團隊的工作,主要使用隨機森林生成更好表征原始數據的新特征組合,再接深度學習完成惡意性識別,文章實驗也比較充分,國內為數不多的幾篇Powershell文章。
5.基于混合特征的檢測模型 (Neurocomputing21)
Yong Fang, Xiangyu Zhou, Cheng Huang. Effective method for detecting malicious PowerShell scripts based on hybrid features. Neurocomputing, 448: 30-39 (2021).
- 四川大學黃老師團隊
- https://www.sciencedirect.com/science/article/pii/S0925231221005099
目前,網絡攻擊在互聯網世界猖獗,黑客的攻擊方式也在不斷變化。PowerShell是一種基于命令行和.NET框架的編程語言,功能強大,兼容性好。因此,黑客經常使用 PowerShell 惡意腳本來攻擊 APT 攻擊中的受害者。當這些惡意 PowerShell 腳本被執行時,黑客可以控制受害者的計算機或在他們的計算機上留下后門。

本文提出了一種基于混合特征的惡意PowerShell腳本檢測模型,分析了惡意樣本和良性樣本在文本字符、函數、標記和抽象語法樹節點方面的差異。
- 首先,PowerShell的腳本被FastText嵌入。
- 然后添加從抽象語法樹中提取的 PowerShell 代碼的文本特征、標記特征和節點特征。
- 最后,腳本的混合特征將由隨機森林分類器進行分類。

在實驗中,將惡意腳本插入到良性腳本中,以削弱惡意樣本在抽象語法樹節點和令牌層面的特征,使腳本更加復雜。即使在如此復雜的數據集中,所提出的基于混合特征的模型在五重交叉驗證中仍能達到 97.76% 的準確率。此外,該模型在原始腳本上的準確率為 98.93%,這意味著該模型具有對復雜腳本進行分類的能力。

評價:這是來自四川大學黃老師團隊的工作,主要提出了一種基于混合特征的惡意PowerShell腳本檢測模型,并且相關工作對比值得大家學習。
6.AA-PSFC檢測方法 (BiGRU 武大學報)
基于深度學習的PowerShell惡意代碼家族分類研究[J]. 武漢大學學報(理學版), 2022(1)
- 武漢大學國家網絡安全學院彭老師團隊
由于PowerShell具備隱蔽性高、易用性好、運行環境簡單等特點,近年來已被廣泛應用于高級持續性威脅攻擊中。對PowerShell惡意代碼進行基于功能的家族分類是檢測其新型變異代碼的關鍵。
針對已有工作主要集中于PowerShell代碼的惡意性檢測,缺乏對其功能層面深入挖掘的問題,提出了一種基于功能類型的 PowerShell 惡意代碼家族分類方法。該方法通過構建雙向門控循環網絡與注意力機制提取PowerShell惡意代碼的上下文語義信息,利用 PowerShell惡意代碼的語義特征實現家族分類。

實驗結果如下圖所示:

評價:這是來自武漢大學彭老師團隊的工作,主要結合抽象語法樹和BiGRU識別Powershell惡意家族,文章實驗也比較充分,國內為數不多的幾篇Powershell文章。
7.POSTER (AST+DNN CCS18)
Gili Rusak, et al. AST-Based Deep Learning for Detecting Malicious PowerShell. CCS, 2018: 2276-2278.
- CSAIL, MIT, USA
- https://dl.acm.org/doi/10.1145/3243734.3278496
隨著深度學習的發展,出現了利用神經網絡或字符級卷積神經網絡檢測混淆的Powershell惡意命令的方法,雖然這些表達能顯示Powershell的屬性,但本文假設靜態程序分析的工具會更加有效。基于此,提出一種結合傳統程序分析(抽象語法樹)和深度學習混合得方法,下圖展示了基本步驟:
- 學習PowerShell AST節點向量
- 按照家族類型對惡意腳本進行分類
- 探索嵌入式程序向量表示

評價:提出一種基于語法樹的Powershell檢測思路,僅3頁內容更像workshop。
8.PSDEM (反混淆 ISCC18)
Chao Liu, et al. PSDEM: A Feasible De-Obfuscation Method for Malicious PowerShell Detection. ISCC, 2018: 825-831.
- 中科院信工所
- https://ieeexplore.ieee.org/document/8538691
PowerShell 非常強大,我們已經看到攻擊者最近在他們的攻擊方法中越來越多地使用 PowerShell。在大多數情況下,PowerShell 惡意軟件通過垃圾郵件傳播,使用 Microsoft Word 文檔組合以致命有效的負載感染受害者。如今,PowerShell的去混淆和分析仍然是基于人工分析。然而,隨著惡意樣本和混淆方法數量的快速增長,速度太慢,無法滿足需求。

本文提出了一種稱為 PSDEM 的 PowerShell 去混淆方法,該方法具有兩層去混淆以獲得原始 PowerShell 腳本。一種是從許多混淆的文檔代碼中提取 PowerShell 腳本。另一個是反混淆腳本,包括編碼、字符串操作和代碼邏輯混淆。同時,我們設計了一種基于PSDEM的Word文檔中惡意PowerShell腳本的自動反混淆分析工具。

我們從去混淆的準確性和時間效率方面測試了該工具的性能,評估結果表明它具有令人滿意的性能。PSDEM 提高了分析 Word 文檔中惡意 PowerShell 腳本的效率和準確率,并為安全專家提供了進一步分析以獲取有關攻擊的更多信息的途徑。

評價:設計了一種基于PSDEM的Word文檔中惡意PowerShell腳本的自動反混淆分析工具,并與現有檢測工具進行對比分析。
9.PowerDrive (動靜態反混淆 DIMVA19)
Denis Ugarte, et al. PowerDrive: Accurate De-obfuscation and Analysis of PowerShell Malware. DIMVA,2019: 240-259.
- University of Cagliari
- https://link.springer.com/chapter/10.1007/978-3-030-22038-9_12
如今,PowerShell 是一種廣泛使用的技術,用于管理和管理基于 Windows 的操作系統。但是,惡意軟件向量也廣泛使用它來執行有效負載或刪除其他惡意內容。與惡意軟件使用的其他腳本語言類似,PowerShell 攻擊由于廣泛使用多個混淆層而難以分析,這使得真正的惡意代碼難以被發現。據我們所知,目前還缺少用于正確消除此類攻擊的綜合解決方案。

在本文中,我們介紹了 PowerDrive,一種用于 PowerShell 攻擊的開源、靜態和動態多階段去混淆器。PowerDrive 檢測 PowerShell 代碼,通過向分析師展示所采用的混淆步驟來逐步對其進行去混淆。

我們使用 PowerDrive 成功分析了從各種惡意軟件向量和可執行文件中提取的數千個 PowerShell 攻擊。獲得的結果顯示了攻擊者用來設計惡意腳本的有趣模式。此外,我們提供了分析代碼所采用的行為模型的分類以及分析期間聯系的惡意域的綜合列表。


評價:提出一種用于 PowerShell 攻擊的開源、靜態和動態多階段去混淆器,并評價了Powershell攻擊各個階段(常見六個)的性能,用VirusTotal score驗證。
PS:還有一些工作不再詳細介紹,請讀者搜索并閱讀相關論文。
二.抽象語法樹之deobshell
前面的論文提到抽象語法樹,它能將Powershell抽象成樹狀結構,常見方法是使用接口或編寫自定義程序實現,下面介紹其中一種方法。希望對大家有所幫助。
- Deobshell
- https://github.com/thewhiteninja/deobshell
PowerShell 的抽象語法樹作為代碼的語義表達,以多叉樹的形式表示腳本功能的邏輯結構,保
留了代碼上下文的特征并剔除無關的參數干擾,是分析功能類似的PowerShell代碼的有效方法 。Windows 為PowerShell提供了訪問腳本AST的接口,使用內置接口獲取的 AST 結構如圖所示。
- Microsoft. Ast Class(System. Management. Automation. Language)
- https//docs.microsoft.com/enus/dotnet/api/system.management.automation.language.astview=powershellsdk-7.0.0.

下面是Deobshell的介紹。

DeobShell 是使用 Python 中的抽象語法樹 (AST) 操作對 Powershell 進行反混淆的 PoC。通過調用System.Management.Automation.Language.Parser 相關節點并將相關節點寫入 XML 文件,使用 Powershell 腳本提取 AST。
AST 操作和優化基于一組規則(例如:concat 常量字符串、應用格式運算符…)。從去混淆的 AST 中,使用 Python 重建一個 ps1 腳本。見下圖。

- 這是一個 PoC …僅支持 Powershell 的一個子集
- data.zip 受密碼保護,使用包含惡意軟件樣本的存檔的通用密碼
規則示例:
- 刪除空節點
- 刪除未使用的變量
- 刪除未初始化變量的使用
- 簡化表達式
- 加入、加、格式化、替換運算符
- 拆分、反向、調用表達式
- 類型轉換為類型、字符串、字符、數組
- 用它們的值替換常量變量
- 修復特殊單詞大小寫
- …
格式運算符的 BinaryExpressionAst 節點示例。
輸入:
<BinaryExpressionAst Operator="Format" StaticType="System.Object">
<StringConstantExpressionAst StringConstantType="DoubleQuoted" StaticType="string">{0}{1}</StringConstantExpressionAst>
<ArrayLiteralAst StaticType="System.Object[]">
<Elements>
<StringConstantExpressionAst StringConstantType="SingleQuoted" StaticType="string">c</StringConstantExpressionAst>
<StringConstantExpressionAst StringConstantType="SingleQuoted" StaticType="string">AcA</StringConstantExpressionAst>
</Elements>
</ArrayLiteralAst>
</BinaryExpressionAst>
輸出:
<StringConstantExpressionAst StringConstantType="SingleQuoted" StaticType="string">cAcA</StringConstantExpressionAst>
data.zip 中提供了更多示例,比如一個CTF去混淆的示例。
輸入:
$mRSp73 = [ChaR[] ]" ))43]raHc[]gNIRtS[,)38]raHc[+98]raHc[+611]raHc[((eCAlper.)421]raHc[]gNIRtS[,'5IP'(eCAlper.)'$',)09]raHc[+99]raHc[+701]raHc[((eCAlper.)93]raHc[]gNIRtS[,'vzW'(eCAlper.)'
2halB.tcejboZck tuptuO-etirW
7halB.tcejboZck +'+' 6halB.tcejboZck + halB.tc'+'ejboZck '+'= 2galFFT'+'C:'+'vneZck
SYt!eciNSYt = 1galFFTC:vneZck
SYt...aedi dab yre'+'v'+' ,yre'+'v a yllacipyt svzWtaht ,ton fI .ti gninnur erofeb siht detacsufbo-ed uoy epoh ISYt eulaV- 2halB emaN- '+'ytreporPetoN epy'+'TrebmeM- rebmeM-ddA 5IP tcejboZck
SYt'+'.uoy tresed dna dnuora nur annog reveNSYt eulaV- 9hal'+'B emaN- ytreporPetoN epyTrebmeM- rebmeM-ddA 5'+'IP tcejboZck
SYt.nwod uo'+'y tel annog '+'re'+'veN .'+'pu uoy evig annog reveNSYt eulaV- 8halB emaN- ytreporPetoN epyTrebm'+'eM- rebmeM-d'+'dA 5IP tcejboZck
SYt}f1j9kdSYt eulaV- 7halB emaN- y'+'treporPetoN ep'+'yTrebmeM- rebmeM-ddA 5IP tcejboZck
SYtg4lf_3ht_t0nSYt eulaV- 4halB emaN- yt'+'reporPetoN epyTrebmeM- rebmeM-ddA 5IP tcejboZck
SYt1#f!J{SYt eulaV- 6halB emaN- ytreporPetoN epyTrebmeM- rebmeM-'+'ddA 5IP tcejboZck
SYtgalF,ehT,toN,oslASYt eulaV- 5halB emaN- ytreporPetoN epyTrebmeM- rebmeM-ddA 5IP tcejboZck
SY'+'t}fdjfkslfdSYt eulaV- 3halB emaN- ytrepor'+'PetoN e'+'pyTrebmeM- rebmeM-ddA 5IP tcejboZ'+'ck
SYtgalfSYt eulaV- halB em'+'aN- ytreporPetoN e'+'pyTrebmeM- rebmeM-ddA 5IP tcej'+'boZck
tc'+'ejbO'+'SP tcejbO-weN = tc'+'ejboZck'( ()''nioJ-'x'+]3,1[)eCNERefErpESoBreV$]GniRTS[( (. " ;[aRRAy]::REVerse($MrSp73);. ( 'IeX') ( -JoiN$MrSp73)
輸出:
$object = New-Object PSObject;
$object | Add-Member NoteProperty Blah "flag";
$object | Add-Member NoteProperty Blah3 "dflskfjdf}";
$object | Add-Member NoteProperty Blah5 "Also,Not,The,Flag";
$object | Add-Member NoteProperty Blah6 "{J!f`#1";
$object | Add-Member NoteProperty Blah4 "n0t_th3_fl4g";
$object | Add-Member NoteProperty Blah7 "dk9j1f}";
$object | Add-Member NoteProperty Blah8 "Never gonna give you up. Never gonna let you down.";
$object | Add-Member NoteProperty Blah9 "Never gonna run around and desert you.";
$object | Add-Member NoteProperty Blah2 "I hope you de-obfuscated this before running it. If not, that''s typically a very, very bad idea...";
$env:CTFFlag1 = "Nice!";
$env:CTFFlag2 = $object.Blah + $object.Blah6 + $object.Blah7;
Write-Output $object.Blah2;
三.AST抽取實例操作
下面簡單復現DeobShell工具。
1.環境部署
首先是配置環境。

下載并解壓Deobshell。

注意,這里的代碼有個新的規則,叫海象運算,是python 3.8正式版更新的,PEP572中的海象運算符獲得正式python版本的支持。大家需要配置該版本以上的環境。
海象運算的規則如下:
接著,設置環境變量。

作者配置了最新的Python版本。

2.AST提取
接下來簡單看看整個代碼文件夾。

運行過程是在Powershell中執行main.py文件,并附帶兩個參數,其中“-i”表示輸入,對應的為混淆原始PS文件。
- python main.py deob -i test001.deob.ps1
它會首先生成抽象語法樹AST,然后執行反混淆操作。如下圖所示:

核心代碼如下:
- ast.py
# coding=utf-8
import os
import subprocess
# noinspection PyPep8Naming
import xml.etree.ElementTree as ET
from modules.logger import log_info, log_debug, log_err
def read_ast_file(filename):
log_info(f"Reading input AST: {filename}")
try:
ast = ET.parse(filename)
return ast
except IOError as e:
log_err(e.args[1])
return None
except Exception as e:
log_err(str(e))
return None
def create_ast_file(ps1_file):
log_info(f"Creating AST for: {ps1_file}")
cmd = ["PowerShell", "-ExecutionPolicy", "Unrestricted", "-File",
os.path.abspath(os.path.join("tools", "Get-AST.ps1")),
"-ps1", os.path.abspath(ps1_file)]
result = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
for line in result.stdout.splitlines():
log_debug(line)
return result.returncode == 0
3.代碼解析及結果
接著我們看看主函數代碼,主要通過類和多個文件、函數調用實現。開源代碼真心值得大家學習。
- main.py
# coding=utf-8
import os
import pathlib
import sys
from modules.ast import create_ast_file, read_ast_file
from modules.logger import set_log_level, LogLevel
from modules.optimize import Optimizer
from modules.rebuilder import Rebuilder
from modules.utils import welcome
OPTIONS = {}
def usage():
print("Usage: " + os.path.basename(sys.argv[0]) + ' [options]')
print()
print("Command:")
print(" deob : Deobfuscate PowerShell script")
print(" format : Format PowerShell script")
print()
print("Options:")
print(" -h, --help : Show help")
print(" -i, --in : Input .ps1 file")
print()
sys.exit(0)
def parse_args():
global OPTIONS
i = 1
while i < len(sys.argv):
if sys.argv[i] in ["-h", "--help"]:
usage()
elif sys.argv[i] in ["-i", "--in"]:
OPTIONS["input"] = sys.argv[i + 1]
i += 1
else:
OPTIONS["command"] = sys.argv[i]
i += 1
def deob(ps1_file):
p = pathlib.Path(ps1_file)
if create_ast_file(p):
if ast := read_ast_file(p.with_suffix(".xml")):
o = Optimizer()
o.optimize(ast)
with open(p.with_suffix(".deob.xml"), "wb") as output:
ast.write(output)
r = Rebuilder(p.with_suffix(".deob.ps1"))
r.rebuild(ast.getroot())
def format(ps1_file):
p = pathlib.Path(ps1_file)
if create_ast_file(p):
if ast := read_ast_file(p.with_suffix(".xml")):
r = Rebuilder(p.with_suffix(".formatted.ps1"))
r.rebuild(ast.getroot())
def main():
cmd = OPTIONS.setdefault("command", None)
if cmd == "deob":
deob(OPTIONS['input'])
elif cmd == "format":
format(OPTIONS['input'])
else:
usage()
if __name__ == '__main__':
welcome()
set_log_level(LogLevel.DEBUG)
parse_args()
print("main")
main()
最后運行結果如下圖所示:

(1) 抽象語法樹生成
test001.ps1為輸入文件,即原始PS文件。

test001.xml為生成的AST,為XML文件。

(2) 反混淆
如果文件帶混淆,會執行反混淆操作。

輸出結果如下圖所示:

提醒:但作者嘗試幾個復雜的混淆PS文件,其效果較差,建議代價完善代碼,遺憾的是CCS那篇未開源。同時,如果讀者僅想得到AST,該方法還不錯,另官方提供的接口也是一種不錯的方法。建議讀者深入研究。
四.總結
寫到這里,這篇文章就介紹結束。首先,感謝參考文獻中的各位老師,其次感恩大家在科研和讀博路上的陪伴。希望對您有所幫助。由于作者英語實在太差,論文的水平也很低,寫得不好的地方還請海涵和批評。同時,也歡迎大家討論,真心推薦原文。
學安全兩年,認識了很多安全大佬和朋友,希望大家一起進步。同時非常感謝參考文獻中的大佬們,感謝老師、實驗室小伙伴們的教導和交流,深知自己很菜,得努力前行。感恩遇見,且行且珍惜,小珞珞太可愛了,哈哈。

