使用 yakpro-po 實現 Laravel 專案程式碼混淆加密

bigbug發表於2022-02-11

背景

防止商用軟體實現邏輯洩露。

工具介紹

yakpro-po 由原生PHP開發,所以安裝的時候,保證環境能執行PHP命令。

安裝 yakpro-po 步驟

  1. 找一個可用目錄,這裡按專案推薦目錄為準:/user/local

    cd /usr/local
  2. 通過 git 拉取 yakpro-po 程式碼

    git clone https://github.com/pk-fr/yakpro-po.git
  3. 到 yakpro-po 目錄,還需要安裝 PHP-Parser

    cd yakpro-po && git clone https://github.com/nikic/PHP-Parser.git
  4. 保證 yakpro-po 有可執行許可權

    chmod a+x yakpro-po.php
  5. 為方便使用,建立軟連線到 bin 目錄

    cd /usr/local/bin
    ln -s /usr/local/yakpro-po/yakpro-po.php yakpro-po
  6. 安裝完畢,檢視下是否正常yakpro-po –help

    yakpro-po –help
    Info:   Using [/usr/local/yakpro-po/yakpro-po.cnf] Config File...
    Info:   yakpro-po version = 2.0.13

    使用方式

    提供了多種方式混淆程式碼,因為本次是針對 Laravel 專案程式碼混淆,所以採用

    yakpro-po source_filename -o target_filename

實踐

Laravel 專案直接上面的命令,不帶任何選項,混淆後的程式碼根本跑不起來,因為預設混淆了類名、命令空間、變數等等,所以要手動新增選項來指定混淆選項。

  • 建議使用的選項:

    yakpro-po my_app -o obfuscate_my_app --no-obfuscate-function-name --no-obfuscate-class_constant-name --no-obfuscate-class-name --no-obfuscate-interface-name --no-obfuscate-trait-name --no-obfuscate-property-name --no-obfuscate-method-name --no-obfuscate-namespace-name --no-obfuscate-label-name
  • 這裡混淆了:

    淆變數名
    混淆常量名
    混淆 if 語句
    淆迴圈語句
    淆字串文字
    隨機播放語句
    單行輸出

混淆前後對比

Laravel 專案 yakpro-po PHP程式碼混淆實踐

Laravel 專案 yakpro-po PHP程式碼混淆實踐

Laravel 專案 yakpro-po PHP程式碼混淆實踐

Laravel 專案 yakpro-po PHP程式碼混淆實踐

需要注意的點:不要混淆 模板程式碼

  • 先把模板目錄拷貝出來,混淆之後,再還原回去。
  • 混淆模板程式碼會用 echo 輸出,造成模板標記直接當成字串輸出。後果就是頁面輸出類似 @if() 這類的效果。

使用 yakpro-po 實現 Laravel 專案程式碼混淆加密

附錄:可用混淆選項

--no-strip-indentation 多行輸出
--strip-indentation 單行輸出

--no-shuffle-statements 不打亂語句
--shuffle-statements 隨機播放語句

--no-obfuscate-string-literal 不混淆字串文字
--obfuscate-string-literal 混淆字串文字

--no-obfuscate-loop-statement 不混淆迴圈語句
--obfuscate-loop-statement 混淆迴圈語句

--no-obfuscate-if-statement 不混淆 if 語句
--obfuscate-if-statement 混淆 if 語句

--no-obfuscate-constant-name 不混淆常量名
--obfuscate-constant-name 混淆常量名

--no-obfuscate-variable-name 不混淆變數名
--obfuscate-variable-name 混淆變數名

--no-obfuscate-function-name 不混淆函式名
--obfuscate-function-name 混淆函式名

--no-obfuscate-class_constant-name 不混淆類常量名
--obfuscate-class_constant-name 混淆類常量名

--no-obfuscate-class-name 不混淆類名
--obfuscate-class-name 混淆類名

--no-obfuscate-interface-name 不混淆介面名稱
--obfuscate-interface-name 混淆介面名稱

--no-obfuscate-trait-name 不混淆特徵名稱
--obfuscate-trait-name 混淆特徵名稱

--no-obfuscate-property-name 不混淆屬性名稱
--obfuscate-property-name 混淆屬性名稱

--no-obfuscate-method-name 不混淆方法名
--obfuscate-method-name 混淆方法名稱

--no-obfuscate-namespace-name 不混淆名稱空間名稱
--obfuscate-namespace-name 混淆名稱空間名稱

--no-obfuscate-label-name 不混淆標籤名稱
--obfuscate-label-name 混淆標籤名稱
本作品採用《CC 協議》,轉載必須註明作者和本文連結
Less is more.

相關文章