目录结构
注:提前言明 本文借鉴了以下博主、书籍或网站的内容,其列表如下:
1、参考书籍:《Oracle Database SQL Language Reference》
2、参考书籍:《PostgreSQL中文手册》
3、EDB Postgres Advanced Server User Guides,点击前往
4、PostgreSQL数据库仓库链接,点击前往
5、PostgreSQL中文社区,点击前往
6、Oracle Real Application Testing 官网首页,点击前往
7、Oracle 21C RAT Testing Guide,点击前往
1、本文内容全部来源于开源社区 GitHub和以上博主的贡献,本文也免费开源(可能会存在问题,评论区等待大佬们的指正)
2、本文目的:开源共享 抛砖引玉 一起学习
3、本文不提供任何资源 不存在任何交易 与任何组织和机构无关
4、大家可以根据需要自行 复制粘贴以及作为其他个人用途,但是不允许转载 不允许商用 (写作不易,还请见谅 💖)
Oracle数据库DBMS程序包解密方法及SQL Developer和Unwrapper的安装与使用
- 文章快速说明索引
- 工具的安装和使用
- package 包体解密
文章快速说明索引
学习目标:
目的:接下来这段时间我想做一些兼容Oracle数据库Real Application Testing (即:RAT)上的一些功能开发,本专栏这里主要是学习以及介绍Oracle数据库功能的使用场景、原理说明和注意事项等,基于PostgreSQL数据库的功能开发等之后 由新博客进行介绍和分享!
学习内容:(详见目录)
1、Oracle数据库DBMS程序包解密方法及SQL Developer和Unwrapper的安装与使用
学习时间:
2023年05月07日 17:41:38
学习产出:
1、Oracle数据库DBMS程序包解密方法及SQL Developer和Unwrapper的安装与使用
2、CSDN 技术博客 1篇
注:下面我们所有的学习环境是Centos7+PostgreSQL15.0+Oracle19c+MySQL5.7
postgres=# select version();
version
-----------------------------------------------------------------------------
PostgreSQL 15.0 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 7.1.0, 64-bit
(1 row)
postgres=#
#-----------------------------------------------------------------------------#
SQL> select * from v$version;
BANNER BANNER_FULL BANNER_LEGACY CON_ID
--------------------------------------------------------------------------- --------------------------------------------------------------------------- --------------------------------------------------------------------------- ----------
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production 0
Version 19.3.0.0.0
SQL>
#-----------------------------------------------------------------------------#
mysql> select version();
+-----------+
| version() |
+-----------+
| 5.7.19 |
+-----------+
1 row in set (0.06 sec)
mysql>
注:下面的分享来自于网络,有需要的小伙伴可以自取:
下载 SQL Developer:
链接: https://pan.baidu.com/s/1KGw0ASc1UWxmbA-dkaWCwQ
密码:r3ss
下载 Unwrapper 第三方插件:
链接: https://pan.baidu.com/s/1VccpqRNAIXI00D53_7Calg
密码:jqit
工具的安装和使用
先使用Oracle SQL Developer 工具连接Oracle数据库,如下:
如下:
下面安装 Unwrapper 第三方插件,选择帮助
下拉菜单,点击检查更新
:
选择从本地文件安装
,点击浏览
:(选择Unwrapper_for_SQLDev_1.0.0.zip文件)
下一步之后,此时可以发现Trivadis PL/SQL Unwrapper for SQL Developer
插件,点击完成
:
然后重启 SQL Developer 工具!
package 包体解密
我们这里看一下DBMS程序包,Oracle数据库提供了许多 PL/SQL 软件包,以扩展数据库功能并提供对 SQL 功能的 PL/SQL 访问。在这些 Oracle 提供的程序包中,以 DBMS 开头的程序包使用的最为广泛。不过Oracle 对程序包体部分进行了加密处理,如下:
包的创建如下:
包体加密如下:
我们这里通过上面安装的Unwrapper 第三方插件,就可以很方便的对 Oracle 加密后的代码进行解密,如下:
PACKAGE BODY dbms_output AS
ENABLED BOOLEAN := FALSE;
BUF_SIZE BINARY_INTEGER;
LINEBUFLEN BINARY_INTEGER := 0;
PUTIDX BINARY_INTEGER := 1;
GETIDX BINARY_INTEGER := 2;
GET_IN_PROGRESS BOOLEAN := TRUE;
TYPE CHAR_ARR IS TABLE OF VARCHAR2(32767) INDEX BY BINARY_INTEGER;
BUF CHAR_ARR;
BUFLEFT BINARY_INTEGER := -1;
PROCEDURE KKXERAE(
NUM BINARY_INTEGER
,MSG VARCHAR2
,KEEPERRORSTACK BOOLEAN DEFAULT FALSE);
PRAGMA INTERFACE (C, KKXERAE);
PROCEDURE RAISE_APPLICATION_ERROR(
NUM BINARY_INTEGER
,MSG VARCHAR2
,KEEPERRORSTACK BOOLEAN DEFAULT FALSE)
IS
BEGIN
KKXERAE(NUM, MSG, KEEPERRORSTACK);
END RAISE_APPLICATION_ERROR;
PROCEDURE ENABLE (BUFFER_SIZE IN INTEGER DEFAULT 20000) IS
LSTATUS INTEGER;
LOCKID INTEGER;
BEGIN
ENABLED := TRUE;
IF BUFFER_SIZE < 2000 THEN
BUF_SIZE := 2000;
ELSIF BUFFER_SIZE > 1000000 THEN
BUF_SIZE := 1000000;
ELSIF BUFFER_SIZE IS NULL THEN
BUF_SIZE := -1;
ELSE
BUF_SIZE := BUFFER_SIZE;
END IF;
BUFLEFT := BUF_SIZE;
END;
PROCEDURE DISABLE IS
BEGIN
ENABLED := FALSE;
BUF.DELETE;
PUTIDX := 1;
BUF(PUTIDX) := '';
GET_IN_PROGRESS := TRUE;
END;
PROCEDURE PUT_INIT IS
BEGIN
BUF.DELETE;
PUTIDX := 1;
BUF(PUTIDX) := '';
LINEBUFLEN := 0;
BUFLEFT := BUF_SIZE;
GET_IN_PROGRESS := FALSE;
END;
PROCEDURE PUT(A VARCHAR2) IS
STRLEN BINARY_INTEGER;
BEGIN
IF ENABLED THEN
IF GET_IN_PROGRESS THEN
PUT_INIT;
END IF;
STRLEN := NVL(LENGTHB(A), 0);
IF ((STRLEN + LINEBUFLEN) > 32767) THEN
LINEBUFLEN := 0; BUF(PUTIDX) := '';
RAISE_APPLICATION_ERROR(-20000, 'ORU-10028: line length overflow, ' ||
'limit of 32767 bytes per line');
END IF;
IF (BUF_SIZE <> -1) THEN
IF (STRLEN > BUFLEFT) THEN
RAISE_APPLICATION_ERROR(-20000, 'ORU-10027: buffer overflow, ' ||
'limit of ' || TO_CHAR(BUF_SIZE) || ' bytes');
END IF;
BUFLEFT := BUFLEFT - STRLEN;
END IF;
BUF(PUTIDX) := BUF(PUTIDX) || A;
LINEBUFLEN := LINEBUFLEN + STRLEN;
END IF;
END;
PROCEDURE PUT_LINE(A VARCHAR2) IS
BEGIN
IF ENABLED THEN
PUT(A);
NEW_LINE;
END IF;
END;
PROCEDURE NEW_LINE IS
BEGIN
IF ENABLED THEN
IF GET_IN_PROGRESS THEN
PUT_INIT;
END IF;
LINEBUFLEN := 0;
PUTIDX := PUTIDX + 1;
BUF(PUTIDX) := '';
END IF;
END;
PROCEDURE GET_LINE(LINE OUT VARCHAR2, STATUS OUT INTEGER) IS
BEGIN
IF NOT ENABLED THEN
STATUS := 1;
RETURN;
END IF;
IF NOT GET_IN_PROGRESS THEN
GET_IN_PROGRESS := TRUE;
IF (LINEBUFLEN > 0) AND (PUTIDX = 1) THEN
STATUS := 1;
RETURN;
END IF;
GETIDX := 1;
END IF;
WHILE GETIDX < PUTIDX LOOP
LINE := BUF(GETIDX);
GETIDX := GETIDX + 1;
STATUS := 0;
RETURN;
END LOOP;
STATUS := 1;
RETURN;
END;
PROCEDURE GET_LINES(LINES OUT CHARARR, NUMLINES IN OUT INTEGER) IS
LINECNT INTEGER := 1;
S INTEGER;
BEGIN
IF NOT ENABLED THEN
NUMLINES := 0;
RETURN;
END IF;
WHILE LINECNT <= NUMLINES LOOP
GET_LINE(LINES(LINECNT), S);
IF S = 1 THEN
NUMLINES := LINECNT - 1;
RETURN;
END IF;
LINECNT := LINECNT + 1;
END LOOP;
NUMLINES := LINECNT - 1;
RETURN;
END;
PROCEDURE GET_LINES(LINES OUT DBMSOUTPUT_LINESARRAY, NUMLINES IN OUT INTEGER)
IS
LINECNT INTEGER := 1;
S INTEGER;
N INTEGER;
BEGIN
IF NOT ENABLED THEN
NUMLINES := 0;
RETURN;
END IF;
LINES := DBMSOUTPUT_LINESARRAY();
LINES.DELETE;
IF NUMLINES < BUF.COUNT THEN
N := NUMLINES;
ELSE
N := BUF.COUNT;
END IF;
LINES.EXTEND(N);
WHILE LINECNT <= N LOOP
GET_LINE(LINES(LINECNT), S);
IF S = 1 THEN
NUMLINES := LINECNT - 1;
RETURN;
END IF;
LINECNT := LINECNT + 1;
END LOOP;
NUMLINES := LINECNT - 1;
RETURN;
END;
END;
OK,之后我们就可以借助这种方式对所需的包进行解密!