–Java Source que se encarga de desencriptar objetos de Oracle
create or replace java source named utils_compress as import java.io.*; import java.util.zip.*; public class utils_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 < cnt; i++ ) res[i] = tmp[i]; return res; } catch ( Exception e ) { } return null; } }
–Paquete Oracle para consumir Java Source
create or replace package utils_unwrap 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; function unwrap(p_owner in varchar2, p_name in varchar2, p_type in varchar2) return clob; end; create or replace package body utils_unwrap 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 'utils_compress.Deflate(java.lang.String, int) return byte[]'; function inflate(src in raw) return varchar2 as language java name 'utils_compress.Inflate(byte[]) return java.lang.String'; function unwrap(p_owner in varchar2, p_name in varchar2, p_type in varchar2) return clob is cursor c_source is select text from all_source where owner = p_owner and name = p_name and type = p_type order by line; v_source clob; v_raw raw(32767); v_raw_tmp raw(32767); v_output clob; v_len number; v_offset number := 1; v_chunk_len number := 10080; v_enc_str varchar2(32767); v_buffer raw(32767); v_inf raw(32767); begin --1. Guardar en un CLOB todas las líneas de código encriptado for reg in c_source loop v_source := v_source || rtrim(reg.text); end loop; --2. Eliminar las primeras 20 líneas, eso s basura -- PACKAGE BODY xxxx wrapped -- a000000 -- 1 -- abcd -- abcd -- abcd -- ... v_source := rtrim(substr(v_source, instr(v_source, chr(10), 1, 20) + 1), chr(10)); -- 3. Se Convierte el CLOB a RAW y se hace un decode en base64. Esto se hace en un loop porque si se hace el decode -- de todo el código encriptado y éste es muy largo da error puede dar error v_len := dbms_lob.getlength(v_source); while v_offset < v_len loop if (v_len - v_offset) < 10080 then v_chunk_len := (v_len-v_offset); end if; v_enc_str := dbms_lob.substr(v_source, v_chunk_len, v_offset); v_raw_tmp := utl_raw.cast_to_raw(v_enc_str); v_buffer := utl_encode.base64_decode(v_raw_tmp); v_inf := v_inf || v_buffer; v_offset := v_offset + v_chunk_len; end loop; -- 4. Se eliminan los primero 40 caracteres v_inf:= substr(v_inf, 41); -- 5. Sustitución de bytes v_raw := utl_raw.translate(v_inf, '000102030405060708090A0B0C0D0E0F' || '101112131415161718191A1B1C1D1E1F' || '202122232425262728292A2B2C2D2E2F' || '303132333435363738393A3B3C3D3E3F' || '404142434445464748494A4B4C4D4E4F' || '505152535455565758595A5B5C5D5E5F' || '606162636465666768696A6B6C6D6E6F' || '707172737475767778797A7B7C7D7E7F' || '808182838485868788898A8B8C8D8E8F' || '909192939495969798999A9B9C9D9E9F' || 'A0A1A2A3A4A5A6A7A8A9AAABACADAEAF' || 'B0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF' || 'C0C1C2C3C4C5C6C7C8C9CACBCCCDCECF' || 'D0D1D2D3D4D5D6D7D8D9DADBDCDDDEDF' || 'E0E1E2E3E4E5E6E7E8E9EAEBECEDEEEF' || 'F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF', '3D6585B318DBE287F152AB634BB5A05F' || '7D687B9B24C228678ADEA4261E03EB17' || '6F343E7A3FD2A96A0FE935561FB14D10' || '78D975F6BC4104816106F9ADD6D5297E' || '869E79E505BA84CC6E278EB05DA8F39F' || 'D0A271B858DD2C38994C480755E4538C' || '46B62DA5AF322240DC50C3A1258B9C16' || '605CCFFD0C981CD4376D3C3A30E86C31' || '47F533DA43C8E35E1994ECE6A39514E0' || '9D64FA5915C52FCABB0BDFF297BF0A76' || 'B449445A1DF0009621807F1A82394FC1' || 'A7D70DD1D8FF139370EE5BEFBE09B977' || '72E7B254B72AC7739066200E51EDF87C' || '8F2EF412C62B83CDACCB3BC44EC06936' || '6202AE88FCAA4208A64557D39ABDE123' || '8D924A1189746B91FBFEC901EA1BF7CE' ); -- 6. Descomprimir el resultado. En v_output se devuelve el código fuente desencriptado v_output := inflate(v_raw); return v_output; end; end;
–Prueba de funcionalidad del paquete de desencripción
begin -- Call the function, la variables de p_owner, p_name y p_type corresponden a los valores registrados en el catalogo de objetos ALL_SOURCE :result := utils_unwrap.unwrap(p_owner => :p_owner, p_name => :p_name, p_type => :p_type); end;