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,