混淆 Python 程式碼

Fariba Laiq 2023年10月10日
  1. 使用 Base64 編碼來混淆 Python 程式碼
  2. 使用 PyArmor 混淆 Python 程式碼
混淆 Python 程式碼

程式碼混淆是指將程式碼加密或轉換成人類難以理解的格式。我們在知情的情況下執行此任務是為了避免攻擊者的逆向工程並保護智慧財產權和商業機密。

Python 提供了多種混淆程式碼的方法。

使用 Base64 編碼來混淆 Python 程式碼

base64 是 Python 中的一個模組,一旦將資料轉換為類似位元組的物件,它就會對資料進行編碼和解碼。對 Python 的程式碼進行編碼可能是一種有用的技巧,可以混淆程式碼以防止其被人類閱讀和理解以確保安全。

在下面的程式碼中,我們匯入了 base64 模組並使用方法 b64encode() 對語句 print('Delftstack') 進行了編碼。我們必須將 UTF-8 格式的字串傳遞給方法。

我們還可以使用方法 b64.decode() 通過將編碼文字傳遞給此方法來解密程式碼。最後,我們可以使用 eval()compile() 方法執行解密後的程式碼。

示例程式碼:

# Python 3.x
import base64

code = "print('Delftstack')"
print("Code:", code)
encrypted_code = base64.b64encode(code.encode("utf-8"))
print("Obfuscated code:", encrypted_code)
mydecode = base64.b64decode(encrypted_code)
print("Decrypted Code:")
eval(compile(mydecode, "<string>", "exec"))

輸出:

#Python 3.x
Code: print('Delftstack')
Obfuscated code: b'cHJpbnQoJ0RlbGZ0c3RhY2snKQ=='
Decrypted Code:
Delftstack

我們還可以匯入包含程式碼的完整 .py 檔案,並使用 base64 技術按以下方式對其進行編碼。My_Script.py 檔案包含程式碼 print('hello world')

# Python 3.x
import base64

file = open("My_Script.py")
encrypted_code = base64.b64encode(file.read().encode("utf-8"))
print("Encrypted Code:", encrypted_code)

輸出:

#Python 3.x
Encrypted Code: b'cHJpbnQoJ2hlbGxvIHdvcmxkJyk='

使用 PyArmor 混淆 Python 程式碼

Python 程式也可以用 PyArmor 加密。它是一個命令列工具,可以對程式碼進行混淆,將混淆指令碼繫結到固定機器,甚至可以使混淆指令碼過期。

要使用 PyArmor,我們應該首先使用以下命令安裝它。

#Python 3.x
pip install pyarmor

在這裡,我們將在名為 MyScript.py 的檔案中混淆以下程式碼。我們必須將 .py 檔案放在一個單獨的資料夾中。

# Python 3.x
print("Hello World")

命令 pyarmor obfuscate MyFolder/MyScript.py 將混淆上述 .py 檔案。我們可以在 dist 資料夾中看到具有相同檔名的輸出檔案。

輸出:

#Python 3.x
from pytransform import pyarmor_runtime
pyarmor_runtime()
__pyarmor__(__name__, __file__, b'\x50\x59\x41\x52\x4d\x4f\x52\x00\x00\x03\x06\x00\x33\x0d\x0d\x0a\x09\x30\xe0\x02\x00\x00\x00\x00\x01\x00\x00\x00\x40\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x18\x58\xc1\xa9\xb3\xd3\xa5\x4a\x59\xc7\xef\x90\xbd\x03\x26\xa0\x44\x00\x00\x00\x00\x00\x00\x00\x00\x75\x29\x30\x1b\x83\xa8\x1a\x8c\x19\x5d\xf5\xfb\x82\xd2\xde\xf9\x3e\x55\x2a\x65\x05\x6c\xd5\x40\xf1\x45\xaf\x5a\x5e\xce\x5b\x94\xe6\xb5\x2d\xbf\x91\x08\x47\x5a\x41\x2a\x8e\x86\x28\x08\x76\x35\x77\xbf\x3f\x52\x28\x03\xbb\xcf\xd4\xac\xa5\x1e\x8a\x4d\xfe\xc4\x48\x04\xb7\x8f\xfb\x10\xa7\x25\x05\x97\x80\xfa\x74\x96\x4b\x61\x88\x8f\x98\x96\x1e\xa5\x3d\x98\x2e\xe0\x1e\x19\xa2\x15\x94\x8b\xc2\x5c\x2a\x1e\x2c\x6f\x46\x28\x08\x85\x3f\x0d\x8a\xd8\xb5\x9c\xcc\xee\x8e\xff\x6f\x31\xb3\x02\x53\xbd\x88\x4a\x98\x84\x61\xd5\xe9\xea\x66\x75\x69\x1c\xd2\x5d\x47\x5e\x5b\xc8\x2d\x5f\x01\x74\xaa\xf6\x3b\xfc\xd0\x9f\xfd\x9c\x27\x35\x2b\xbe\x41\xa6\xc1\x88\x79\xfc\xb3\xe8\xa7\x65\x19\xed\x8d\x85\xb1\x07\x35\x96\x4d\xea\x32\x71\xba\x63\xb0\x11\xaf\x31\x05\xe9\xa0\xba\xaa\x77\x96\x43\xeb\x4d', 2)
作者: Fariba Laiq
Fariba Laiq avatar Fariba Laiq avatar

I am Fariba Laiq from Pakistan. An android app developer, technical content writer, and coding instructor. Writing has always been one of my passions. I love to learn, implement and convey my knowledge to others.

LinkedIn