收藏 分享(赏)

oracle unwrap.docx

上传人:hwpkd79526 文档编号:6628283 上传时间:2019-04-18 格式:DOCX 页数:14 大小:1.37MB
下载 相关 举报
oracle unwrap.docx_第1页
第1页 / 共14页
oracle unwrap.docx_第2页
第2页 / 共14页
oracle unwrap.docx_第3页
第3页 / 共14页
oracle unwrap.docx_第4页
第4页 / 共14页
oracle unwrap.docx_第5页
第5页 / 共14页
点击查看更多>>
资源描述

1、Oracle 内部的核心包体、函数都是被加密过的。因为必须要知道 space manager 内部的核心算法是如何实现的,必须要破解下。这个文件是说明如何解密了。不过还有一个大名鼎鼎的工具,是直接出结果的:当然,收费的,200 美元。今天找了个中国有个人破解了,刚才问他, 200 块,砍到 100,便不能再砍了。终于跟位大牛要到这个 oracle 内部加密算法的 pft 说明文档,见附件的 pft 文件。再帖下 itpub 的itisamos 写的文章:在下的,老外研究得比较彻底了,由于涉及到语法构成分析,比较麻烦,这里就不多说了,只讲讲在到下怎样搞。在这个版本的下,的理论依据都来源于“The

2、 oracle hackers handbook“ by David Litchfield在书中介绍了后的代码是编码的,也就是说如果我们要,首先就要进行的解码;其次,书中也告诉我们,解码后的每个字节需要根据一个替换表进行单独的替换;替换后的字符串需要按算法进行解压;最终可以得到源码的明文。是不是挺简单的?如果书上说的是正确的,进行 UNWRAP 唯一的问题就是这个替换表了。要得这个替换表,那么我们可以做这样一个假设:既然我们通过可以这样对某过程做 DBMS_DDL.WRAP 加密可以得到密文,如下所示:select dbms_ddl.wrap(create procedure a) from

3、dual;那么对这部份密文的正文部份进行解码的值 与 未加密正文(procedure a)直接进行压缩后的值必然是一一对应的,且两个串的长度也是相等的。这是一个重大的前提!通过这种假设,肯定就能得到替换表,替换表是按字节来计算的,所以应该有二个列,其中一列代表解码后的字节值(十六进制到),另一列代表替换列(另外提醒一个问题,列不能出现重复值,哈哈,可以想像得到,如果有重复值就完了)。我的意思就是对密文进行解码后,将对应的密文的正文部份按字节替换成替换表中预先算出来的字节,最后直接按算法进行解压,替换表正确的情况下,明文就应该出来了。这里需要解释 4 个问题,密文的正文部份是什么?未加密正文为什

4、么要用procedure a而不加上Create部份?算法压缩在中怎么办?编码与解码在中怎么办?编码地球人都知道,在中有现存的工具包进行编码和解码,我们将用到的解码,具体包是:sys.utl_encode.base64_decode。用的时候还需要另一个过程来将字符串转换为格式:sys.utl_raw.cast_to_raw。压缩很常见,不过懂得内部算法的人很少,中也有现存的工具包,我这里用的是老外的一个包。在使用这个工具包时,涉及到一个压缩级别参数,这个等级参数不一样,压缩得到的字符串完全一不样。有人可能要问,这样搞岂不是没法得到替换表了吗?是的,但也不完全正确。因为可供选择的等级参数有限,

5、俺们还能从等级开始一个一个进行测试,看到底哪个参数是系统用的来的。嘿嘿,用的是“”等级。创建过程或包时如果没有部份,肯定要报错;同样 DBMS_DDL.WRAP 也不能缺少这个“create”,否则就要报错。但对于过程或包的,查阅系统视图 DBA_SOURCE 的列就知道了,肯定没有这一句。说到密文的正文部份,首先要看下面的例子:SQLselect dbms_ddl.wrap(create procedure a) from dual;create procedure a wrapped a000000354abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabc

6、dabcdabcdabcdabcd7c 388BgMHdmA3Qg9IbJmntlZoZQoHwcwg5nnm7+fMr2ywFxakaamb40d1Q=这里要解释一下,加密后的代码中与的版本有关,abcd 后的与创建的对象类型有关,也就是为存储过程,另外的 c 38 有其他意义,这里就不多说了。从 8BgMH 开始,解码后的前二十个字节是 SHA1-HASH 值(前面那本书说的哈),所以解码后的第二十一个字节开始就是正文了。为了下一节的实践活动,嘿嘿,我们先把包创建好,用以进行 LZ 压缩与解压,如下所示(全部用用户来做):create or replace java source name

7、d UNWRAPPERasimport java.io.*;import java.util.zip.*;public class UNWRAPPERpublic static String Inflate( byte src )tryByteArrayInputStream bis = new ByteArrayInputStream( src );InflaterInputStream iis = new InflaterInputStream( bis );StringBuffer sb = new StringBuffer();for( int c = iis.read(); c !=

8、 -1; c = iis.read() )sb.append( (char) c );return sb.toString(); catch ( Exception e )return null;public static byte Deflate( String src, int quality )trybyte tmp = new byte src.length() + 100 ;Deflater defl = new Deflater( quality );defl.setInput( src.getBytes( “UTF-8“ ) );defl.finish();int cnt = d

9、efl.deflate( tmp );byte res = new byte cnt ;for( int i = 0; i connect sys/XXXXxxxx as sysdba;SQL CREATE TABLE SYS.IDLTRANSLATE(C_BASE64DECODE VARCHAR2(2) NOT NULL,C_LZDEFLATECODE VARCHAR2(2) NULL)/declarenCnt integer;nLoop integer;nSLoop integer;nCharmax integer;nCharmin integer;vChar Varchar2(3);cu

10、rsor getchar is with src AS ( select PACKAGE |vChar txt from dual ),wrap as ( select src.txt , dbms_ddl.wrap( create | src.txt ) wrap from src ), subst as (select substr( utl_encode.base64_decode( utl_raw.cast_to_raw(rtrim( substr( wrap.wrap, instr( wrap.wrap, chr( 10 ), 1, 20 ) + 1 ), chr(10) ) ) )

11、, 41 ) x,amosunwrapper.deflate( wrap.txt | chr(0), 9 ) dfrom wrap )select substr( x, r * 2 - 1, 2 ) xr , substr( d, r * 2 - 1, 2 ) drfrom subst , ( select rownum r from dual connect by rownum 1 ThenDBMS_OUTPUT.PUT_LINE(SUBSTATION TABLE WARNING: Count not find following char-|vChar);Return;ElseSelect

12、 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;大家可以看看这个程序的输出是什么? 的系统包没有秘密

13、可言了,当然其他的用了的应用存储过程与包也对大家没有秘密了sys.IDLTRANSLATE 的内容,由于牵涉到各方面的因素,我这里就不公开了相信诸位大大,精通,可以通过对代码的分析,得到替换表的内容;本身不太懂的人,得到了这个替换表的内容,我相信也不是什么好事情!精通的人可以发现这个贴子的破解程序只能针对较小的存储过程或包,这是由于多方面的因素,当然我贪图方便是最大的原因大大们可以根据这个思路,扩展这个程序,将其改造为适应长度超过一行,输出长度也大于的应用程序来方便大家使用注:后面论坛另一位大神 OO 将上面的 sql 优化了下,当然这源码取自 amis 论坛的成果一部分:set server

14、output on;DeclarevWrappedtext Varchar2(32767); vChar Varchar2(2);vRepchar Varchar2(2);vLZinflatestr Varchar2(32767);nLen Integer;nLoop Integer;nCnt Integer;type vartab is table of varchar2(2) index by varchar2(2);mytbl vartab;cursor getchar is select C_BASE64DECODE xr,C_LZDEFLATECODE dr from sys.idl

15、translate;Beginfor i in getchar loop -sys.idltranslate 表内容存到字符数组mytbl(i.xr):=i.dr;end loop;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 vWrappedtextfrom DBA_SOURCE Where owner=SYSAnd Name = DBMS_OU

16、TPUTAnd Type=PACKAGE BODY ;-DBMS_OUTPUT.PUT_LINE(vWrappedtext);nLen := Length(vWrappedtext)/2 - 1;vLZinflatestr :=;For nLoop In 0nLen LoopvChar := Substrb(vWrappedtext,nLoop*2+1,2);/*Select Count(*) Into nCnt From SYS.IDLTRANSLATE Where C_BASE64DECODE=vChar;If nCnt create or replace package pkg_wrap

17、_test2 is3 -测试过程,将输入的数字以字符格式输出4 procedure test_wrap(i in number);56 END pkg_wrap_test;7 /程序包已创建。SQL $wrap iname=d:pkgbd_wrap_test.sql oname=d:pkgbd_wrap_test.plbPL/SQL Wrapper: Release 10.2.0.1.0- Production on 星期四 11 月 20 16:05:46 2008Copyright (c) 1993, 2004, Oracle. All rights reserved.Processing

18、 d:pkgbd_wrap_test.sql to d:pkgbd_wrap_test.plb3、执行创建包体的加密文件SQL d:pkgbd_wrap_test.plb;程序包体已创建。4、检测是否加密成功,可以通过 pl/sql developer 工具来检查,也可以用 user_resource 视图来检查。pl/sql developer 工具看的结果是:/* Source is wrapped */而 user_resource 视图的结果如下:SQL select name,text from user_source where type=PACKAGE BODY and name

19、=PKG_WRAP_TEST;PKG_WRAP_TEST package body pkg_wrap_test wrappeda000000354abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdb9f ebCxYp585Q8j6W0BCKuJNCkFzupjkwg5m49TOf9b9cuJu/9MMWhdzQlpbyVuOWoWLRzKV0iwlpplGpyqoX6pxQyuoCL7GPyM6lysamsq5EriREnWkPSbHKLkSAyOZJ6r+uJMo7Do8GXf12uyyr0y+rUVvbCCJBP+Kr/

20、LBBbjDtKWgmnbBKCtV3dxZGzsbaElc53jAnJ6MdMr6SvlTH+70CpiC/S7IIypjYiKYahpb65、验证包的可用性SQL set serveroutput onSQL exec pkg_wrap_test.test_wrap(1);输入参数是 1PL/SQL 过程已成功完成。小测试完成不过。这仍然麻烦,有没有一个直接转换的工具呢?itpub 的另一个 lfree 给了一个绝杀工具,hellodba写的用.net 写的:直接破解结果,不算是 sys 用户还是 space manager,谁用谁知道。不过这工具大家自己留着用就行了。不要触犯别的公司的版权。如果破解后的 SQL 代码,也不要流传出去,毕竟,加密的 sql 都是最核心的算法,是一个工具的灵魂所在,要尊重别人的劳动成果。code.sql HanMon PACKAGE BODY.txt fyunwrap_full.rar

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报