热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

Oracle10gunwrap技术分析ByGENXOR

Oracle为PLSQL开发者提供的一种对他们所写的代码(oracle下的对象Package、Procedure、Function、JavaSource等)进行加密的工具

Oracle为PL/SQL开发者提供的一种对他们所写的代码(oracle下的对象Package、Procedure、Function、Java Source等)进行加密的工具

一. 前言

Oracle为PL/SQL开发者提供的一种对他们所写的代码(oracle下的对象Package、Procedure、Function、Java Source等)进行加密的工具。当PL/SQL代码被加密以后,它就被描述为被“包装过”。使用wrap工具对代码进行包装,wrap工具会取出含有要包装的代码的文件名并输出下面的文件:

wrap iname=plain.sql Oname=encrypted.plb

因为代码被加密了,所以其细节被隐藏了,而且Oracle不提供解包装设备。但是我们可以编写我们自己的unwrap程序。

二. 对象加密

Oracle为了防止自己的对象程序源码泄露,也对其做了wrap处理。因为许多PACKAGE、PROCEDURE等程序本身可能存在SQL注入漏洞,但是如果得不到源码,对其进行审计是很困难的。这样wrap在一定程度上也起到了保护作用。

这里随便找一个Oracle的PACKAGE为实例,这里我们找到dbms_hs包程序,其代码如图所示:

clip_image002

很明显代码被加密了。

Oracle加密的原理就是先对源码进行lz压缩lzstr,然后对压缩数据进行SHA-1运算得到40位的加密串shstr,然后将加密串与压缩串拼接得到shstr+lzstr,然后对拼接后的字符串进行Oracle双字符转换(转换表)。最后将转换后的字符串进行base64编码,最终得到wrap的加密串。

关于LZ压缩,这里用老外提供的一个JAVA包,代码如下:

create or replace java source named MY_COMPRESS

as

import java.io.*;

import java.util.zip.*;

public class MY_COMPRESS

{

public static String Inflate( byte[] src )

{

try

{

ByteArrayInputStream bis = new ByteArrayInputStream( src );

InflaterInputStream iis = new InflaterInputStream( bis );

StringBuffer sb = new StringBuffer();

for( int c = iis.read(); c != -1; c = iis.read() )

{

sb.append( (char) c );

}

return sb.toString();

} catch ( Exception e )

{

}

return null;

}

public static byte[] Deflate( String src, int quality )

{

try

{

byte[] tmp = new byte[ src.length() + 100 ];

Deflater defl = new Deflater( quality );

defl.setInput( src.getBytes( “UTF-8″ ) );

defl.finish();

int cnt = defl.deflate( tmp );

byte[] res = new byte[ cnt ];

for( int i = 0; i

res[i] = tmp[i];

return res;

} catch ( Exception e )

{

}

return null;

}

}

/

alter java source MY_COMPRESS compile

/

create or replace package mycompress

is

function deflate( src in varchar2 )

return raw;

function deflate( src in varchar2, quality in number )

return raw;

function inflate( src in raw )

return varchar2;

end;

/

create or replace package body mycompress

is

function deflate( src in varchar2 )

return raw

is

begin

return deflate( src, 6 );

end;

function deflate( src in varchar2, quality in number )

return raw

as language java

name ‘MY_COMPRESS.Deflate( java.lang.String, int ) return byte[]‘;

function inflate( src in raw )

return varchar2

as language java

name ‘MY_COMPRESS.Inflate( byte[] ) return java.lang.String’;

end;

/

这里deflate函数实现LZ压缩,而inflate则实现解压。

首先,我们以一小段PL/SQL代码来测试分先加密字符串的结构,这里我先讲程序加密处理。如图所示,这里将create PACKAGE a代码wrap之后变成了如下代码

clip_image004

为了进一步测试,分析其加密字符串中的结构,我们利用如下代码:

with src as

( select ‘PACKAGE a’ txt from dual )

, wrap as

( select src.txt, dbms_ddl.wrap( ‘create ‘ || src.txt ) wrap from src )

Select rtrim( substr( wrap.wrap, instr(wrap.wrap, chr(10), 1, 20 ) + 1 ),chr(10) ) from wrap;

这段代码获得加密串,如图所示

clip_image006

进一步对这段代码做base64解码,获得经过Oracle双字符转换后的字符串,如图所示:

clip_image008

推荐阅读
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • Startup 类配置服务和应用的请求管道。Startup类ASP.NETCore应用使用 Startup 类,按照约定命名为 Startup。 Startup 类:可选择性地包括 ... [详细]
  • 本文深入探讨了SQL数据库中常见的面试问题,包括如何获取自增字段的当前值、防止SQL注入的方法、游标的作用与使用、索引的形式及其优缺点,以及事务和存储过程的概念。通过详细的解答和示例,帮助读者更好地理解和应对这些技术问题。 ... [详细]
  • 本章详细介绍SP框架中的数据操作方法,包括数据查找、记录查询、新增、删除、更新、计数及字段增减等核心功能。通过具体示例和详细解析,帮助开发者更好地理解和使用这些方法。 ... [详细]
  • 配置PHPStudy环境并使用DVWA进行Web安全测试
    本文详细介绍了如何在PHPStudy环境下配置DVWA( Damn Vulnerable Web Application ),并利用该平台进行SQL注入和XSS攻击的练习。通过此过程,读者可以熟悉常见的Web漏洞及其利用方法。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文将深入探讨如何在不依赖第三方库的情况下,使用 React 处理表单输入和验证。我们将介绍一种高效且灵活的方法,涵盖表单提交、输入验证及错误处理等关键功能。 ... [详细]
  • 探索电路与系统的起源与发展
    本文回顾了电路与系统的发展历程,从电的早期发现到现代电子器件的应用。文章不仅涵盖了基础理论和关键发明,还探讨了这一学科对计算机、人工智能及物联网等领域的深远影响。 ... [详细]
  • 科研单位信息系统中的DevOps实践与优化
    本文探讨了某科研单位通过引入云原生平台实现DevOps开发和运维一体化,显著提升了项目交付效率和产品质量。详细介绍了如何在实际项目中应用DevOps理念,解决了传统开发模式下的诸多痛点。 ... [详细]
  • 深入理解 .NET 中的中间件
    中间件是插入到应用程序请求处理管道中的组件,用于处理传入的HTTP请求和响应。它在ASP.NET Core中扮演着至关重要的角色,能够灵活地扩展和自定义应用程序的行为。 ... [详细]
  • 本文介绍如何在Spring Boot项目中集成Redis,并通过具体案例展示其配置和使用方法。包括添加依赖、配置连接信息、自定义序列化方式以及实现仓储接口。 ... [详细]
  • 在 Android 开发中,通过 Intent 启动 Activity 或 Service 时,可以使用 putExtra 方法传递数据。接收方可以通过 getIntent().getExtras() 获取这些数据。本文将介绍如何使用 RoboGuice 框架简化这一过程,特别是 @InjectExtra 注解的使用。 ... [详细]
  • 云函数与数据库API实现增删查改的对比
    本文将深入探讨使用云函数和数据库API实现数据操作(增删查改)的不同方法,通过详细的代码示例帮助读者更好地理解和掌握这些技术。文章不仅提供代码实现,还解释了每种方法的特点和适用场景。 ... [详细]
  • 深入解析Spring启动过程
    本文详细介绍了Spring框架的启动流程,帮助开发者理解其内部机制。通过具体示例和代码片段,解释了Bean定义、工厂类、读取器以及条件评估等关键概念,使读者能够更全面地掌握Spring的初始化过程。 ... [详细]
  • 本文介绍如何在Vue项目中配置Webpack,使JS代码作为入口文件直接嵌入到HTML中,而不是传统的HTML作为入口。 ... [详细]
author-avatar
cheer57_275
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有