Oracle 10g unwrap技术分析 By GENXOR(三)

2014-11-24 17:28:16 · 作者: · 浏览: 2
dtext:=substr(vWrappedtext,41);


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