• 沒有找到結果。

以虛擬化混淆轉換來落實 Python 程式的安全式機器學習 - 政大學術集成

N/A
N/A
Protected

Academic year: 2021

Share "以虛擬化混淆轉換來落實 Python 程式的安全式機器學習 - 政大學術集成"

Copied!
33
0
0

加載中.... (立即查看全文)

全文

(1)國立政治大學資訊科學系 Department of Computer Science National Chengchi University 碩士論文. 立. Master’s 政 治Thesis. 大. ‧. ‧ 國. 學. 以虛擬化混淆轉換來落實 Python 程式的安全式機器學習. y. Nat. Secure Machine Learning through Virtualization. n. al. er. io. sit. Obfuscation of Python Code. i n C研究生:邱怡翔 hengchi U. v. 指導教授:胡毓忠 中華民國 108 年 4 月 April 2019. DOI:10.6814/NCCU201900153.

(2) 摘要 借助機器學習的能力人們可以從資料裡得到許多有用的資訊。當有巨量 分析需求的資料時經常以向公有雲平台提供者租用運算資源來進行叢集運算 作為處理方式。然而在公有雲進行運算意味著不可信任性,程式資訊有洩漏 的可能性。本研究以保護 Python 程式語言撰寫的程式為目的設計程式碼混淆 轉換工具,其利用虛擬化混淆演算法作為主要轉換方式來修改程式,轉換後 的程式達成程序抽象化,確保模型在訓練及預測階段的運算方式無法被輕易 得知。此外,本研究應用簡單化混淆來改寫虛擬化混淆轉換中,直譯器的運. 政 治 大. 作方式來阻饒攻擊者進行靜態及動態的程式分析。在轉換效果評估上,本研. 立. 究以 Kaggle 預測鐵達尼號事件存亡的競賽資料集準備機器學習程式。機器學. ‧ 國. 學. 習程式在虛擬化轉換後,控制流程被全面地改寫並且使軟體複雜度大幅提高, 而這也將使程式執行時間增加 43 到 70 倍。. ‧. 關鍵字:程式碼混淆、虛擬化混淆轉換、安全式機器學習. n. er. io. sit. y. Nat. al. Ch. engchi. i n U. v. i. DOI:10.6814/NCCU201900153.

(3) ABSTRACT With the power of machine learning, people can get a lot of useful information from the data. When there is a huge amount of data for analyzing, the cluster computing operation is often carried out by renting computing resources, which is offered by the public cloud platform provider. However, computing in the public cloud means untrustworthiness, and program information has the possibility of leakage. This paper designs a code obfuscation conversion tool for the purpose of protecting programs written in the Python programming language. It uses the Virtualization Obfuscation algorithm as the main conversion method to modify the program, and the converted program achieves program abstraction to ensure that. 政 治 大 to rewrite the interpreter. the model is secure in the training and prediction stage. In addition, this study also. 立. applies simplicity obfuscation. in the Virtualization. ‧ 國. 學. Obfuscation transformation, so that the attacker is harder to perform static and dynamic program analysis. In the evaluation of the conversion effect, this study prepares a machine learning program based on the Kaggle competition data set in. ‧. which predicts the survival of the Titanic event. After the Virtualization. y. Nat. Obfuscation transform is performed on the machine learning program, the control. sit. flow is completely rewritten and the complexity of the software is greatly. er. io. improved, but this will also increase the program execution time by 43 to 70 times.. al. n. v i n C hVirtualization Obfuscation, Keywords : Code Obfuscation, Secure Machine engchi U Learning. ii. DOI:10.6814/NCCU201900153.

(4) 目錄 摘要.................................................................................................................................i ABSTRACT..................................................................................................................ii 表目錄............................................................................................................................ v 圖目錄...........................................................................................................................vi 第一章 導論.................................................................................................................. 1 1.1 研究動機.........................................................................................................1. 政 治 大 1.2 研究目的........................................................................................................2 立. ‧ 國. 學. 1.3 研究成果.........................................................................................................2 第二章 研究背景.......................................................................................................... 3. ‧. 2.1 程式碼混淆.....................................................................................................3. y. Nat. 2.1.1 虛擬化混淆演算法..............................................................................3. er. io. sit. 2.1.2 對虛擬化混淆的攻擊..........................................................................6 2.2 Python 程式.................................................................................................... 8. al. n. v i n Ch 第三章 相關研究........................................................................................................ 11 engchi U 第四章 混淆方法與流程............................................................................................12. 4.1 原始程式分析..............................................................................................12 4.2 虛擬化混淆轉換..........................................................................................13 4.2.1 建立混淆版位元組碼........................................................................15 4.2.2 建立自訂直譯器................................................................................16 4.3 簡單化混淆轉換..........................................................................................17 第五章 研究實作........................................................................................................ 19 5.1 混淆前程式準備..........................................................................................19 iii. DOI:10.6814/NCCU201900153.

(5) 5.2 虛擬化混淆後程式實測..............................................................................20 5.3 虛擬化混淆轉換效力..................................................................................21 第六章 結論與未來研究............................................................................................23 6.1 研究結論與貢獻..........................................................................................23 6.2 研究限制......................................................................................................23 參考文獻...................................................................................................................... 25. 立. 政 治 大. ‧. ‧ 國. 學. n. er. io. sit. y. Nat. al. Ch. engchi. i n U. v. iv. DOI:10.6814/NCCU201900153.

(6) 表目錄. 表1. 虛擬化轉換程式的組成位.................................................................................5. 表2. CPython 直譯器無參數指令..............................................................................9. 表3. CPython 直譯器含參數指令............................................................................10. 表4. 指令集架構表格...............................................................................................16. 表5. 機器學習程式在虛擬化混淆前後的執行秒數...............................................20. 表6. 含交叉驗證的機器學習程式在虛擬化混淆前後的執行秒數.......................21. 表7. 機器學習模組在虛擬化混淆前後的檔案大小...............................................21. 程式虛擬化混淆前後循環複雜度...................................................................22. 學. ‧. io. sit. y. Nat. n. al. er. 表9. ‧ 國. 表8. 政 治 大 程式虛擬化混淆前後計算程式長度...............................................................22 立. Ch. engchi. i n U. v. v. DOI:10.6814/NCCU201900153.

(7) 圖目錄. 圖1. Opy 混淆實例......................................................................................................4. 圖2. 虛擬化轉換程式運作示意圖.............................................................................5. 圖3. CPython 直譯器的指令更新...............................................................................8. 圖4. Python 程式混淆流程........................................................................................12. 圖5. Python 函式........................................................................................................14. 圖6. Python 虛擬化轉換後函式................................................................................14. Kaggle 鐵達尼號競賽訓練資料.....................................................................19. ‧ y. Nat. io. sit. 圖 10. 簡單化混淆轉換...............................................................................................18. 學. 圖9. n. al. er. 圖8. 政 治 大 Byterun 直譯器的指令處理..............................................................................17 立 Python DIS 套件分析........................................................................................15. ‧ 國. 圖7. Ch. engchi. i n U. v. vi. DOI:10.6814/NCCU201900153.

(8) 第一章 導論 現在雲端有著充分的運算資源值得大數據分析時使用,然而訓練時所用資 料或是專業評估後所訓練而得的分析模型可能有隱私上的需求。因此,若是能建 立安全的機器學習分析方法將有助於對機器學習專家提供保障。. 1.1 研究動機 為了使程式更難被逆向工程還原出原本程式的樣貌,程式碼混淆領域研究. 政 治 大 Obfuscation ) ,又稱作虛擬化轉換的程式碼混淆方式,是透過將程式轉換成特殊 立 如何轉換出混淆版本的程式來令人難以了解其運作。虛擬化混淆( Virtualization 1. ‧ 國. 學. 位元組碼程式並由一個自訂的直譯器所解譯。這個特殊的位元組碼根據一套隨 機生成的指令集架構設定程式運作方式,這令程式可以有複雜的語意而使攻擊. ‧. 者難以解讀程式。. 隨著安全隱私的觀念在大數據資料分析領域被重視,從資料前處理、選定. y. Nat. sit. 機器學習演算法、設定模型相關參數直到對測試資料進行預測皆是機器學習專. al. er. io. 家的私人財產。在對大量的資料進行運算時,向公有雲服務提供者租用運算資源. n. v i n Ch 存在,除了服務提供者有可能是不誠實的,機器學習程式也可能成為惡意第三 engchi U 使用來完成是經常被選用的策略。然而公有雲平台的使用意味著不可信任問題. 方的攻擊目標。如同 Collberg 研究裡所描述的情境[8],若程式在不信任的平台 執行且需要保護其運作資訊,開發者選擇將自身程式透過混淆轉換處理。本研究 以保護於雲端進行機器學習分析的程式為目標,提供使用者一個能夠進行虛擬 換轉換的混淆工具。. http://tigress.cs.arizona.edu/transformPage/docs/virtualize/index.html,虛擬化混淆轉換 1. 1. DOI:10.6814/NCCU201900153.

(9) 1.2 研究目的 除了程式碼混淆,另一種可能的方式來達成於公有雲進行安全式機器學習 模型分析是使用密碼學混淆的做法[2][11],而本研究使用根據對抗逆向工程經 驗發展至今的程式碼混淆演算法。其中,虛擬化轉換使用隨機建立的指令集架構 ( Instruction Set Architecture )來取代原本程式功能的完成方式,攻擊者若嘗試植 入程式碼來突破對程式運作的了解,複雜的合成指令可有效阻撓這種方法進行。 本研究的研究議題如下:. 政 治 大 擬化轉換為主的混淆工具為使用者混淆 Python 機器學習程式。 立. . 研究虛擬化混淆轉換在 Python 程式語言的實現方式,並提供一個使用虛. . 根據近期關於程式碼混淆發展,研究如何應用簡單化混淆( simplicity )[3]. ‧ 國. 學. 來增強虛擬化轉換。. 驗證經由混淆工具混淆後程式的執行效能、檔案大小成長及混淆效力。. ‧. io. sit. y. Nat. 1.3 研究成果. er. . al. v i n Ch 機器學習中,模型的訓練與資料測試可以隱密地進行的運算。隨著自動化分析攻 engchi U n. 研究展示經虛擬化轉換的機器學習程式可以改變原本程式的控制流程使得. 擊方式的演進,攻擊者將能更快的分析程式運作內容,對此本研究的混淆工具藉 由簡單化混淆的應用作為虛擬化轉換的強化版本。 混淆實測方面本文以 Kaggle 數據分析競賽的題目:鐵達尼號事件乘客生存 預測為例進行研究。機器學習演算法方面以邏輯回歸、決策樹、隨機森林及交叉 驗證使用與否的組合準備 Python 程式,虛擬化轉換後的程式將需要額外數十倍 時間來執行,從霍爾斯特德及 McCabe 軟體複雜度的觀點來看,虛擬化轉換具有 充分的混淆效力。 2. DOI:10.6814/NCCU201900153.

(10) 第二章 研究背景 程式碼混淆是一種分析程式原始碼後改寫成另一個版本的程序,新版本的 程式將使人更難從中得到資訊。本章以程式碼混淆的概念介紹虛擬化混淆轉換 的價值及分析此混淆演算法的研究,接著探索作關於程式語言 Python 的相關知 識。. 2.1 程式碼混淆. 治 政 大 混淆領域中,使用者透過程式碼轉換來增加攻擊者破解程式內容的時間。程式碼 立 程式混淆是指將程式運行轉換成一種令人難以理解的混淆版本,在程式碼. 混淆的優勢在於程式打亂的程度可以被彈性的決定,根據安全程度的需求,程式. ‧ 國. 學. 碼混淆可以令攻擊者破解程式所需的攻擊內容更複雜,直到攻擊所需的花費時. ‧. 間成本超越理解程式的價值。. Savio 等對程式碼混淆的調查[19]中,將程式碼混淆的技巧分成四大類,包. y. Nat. sit. 括程式重新排版、資料抽象化、控制流程轉換及程序抽象化,這些混淆演算法可. er. io. 以互相搭配使用來提升程式的混淆程度。目前可對 Python 程式語言進行程式碼. al. v i n Ch 用模組重新命名,並且達成重新排版技巧中,字串、程式註解內容打亂,圖 1 engchi U n. 混淆的開源專案中如 Opy2 可以完成資料抽象化的技巧為程式中的資料變數、引. 為 Opy 混淆程式案例。而本研究則著重於另外兩類方法的實現,藉由虛擬化混 淆轉換及簡單化混淆轉換達成程式的程序抽象化改寫並使其控制流程難以理解。 2.1.1 虛擬化混淆演算法. 一般高階的程式語言可由編譯器處理使其對應到特定的指令集架構後等待 執行。如 x86 架構定義了處理器對於指令的處理及執行、Java 將程式轉變成位元 https://github.com/QQuick/Opy/blob/master/opy/opy.py,Python 名稱混淆工具. 2. 3. DOI:10.6814/NCCU201900153.

(11) 組碼,由不同平台上的 Java 虛擬機器來解釋並執行位元組碼。使用者也能依據 這樣的概念建立自訂的指令集架構,接著製作特定的直譯器來解譯程式。. 立. 政 治 大. ‧. ‧ 國. 學. n. Ch. engchi. er. io. al. sit. y. Nat. 圖 1: Opy 混淆實例. i n U. v. 透過在原始碼中嵌入自製的直譯器來解譯轉換後的程式來實現上述以自訂 的指令集架構運行的作法,相當於另程式添加額外一層解譯程序( interpretation ) ,增加每層解譯程序包含隨機產生一套指令集架構、將原程式轉換至採用該指 令集運作的版本、建立使用該指令集的直譯器。表 1 列出的項目為虛擬化混淆轉 換後程式的構成元件。虛擬化混淆轉換後程式的運作方式如圖 2 所示,根據虛擬 程式計數器在位元碼陣列所指的位置,調度單位指定相對應的指令處理器工作, 指令處理器使用所產生的虛擬指令集執行程式指令,過程將反覆執行直到程式 目的達成。 4. DOI:10.6814/NCCU201900153.

(12) 表 1: 虛擬化轉換程式的組成單位. 立. 政 治 大. ‧. ‧ 國. 學. n. er. io. sit. y. Nat. al. Ch. engchi. i n U. v. 圖 2: 虛擬化轉換程式運作示意圖. 虛擬化混淆轉換特性讓它可以達成多種程式保護的需求。除了混淆程式內 部運作資訊、使同樣的程式可以被再製出多種版本來滿足樣性,也能讓程式不易 被竄改來確保程式的完整性。Anckaert 等的研究[1]描述了虛擬化轉換有充分的 混淆能力,例如自訂指令集的指令語意可以合併或分割而更複雜、編碼可以隱 5. DOI:10.6814/NCCU201900153.

(13) 藏指令的含義及參數的位置、產生的直譯器可以選擇不同的調度方式來進入指 令執行階段。然而在程式碼混淆的技巧中,虛擬化轉換對程式運作效能的衝擊是 較為巨大的,運算時間的成長將到達數十倍以上。. 2.1.2 對虛擬化混淆的攻擊. 為破解程式對其進行分析可分為靜態及動態類[16],靜態分析的目標著重在 根據程式本身內容來了解所有可能的執行情況,這可使攻擊者用於對程式可以 有全面性的了解。編譯器分析程式裡的標記( token )進行語法解析、產生對應的. 治 政 大 抽象語法樹也是一種程式靜態分析的行為。混淆工具改寫程式的工作也與此類 立 似,根據混淆演算法的需求混淆工具會先選定合適的分析方式後再進行程式轉 ‧ 國. 學. 換,使混淆後程式的運算結果不違背原始程式的輸出;動態分析則是藉由選擇特. ‧. 定的輸入讓程式執行來觀察程式執行的路徑及資料在過程中的修改,整理這些 觀察結果攻擊者可以藉由簡化來取得近似於原始程式的運作方式。動態分析的. y. Nat. io. sit. 工具可分為多種類型如 debuggers、profilers、tracers、emulators。使用 debugger. n. al. er. 可以讓使用者在程式執行期間與之互動,最常見的使用方式是設定執行中斷點,. Ch. i n U. v. 這除了幫助使用者開發程式外,也讓攻擊者了解程式做了怎樣的保護設定。. engchi. profiler 的使用可以得知程式個個部分的執行次數與時間,從攻擊者的角度這可 以推測程式裡不同部分的關係。tracer 可以記錄程式執行的過程,直到程式運行 結束後再進行事後的分析。emulator 對攻擊者而言則可以作為一種特殊的 debugger 使用。 上述工具及分析分法屬於程式碼混淆在面臨 Man-At-The-End ( MATE )的攻 擊時需要能有所抵抗的目標,攻擊者在程式執行環境上擁有軟硬體的控制權,在 不斷的竄改與測試下嘗試了解程式內涵。MATE 的攻擊分為兩種情形,其一是惡 意代碼( malicious code )使用來令受害者端執行潛在破壞可能的命令,其二是惡 意主持( malicious host ),攻擊者在自身裝置以靜態或動態分析嘗試破解程式的 6. DOI:10.6814/NCCU201900153.

(14) 運作。探索 MATE 對於虛擬化混淆轉換程式的攻擊分析[7]指出了攻擊上會有許 多的困難點,如攻擊者若要以植入程式分析程式執行過程,則需要在了解直譯器 所用的指令集架構後才能開始,也因此在實務上虛擬化混淆轉換是達成程式碼 混淆目的的一種強力的手段。 至今有許多研究探討虛擬化混淆轉換的攻擊方式。由於虛擬化轉換的做法 是讓所建的直譯器去解譯為了完成原本程式功能的新語言,Rolles 的研究[18]以 靜態分析的方式一步一步掌握直譯器內容來將虛擬化轉換後的程式還原成接近 原本的程式碼內容,然而這種反虛擬化轉換的攻擊包含許多繁瑣的工作,對於經 由隨機定義的指令集架構打亂的程式仍然難以掌握其運作邏輯。之後反虛擬化. 政 治 大. 轉換研究[10][13][20][21]的做法傾向於使用或結合動態分析的使用,依據攻擊目 標的不同而有所差異。. 立. ‧ 國. 學. 使用動態分析來攻擊程式需要給定輸入測試,Banescu 等的研究[4]觀察應用 符號運算[6][14]於動態分析的結果以及處理方式。符號運算原先是作為程式錯誤. ‧. 檢查方式,將原本輸入的內容以符號值代替來模擬程式執行情況,而許多對程式 的動態分析攻擊也依此使用。研究提出了兩種處理方式妨害對混淆的程式進行. y. Nat. sit. 動態分析: (1) Range Dividers,透過將輸入的範圍切割來產生多個分支,因此令. n. al. er. io. 動態分析執行時難以探索全部的分支,(2) Input Invariants,首先令使用者訂出輸. i n U. v. 入集合,接著對混淆的程式設定可接受的輸入範圍。輸入被接受範圍的輸入可以. Ch. engchi. 正常地輸出與未混淆的程式相同的結果,而輸入集合範圍外的輸入則會被引導 至與原本程式不同的結果,例如得到錯誤的輸出或進入無窮迴圈。 根據上述在程式碼混淆領域的攻擊、防守研究,若是使用者希望進行高度混 淆的轉換,在混淆過程中需要加入足以對抗動態分析攻擊的轉換演算法,使現今 的混淆工具可以混淆至足夠的安全程度。. 7. DOI:10.6814/NCCU201900153.

(15) 2.2 Python 程式. Python 在當今是廣泛應用於許多場合的高階程式語言,它提供許多套件令 使用者可以快速取用函式庫完成需要的功能,當今許多的機器學習程式也因為 可以利用其 Scikit-learn 套件快速嘗試各類演算法而於 Python 程式語言實作。 Python 的特色包括其屬於直譯語言、動態型別。因此 Python 重視程式的簡 潔及可讀性並可以在不經由編譯的步驟直接為使用者執行程式語句,而動態型 別的特性使程式變數在執行當下才檢查其資料類型。. 政 治 大 Python 官方由 C 語言編寫的 CPython 直譯器為例,在每當 Python 的新版本推出 立 由於上述 Python 程式語言的特性,程式執行速度慢成為其最大的缺點。以. 時其直譯器也有所調整,包含新指令的加入及舊指令的汰除或更新來嘗試以更. ‧ 國. 學. 有效率的操作指令執行程式。例如 Python 直譯器的「CALL_FUNCTION_KW」. ‧. 指令,如圖 3 所示的官方文件說明是用於以字典資料結構作為參數呼叫函式的. n. al. er. io. sit. y. Nat. 指令,在 Python 3.6 版本後改以 tuple 資料表示參數中的 keyword。. Ch. engchi. i n U. v. 圖 3: CPython 直譯器的指令更新 Python 官方文件有對應版本 CPython 直譯器所使用的全部指令列表 3。虛擬 化混淆工具的設計需要如同上述的情況依據 Python 版本選擇每個指令的工作內 https://docs.python.org/3/library/dis.html. 3. 8. DOI:10.6814/NCCU201900153.

(16) 容,使直譯器能夠正確地運作程式。以 CPython 直譯器的指令在堆疊機器( stack machine )完成 Python 函式功能所需的指令如表 2、3 所示,任何程式語言達成這 些指令語意即可產生自訂直譯器為 Python 函式進行虛擬化轉換。 表 2: CPython 直譯器無參數指令 指令類別. 相關指令. 指令簡述. 一般性堆疊. POP_TOP、ROT_TWO、ROT_THREE. 移除、換位元素. 操作指令. DUP_TOP、DUP_TOP_TWO. 複製 stack 頂端 元素. 一元運算指. UNARY_POSITIVE、UNARY_NEGATIVE、. 自 stack 取出頂. 令. UNARY_NOT、UNARY_INVERT. 端元素,將運算. 立. 政 治 大. 結果推回 stack 取得迭代. GET_ITER、GET_YIELD_FROM_ITER. BINARY_POWER、BINARY_MULTIPLY、BINARY_AND、 自 stack 取出兩. 令. BINARY_RSHIFT、BINARY_MATRIX_MULTIPLY、 BINARY_XOR、BINARY_OR、BINARY_MODULO、. 運算結果推回. io. n. Ch. i n U. INPLACE_POWER、INPLACE_MULTIPLY、. engchi. er. BINARY_ADD、BINARY_SUBTRACT、. al. stack. sit. y. Nat. BINARY_FLOOR_DIVIDE、BINARY_TRUE_DIVIDE、. BINARY_SUBSCR、BINARY_LSHIFT. 個元素運算,將. ‧. ‧ 國. 學. 二元運算指. v. 自 stack 取出兩. INPLACE_AND、INPLACE_MATRIX_MULTIPLY、. 個元素運算,將. INPLACE_XOR、INPLACE_OR、INPLACE_MODULO、. 運算後的元素. INPLACE_FLOOR_DIVIDE、INPLACE_TRUE_DIVIDE、 推回 stack INPLACE_ADD、INPLACE_SUBTRACT、 INPLACE_LSHIFT、INPLACE_RSHIFT. 其他無參數. STORE_SUBSCR、DELETE_SUBSCR. 陣列修改. SET_ADD、LIST_APPEND、MAP_ADD. 資料結構追加. 指令. 內容 BREAK_LOOP、CONTINUE_LOOP. 迴圈操作. 9. DOI:10.6814/NCCU201900153.

(17) RETURN_VALUE、YIELD_VALUE、YIELD_FROM. 回傳. SETUP_WITH、WITH_CLEANUP_START、. with 語句設定. WITH_CLEANUP_FINISH. 表 3: Python 直譯器含參數指令 指令類別. 相關指令. 指令簡述. 參數操作指令. STORE_NAME、DELETE_NAME、STORE_ATTR、. 儲存、刪除變. DELETE_ATTR、STORE_GLOBAL、. 數. DELETE_GLOBAL. 政 治 大. 取得變數值. LOAD_CONST、LOAD_NAME、LOAD_ATTR、 LOAD_GLOBAL. 立. BUILD_TUPLE、BUILD_LIST、. 建立資料結構. ‧ 國. 學. BUILD_SET、BUILD_MAP. 根據參數比較. COMPARE_OP. ‧ sit. y. Nat. IMPORT_NAME、IMPORT_FROM. io. er. JUMP_FORWARD、POP_JUMP_IF_TRUE、. POP_JUMP_IF_FALSE、JUMP_IF_TRUE_OR_POP、. n. al. Ch. engchi U. v ni. 兩元素內容 匯入模組 跳躍至其他程 式執行階段. JUMP_IF_FALSE_OR_POP、JUMP_ABSOLUTE FOR_ITER. 取得下個迭代 資訊. SETUP_LOOP、SETUP_EXCEPT、SETUP_FINALLY. 設定迴圈、例 外處理起始點. LOAD_FAST、STORE_FAST、DELETE_FAST. 變數處理. RAISE_VARARGS. 例外處理. CALL_FUNCTION、CALL_FUNCTION_EX、. 呼叫函式. CALL_FUNCTION_KW LOAD_METHOD、CALL_METHOD. 取用物件方法. 10. DOI:10.6814/NCCU201900153.

(18) 第三章 相關研究 使用程式碼混淆實現控制流程混淆且公開發表的案例不多,其中公開的虛 擬化轉換研究以保護 C 或其他程式語言為目標實作,本研究與其他實現虛擬化 轉換的混淆工具差異在於能夠為以 Python 語言撰寫的程式進行混淆及簡單化混 淆的應用。 Banescu 等的研究[5]實做了能夠為 C#程式語言進行虛擬化轉換的混淆轉換 工具 VOT4CS4 並且藉由 Coogan 等的研究[10]評估程式轉換前後的容忍能力及代 價。安全性評估從程式的執行期間以動態分析工具 tracer 記錄程式所用指令等資 料,到執行結束後將記錄的結果簡化並檢視與原本程式的差異程度而得。虛擬化. 政 治 大. 轉換後的程式大小及執行速度都會有一定幅度的成長,以 VOT4CS 混淆開源專. 立. 案 ResourceLib 為例,整個編譯後的檔案大小成長量為 93.87%。. ‧ 國. 學. Collberg 等的研究[9]從保護主從架構的分散式系統設計要求不信任用戶端 程式持續更新的後端 – Tigress5,而這個具有程式轉換的作品發展成可以保護 C. ‧. 語言程式的混淆工具。在 Tigress 實作的虛擬化轉換中,額外地使用一些程式碼. y. Nat. 混淆演算法來保護直譯器功能的隱密性。包括透過將直譯器的執行迴圈切割成. sit. 更小的片段後,以不透明條件式( opaque predicate )來令程式執行階段難以追蹤. al. n. 其他部分來回執行。. er. io. 以及讓直譯器以折返( Reentrant )的方式運作,使直譯器執行的指令及程式中的. Ch. engchi. i n U. v. https://github.com/tum-i22/vot4cs. 4. http://tigress.cs.arizona.edu/index.html. 5. 11. DOI:10.6814/NCCU201900153.

(19) 第四章 混淆方法與流程 本文以實際作為數據分析競賽的訓練及測試資料準備 Python 機器學習程式 來評估程式碼混淆前後的效果,而為程式進行程式碼混淆轉換的流程如圖 4 所 示。首先,使用者將原始程式輸入至混淆工具後,混淆工具透過 Python 的抽象 語法樹及反組譯模組分析出函式、類別的方法中,CPython 直譯器執行該段程式 的位元組碼資訊。接著根據解譯位元組碼所需的指令重新產生一套指令集架構, 以 Byterun6 直譯器為基礎改寫解譯方式後,混淆工具輸出一份混亂的位元組碼 程式以及與其對應的直譯器來取代原本的 Python 程式。最後,使用者在本地端 完成程式混淆轉換後即可取代原始程式上傳至公有雲平台執行。. 立. 政 治 大. ‧. ‧ 國. 學. n. er. io. sit. y. Nat. al. Ch. engchi. i n U. v. 圖 4: Python 程式混淆流程. 4.1 原始程式分析 如圖 4 所示,本研究的混淆工具透過 Python 的抽象語法樹及反組譯模組分 析程式內容,而 nedbat 的 Byterun 直譯器則用來做為虛擬化轉換時,直譯器的產 生基礎。 htmls://github.com/nedbat/byterun. 6. 12. DOI:10.6814/NCCU201900153.

(20) 開始進行混淆轉換前,混淆工具需要先切出被轉換的程式部分,亦即一對位 元組碼及直譯器負責執行的範圍。Python 是將每個模組視為物件的物件導向程 式,物件可以作為轉換單位的選擇包括整個物件或是針對物件的每個方法,另外 與物件導向的開發方式有所不同的地方是,Python 函式可作為第一類物件被定 義。為了對不同開發類型的 Python 程式進行混淆,本研究以函式虛擬化轉換來 轉換每個定義的函式及物件的方法。Python 的 AST( Abstract Syntax Tree )模組 可以對原始程式檔案進行初步分析,為每個模組建立抽象語法樹,完成後便能從 樹的尋訪過程找出程式所定義的函式部分進行混淆轉換。 虛擬化混淆轉換的目的是產生一個特殊位元組碼陣列,只有與其相對應的 直譯器可以解譯。其中,位元碼陣列是根據混淆前程式的內容改寫成一連串的. 政 治 大. 操作碼及參數對而成;直譯器則是一個大型的迴圈令指令調度器不斷選擇下一個. 立. 操作指令直到工作結束。然而 Python 對於同樣程式碼的解讀可能會隨著新版本. ‧ 國. 學. 的釋出有所不同,因此混淆工具的設計也將影響所產出的直譯器如何使用操作 指令來解譯程式。. ‧. 有關 Python 直譯器的製作方面,最著名的是以 C 語言做成的 CPython 直譯 器,使用 CPython 時原始的 Python 程式檔案會被編譯成對應的.pyc 檔案,內容. y. Nat. sit. 包含位元組碼讓虛擬機器後續執行時不需重新編譯檔案並且擁有執行速度快的. al. er. io. 優點,CPython 解譯程式的資訊可以藉由 Python 的 DIS 模組獲得。另外也有以. v. n. Python 實現 Python 的直譯器如 Byterun,它使用與 CPython 相同的指令來解譯程. Ch. engchi. i n U. 式,此外還保留了 Python 先前版本的指令內容來解譯不同版本所編譯的 Python 程式。本研究以 Byterun 直譯器為基礎作為實現虛擬化轉換中直譯器的產生方式 ,並以 Python 程式語言設計混淆工具,完成 Python 原始碼到 Python 原始碼的程 式碼混淆轉換。. 4.2 虛擬化混淆轉換 虛擬化混淆轉換由以下幾個基本構成元素:虛擬指令集、位元碼陣列、虛擬 程式計數器、堆疊、調度單位、指令處理器。以圖 5 的 Python 函式為例,此函 13. DOI:10.6814/NCCU201900153.

(21) 式用於決策樹演算法中,將資料集根據其中的一項特徵值數值來把資料分成兩 堆。圖 6 則是上述函式以虛擬化轉換後的結果。經由函式虛擬化轉換再製的前後 函式擁有相同的功能,但運作方式的複雜程度卻有相當程度的提升。接下來將介 紹關於混淆轉換工具的轉換流程設計以實現自動化 Python 函式虛擬化轉換。. 立. 治 政 圖 5: Python 函式大. ‧. ‧ 國. 學. n. er. io. sit. y. Nat. al. Ch. engchi. i n U. v. 圖 6: Python 虛擬化轉換後函式 14. DOI:10.6814/NCCU201900153.

(22) 4.2.1 建立混淆版位元組碼 位元組碼的內容包括指令操作碼( opcode )及參數,虛擬化轉換中混淆工具 可以隨機生成一套新的指令集架構作為虛擬指令集,虛擬指令集可以設定獨特 的操作指令編碼及參數存取位置,使基於虛擬指令集輸出的位元組碼無法直接 分析其內容。 虛擬指令集除了操作指令編碼可以採用任意數值外,也可設計獨特的指令 語意。建立新指令集前,混淆工具以 Python 的 DIS( Disassembler for Python bytecode )套件來取得完成函式功能所需指令。圖 7 所示為藉由使用 DIS 套件分 析圖 5 Python 函式所得的位元組碼資訊,圖中每行表示位元組碼中的一個指令,. 治 政 大 內容包括指令所對應的原始程式碼行數、當前指令、被標記的指令、指令位址、 立 位元組碼名稱、位元組碼參數、參數內容。 ‧. ‧ 國. 學. n. er. io. sit. y. Nat. al. Ch. engchi. i n U. v. 圖 7: Python DIS 套件分析. 15. DOI:10.6814/NCCU201900153.

(23) 得到完成函式功能所需的基本指令後,混淆工具可以產生如表 4 所示的指 令集表格,除了指令中的操作碼會由新的編號表示外,指令所用的參數讀入位 置、到達下個指令位置可以隨機設定。另外混淆工具可以藉由合併指令語意來產 生新的指令,例如在透過 N 元語法 7 分析指令前後關係後,混淆工具選擇將指令 「LOAD_GLOBAL」及「CALL_FUNCTION」合併成超級指令(表 4 中操作碼 3 的指令),接著便能輸出新的位元組碼程式「超級指令#1,參數 1,參數 2」取代原 本的位元組碼「LOAD_GLOBAL,參數 1,CALL_FUNCTION,參數 2」。. 表 4: 指令集架構表格. 治 政 CALL_FUNCTION 大 2. LOAD_GLOBAL. 超級指令#1. 操作碼. 1. 3. 參數. +1. +1. +2. +2. 虛擬程式計數器. (+1,+2) +3. ‧. ‧ 國. 立. 學. 位元組碼名稱. y. Nat. 關於上述指令集架構產生可以讓混淆工具每次執行產生不同的結果,除了. io. sit. 隨機的新指令操作碼、指令參數位置、虛擬程式計數器移動外,超級指令可以嘗. n. al. er. 試選擇任意兩個相連的指令來產生,因此攻擊者無法根據混淆工具的程式內容 直接得知混淆前程式的還原方式。. Ch. 4.2.2 建立自訂直譯器. engchi. i n U. v. 自訂的直譯器需要不斷地選擇如表 2、3 所示的操作指令並準確地完成指令 工作,圖 8 所示為 Byterun 直譯器對於 Python 位元組碼「LOAD_GLOBAL」的 解譯方式,混淆工具可以將這樣的指令語意轉換成虛擬化混淆轉換中的指令處 理器。圖 6 中第 19~27 行即為工具轉換後,可完成如圖 8 指令工作內容的程式。 https://en.wikipedia.org/wiki/N-gram. 7. 16. DOI:10.6814/NCCU201900153.

(24) 圖 8: Byterun 直譯器的指令處理. 根據生成的虛擬指令集,自訂的直譯器可以解譯混淆版本的位元組碼程式,. 政 治 大. 也因此位元組碼陣列的元素位置可以被隨機調整、加入無含意的資料。虛擬程式. 立. 計數器則會在直譯器的控制下,在每次指令工作完成後指向正確的程式陣列位. ‧ 國. 學. 置使程式能正確執行。. 調度單位及指令處理器是自訂直譯器的主要內容。調度單位會根據虛擬程. ‧. 式計數器在程式陣列中所指的位置選擇要使用的指令處理器,指令處理器在執. sit. y. Nat. 行完指令工作後會將虛擬程式計數器引導到下個位置,根據函式所用指令,混淆. al. er. io. 工具會選擇表 2 及表 3 裡的指令工作做成指令處理器直到自訂的直譯器可以處理. v. n. 所有指令。除了上述的工作,混淆工具所建立的直譯器還會額外以區塊( Block ). Ch. engchi. i n U. 來確保程式運作在正確的狀態下。例如在進入迴圈時,程式會先令區塊記錄當前 資料堆疊的狀態、迴圈結束位置,迴圈執行期間遇到「break」指令則引導程式 到迴圈結束位置、遇到「continue」指令則引導程式到迴圈起始位置,離開迴圈 時根據區塊所記錄的資訊檢查資料堆疊是否在維持在先前的高度。. 4.3 簡單化混淆轉換 由於虛擬化混淆轉換後的程式只能透過分析程式內的自訂直譯器,因此若 是能令混淆工具產出運作更複雜的直譯器將可提升程式的混淆效果。有關這方 17. DOI:10.6814/NCCU201900153.

(25) 面的議題,Collberg 的 Tigress 混淆工具使用其他的程式碼混淆演算法如不透明 條件式等方法阻饒攻擊者的分析、Banescu 的 VOT4CS 混淆工具以分析指令使 用次數來編排指令處理器位置。本研究以 Asghar[3]的簡單化混淆轉換作為虛擬 化轉換中妨礙攻擊者分析直譯器方式,該研究指出這樣混淆方式可以同時達到 對抗靜態及動態分析的威脅。 透過兩數大小比較改換成兩數互減併入條件式的內部運算可以移除明確的 條件分支,用於虛擬化轉換時可使程式計數器的跳躍內容被混淆,簡單化混淆的 方式如圖 9 所示,圖中的兩個 Python 函式有著相同的功能,圖 9 (a)的函式以條. 政 治 大 使函式的輸出結果在一長串運算式的計算後而得。 立. 件式的判別結果決定輸出結果,圖 9 (b)的函式將判別式的內容轉換成算式運算. ‧. ‧ 國. 學. n. er. io. sit. y. Nat. al. i n C圖h9: 簡單化混淆轉換 engchi U. v. 將簡單化混淆運用於虛擬化轉換時,混淆工具會選出堆疊操作的相關指令 如元素位置交換、複製頂端元素等指令,使自訂的直譯器在每次回圈都執行堆疊 操作指令,最後再根據簡單化混淆的算式調整堆疊到正確的狀態。這可以使直譯 器的調度單位被混淆,實際解譯的指令需要在分解簡單化混淆的運算式後才能 得知。. 18. DOI:10.6814/NCCU201900153.

(26) 第五章 研究實作 本研究以 Python 程式語言版本 3.6 為實作環境建立轉換 Python 程式的混淆 工具,使用者的機器學習模組在本地端完成混淆後即能上傳至公有雲平台進行 資料分析。研究實作以 Kaggle 的競賽題目—鐵達尼號生存預測為標的展示機器 學習程式在混淆前後的運作差異。. 5.1 混淆前程式準備 Kaggle 的鐵達尼號生存預測競賽所提供的訓練資料集情形如圖 10 所示,除. 政 治 大. 了乘客年齡外,還有登船港口、船票價欄位中有些是空值,另外部分欄位也需要. 立. 經過特徵值工程後才能開始數據分析。有關資料前處理的部分本研究採用以下. ‧ 國. 學. 方式設定:遺失的年齡值部分以回歸模型預測數值、根據乘客稱謂(如:Mr.、 Mrs.)與性別合併考量後轉換為整數資料、其餘空白值則根據其他資料的平均值. ‧. 設定。. n. er. io. sit. y. Nat. al. Ch. engchi. i n U. v. 圖 10: Kaggle 鐵達尼號競賽訓練資料 機器學習程式實作的選擇可以依照是否依賴現成機器學習套件來準備,若 是使用套件如 Python 的開放原始碼的套件 Scikit-learn ( sklearn ),使用者可以在 選擇完演算法相關類別、設定參數後就開始使用 sklearn 套件建立模型。機器學 19. DOI:10.6814/NCCU201900153.

(27) 習程式也可以透過自行定義函式內容,在單一模組完成機器學習演算法的所有 步驟。為了更精準地觀測 Python 程式在混淆前後的差異性,本研究以自訂的機 器學習模組做為比較基準。. 5.2 虛擬化混淆後程式實測 實測的機器學習程式分別為使用決策樹、隨機森林、邏輯回歸機器學習演算 法的三個模組,機器學習程式在混淆前後的運算時間差異如表 5 所示。. 表 5: 機器學習程式在虛擬化混淆前後的執行秒數 決策樹. 未混淆程式. 3. 虛擬化轉換後程式. 立. 治 政 隨機森林 大. 邏輯回歸. 9. 159. 389. 15. 學. 1043. ‧. ‧ 國. 機器學習演算法. 上述機器學習演算法的詳細資訊及參數設定如下:決策樹演算法的程式是. sit. y. Nat. CART ( Classification and Regression Tree ),模型參數為最大樹深度 5、分割所需. er. io. 最小樣本數 1,採用 Gini Index 的分類樹。隨機森林的單棵樹建立方式與上述決 策樹相同,除分割所需最小樣本數 12,隨機森林的樹總量為 10 棵。邏輯回歸演. al. n. v i n Cgradient 算法的實作中,採用 stochastic ( SGD )作為係數決定方法,SGD U h e ndescent i h gc 參數中的學習率設為 0.01、Epochs(尋訪訓練資料集次數)設為 5000。. 在大數據分析上,使用者可以額外使用交叉驗證的方式強化機器學習的效 果,上述的三種演算法配合 5 堆交叉驗證的機器學習程式在混淆前後,運作時間 差異如表 6 所示,配合表 5 的結果可以看出程式本身所使用的機器學習演算法, 在虛擬化轉換前後的運算時間差異有著較大幅度的影響。 除了運算時間,Python 模組在虛擬化轉換後也會影響其檔案大小,表 7 整 理了上述三種採用不同機器學習演算法的模組在混淆前後的檔案大小差異。. 20. DOI:10.6814/NCCU201900153.

(28) 表 6: 含交叉驗證的機器學習程式在虛擬化混淆前後的執行秒數 機器學習演算法(5 fold CV). 決策樹. 隨機森林. 邏輯回歸. 未混淆程式. 3. 9. 15. 虛擬化轉換後程式. 159. 389. 1043. 表 7: 機器學習模組在虛擬化混淆前後的檔案大小 機器學習演算法. 決策樹. 未混淆模組. 6.22KB. 立. 虛擬化轉換後模組. 隨機森林. 邏輯回歸. 政 治 7.74KB 大. 145KB. 4.33KB. 174KB. 128KB. ‧ 國. 學. 在章節 4.3 中,本文提及額外的虛擬化混淆轉換方式來使自訂直譯器更難被. ‧. 分析其解譯指令的運作方式。以決策樹及邏輯回歸演算法作為代表的機器學習 程式,在使用搭配簡單化混淆的虛擬化轉換後,決策樹演算法執行時間增加至. Nat. sit. y. 89696 秒、邏輯回歸演算法執行時間為 1370 秒。根據演算法對堆疊操作指令的. n. al. er. io. 依賴程度,混淆後程式的執行時間成長幅度也會有巨大的分歧。. 5.3 虛擬化混淆轉換效力 C h e. ngchi. i n U. v. 在 Collberg 的論文中提到關於程式在混淆後,運作資訊被理解的難度可以 藉由幾個軟體複雜度計算,作為混淆效力( potency )依據[8]。本研究以霍爾斯特 德的計算程式長度[12]及 McCabe 的循環複雜度[15]檢視程式在混淆前後的效力 值。 取得程式中獨特的運算子的個數 n1 及獨特的運算元個數 n2 後,計算程式長 度 N 的計算如下: N = n1*log2n1 + n2*log2n2. 21. DOI:10.6814/NCCU201900153.

(29) 循環複雜度的計算是基於程式的控制流程,在程式中控制流程以有向圖表 示,取得圖的邊個數 E、節點個數 N 及連通元件個數 P 後,循環複雜度 N 的計 算如下: M = E - N + 2*P 在章節 5.2 提及的三個機器學習程式,根據整個程式的獨特在運算元及運算 子個數在混淆前後的成長情況,算出的計算程式長度如表 8 所示;根據程式控制 流程路徑數算出的循環複雜度如表 9 所示,由於程式的每個函式個別表示一個 控制流程來計算循環複雜度,所列結果為程式中全部函式循環複雜度的平均值。. 政 治 大. 表 8: 程式虛擬化混淆前後計算程式長度. 立. 虛擬化轉換後程式. 決策樹. 隨機森林. 邏輯回歸. 1564. 1885. 1019. 11119. 12817. 學. 未混淆程式. ‧ 國. 機器學習演算法. 8592. ‧. 虛擬化轉換後程式. y. 隨機森林. 2.8. 2.7. Ch 37. i n U. e n g c h i37.3. sit. 決策樹. er. al. n. 未混淆程式. io. 機器學習演算法. Nat. 表 9: 程式虛擬化混淆前後循環複雜度. v. 邏輯回歸 2.6 38.25. 從霍爾斯特德的計算程式長度結果可以得知要從虛擬化轉換後的程式中判 斷變數所代表的涵義將變得更複雜。循環複雜度的結果則可以看出程式控制流 程的改變,使程式執行過程更難被解讀。. 22. DOI:10.6814/NCCU201900153.

(30) 第六章 結論與未來研究 本章將探討以程式碼混淆保護 Python 程式語言的方法中,使用混淆工具幫 助使用者達成虛擬化轉換的結果,並且確認對於第一章研究議題的達成狀況。. 6.1 研究結論與貢獻 本研究建立轉換 Python 程式語言的虛擬化混淆工具,在現在為 Python 程式 進行程式碼混淆轉換的開放式專案中多數偏向於轉換變數名稱等不涉及程式邏 輯的轉換,因此讓 Python 程式的混淆方式提供更多選擇,混淆工具使用超級位. 政 治 大. 元組碼合併指令語意完成虛擬化轉換,這可以令攻擊者難以還原原始的程式指. 立. 令內容。. ‧ 國. 學. 在簡單化混淆應用於虛擬化轉換的研究方面,本文選用堆疊操作類型的指 令來讓這些指令會在每次直譯器解譯一個指令時都執行,攻擊者需要破解經由. ‧. 簡單化混淆產生的運算式才能得知這些指令的使用與否。然而套用簡單化混淆. io. y. sit. 巨量的成長。. Nat. 於虛擬化轉換的直譯器上時,依據函式所用指令內容程式的運作時間可能會有. n. al. er. 對程式碼進行混淆保護有許多的目的,本文以使用者利用公有雲服務參加. i n U. v. Kaggle 數據分析競賽為情境使 Python 語言撰寫的分析程式可以在多種混淆程度. Ch. engchi. 變換程式內容。虛擬化轉換應用於 Python 決策樹、隨機森林、邏輯回歸程式後, 將使運作時間上升 43 到 70 倍間。. 6.2 研究限制 本文以 Python 3.6.5 版本為前提設計虛擬化混淆轉換的流程與工具。轉換流 程中的指令集架構生成是以官方釋出的 CPython 直譯器所用指令為基礎轉換而 成,混淆工具則是以 Python 程式語言製作,用來實現 Python 原始碼到原始碼混 淆轉換。而不同的 Python 版本對同樣的程式原始碼可能會產生不一樣的位元組 碼程式,指令的位元組大小也會可能有所不同。過去 CPython 令每個指令的位元 23. DOI:10.6814/NCCU201900153.

(31) 組大小變動於一到三間,現在指令中的操作碼及參數則各占用一個位元組,並且 以額外的位元組碼處理參數大於一個位元組的指令。本研究的混淆工具以現行 Python 版本的運作方式令一個指令占用兩個位元組大小來解讀位元組碼程式的 方式運作,此外若是面臨如圖 3 所示 Python 版本更新,混淆轉換工具需要額外 的調整才能處理新版本 Python 的指令。 除了混淆效力外,程式碼混淆的功效還需要藉由抵抗程式自動分析工具的 能力來評估,自動分析工具的設計關係到工具所需的開發時間及工具本身在執 行時所需的時間及空間負擔,未來研究可嘗試比較不同運作方式的直譯器抵抗 自動化分析的能力。. 立. 政 治 大. ‧. ‧ 國. 學. n. er. io. sit. y. Nat. al. Ch. engchi. i n U. v. 24. DOI:10.6814/NCCU201900153.

(32) 參考文獻. [1] B. Anckaert, M. H. Jakubowski, R. Venkatesan. "Virtualization for diversified tamper resistance." U.S. Patent No. 8,584,109. 12 Nov. 2013. [2] D. Apon, et al. "Implementing Cryptographic Program Obfuscation." IACR Cryptology ePrint Archive 2014 (2014): 779. [3] M. R. Asghar, S.D. Galbraith, G. Russello. "Obfuscation through simplicity." (2016). [4] S. Banescu, et al. "Code obfuscation against symbolic execution attacks.". 政 治 大. Proceedings of the 32nd Annual Conference on Computer Security Applications.. 立. ACM, 2016.. ‧ 國. 學. [5] S. Banescu, et al. "Vot4cs: A virtualization obfuscation tool for C#" Proceedings of the 2016 ACM Workshop on Software PROtection. ACM, 2016. [6] C. Cadar, D. Dunbar, D. R. Engler. "KLEE: Unassisted and Automatic. ‧. Generation of High-Coverage Tests for Complex Systems Programs." OSDI. Vol.. y. Nat. 8. 2008.. sit. [7] J. Cazalas, et al. "Probing the limits of virtualized software protection.". al. n. v i n Ch C. Collberg, C. Thomborson, D. e Low. A taxonomy n g c h i Uof obfuscating ACM, 2014.. [8]. er. io. Proceedings of the 4th Program Protection and Reverse Engineering Workshop.. transformations. Department of Computer Science, The University of Auckland, New Zealand, 1997.. [9] C. Collberg, et al. "Distributed application tamper detection via continuous software updates." Proceedings of the 28th Annual Computer Security Applications Conference. ACM, 2012. [10] K. Coogan, G. Lu, S. Debray. "Deobfuscation of virtualization-obfuscated software: a semantics-based approach." Proceedings of the 18th ACM conference on Computer and communications security. ACM, 2011. [11] S. Garg, et al. "Candidate indistinguishability obfuscation and functional encryption for all circuits." SIAM Journal on Computing 45.3 (2016): 882-929. 25. DOI:10.6814/NCCU201900153.

(33) [12] M. H. Halstead. Elements of software science. Vol. 7. New York: Elsevier, 1977. [13] J. Kinder. "Towards static analysis of virtualization-obfuscated binaries." Reverse Engineering (WCRE), 2012 19th Working Conference on. IEEE, 2012. [14] J. C. King. "Symbolic execution and program testing." Communications of the ACM 19.7 (1976): 385-394. [15] T. J. McCabe. "A complexity measure." IEEE Transactions on software Engineering 4 (1976): 308-320. [16] J. Nagra, C. Collberg. Surreptitious Software: Obfuscation, Watermarking, and Tamperproofing for Software Protection. Pearson Education, 2009. [17] T. A. Proebsting. "Optimizing an ANSI C interpreter with superoperators." Proceedings of the 22nd ACM SIGPLAN-SIGACT symposium on Principles of. 政 治 大 [18] R. Rolles. "Unpacking virtualization obfuscators." 3rd USENIX Workshop on 立 Offensive Technologies.(WOOT). 2009. programming languages. ACM, 1995.. ‧ 國. 學. [19] S. A. Sebastian, S. Malgaonkar, P. Shah, M. Kapoor and T. Parekhji, "A study & review on code obfuscation," 2016 World Conference on Futuristic Trends in. ‧. Research and Innovation for Social Welfare (Startup Conclave), Coimbatore, 2016, pp. 1-6.. Nat. sit. y. [20] M. Sharif, et al. "Automatic reverse engineering of malware emulators." 2009. er. io. 30th IEEE Symposium on Security and Privacy. IEEE, 2009.. [21] B. Yadegari, et al. "A generic approach to automatic deobfuscation of executable. n. al. Ch. i n U. v. code." 2015 IEEE Symposium on Security and Privacy. IEEE, 2015.. engchi. 26. DOI:10.6814/NCCU201900153.

(34)

參考文獻

相關文件

有關於 Java 程式語言,下列何者敘述不正確?(A)Java 程式語言透過 extends 提供多重繼承 (Multiple

 教師介紹投委會的「收支管家–錢家有 道」手機應 用程式 , 方 便學生實 踐所

全方位學習指學生在真實情境中的學習,以達至在課堂

並以較淺易的方式進行評估,為學生建立學習成就感。整體而言,大多數政治演變的課題,會以概覽式課題的方法處理,即教師

提供機會給不同興趣、志向和能力的學 生選修應用學習課程,尤其是善於從實

Windows 95 後的「命令提示字 元」就是執行 MS-DOS 指令的應用

Windows/ Linux/ Mac 各種平台的開發套件,使我們能夠透過各種平台來開發 Android 軟體,所有的 Android 應用程式都是使用 Java

Excel VBA 乃是以 Visual Basic 程式語言為基礎,提供在 Excel 環境中進 行應用程式開發的能力。在 Excel 環境中「Visual Basic 編輯器」提供了一個