oracle unwrap.docx

上传人:b****6 文档编号:8470113 上传时间:2023-01-31 格式:DOCX 页数:15 大小:128.49KB
下载 相关 举报
oracle unwrap.docx_第1页
第1页 / 共15页
oracle unwrap.docx_第2页
第2页 / 共15页
oracle unwrap.docx_第3页
第3页 / 共15页
oracle unwrap.docx_第4页
第4页 / 共15页
oracle unwrap.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

oracle unwrap.docx

《oracle unwrap.docx》由会员分享,可在线阅读,更多相关《oracle unwrap.docx(15页珍藏版)》请在冰豆网上搜索。

oracle unwrap.docx

oracleunwrap

Oracle内部的核心包体、函数都是被加密过的。

因为必须要知道spacemanager内部的核心算法是如何实现的,必须要破解下。

这个文件是说明如何解密了。

不过还有一个大名鼎鼎的工具,是直接出结果的:

当然,收费的,200美元。

今天找了个中国有个人破解了,刚才问他,200块,砍到100,便不能再砍了。

终于跟位大牛要到这个oracle内部加密算法的pft说明文档,见附件的pft文件。

再帖下itpub的itisamos写的文章:

在ORACLE9I下的UNWRAP,老外研究得比较彻底了,由于涉及到语法构成分析,比较麻烦,这里就不多说了,只讲讲在10到11G下怎样搞。

在这个版本的ORACLE下,UNWRAP的理论依据都来源于"Theoraclehacker'shandbook"byDavidLitchfield

在书中介绍了WRAP后的代码是BASE64编码的,也就是说如果我们要UNWRAP,首先就要进行BASE64的解码;其次,书中也告诉我们,解码后的每个字节需要根据一个替换表进行单独的替换;替换后的字符串需要按LZ算法进行解压;最终可以得到源码的明文。

是不是挺简单的?

如果书上说的是正确的,进行UNWRAP唯一的问题就是这个替换表了。

要得这个替换表,那么我们可以做这样一个假设:

既然我们通过SQL可以这样对某过程做DBMS_DDL.WRAP加密可以得到密文,如下所示:

selectdbms_ddl.wrap('createprocedurea')fromdual;

那么对这部份密文的正文部份进行BASE64解码的值 与 未加密正文('procedurea')直接进行LZ压缩后的值必然是一一对应的,且两个串的长度也是相等的。

这是一个重大的前提!

通过这种假设,肯定就能得到替换表,替换表是按字节来计算的,所以应该有二个列,其中一列代表BASE64解码后的字节值(十六进制00到FF),另一列代表替换列(另外提醒一个问题,BASE64列不能出现重复值,哈哈,可以想像得到,如果有重复值就完了)。

我的意思就是对密文进行BASE64解码后,将对应的密文的正文部份按字节替换成替换表中预先算出来的字节,最后直接按LZ算法进行解压,替换表正确的情况下,明文就应该出来了。

这里需要解释4个问题,密文的正文部份是什么?

未加密正文为什么要用'procedurea'而不加上'Create'部份?

LZ算法压缩在ORACLE中怎么办?

BASE64编码与解码在ORACLE中怎么办?

BASE64编码地球人都知道,在ORACLE中有现存的工具包进行编码和解码,我们将用到BASE64的解码,具体包是:

sys.utl_encode.base64_decode。

用的时候还需要另一个过程来将字符串转换为RAW格式:

sys.utl_raw.cast_to_raw。

LZ压缩很常见,不过懂得内部算法的人很少,ORACLE中也有现存的工具包,我这里用的是老外的一个JAVA包。

在使用这个LZ工具包时,涉及到一个压缩级别参数,这个等级参数不一样,压缩得到的字符串完全一不样。

有人可能要问,这样搞岂不是没法得到替换表了吗?

是的,但也不完全正确。

因为可供选择的等级参数有限,俺们还能从0等级开始一个一个进行测试,

看到底哪个参数是ORACLE系统用的来WRAP的。

嘿嘿,ORACLE用的是“9”等级。

创建过程或包时如果没有CREATE部份,ORACLE肯定要报错;同样DBMS_DDL.WRAP也不能缺少这个“create”,否则就要报错。

但对于过程或包的SOURCE,查阅系统视图DBA_SOURCE的TEXT列就知道了,肯定没有CREATE这一句。

说到密文的正文部份,首先要看下面的例子:

  SQL>selectdbms_ddl.wrap('createprocedurea')fromdual;

createprocedureawrapped

a000000

354

abcd

abcd

abcd

abcd

abcd

abcd

abcd

abcd

abcd

abcd

abcd

abcd

abcd

abcd

abcd

7

c38

8BgMHdmA3Qg9IbJmntlZoZQoHwcwg5nnm7+fMr2ywFxakaamb40d1Q=

这里要解释一下,加密后的代码中354与DB的版本有关,abcd后的7与创建的对象类型有关,也就是7为存储过程,另外的c38有其他意义,这里就不多说了。

从8BgMH开始,BASE64解码后的前二十个字节是SHA1-HASH值(前面那本书说的哈),所以解码后的第二十一个字节开始就是正文了。

为了下一节的实践活动,嘿嘿,我们先把JAVA包创建好,用以进行LZ压缩与解压,如下所示(全部用SYS用户来做):

createorreplacejavasourcenamedUNWRAPPER

as

importjava.io.*;

importjava.util.zip.*;

publicclassUNWRAPPER

{

 publicstaticStringInflate(byte[]src)

 {

   try

   {

     ByteArrayInputStreambis=newByteArrayInputStream(src);

     InflaterInputStreamiis=newInflaterInputStream(bis);

     StringBuffersb=newStringBuffer();

     for(intc=iis.read();c!

=-1;c=iis.read())

     {

       sb.append((char)c);

     }

     returnsb.toString();

   }catch(Exceptione)

   {

   }

   returnnull;

 }

 publicstaticbyte[]Deflate(Stringsrc,intquality)

 {

   try

   {

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

     Deflaterdefl=newDeflater(quality);

     defl.setInput(src.getBytes("UTF-8"));

     defl.finish();

     intcnt=defl.deflate(tmp);

     byte[]res=newbyte[cnt];

     for(inti=0;i

       res=tmp;

     returnres;

   }catch(Exceptione)

   {

   }

   returnnull;

 }

}

/

alterjavasourceUNWRAPPERcompile

/

然后用包把JAVA声明进来:

createorreplacepackageamosunwrapper

is

 functiondeflate(srcinvarchar2)

 returnraw;

 functiondeflate(srcinvarchar2,qualityinnumber)

 returnraw;

 functioninflate(srcinraw)

 returnvarchar2;

end;

/

createorreplacepackagebodyamosunwrapper

is

 functiondeflate(srcinvarchar2)

 returnraw

 is

 begin

   returndeflate(src,6);

 end;

 functiondeflate(srcinvarchar2,qualityinnumber)

 returnraw

 aslanguagejava

 name'UNWRAPPER.Deflate(java.lang.String,int)returnbyte[]';

 functioninflate(srcinraw)

 returnvarchar2

 aslanguagejava

 name'UNWRAPPER.Inflate(byte[])returnjava.lang.String';

end;

/

创建好了工具,我们先来看看下面的SQL:

 

   withsrcAS(select'PACKAGEa'txt fromdual  ),

    wrapas  (selectsrc.txt,dbms_ddl.wrap('create'||src.txt)wrap fromsrc ),

     substas (selectsubstr(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

      fromwrap )

   selectsubstr(x,r*2-1,2) c_base64,

              substr(d,r*2-1,2) c_translatecode

           fromsubst ,(selectrownumrfromdualconnectbyrownum<=(selectlength(x)/2fromsubst));

结果如下:

C_BASE64C_TRANSLATECODE

3078

83DA

990B

B870

F574

33F6

9F76

F574

BF77

5C55

5A48

9164

A600

A600

CB0E

C4B7

E102

486E

 

 通过对结果的排序,没有出现同一个BASE64编码对应不同的十六进制的情况,因此我们知道了可以用这个SQL为基础,通过用不同的SOURCE串来产生替换表的内容。

根据上面的SQL俺就可以写首先建一个表来存储替换表的内容,然后写一段PLSQL块来生成替换表的内容:

   SQL>connectsys/XXXX@xxxxassysdba;

  SQL>CREATETABLESYS.IDLTRANSLATE

   (

   C_BASE64DECODE VARCHAR2

(2)NOTNULL,

   C_LZDEFLATECODEVARCHAR2

(2)    NULL

   )

/

declare

 nCntinteger;

 nLoopinteger;

 nSLoopinteger;

 nCharmaxinteger;

 nCharmin integer;

 vChar    Varchar2(3);

 cursorgetcharis

    withsrcAS(select'PACKAGE'||vChartxt fromdual  ),

    wrapas  (selectsrc.txt,dbms_ddl.wrap('create'||src.txt)wrap fromsrc ),

     substas (selectsubstr(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

      fromwrap )

   select substr(x,r*2-1,2) xr,

    substr(d,r*2-1,2) dr

           fromsubst ,(selectrownumrfromdualconnectbyrownum<=(selectlength(x)/2fromsubst));

begin

   nCharmax:

=97;

nCharmin:

=122;

FornLoopIn97..122Loop

 FornSloopIn0..99Loop

  vChar:

=chr(nLoop)||to_char(nSloop);

  ForabcIngetcharLoop

   SelectCount(*)IntonCntFromsys.idltranslateWHEREc_base64decode=abc.xr;

   IfnCnt<1Then

    InsertINTOsys.idltranslateVALUES(abc.xr,abc.dr);

    Commit;

   Else

    SelectCount(*)IntoncntFromsys.idltranslateWHEREc_base64decode=abc.xrANDc_lzdeflatecode=abc.dr;

    IfnCnt<1Then

     DBMS_OUTPUT.PUT_LINE('wrongorginalchar:

'||vchar||'        hexbase64:

'||abc.xr);

    EndIf;

   EndIf;   

   EndLoop;

 EndLoop;

EndLoop;

end;

 

运行上面这段SQL大概会产生1百多条记录,还未达到00-FF总共256条记录的要求,建议替换

select'PACKAGE'||vChartxt fromdual  中的PACKAGE关健字为procedure或者function类似的,继续运行直到

替换表中有不重复的256条记录为止。

  有了替换表的内容,还有前面的JAVA工具包和ORACLE工具包,已经无限接近终点了!

俺将在后面写一段程序来验证unwrap的威力,矛头嘛就直接指向ORACLE自身的包了。

           继续未完的测试哈.废话少说先看代码

setserveroutputon;

Declare

       vWrappedtext               Varchar2(32767);               

        vChar                                       Varchar2

(2);

       vRepchar                               Varchar2

(2);

       vLZinflatestr                       Varchar2(32767);

       nLen               Integer;

       nLoop       Integer;

       nCnt               Integer;

Begin

       selectsubstr(utl_encode.base64_decode(utl_raw.cast_to_raw(rtrim(substr(TEXT,instr(TEXT,chr(10),1,20)+1),chr(10)) )),41)x                

                        IntovWrappedtext

                       fromDBA_SOURCE

                        Whereowner='SYS'

                       AndName='DBMS_MONITOR'

                       AndType='PACKAGEBODY';

       --DBMS_OUTPUT.PUT_LINE(vWrappedtext);

   nLen:

=Length(vWrappedtext)/2-1;

       vLZinflatestr:

='';

       FornLoopIn0..nLenLoop

               vChar:

=Substrb(vWrappedtext,nLoop*2+1,2);

               SelectCount(*)IntonCntFromSYS.IDLTRANSLATEWhereC_BASE64DECODE=vChar;

               IfnCnt<>1Then

                       DBMS_OUTPUT.PUT_LINE('SUBSTATIONTABLEWARNING:

Countnotfindfollowingchar--'||vChar);

                       Return;

               Else

                       SelectC_LZDEFLATECODEIntovRepcharFromSYS.IDLTRANSLATEWhereC_BASE64DECODE=vChar;

               EndIf;

               vLZinflatestr:

=vLZinflatestr||vRepchar;

               --DBMS_OUTPUT.PUT_LINE(vLZinflatestr);

       EndLoop;

       --DBMS_OUTPUT.PUT_LINE(vLZinflatestr);

       DBMS_OUTPUT.PUT_LINE(amosunwrapper.inflate(vLZinflatestr));

End;

大家可以看看这个程序的输出是什么?

  ORACLE的系统包没有秘密可言了,当然其他的用了WRAP的应用存储过程与包也对大家没有秘密了.

sys.IDLTRANSLATE的内容,由于牵涉到各方面的因素,我这里就不公开了.相信诸位大大,精通PLSQL,可以通过对代码的分析,得到替换表的内容;本身不太懂SQL的人,得到了这个替换表的内容,我相信也不是什么好事情!

精通PLSQL的人可以发现这个贴子的破解程序只能针对较小的存储过程或包,这是由于多方面的因素,当然我贪图方便是最大的原因.大大们可以根据这个思路,扩展这个程序,将其改造为适应SOURCE长度超过一行,输出长度也大于4000的应用程序来方便大家使用.

注:

后面论坛另一位大神OO将上面的sql优化了下,当然这源码取自amis论坛的成果一部分:

setserveroutputon;

Declare

       vWrappedtext               Varchar2(32767);               

        vChar                                       Varchar2

(2);

       vRepchar                               Varchar2

(2);

       vLZinflatestr                       Varchar2(32767);

       nLen               Integer;

       nLoop       Integer;

       nCnt               Integer;

typevartabistableofvarchar2

(2)indexbyvarchar2

(2);

mytblvartab;

cursorgetcharisselectC_BASE64DECODExr,C_LZDEFLATECODEdrfromsys.idltranslate;

Begin

foriingetcharloop--sys.idltranslate表内容存到字符数组

mytbl(i.xr):

=i.dr;

endloop;

       selectsubstr(utl_encode.base64_decode(utl_raw.cast_to_raw(rtrim(substr(TEXT,instr(TEXT,chr(10),1,20)+1),chr(10)) )),41)x                

                        IntovWrappedtext

                       fromDBA_SOURCE

                        Whereowner='SYS'

                       AndName='DBMS_OUTPUT'

                       AndType='PACKAGEBODY';

       --DBMS_OUTPUT.PUT_LINE(vWrappedtext);

   nLen:

=Length(vWrappedtext)/2-1;

       vLZinflatestr:

='';

       FornLoopIn0..nLenLoop

               vChar:

=Substrb(vWrappedtext,nLoop*2+1,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 可爱清新

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1