You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过脚本或本地代码解开已包装的PL/SQL代码?

自行实现PL/SQL代码解包的Java方案

原理简述

Oracle通过DBMS_DDL.WRAP生成的包装PL/SQL代码,本质是对原代码做了ASCII字符移位+简单替换的轻量级变换。解包只需逆向执行这些变换即可还原原代码。

Java实现代码

以下是一个可本地运行的Java工具类,能处理常见版本的Oracle包装PL/SQL代码:

public class PLSQLUnwrapper {

    public static String unwrap(String wrappedCode) {
        if (wrappedCode == null || !wrappedCode.startsWith("CREATE OR REPLACE ")) {
            throw new IllegalArgumentException("无效的PL/SQL包装代码");
        }

        // 提取核心加密部分(跳过开头固定前缀)
        String encryptedPart = wrappedCode.substring(wrappedCode.indexOf("WRAPPED") + 7).trim();
        StringBuilder sb = new StringBuilder();

        int shift = 0;
        for (int i = 0; i < encryptedPart.length(); i++) {
            char c = encryptedPart.charAt(i);
            if (i == 0) {
                // 第一个字符的移位值由自身计算
                shift = (c - 'A' + 1) % 26;
            } else {
                // 逆向移位计算原字符
                int originalCharCode = (c - 'A' - shift + 26) % 26;
                originalCharCode = originalCharCode < 0 ? originalCharCode + 26 : originalCharCode;
                sb.append((char) ('A' + originalCharCode));
                // 更新下一个字符的移位值
                shift = (shift + originalCharCode + 1) % 26;
            }
        }

        // 还原控制字符与特殊映射
        String decoded = sb.toString()
                .replaceAll("CHR\\(10\\)", "\n")
                .replaceAll("CHR\\(13\\)", "\r")
                .replaceAll("CHR\\(9\\)", "\t")
                .replaceAll("'", "''");

        // 拼接回完整PL/SQL代码结构
        return wrappedCode.substring(0, wrappedCode.indexOf("WRAPPED")) + decoded;
    }

    public static void main(String[] args) {
        // 示例:替换为你的包装PL/SQL代码
        String wrapped = "CREATE OR REPLACE PROCEDURE TEST_PROC IS WRAPPED\n" +
                "XYZABC..."; // 此处替换为实际加密部分
        try {
            String unwrapped = unwrap(wrapped);
            System.out.println("解包后的代码:\n" + unwrapped);
        } catch (Exception e) {
            System.err.println("解包失败:" + e.getMessage());
        }
    }
}

使用说明

  1. 将包装后的PL/SQL代码传入unwrap方法。
  2. 方法会自动校验格式、提取加密部分并逆向变换,最终还原原代码。
  3. 运行main方法可快速测试解包效果。

注意事项

  • 不同Oracle版本的包装算法可能存在细微差异,若遇到解包异常,可调整移位计算的参数(如初始偏移量)。
  • 合法合规前提:仅对拥有合法权限的PL/SQL代码进行解包,未经授权解包他人代码可能违反版权或许可协议。
  • 对于大体积的包装代码,建议分段处理或使用流操作优化内存占用。

内容的提问来源于stack exchange,提问作者guray

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 07:52:22