oracle unwrap.docx_第1页
oracle unwrap.docx_第2页
oracle unwrap.docx_第3页
oracle unwrap.docx_第4页
oracle unwrap.docx_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Oracle内部的核心包体、函数都是被加密过的。因为必须要知道space manager内部的核心算法是如何实现的,必须要破解下。这个文件是说明如何解密了。不过还有一个大名鼎鼎的工具,是直接出结果的:当然,收费的,200美元。今天找了个中国有个人破解了,刚才问他,200块,砍到100,便不能再砍了。终于跟位大牛要到这个oracle内部加密算法的pft说明文档,见附件的pft文件。再帖下itpub的itisamos写的文章:在下的,老外研究得比较彻底了,由于涉及到语法构成分析,比较麻烦,这里就不多说了,只讲讲在到下怎样搞。在这个版本的下,的理论依据都来源于The oracle hackers handbook by David Litchfield在书中介绍了后的代码是编码的,也就是说如果我们要,首先就要进行的解码;其次,书中也告诉我们,解码后的每个字节需要根据一个替换表进行单独的替换;替换后的字符串需要按算法进行解压;最终可以得到源码的明文。是不是挺简单的?如果书上说的是正确的,进行UNWRAP唯一的问题就是这个替换表了。要得这个替换表,那么我们可以做这样一个假设:既然我们通过可以这样对某过程做DBMS_DDL.WRAP加密可以得到密文,如下所示:select dbms_ddl.wrap(create procedure a) from dual;那么对这部份密文的正文部份进行解码的值与未加密正文(procedure a)直接进行压缩后的值必然是一一对应的,且两个串的长度也是相等的。这是一个重大的前提!通过这种假设,肯定就能得到替换表,替换表是按字节来计算的,所以应该有二个列,其中一列代表解码后的字节值(十六进制到),另一列代表替换列(另外提醒一个问题,列不能出现重复值,哈哈,可以想像得到,如果有重复值就完了)。我的意思就是对密文进行解码后,将对应的密文的正文部份按字节替换成替换表中预先算出来的字节,最后直接按算法进行解压,替换表正确的情况下,明文就应该出来了。这里需要解释4个问题,密文的正文部份是什么?未加密正文为什么要用procedure a而不加上Create部份?算法压缩在中怎么办?编码与解码在中怎么办?编码地球人都知道,在中有现存的工具包进行编码和解码,我们将用到的解码,具体包是:sys.utl_encode.base64_decode。用的时候还需要另一个过程来将字符串转换为格式:sys.utl_raw.cast_to_raw。压缩很常见,不过懂得内部算法的人很少,中也有现存的工具包,我这里用的是老外的一个包。在使用这个工具包时,涉及到一个压缩级别参数,这个等级参数不一样,压缩得到的字符串完全一不样。有人可能要问,这样搞岂不是没法得到替换表了吗?是的,但也不完全正确。因为可供选择的等级参数有限,俺们还能从等级开始一个一个进行测试,看到底哪个参数是系统用的来的。嘿嘿,用的是“”等级。创建过程或包时如果没有部份,肯定要报错;同样DBMS_DDL.WRAP也不能缺少这个“create”,否则就要报错。但对于过程或包的,查阅系统视图DBA_SOURCE的列就知道了,肯定没有这一句。说到密文的正文部份,首先要看下面的例子:SQLselect dbms_ddl.wrap(create procedure a) from dual;create procedure a wrapped a000000354abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcd7c 388BgMHdmA3Qg9IbJmntlZoZQoHwcwg5nnm7+fMr2ywFxakaamb40d1Q=这里要解释一下,加密后的代码中与的版本有关,abcd后的与创建的对象类型有关,也就是为存储过程,另外的c 38有其他意义,这里就不多说了。从8BgMH开始,解码后的前二十个字节是SHA1-HASH值(前面那本书说的哈),所以解码后的第二十一个字节开始就是正文了。为了下一节的实践活动,嘿嘿,我们先把包创建好,用以进行LZ压缩与解压,如下所示(全部用用户来做):create or replace java source named UNWRAPPERasimport java.io.*;import java.util.zip.*;public class UNWRAPPER 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 cnt; i+ ) res = tmp; return res; catch ( Exception e ) return null; /alter java source UNWRAPPER compile/然后用包把JAVA声明进来:create or replace package amosunwrapperis 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 amosunwrapperis 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 UNWRAPPER.Deflate( java.lang.String, int ) return byte; function inflate( src in raw ) return varchar2 as language java name UNWRAPPER.Inflate( byte ) return java.lang.String;end;/创建好了工具,我们先来看看下面的SQL: with src AS ( select PACKAGE a txt from dual ), wrap as ( select src.txt , dbms_ddl.wrap( create | src.txt ) wrap from src ), subst as (select substr( utl_encode.base64_decode( utl_raw.cast_to_raw(rtrim( substr( wrap.wrap, instr( wrap.wrap, chr( 10 ), 1, 20 ) + 1 ), chr(10) ) ) ), 41 ) x, amosunwrapper.deflate( wrap.txt | chr(0), 9 ) d from wrap ) select substr( x, r * 2 - 1, 2 ) c_base64, substr( d, r * 2 - 1, 2 ) c_translatecode from subst , ( select rownum r from dual connect by rownum connect sys/XXXXxxxx as sysdba; SQL CREATE TABLE SYS.IDLTRANSLATE ( C_BASE64DECODE VARCHAR2(2) NOT NULL, C_LZDEFLATECODE VARCHAR2(2) NULL )/declare nCnt integer; nLoop integer; nSLoop integer; nCharmax integer; nCharmin integer; vChar Varchar2(3); cursor getchar is with src AS ( select PACKAGE |vChar txt from dual ), wrap as ( select src.txt , dbms_ddl.wrap( create | src.txt ) wrap from src ), subst as (select substr( utl_encode.base64_decode( utl_raw.cast_to_raw(rtrim( substr( wrap.wrap, instr( wrap.wrap, chr( 10 ), 1, 20 ) + 1 ), chr(10) ) ) ), 41 ) x, amosunwrapper.deflate( wrap.txt | chr(0), 9 ) d from wrap ) select substr( x, r * 2 - 1, 2 ) xr , substr( d, r * 2 - 1, 2 ) dr from subst , ( select rownum r from dual connect by rownum = ( select length( x ) / 2 from subst ) );begin nCharmax:=97;nCharmin:=122;For nLoop In 97.122 Loop For nSloop In 0.99 Loop vChar := chr(nLoop)|to_char(nSloop); For abc In getchar Loop Select Count(*) Into nCnt From sys.idltranslate WHERE c_base64decode = abc.xr; If nCnt 1 Then Insert INTO sys.idltranslate VALUES (abc.xr,abc.dr); Commit; Else Select Count(*) Into ncnt From sys.idltranslate WHERE c_base64decode = abc.xr AND c_lzdeflatecode=abc.dr; If nCnt 1 Then DBMS_OUTPUT.PUT_LINE(wrong orginal char:|vchar| hex base64:|abc.xr); End If; End If; End Loop; End Loop;End Loop;end;运行上面这段大概会产生百多条记录,还未达到00-FF总共256条记录的要求,建议替换select PACKAGE |vChar txt from dual 中的PACKAGE关健字为procedure或者function类似的,继续运行直到替换表中有不重复的256条记录为止。有了替换表的内容,还有前面的工具包和工具包,已经无限接近终点了!俺将在后面写一段程序来验证unwrap的威力,矛头嘛就直接指向ORACLE自身的包了。 继续未完的测试哈.废话少说先看代码set serveroutput on;Declare vWrappedtext Varchar2(32767); vChar Varchar2(2); vRepchar Varchar2(2); vLZinflatestr Varchar2(32767); nLen Integer; nLoop Integer; nCnt Integer;Begin select substr( utl_encode.base64_decode( utl_raw.cast_to_raw(rtrim( substr( TEXT, instr( TEXT, chr( 10 ), 1, 20 ) + 1 ), chr(10) ) ) ), 41 ) x Into vWrappedtext from DBA_SOURCE Where owner=SYS And Name = DBMS_MONITOR And Type=PACKAGE BODY ; -DBMS_OUTPUT.PUT_LINE(vWrappedtext); nLen := Length(vWrappedtext)/2 - 1; vLZinflatestr :=; For nLoop In 0.nLen Loop vChar := Substrb(vWrappedtext,nLoop*2+1,2); Select Count(*) Into nCnt From SYS.IDLTRANSLATE Where C_BASE64DECODE=vChar; If nCnt 1 Then DBMS_OUTPUT.PUT_LINE(SUBSTATION TABLE WARNING: Count not find following char-|vChar); Return; Else Select C_LZDEFLATECODE Into vRepchar From SYS.IDLTRANSLATE Where C_BASE64DECODE=vChar; End If; vLZinflatestr := vLZinflatestr | vRepchar; -DBMS_OUTPUT.PUT_LINE(vLZinflatestr); End Loop; -DBMS_OUTPUT.PUT_LINE(vLZinflatestr); DBMS_OUTPUT.PUT_LINE(amosunwrapper.inflate(vLZinflatestr);End;大家可以看看这个程序的输出是什么?的系统包没有秘密可言了,当然其他的用了的应用存储过程与包也对大家没有秘密了sys.IDLTRANSLATE 的内容,由于牵涉到各方面的因素,我这里就不公开了相信诸位大大,精通,可以通过对代码的分析,得到替换表的内容;本身不太懂的人,得到了这个替换表的内容,我相信也不是什么好事情!精通的人可以发现这个贴子的破解程序只能针对较小的存储过程或包,这是由于多方面的因素,当然我贪图方便是最大的原因大大们可以根据这个思路,扩展这个程序,将其改造为适应长度超过一行,输出长度也大于的应用程序来方便大家使用注:后面论坛另一位大神OO将上面的sql优化了下,当然这源码取自amis论坛的成果一部分:set serveroutput on;Declare vWrappedtext Varchar2(32767); vChar Varchar2(2); vRepchar Varchar2(2); vLZinflatestr Varchar2(32767); nLen Integer; nLoop Integer; nCnt Integer;type vartab is table of varchar2(2) index by varchar2(2);mytbl vartab;cursor getchar is select C_BASE64DECODE xr,C_LZDEFLATECODE dr from sys.idltranslate;Beginfor i in getchar loop -sys.idltranslate表内容存到字符数组mytbl(i.xr):=i.dr;end loop; select substr( utl_encode.base64_decode( utl_raw.cast_to_raw(rtrim( substr( TEXT, instr( TEXT, chr( 10 ), 1, 20 ) + 1 ), chr(10) ) ) ), 41 ) x Into vWrappedtext from DBA_SOURCE Where owner=SYS And Name = DBMS_OUTPUT And Type=PACKAGE BODY ; -DBMS_OUTPUT.PUT_LINE(vWrappedtext); nLen := Length(vWrappedtext)/2 - 1; vLZinflatestr :=; For nLoop In 0.nLen Loop vChar := Substrb(vWrappedtext,nLoop*2+1,2); /* Select Count(*) Into nCnt From SYS.IDLTRANSLATE Where C_BASE64DECODE=vChar; If nCnt 1 Then DBMS_OUTPUT.PUT_LINE(SUBSTATION TABLE WARNING: Count not find following char-|vChar); Return; Else Select C_LZDEFLATECODE Into vRepchar From SYS.IDLTRANSLATE Where C_BASE64DECODE=vChar; End If; */ vLZinflatestr := vLZinflatestr | mytbl(vChar); -从字符数组匹配 -DBMS_OUTPUT.PUT_LINE(vLZinflatestr); End Loop; -DBMS_OUTPUT.PUT_LINE(vLZinflatestr); DBMS_OUTPUT.PUT_LINE(amosunwrapper.inflate(vLZinflatestr);End;/源码一块帖在附件上了。下面再说下加密的算法:大家都知道oracle的很多系统包是没法看它的源码的,oracle就是将自己的源码用wrap加密了,所以看不到。为了保护自己辛苦写下的代码,我们自己也可以用该工具加密自己写的过程、函数、包、包体。只是wrap加密是不可逆的过程,所以大家在加密了自己代码的同时也必须保存好源码。下面做个wrap的小测试,我也像oracle那样只加密包体,不加密包说明,过程、函数的加密和这类似。1、创建包说明、包体文件包说明:d:pkg_wrap_test .sqlcreate or replace package pkg_wrap_test is -测试过程,将输入的数字以字符格式输出 procedure test1(i in number);END pkg_wrap_test;包体:d:pkgbd_wrap_test .sqlcreate or replace package body pkg_wrap_test is -测试过程,将输入的数字以字符格式输出 procedure test1(i in number) as begin dbms_output.put_line(输入参数是 | to_char(i); end;END pkg_wrap_test;2、创建包说明、加密包体SQL create or replace package pkg_wrap_test 2 is 3 -测试过程,将输入的数字以字符格式输出 4 procedure test_wrap(i in number); 5 6 END pkg_wrap_test; 7 /程序包已创建。SQL $wrap iname=d:pkgbd_wrap_test.sql oname=d:pkgbd_wrap_test.plbPL/SQL Wrapper: Release 10.2.0.1.0- Production on 星期四 11月 20 16:05:46 2008Copyright (c) 1993, 2004, Oracle. All rights reserved.Pr

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论