首先我们来看一下oracle对包、函数、过程的加密
oracle内部提供了两种加密方式
我们先来看第一种:
在没有内置OCI之前,ORACLE只提供WRAP操作系统工具。
我们来简单的看一个例子:
SQL> ho
[oracle@ucjmh ~]$ vi function.sql
SQL> ho cat function.sql
create or replace function dl2ml(hy in varchar)
return varchar
as
x varchar(2);
begin
select
case
when hy >=’01’ and hy<= ’05’ then 1
when hy >=’06’ and hy<= ’11’ then 2
when hy >=’13’ and hy<= ’43’ then 3
when hy >=’44’ and hy<= ’46’ then 4
when hy >=’47’ and hy<= ’50’ then 5
when hy >=’51’ and hy<= ’59’ then 6
when hy >=’60’ and hy<= ’62’ then 7
when hy =’63’ or hy = ’65’ then 8
when hy >=’66’ and hy<= ’67’ then 9
when hy >=’68’ and hy<= ’71’ then 10
when hy >=’72’ and hy<= ’72’ then 11
when hy >=’73’ and hy<= ’74’ then 12
when hy >=’75’ and hy<= ’78’ then 13
when hy >=’79’ and hy<= ’81’ then 14
when hy >=’82’ and hy<= ’83’ then 15
when hy >=’84’ and hy<= ’84’ then 16
when hy >=’85’ and hy<= ’87’ then 17
when hy >=’88’ and hy<= ’92’ then 18
when hy >=’93’ and hy<= ’98’ then 19
else null
end
into x from dual;
return x;
end;
/
我们首先创始一个文件 里面是一个简单的函数
然后使用操作系统级别的命令进行加密
SQL> @function.sql
Function created.
SQL> ho
[oracle@ucjmh ~]$ wrap iname=function.sql oname=function.pld
PL/SQL Wrapper: Release 11.2.0.3.0- Production on Fri May 01 00:31:44 2015
Copyright (c) 1993, 2009, Oracle. All rights reserved.
Processing function.sql to function.pld
[oracle@ucjmh ~]$ cat function.pld
create or replace function dl2ml wrapped
a000000
369
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
8
335 199
ndEQSpIvhV202FWf2jLyxpFnjQMwg1zrr0hGyo5EUOI6GMTHyUnF4S3rRsXrfy11DmGfmkPS
tcQ9Nue/OhW9vrvTuRMesVKf0vjY+UGcxijwSrxfuyzUD1jEHovrR0cVM1dx5fbGGc3GfbTg
SQVk2HhtAZooHn1TQ80riTTKhkALI+3MzBisPE7I1t7HakJ8XEgwkBPoy+j/Luup3tbe3YVo
42UE9/37WALL6NcuuovoO6z3+lA4SokDsMd7LmhMrwBLEtXWs3DDSJGKB5yt8ZQOBOOE69Oj
iS6iaQ2OqcOiUA13rQk+tok7yrcY0NRreURk6AkbTbo1G5T2BtMv0hpeRGlTQJ71g9yC2mKn
aN8uR0U38EiQ3rCYTyTetEd3lapLv8FC/psoXEq+ww==
/
[oracle@ucjmh ~]$ exit
exit
SQL> @funtion.pld
SP2-0310: unable to open file “funtion.pld”
SQL> @function.pld
Function created.
SQL> select dl2ml(’45’) from dual;
DL2ML(’45’)
——————————————————————————–
4
SQL> select text from user_source where name=’DL2ML’;
TEXT
——————————————————————————–
function dl2ml wrapped
a000000
369
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
8
335 199
ndEQSpIvhV202FWf2jLyxpFnjQMwg1zrr0hGyo5EUOI6GMTHyUnF4S3rRsXrfy11DmGfmkPS
tcQ9Nue/OhW9vrvTuRMesVKf0vjY+UGcxijwSrxfuyzUD1jEHovrR0cVM1dx5fbGGc3GfbTg
SQVk2HhtAZooHn1TQ80riTTKhkALI+3MzBisPE7I1t7HakJ8XEgwkBPoy+j/Luup3tbe3YVo
42UE9/37WALL6NcuuovoO6z3+lA4SokDsMd7LmhMrwBLEtXWs3DDSJGKB5yt8ZQOBOOE69Oj
iS6iaQ2OqcOiUA13rQk+tok7yrcY0NRreURk6AkbTbo1G5T2BtMv0hpeRGlTQJ71g9yC2mKn
aN8uR0U38EiQ3rCYTyTetEd3lapLv8FC/psoXEq+ww==
接下来我们再来看第二种加密方式:
在ORACLE 10.2之后,ORACLE提供了内置的OCI,为用户提供代码加密,其中,DBMS_DDL.WRAP和DBMS_DDL.CREATE_WRAPPED分别提供了加密、加密并且创建功能
还是来看个例子:
DBMS_DDL.WRAP使用示例
1:文本加密
select dbms_ddl.wrap(‘create or replace procedure TESTPRO is begin null end;’) from dual;
DBMS_DDL.WRAP(‘CREATEORREPLACEPROCEDURETESTPROISBEGINNULLEND;’)
————————————————————–
create or replace procedure TESTPRO wrapped
a000000
369
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
7
25 59
8g4YR51zp6Rm0t2Q5m7K9QrNB6wwg5nnm7+fMr2ywFznUrLLveeb6qV0K7jAMv7SXqWZgQjM
uIHHLcmmpmq0vfo=
2:已经创建过的代码对象加密
首先先创建一个过程
SQL> create or replace procedure TESTPRO1 is
V_str varchar2(100);
begin
v_str:=’This is string.’;
dbms_output.put_line(v_str);
end TESTPRO1;
/
Procedure created.
然后 从数据库获取源码 并且加密
SQL> DECLARE
l_source sys.DBMS_SQL.VARCHAR2A;
l_wrap sys.DBMS_SQL.VARCHAR2A;
BEGIN
SELECT case line
when 1 then ‘Create or replace ‘||Type|| ‘ ‘||text
else TEXT
end case bulk collect into l_source from dba_source where name=’TESTPRO1’ ORDER BY LINE;
l_wrap := SYS.DBMS_DDL.WRAP(ddl => l_source,
lb => 1,
ub => l_source.count);
FOR i IN 1 .. l_wrap.count LOOP
DBMS_OUTPUT.put_line(l_wrap(i));
END LOOP;
END;
/ 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
Create or replace PROCEDURE procedure wrapped
a000000
369
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
7
ab
c6
wET87k8GVIxXUUglEZEexfhS/xAwg5nnm7+fMr2ywFwWFpeu3C4+YvJc51Kyy73nm3jDpXSL
CabWS86PyMovzQRdiu4EkRo4EXAO3rL39cAy/tLW5YQJeQEKHPH3k9im
op6VbOlYQikj/DyF
l3Fuz9aGc4SE4eaE0qlXGcbrclwd2JTJwqwKT5lofzx0pkJtxUQ=
PL/SQL procedure successfully completed.
注:
dbms_sql.varchar2a提供最大为每行32k的支持
dbms_sql.varchar2s提供每行256字节的支持
ORACLE 10.2.0.1可能会出现22921 bug.
dbms_ddl.create_wrapped同上一样,只是形成加密之后,进行创建
这是oracle提供的两种加密的方式 但是o并没有提供解密的方式 o在rdbms目录下也有大量的pld的文件 可能是不想破解吧
但是聪明的使用者已经研究出来了怎么破解 我们来看一下:
首先我们要明白 oracle是怎么加密的
Oracle加密的原理就是先对源码进行lz压缩lzstr,然后对压缩数据进行SHA-1运算得到40位的加密串shstr,然后将加密串与压缩串拼接得到shstr+lzstr,然后对拼接后的字符串进行Oracle双字符转换(转换表)。最后将转换后的字符串进行base64编码,最终得到wrap的加密串。
既然我们通过SQL可以这样对某过程做DBMS_DDL.WRAP加密可以得到密文
那么对这部份密文的正文部份进行BASE64解码的值与未加密正文直接进行LZ压缩后的值必然是一一对应的,且两个串的长度也是相等的对密文
进行BASE64解码后,将对应的密文的正文部份按字节替换成替换表中预先算出来的字节,最后直接按LZ算法进行解压, 替换表正确的情况下,明文就应该出来了。通过这种假设,肯定就能得到替换表,替换表是按字 节来计算的,所以应该有二个列,其中一列代表BASE64解码后的字节值(十六进制00到FF),另一列代表替换列(BASE64列不能出现重复值是一个前提)。 |
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> 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); SelectSQL> 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 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; 23 24 25 26 27 28 29 30 31 32 33 34 35 36 / PACKAGE BODY dbms_monitor IS PROCEDURE CLIENT_ID_STAT_ENABLE(CLIENT_ID IN VARCHAR2) IS EXTERNAL NAME “kewe_3gl_1” WITH CONTEXT PARAMETERS (CONTEXT, CLIENT_ID OCISTRING, CLIENT_ID INDICATOR SB4) LIBRARY DBMS_MONITOR_LIB; PROCEDURE CLIENT_ID_STAT_DISABLE(CLIENT_ID IN VARCHAR2) IS EXTERNAL NAME “kewe_3gl_2” WITH CONTEXT PARAMETERS (CONTEXT, CLIENT_ID OCISTRING, CLIENT_ID INDICATOR SB4) LIBRARY DBMS_MONITOR_LIB; PROCEDURE SERV_MOD_ACT_STAT_ENABLE(SERVICE_NAME IN VARCHAR2, MODULE_NAME IN VARCHAR2, ACTION_NAME IN VARCHAR2) IS EXTERNAL NAME “kewe_3gl_3” WITH CONTEXT PARAMETERS (CONTEXT, SERVICE_NAME OCISTRING, SERVICE_NAME INDICATOR SB4, MODULE_NAME OCISTRING, MODULE_NAME INDICATOR SB4, ACTION_NAME OCISTRING, ACTION_NAME INDICATOR SB4) LIBRARY DBMS_MONITOR_LIB; PROCEDURE SERV_MOD_ACT_STAT_DISABLE(SERVICE_NAME IN VARCHAR2, MODULE_NAME IN VARCHAR2, ACTION_NAME IN VARCHAR2) IS EXTERNAL NAME “kewe_3gl_4” WITH CONTEXT PARAMETERS (CONTEXT, SERVICE_NAME OCISTRING, SERVICE_NAME INDICATOR SB4, MODULE_NAME OCISTRING, MODULE_NAME INDICATOR SB4, ACTION_NAME OCISTRING, ACTION_NAME INDICATOR SB4) LIBRARY DBMS_MONITOR_LIB; PROCEDURE CLIENT_ID_TRACE_ENABLE(CLIENT_ID IN VARCHAR2, WAITS IN BOOLEAN, BINDS IN BOOLEAN, PLAN_STAT IN VARCHAR2) IS EXTERNAL NAME “kewe_3gl_5” WITH CONTEXT PARAMETERS (CONTEXT, CLIENT_ID OCISTRING, CLIENT_ID INDICATOR SB4, WAITS UB2, WAITS INDICATOR SB4, BINDS UB2, BINDS INDICATOR SB4, PLAN_STAT OCISTRING, PLAN_STAT INDICATOR SB4) LIBRARY DBMS_MONITOR_LIB; PROCEDURE CLIENT_ID_TRACE_DISABLE(CLIENT_ID IN VARCHAR2) IS EXTERNAL NAME “kewe_3gl_6” WITH CONTEXT PARAMETERS (CONTEXT, CLIENT_ID OCISTRING, CLIENT_ID INDICATOR SB4) LIBRARY DBMS_MONITOR_LIB; PROCEDURE SERV_MOD_ACT_TRACE_ENABLE(SERVICE_NAME IN VARCHAR2, MODULE_NAME IN VARCHAR2, ACTION_NAME IN VARCHAR2, WAITS IN BOOLEAN, BINDS IN BOOLEAN, INSTANCE_NAME IN VARCHAR2, PLAN_STAT IN VARCHAR2) IS EXTERNAL NAME “kewe_3gl_7” WITH CONTEXT PARAMETERS (CONTEXT, SERVICE_NAME OCISTRING, SERVICE_NAME INDICATOR SB4, MODULE_NAME OCISTRING, MODULE_NAME INDICATOR SB4, ACTION_NAME OCISTRING, ACTION_NAME INDICATOR SB4, WAITS UB2, WAITS INDICATOR SB4, BINDS UB2, BINDS INDICATOR SB4, INSTANCE_NAME OCISTRING, INSTANCE_NAME INDICATOR SB4, PLAN_STAT OCISTRING, PLAN_STAT INDICATOR SB4) LIBRARY DBMS_MONITOR_LIB; PROCEDURE SERV_MOD_ACT_TRACE_DISABLE(SERVICE_NAME IN VARCHAR2, MODULE_NAME IN VARCHAR2, ACTION_NAME IN VARCHAR2, INSTANCE_NAME IN VARCHAR2) IS EXTERNAL NAME “kewe_3gl_8” WITH CONTEXT PARAMETERS (CONTEXT, SERVICE_NAME OCISTRING, SERVICE_NAME INDICATOR SB4, MODULE_NAME OCISTRING, MODULE_NAME INDICATOR SB4, ACTION_NAME OCISTRING, ACTION_NAME INDICATOR SB4, INSTANCE_NAME OCISTRING, INSTANCE_NAME INDICATOR SB4) LIBRARY DBMS_MONITOR_LIB; PROCEDURE SESSION_TRACE_ENABLE(SESSION_ID IN BINARY_INTEGER, SERIAL_NUM IN BINARY_INTEGER, WAITS IN BOOLEAN, BINDS IN BOOLEAN, PLAN_STAT IN VARCHAR2) IS EXTERNAL NAME “kewe_3gl_9” WITH CONTEXT PARAMETERS (CONTEXT, SESSION_ID SB4, SESSION_ID INDICATOR SB4, SERIAL_NUM SB4, SERIAL_NUM INDICATOR SB4, WAITS UB2, WAITS INDICATOR SB4, BINDS UB2, BINDS INDICATOR SB4, PLAN_STAT OCISTRING, PLAN_STAT INDICATOR SB4) LIBRARY DBMS_MONITOR_LIB; PROCEDURE SESSION_TRACE_DISABLE(SESSION_ID IN BINARY_INTEGER, SERIAL_NUM IN BINARY_INTEGER) IS EXTERNAL NAME “kewe_3gl_10” WITH CONTEXT PARAMETERS (CONTEXT, SESSION_ID SB4, SESSION_ID INDICATOR SB4, SERIAL_NUM SB4, SERIAL_NUM INDICATOR SB4) LIBRARY DBMS_MONITOR_LIB; PROCEDURE DATABASE_TRACE_ENABLE(WAITS IN BOOLEAN, BINDS IN BOOLEAN, INSTANCE_NAME IN VARCHAR2, PLAN_STAT IN VARCHAR2) IS EXTERNAL NAME “kewe_3gl_11” WITH CONTEXT PARAMETERS (CONTEXT, WAITS UB2, WAITS INDICATOR SB4, BINDS UB2, BINDS INDICATOR SB4, INSTANCE_NAME OCISTRING, INSTANCE_NAME INDICATOR SB4, PLAN_STAT OCISTRING, PLAN_STAT INDICATOR SB4) LIBRARY DBMS_MONITOR_LIB; PROCEDURE DATABASE_TRACE_DISABLE(INSTANCE_NAME IN VARCHAR2) IS EXTERNAL NAME “kewe_3gl_12” WITH CONTEXT PARAMETERS (CONTEXT, INSTANCE_NAME OCISTRING, INSTANCE_NAME INDICATOR SB4) LIBRARY DBMS_MONITOR_LIB; END; PL/SQL procedure success 上面直接调用不能大于4000个字节 我们写一个过程来封装一下 完善一下
|