Python Program Obfuscation Tool

English 简体中文 繁体中文 Tiếng Việt
Summary

A multiplatform Python program obfuscation tool is presented, aiming to safeguard intellectual property by converting source code into unreadable, yet Python-interpreter executable, byte data. This tool features both an encoder and a decoder, offering multi-layer obfuscation with customizable output sizes, flexible code randomization, and the capability to obfuscate entire files or specific sections. It employs techniques such as bytes reversal, dynamic module imports, base64 encoding, and zlib compression, with the obfuscated code executed dynamically via exec(). Developers can utilize the tool through a Flask-based web interface or integrate its encoding and real-time decoding/execution functions via a Python API.

Program Design Purpose: 程式設計目的: 此專案的主要目標是開發一個多平台Python程式碼混淆工具,讓想要保護其智慧財產權或管理其軟體敏感演算法的人們,可以輕鬆地保護原始碼。此工具將無縫地混淆和編碼原始碼為不可讀但Python直譯器可執行的位元組資料,這些資料可以與正常的Python程式混合執行。此外,它將提供一個解碼器,將混淆的位元組資料還原回其原始碼。該程式包含三個主要組件:

  • Obfuscation Encoder : 混淆編碼器: 此組件加密Python原始碼,無論是整個檔案還是特定部分,使其成為不可讀的位元組資料,然後嵌入一個執行標頭,以建立可執行但不可讀的Python程式/部分。

  • Obfuscation Decoder : 混淆解碼器: 解碼器旨在反轉編碼過程,此解碼器將混淆的位元組資料轉換回其原始Python程式碼,確保易於讀取和存取。

  • Service Web Interface : 服務網頁介面: 提供一個使用者友好的網頁介面,讓使用者可以輕鬆地編碼和解碼Python程式。

程式碼混淆工具的使用範例如下所示,使用者可以使用編碼器來混淆單行程式碼print("hello world")為不可讀的程式碼位元組,然後使用解碼器將其轉換回:

Figure 00: Code obfuscation encode and decode example, version v_0.1.3 (2025)

我們還提供Python-API,供使用者將編碼和即時解碼&執行功能整合到他們的程式中。影片展示詳細用法:link

# Created:     2024/03/21
# Version:     v_0.1.3
# Copyright:   Copyright (c) 2024 LiuYuancheng
# License:     MIT License

--------------------------------------------------------------------------------------------------

Introduction 

程式碼混淆是一種廣泛採用的常見技術,用於增強Python應用程式的安全性。市場上存在各種混淆函式庫和工具,例如pyarmfree online tool's obfuscation tool。混淆過程將採用諸如identifier renamingcode encryptioncode packingdead code insertion等方法,有效地使駭客難以理解程式執行/控制流程,並保護敏感原始碼免受未經授權的存取。但是,目前大多數混淆工具不提供諸如decoding algorithmscustomization of obfuscation result sizeselection of whether obfuscate entire/part of file等功能。

受到此free online tool's obfuscation tool概念的啟發,我們的目標是開發一個基於網路的Python程式碼混淆工具,具有以下主要功能:

  • 提供多層Python程式碼混淆,並具有可自訂的編碼混淆程式碼大小配置。

  • 提供編碼器和解碼器功能,以方便維護和偵錯混淆的程式碼。

  • 提供混淆整個Python程式或原始碼的特定部分的功能,以增加靈活性。

  • 整合靈活的程式碼隨機化技術,以確保每個產生的混淆程式碼都是唯一的,即使是從相同的原始碼衍生而來。

  • 提供標準化的API,供使用者將工具無縫地整合到他們的專案中,並提供使用者友好的網頁UI,以方便編碼和解碼操作。

混淆工具的工作流程如下所示:

Figure 01: Code obfuscation encode and decode work flow, version v_0.1.3 (2025)

Obfuscation Encoder Web UI

混淆編碼器頁面如下所示。要混淆Python函式或程式,只需將Python原始碼貼到原始碼文字欄位中,然後選擇隨機內容附加配置參數randomLen(範圍從0100)。每行原始碼將在執行混淆編碼過程之前附加randomLen * 16 Bytes隨機字串。

混淆編碼器網頁檢視:

Figure 02: Code obfuscation webApp encoder screen shot, version v_0.1.3 (2025)

按下「Run Obfuscation Encode」按鈕後,混淆的程式碼將出現在右側的結果文字欄位中。按下複製程式碼按鈕,然後將混淆的程式碼貼到您的程式中以執行。

Note : Each time the user presses the run button, a different obfuscated code result will be generated.

Obfuscation Decoder Web UI

與編碼器頁面類似,解碼器頁面如下所示。使用者需要將混淆程式碼的位元組資料(包含在exec()函式中)複製到左側的文字欄位中。然後,透過點擊「Run Decoder」按鈕,混淆的程式碼將轉換回其原始碼。

Figure 03: Code obfuscation webApp decoder screen shot, version v_0.1.3 (2025)

Note: If users prefer to obtain the source code without comments, they can check the "Remove the comments" checkbox.

--------------------------------------------------------------------------------------------------

Background Knowledge

What is Program obfuscation ?

程式碼混淆是一種在軟體開發中使用的技術,旨在故意使程式的原始碼更難以理解或反向工程,同時保持其功能。它通常用於開發人員想要保護其智慧財產權、防止未經授權的存取或阻止篡改軟體的嘗試的情況。

以下是一些程式碼混淆中使用的常見技術:

  1. Renaming identifiers: 這涉及將程式碼中的變數、函式、類別和其他識別符號重新命名為非描述性或隱晦的名稱。例如,像userInput這樣的變數可能會重新命名為ab,使其更難以理解其用途。

  2. Control flow obfuscation: 此技術涉及改變程式中的控制流程,使其更難以追蹤邏輯結構。這可以透過諸如新增冗餘程式碼、以不尋常的方式使用條件陳述式或重組迴圈等技術來實現。

  3. Data obfuscation: 資料混淆涉及偽裝程式中的資料,使其更難以理解或提取敏感資訊。這可以包括加密字串或將它們分成較小的部分,這些部分在執行時串連在一起。

  4. Code encryption: 這涉及加密程式中的部分或全部程式碼,並在執行時解密它。這使得攻擊者難以在不知道解密金鑰的情況下分析程式碼。

  5. Dead code insertion: 將無效程式碼(從未執行的程式碼)插入到程式中可以混淆反向工程師,並使其更難以理解程式的真實功能。

  6. Code packing: 這涉及壓縮或封裝可執行檔,使其更難以使用標準工具進行分析。封裝的程式碼通常在執行時解壓縮和執行。

  7. Anti-debugging techniques: 這些是用於偵測和防止程式被偵錯的方法,這會使攻擊者更難以分析程式碼。

重要的是要注意,雖然混淆可以使反向工程更加困難,但它並不是保護軟體的萬無一失的方法。熟練的攻擊者仍然可以在給予足夠的時間和資源的情況下反向工程混淆的程式碼。因此,混淆通常與其他安全措施(例如加密、存取控制和程式碼簽署)結合使用。此外,混淆的程式碼可能更難以維護和偵錯,因此開發人員應在應用混淆技術之前權衡收益與潛在的缺點。

--------------------------------------------------------------------------------------------------

Project Design

本節結合背景知識,闡明混淆過程中應用的步驟和技術。

Design of Encoding and Decoding

如簡介中提供的程式工作流程圖所示,Python原始碼部分經過一系列步驟進行編碼,以將Python原始碼字串轉換為位元組資料。隨後,它被封裝在一個解碼標頭中。為了執行位元組資料,利用解碼標頭將位元組轉換回字串,然後將其傳遞到Python動態程式碼執行函式exec()以進行程式碼執行。編碼步驟概述如下:

範例編碼器原始碼輸入:

import os
# Code comment 1
print("Current working directory is : %s" % os.getcwd())
dirpath = ''
# Code document 2
if os.path.dirname(__file__):
      dirpath = os.path.dirname(__file__)
else:
      dirpath = os.getcwd()
# Code comment 3
print("Current source code location : %s" % dirpath)
print("Hello world")

範例編碼器混淆程式碼輸出:

def obfDecode(data): return __import__('zlib').decompress(__import__('base64').b64decode(data[::-1]))
exec(obfDecode(b'kDMA2910OfmOY0xz1Jeq1cjF1JMlFPYhZCtLm5r5V0c3LyNFMwBmnV7YF3hnto2YOMsfrKkvLSzKTp1tL3je1dP+R8t2mH74DVtheP0G1EUMVMnsRP3APWbRcAfFkilrWTbnlp3ttZVjhXcluBz5GOMb/UlK2UKJRzbbUXHe7DKL65v/y/trHOP3hfqE83kkRwle1v6OSgbVVAT7CZvvXGXWa6u6wBXjGgHPV02VULPoNfXFUXRCUxN11+ZFIxbON+t67wffylf9V3/xKJxHbe96nWPH/3aBwKW0e9GFl5DlK4zJUCSNqnhxlGpiCVNIKCHTC2uuOvPgUNLjQXiOJWJbRbEnW/YfrDQrsX9eUPX+tT4w6hx10UIIG2U7zcC2maRyDUhYcjeEeMOVjqHUR/aZTjtcVuOJ0GjIzrjqdau0yCup99y2Hov6/TZyKf/JPXmd1M+6IMyrPBpVuw8uBVYW72TRSDh1o1F2OuFvl05d1HhzjFYOuiuSqq+58tbop9aXeMV/lzj02klznW10GVcXSYESwFoLEcLoStyQaVw72AYC9UNEqEhvYgvGJizlmu1QsDmIhOcq1M3ViI2UV9/6Hrf55PtrZWqMfX0CF3YFPWI20OQmE4FjWKTHwduZ+wMzweDKqrBNbhWwj6GL6srBRXvVZvVAiyV+WNUAs8n3u/uPlbv7u/Ok6/4vU9jPP+1Dyme57KhvsRITjAGw1AakCa8M+oVb7C7IZ0pRFn8xyVdXmJRlRwoduC6hR/cuwBZUHCjScdDhB4I0G81XqP+/PIvAGmFho19mLzJCyZ94+m1k7trz3/QUzBQ0h0oJhbaeEOhzrBm15OrFoXuiATAG3TpdTH0Jqud75vO/97ffXQsSeG7Az9GP55p5moVcW4AZxQt+3pDQtfJeYVwSU3kh6jJNyuApFffdvFQdytMKCJGO9OLnjnWf+fPe3uvPzFO852U+Vnu58HP/pX+8P3+6nT/tukz8xX+x2X/2zH123+6pV7O/4Lf7Ln+492o77mrhGcdXegy4lyiNQJnIiRrIqRx9Vf+eJTdEbR0B1yoxwskbtt7SYIWLoujaBPnJYb+oGzH+5/wDvmN5rd68rP9g1gmsgROkfKzZgg/k0ZjoPgwZmWzkwtXgZCngFcnu1eKchFyUMpbHjJgR3QGnL6IKemRn6JX/+4Lf2X/yhXe0ff0RK9Hc5urkwNBs3d02Jz4ZmO9Mmw5roHzbmIvsZUSVKlKGejtxGfYeNcfhMcEXK2Ml1xJe'))

混淆編碼過程中使用的混淆技術:

  1. Bytes reversal: 結果資料位元組陣列被反轉,以使反轉的程式碼更難以一目瞭然地理解,並且需要在正確解釋之前將其反轉。

  2. Randomization: 編碼函式在混淆之前將指定長度的隨機字串新增到每一行。這為混淆的程式碼增加了更多的複雜性和隨機性。

  3. Dynamic import: 混淆的程式碼使用__import__()來動態匯入模組(zlibbase64)。此技術隱藏了匯入,使其不太明顯正在使用哪些模組。

  4. String manipulation: 編碼過程從程式碼中刪除註解、靜態字串和空行,以使程式碼更難以理解和分析。

  5. Encoding and compression: 編碼函式透過使用base64編碼並使用zlib壓縮來混淆程式碼。此外,它還反轉了結果字串。此過程使程式碼在其編碼形式中不可讀。

  6. Execution via exec(): 程式碼由exec()函式執行。這種執行方法使得在不分析其執行的情況下難以理解程式碼的行為。

這些混淆技術使程式碼難以理解、分析和反向工程,從而增強了其對反向工程和未經授權存取的抵抗力。

解碼進度反轉編碼過程,步驟如下:

範例解碼器混淆位元組輸入:

b'==Azg/E+Hk/eC9JOcaYt02SskKCJHfYu6ZVAPyhHdaUjsOse30tA1QP7d3nvW7U4eWbcNtHxmP4jG6VKRiMCbBNe1/8UHBxw7WSMdLdeA6vnz07MBSDeOxNd91GOps8hieqUrq+9QO8BIrlwh1me8uwTqOvK7qNLgbc/bAsiysVCPPfoDwOxAE+YpjwxPvGPaBCdTP2QWyRuO36o4GRlaf8NtENhd5Uzcz6VcBntUaz73kkqyNxjXKCvrqFH2Cy5pc12ydzjuIS2p2ERKLy1IA0LZdHllai3el3/e4VY40KhjXeZkjmtgMmJxAyQ4wDgWPWqXiNfywoHb2OWVBA442CkfaqknK/aDE4exCL2PGERtupfoaVAgikXMR/ZdA2NkxKhO19JWowZYU0I8GSzd7mwOI6S+6C8r4ZwVAj12P+t5OUnvkVvx1lxRGXFxyh8FaFglYml1iilkUBzBrsTI24q2VgoCr5bA1nvSNdY8hbXvZBRS05i9YWwlQGzbgB15Qlcnh6Wb0aYxUVMrT58MYXngucLlVZVvACQdIr2YTFBjwlN5aslybv/Pf/zeML/+4zvjs9x1v+P+97fe8rP+9867fe++3v++fuO6uloQpnGAp9n2CEh7cmhi43pvoPpZK5ThFO7GeeRQETHqtkk1xJe'

範例解碼器原始碼輸出:

print("hello world")

--------------------------------------------------------------------------------------------------

Program Setup

在執行程式之前,請按照以下配置步驟操作。

Development Environment
  • python 3.8.2rc2+ [Windows11]

Additional Lib/Software Need
Hardware Needed : None
Program Files List
Program File Execution Env Description
src/pyObfuscator.py python 3.7 + 主要函式庫模組,用於提供混淆編碼和解碼功能。
src/pyObfuscatorApp.py python 3.7 + 混淆網頁介面。
templates/*.html   所有網頁html檔案。

--------------------------------------------------------------------------------------------------

Program Usage/Execution

我們提供兩個介面供使用者使用該程式:主控台命令介面和網頁介面。

Run the obfuscator via command interface

Step1: 透過命令執行程式:

python pyObfuscator.py

Step2: 選擇模式0,然後按照步驟輸入需要混淆的python程式,混淆的程式碼將儲存在檔案obfuscateCode.py中,然後使用者可以更改檔案的名稱並替換原始檔案。

Figure 03: obfuscator test case usage screen shot, version v_0.1.3 (2025)

Run the obfuscator via web interface

Step1: 透過命令執行網頁主機程式:

python pyObfuscatorApp.py

Step2: 開啟瀏覽器並輸入URLhttp://127.0.0.1:5000/

Figure 04: Code obfuscation webApp introduction page screen shot, version v_0.1.3 (2025)

Step3: 選擇Obfuscation Encoder從左側導覽選單中選擇Encoder,然後按照以下步驟混淆原始程式碼:

Figure 05: Code obfuscation webApp encoder usage steps, version v_0.1.3 (2025)

Step4:從左側導覽選單中選擇Obfuscation decoder,然後按照以下步驟取得原始程式碼:

Figure 05: Code obfuscation webApp decoder usage steps, version v_0.1.3 (2025)


參考文獻


要在您的本機上設定 Python Obfuscation,請參閱專案 GitHub Repo 連結中的「程式設定」章節

授權類型:

MIT License 

感謝您花時間查看文章詳細資訊,如果您有任何問題和建議或發現任何程式錯誤,請隨時給我留言。如果您能提供一些意見並分享任何改進建議,我們將不勝感激,以便我們能夠把工作做得更好〜


上次編輯者:LiuYuancheng ([email protected]) 於 20/02/2025,如果您有任何問題,請隨時給我留言。

  RELATED

No related programming articles found. Browse all programming tutorials and articles.

  COMMENTS

0

No comment for this article.