wrap 是 Oracle 官方提供的 PL/SQL 原始碼混淆工具(非加密),將可讀文本轉為二進制格式,隱藏實作邏輯,保護智慧財產權。支援版本:Oracle 7.3+。
# 設定字元集(避免中文亂碼)
export NLS_LANG=AMERICAN_AMERICA.UTF8
# 或 Windows
set NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1
CREATE OR REPLACE PROCEDURE test_encrypt (p_id IN NUMBER) AS
BEGIN
DBMS_OUTPUT.PUT_LINE('Input parameter: ' || TO_CHAR(p_id));
END;
/
SHOW ERRORS
$ wrap iname=source.sql oname=source.plb
PL/SQL Wrapper: Release 19.0.0.0.0 - Production
Copyright (c) Oracle Corporation 1993, 2021. All rights reserved.
Processing source.sql to source.plb
參數說明:
iname:輸入檔(預設副檔名 .sql)oname:輸出檔(預設同名 .plb)oname,輸出檔為 iname.plb$ cat source.plb
CREATE OR REPLACE PROCEDURE test_encrypt WRAPPED
a000000
...
[二進制混淆內容]
...
/
-- 關鍵字 WRAPPED 取代 AS/IS,原始邏輯不可讀
SQL> @source.plb
Procedure created.
SQL> SET SERVEROUTPUT ON
SQL> EXEC test_encrypt(999);
Input parameter: 999
PL/SQL procedure successfully completed.
SQL> SELECT text FROM user_source WHERE name = 'TEST_ENCRYPT' AND type = 'PROCEDURE';
TEXT
--------------------------------------------------
CREATE OR REPLACE PROCEDURE test_encrypt WRAPPED
a000000
...
-- 僅見混淆頭部,無業務邏輯
| 維度 | 說明 |
|---|---|
| 本質 | 混淆,非加密。無金鑰,演算法公開,理論上可逆向工程。 |
| 防禦等級 | 阻擋「直接閱讀」、「簡單搜尋」、「誤改」。無法阻擋具備逆向能力的攻擊者。 |
| 版本相容 | 混淆檔通常不跨大版本相容(10g wrap 檔可能無法在 19c 載入)。部署目標版本需重新 wrap。 |
| 除錯影響 | IDE 除錯器無法單步進入混淆程式碼,變數檢視受限。 |
| 動態 SQL | 字串拼接的動態 SQL 內容不會被混淆,敏感邏輯勿置於動態 SQL 字串中。 |