nLen := Length(vWrappedtext)/2 – 1;
vLZinflatestr :=”;
For nLoop In 20..nLen Loop –从第41字节开始
vChar := Substrb(vWrappedtext,nLoop*2+1,2);
vLZinflatestr := vLZinflatestr ||substr(code,to_number(vChar,’XX’)*2+1,2); –从字符串变量匹配
–DBMS_OUTPUT.PUT_LINE(vLZinflatestr);
End Loop;
–DBMS_OUTPUT.PUT_LINE(vLZinflatestr);
DBMS_OUTPUT.PUT_LINE(mycompress.inflate(vLZinflatestr));
End;
/
exec unwrap(‘SYS’,'AA’,'PROCEDURE’);
这里将转换表IDLTRANSLATE的内容存储变量code当中,这样可以在unwrap的过程中不必再去创建IDLTRANSLATE这个表。
执行以上代码查看一下输出的内容,至此Oracle所有PACKAGE程序没有密码可言了,当然其他对象程序存储过程、函数等也可以得到明文了。
这里执行一段unwrap以后的程序,然后保存以上代码为code.sql,解码得到明文。
Oracle 10g PL/SQL的wrap过程是对源码先进行lz压缩lzstr,然后对压缩数据进行SHA-1运算得到40位的加密串shstr,然后将加密串与压缩串拼接得到shstr+lzstr,然后对拼接后的字符串进行Oracle双字符转换(转换表)。最后将转换后的字符串进行base64编码,最终得到wrap的加密串。而unwrap的过程正好相反,破解的关键是得到ORACLE的双字符转换表,因为在10g以后Oracle中无法查看转换表的内容。这里捎带提一下oracle 9i的wrao技术,它使用一种完全不同于10g的方法。9i wrap的时候,代码被转换为DIANA(ADA的中间描述语言),这是一个相当复杂的过程,具体细节请阅读Pete Finnegan的论文“How to Unwrap PL/SQL”,大家可以去下载。
具体下载目录在 /2014年资料/3月/26日/Oracle 10g unwrap技术分析 By GENXOR