WRAP本质是源码混淆而非加密,仅防随手查看,无法抵御专业逆向;其执行失败主因是输入文件不满足硬性要求:须UTF-8无BOM、首行顶格CREATE OR REPLACE、无SQL*Plus变量/斜杠/匿名块、路径无中文空格。

WRAP 不是加密,是源码混淆;它防不住专业逆向,只挡随手查看。如果你指望它防止代码泄露,必须配合权限控制(如收回 SELECT 权限 on USER_SOURCE)和部署策略,否则用 FyUnwrap 一类工具几秒就能还原逻辑结构。
WRAP 命令行执行失败的常见原因
命令看似跑完,但后续在数据库里执行 @xxx.plb 报 PLS-00103 或 ORA-00900,大概率是输入文件不符合 WRAP 的硬性语法洁癖:
- source.sql 必须是 UTF-8 无 BOM 编码(Windows 记事本默认带 BOM,直接废)
- 第一行必须是顶格的
CREATE OR REPLACE,前面不能有空格、Tab、空行或注释 - 不能含 SQL*Plus 变量(如
&table_name)、斜杠结尾/、匿名块BEGIN END;——这些得提前手动清理 - 路径里别有中文、空格或 OneDrive/桌面等同步目录(Windows 下容易触发权限或路径截断)
DBMS_DDL.CREATE_WRAPPED 和 WRAP 的本质区别
DBMS_DDL.CREATE_WRAPPED 看起来更“PL/SQL 化”,但它只是字符串字面量包装器,不做语法校验,也不处理依赖:
- 传入的字符串必须是完整 DDL,包括分号;和斜杠
/,例如:'CREATE OR REPLACE PROCEDURE p AS BEGIN NULL; END; /' - 单个字符串长度不能超 ~32767 字节;包体太长会拼接失败,得切分或改用命令行
WRAP - 调用用户需有
EXECUTEonDBMS_DDL,且目标 schema 可写,否则报ORA-01031 - 返回的是 wrapped 字符串,仍需
EXECUTE IMMEDIATE才真正创建对象——中间没有编译验证环节
加密后还能看到什么?别被“已加密”误导
所谓“加密”,只是让 USER_SOURCE 里显示 PACKAGE BODY WRAPPED,但以下内容依然明文可见:
- 对象名、参数名、返回类型(从
ALL_ARGUMENTS或DBA_PROCEDURES查) - 所有 SQL 文本、字符串常量、异常名(它们在 wrapped 流中未编码,只是位置偏移)
- 注释若没删,也会保留在 wrapped 输出里(部分版本)
-
DBMS_METADATA.GET_DDL返回的是 wrapped 后的 DDL,开头是CREATE OR REPLACE wrapped,不是原始源码
真正要保护核心逻辑,WRAP 只是障眼法。关键算法别塞进 PL/SQL,拆到外部:用 Java Stored Procedure(CREATE OR REPLACE AND RESOLVE JAVA SOURCE)或 C library(CREATE LIBRARY + CREATE FUNCTION CALLING CONVENTION C),Oracle 不暴露这些源码。权限控制比混淆重要得多——GRANT EXECUTE 而非 SELECT on source,才是实际防线。


















