ITPUB论坛-中国最专业的IT技术社区

 找回密码
 注册
查看: 50216|回复: 132

终于改出了能超过4000字的unwrap

[复制链接]
论坛徽章:
394
阿斯顿马丁
日期:2014-01-03 13:53:522014年世界杯参赛球队:喀麦隆
日期:2014-07-11 12:10:53马上有对象
日期:2014-04-09 16:19:542014年世界杯参赛球队: 洪都拉斯
日期:2014-06-25 08:25:55itpub13周年纪念徽章
日期:2014-09-28 10:55:55itpub13周年纪念徽章
日期:2014-10-01 15:27:22itpub13周年纪念徽章
日期:2014-10-09 12:04:18马上有钱
日期:2014-10-14 21:37:37马上有钱
日期:2015-01-22 00:39:13喜羊羊
日期:2015-02-20 22:26:07
发表于 2009-6-11 13:32 | 显示全部楼层 |阅读模式
http://www.itpub.net/1154232.html的基础上

set serveroutput on;
Declare
        vWrappedtext                Varchar2(32767);               
        vtrimtext                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.idltranslate;
Begin
for i in getchar loop --sys.idltranslate表内容存到字符数组
   mytbl(i.xr):=i.dr;
end loop;
vtrimtext:='';
select count(*) into ncnt                         from DBA_SOURCE
                        Where owner='SYS'
                        And Name = 'HANMON'
                        And Type='PACKAGE BODY' ;
if ncnt >0 and ncnt <5 then
for i in 1..ncnt loop
if i=1 then
select rtrim( substr( TEXT, instr( TEXT, chr( 10 ), 1, 20 ) + 1 ), chr(10) )   --保存去掉换行的BASE64码正文
into vLZinflatestr
                        from DBA_SOURCE
                        Where owner='SYS'
                        And Name = 'HANMON'
                        And Type='PACKAGE BODY' and line=i;
else
select text into vLZinflatestr
                        from DBA_SOURCE
                        Where owner='SYS'
                        And Name = 'HANMON'
                        And Type='PACKAGE BODY' and line=i;
end if;
vtrimtext:=vtrimtext||vLZinflatestr;
end loop;
end if;
vtrimtext:=replace(vtrimtext,chr(10),'');
nLen := Length(vtrimtext)/64 ;
vWrappedtext :='';
for i in 0..nLen  loop  
if i< nLen   then
vWrappedtext:=vWrappedtext||utl_encode.base64_decode( utl_raw.cast_to_raw(substrb(vtrimtext,64*i+1 , 64 ))) ;
else
vWrappedtext:=vWrappedtext||utl_encode.base64_decode( utl_raw.cast_to_raw(substrb(vtrimtext,64*i+1  ))) ;
end if;
        --DBMS_OUTPUT.PUT_LINE(vWrappedtext);
        End Loop;
--vWrappedtext:=substr(vWrappedtext,41);
    nLen := Length(vWrappedtext)/2 - 1;

        vLZinflatestr :='';

        For nLoop In 20..nLen Loop --从第41字节开始
                vChar := Substrb(vWrappedtext,nLoop*2+1,2);
                /*
                Select 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 || mytbl(vChar); --从字符数组匹配
                --DBMS_OUTPUT.PUT_LINE(vLZinflatestr);
        End Loop;
        --DBMS_OUTPUT.PUT_LINE(vLZinflatestr);
        DBMS_OUTPUT.PUT_LINE(amosunwrapper.inflate(vLZinflatestr));
End;

附件是解码结果

6月13日修改,不依赖表,用变量存储对照表


code:='3D6585B318DBE287F152AB634BB5A05F7D687B9B24C228678ADEA4261E03EB176F343E7A3FD2A96A0FE935561FB14D1078D97
5F6BC4104816106F9ADD6D5297E869E79E505BA84CC6E278EB05DA8F39FD0A271B858DD2C38994C480755E4538C46B62DA5AF322240DC50C
3A1258B9C16605CCFFD0C981CD4376D3C3A30E86C3147F533DA43C8E35E1994ECE6A39514E09D64FA5915C52FCABB0BDFF297BF0A76B44944
5A1DF0009621807F1A82394FC1A7D70DD1D8FF139370EE5BEFBE09B97772E7B254B72AC7739066200E51EDF87C8F2EF412C62B83CDACCB3B
C44EC069366202AE88FCAA4208A64557D39ABDE1238D924A1189746B91FBFEC901EA1BF7CE';

vLZinflatestr := vLZinflatestr || mytbl(vChar); --从字符数组匹配
替换为
vLZinflatestr := vLZinflatestr ||substr(code,to_number(vChar,'XX')*2+1,2);
新代码code.sql

[ 本帖最后由 〇〇 于 2009-6-13 09:04 编辑 ]

HanMon PACKAGE BODY.txt

17.11 KB, 下载次数: 763

code.sql

2.92 KB, 下载次数: 773

论坛徽章:
70
ITPUB元老
日期:2009-11-30 15:55:11授权会员
日期:2009-11-30 11:36:17ITPUB季度 技术新星
日期:2010-08-31 10:47:25优秀写手
日期:2014-12-24 06:00:14ITPUB8周年纪念徽章
日期:2009-09-27 10:21:20祖国60周年纪念徽章
日期:2009-10-09 08:28:00奔驰
日期:2013-10-20 13:32:09数据库板块每日发贴之星
日期:2008-10-03 01:02:14数据库板块每日发贴之星
日期:2010-07-27 01:01:02数据库板块每日发贴之星
日期:2009-11-23 01:01:03
发表于 2009-6-11 13:57 | 显示全部楼层
高深,高手。

使用道具 举报

回复
论坛徽章:
17
生肖徽章2007版:蛇
日期:2009-03-10 21:14:362014年世界杯参赛球队: 伊朗
日期:2014-06-13 11:29:242014年新春福章
日期:2014-02-22 15:22:32马上有房
日期:2014-02-18 16:42:022014年新春福章
日期:2014-02-18 16:42:022013年新春福章
日期:2013-02-25 14:51:24ITPUB十周年纪念徽章
日期:2011-11-01 16:23:262012新春纪念徽章
日期:2012-01-04 11:53:29ITPUB十周年纪念徽章
日期:2011-09-27 16:32:49双黄蛋
日期:2011-08-27 13:04:11
发表于 2009-6-11 14:36 | 显示全部楼层
高深
学习

使用道具 举报

回复
论坛徽章:
15
2009新春纪念徽章
日期:2009-01-04 14:52:282012新春纪念徽章
日期:2012-01-04 11:50:44茶鸡蛋
日期:2011-06-09 12:05:152011新春纪念徽章
日期:2011-02-18 11:43:332010广州亚运会纪念徽章:网球
日期:2010-12-01 20:55:192010广州亚运会纪念徽章:藤球
日期:2010-11-22 15:43:49ITPUB9周年纪念徽章
日期:2010-10-08 09:32:252010年世界杯参赛球队:朝鲜
日期:2010-06-29 15:28:312010新春纪念徽章
日期:2010-03-01 11:06:12生肖徽章2007版:猪
日期:2009-11-13 17:36:11
发表于 2009-6-11 14:43 | 显示全部楼层
up

使用道具 举报

回复
论坛徽章:
394
阿斯顿马丁
日期:2014-01-03 13:53:522014年世界杯参赛球队:喀麦隆
日期:2014-07-11 12:10:53马上有对象
日期:2014-04-09 16:19:542014年世界杯参赛球队: 洪都拉斯
日期:2014-06-25 08:25:55itpub13周年纪念徽章
日期:2014-09-28 10:55:55itpub13周年纪念徽章
日期:2014-10-01 15:27:22itpub13周年纪念徽章
日期:2014-10-09 12:04:18马上有钱
日期:2014-10-14 21:37:37马上有钱
日期:2015-01-22 00:39:13喜羊羊
日期:2015-02-20 22:26:07
 楼主| 发表于 2009-6-12 08:41 | 显示全部楼层
还是用存储过程方便一些
set serveroutput on;
create or replace procedure unwrap(o in varchar,n in varchar, t in varchar)
as
        vWrappedtext                Varchar2(32767);               
        vtrimtext                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.idltranslate;
Begin
for i in getchar loop --sys.idltranslate表内容存到字符数组
   mytbl(i.xr):=i.dr;
end loop;
vtrimtext:='';
select count(*) into ncnt                         from DBA_SOURCE
                        Where owner=o
                        And Name = n
                        And Type=t ;
if ncnt >0 and ncnt <5 then
for i in 1..ncnt loop
if i=1 then
select rtrim( substr( TEXT, instr( TEXT, chr( 10 ), 1, 20 ) + 1 ), chr(10) )   --保存去掉换行的BASE64码正文
into vLZinflatestr
                        from DBA_SOURCE
                        Where owner=o
                        And Name = n
                        And Type=t and line=i;
else
select text into vLZinflatestr
                        from DBA_SOURCE
                        Where owner=o
                        And Name = n
                        And Type=t and line=i;
end if;
vtrimtext:=vtrimtext||vLZinflatestr;
end loop;
end if;
vtrimtext:=replace(vtrimtext,chr(10),'');
nLen := Length(vtrimtext)/64 ;
vWrappedtext :='';
for i in 0..nLen  loop  
if i< nLen   then
vWrappedtext:=vWrappedtext||utl_encode.base64_decode( utl_raw.cast_to_raw(substrb(vtrimtext,64*i+1 , 64 ))) ;
else
vWrappedtext:=vWrappedtext||utl_encode.base64_decode( utl_raw.cast_to_raw(substrb(vtrimtext,64*i+1  ))) ;
end if;
        --DBMS_OUTPUT.PUT_LINE(vWrappedtext);
        End Loop;
--vWrappedtext:=substr(vWrappedtext,41);
    nLen := Length(vWrappedtext)/2 - 1;

        vLZinflatestr :='';

        For nLoop In 20..nLen Loop --从第41字节开始
                vChar := Substrb(vWrappedtext,nLoop*2+1,2);
                /*
                Select 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 || mytbl(vChar); --从字符数组匹配
                --DBMS_OUTPUT.PUT_LINE(vLZinflatestr);
        End Loop;
        --DBMS_OUTPUT.PUT_LINE(vLZinflatestr);
        DBMS_OUTPUT.PUT_LINE(amosunwrapper.inflate(vLZinflatestr));
End;
/

exec unwrap('SYS','HANMON','PACKAGE BODY');

使用道具 举报

回复
论坛徽章:
394
阿斯顿马丁
日期:2014-01-03 13:53:522014年世界杯参赛球队:喀麦隆
日期:2014-07-11 12:10:53马上有对象
日期:2014-04-09 16:19:542014年世界杯参赛球队: 洪都拉斯
日期:2014-06-25 08:25:55itpub13周年纪念徽章
日期:2014-09-28 10:55:55itpub13周年纪念徽章
日期:2014-10-01 15:27:22itpub13周年纪念徽章
日期:2014-10-09 12:04:18马上有钱
日期:2014-10-14 21:37:37马上有钱
日期:2015-01-22 00:39:13喜羊羊
日期:2015-02-20 22:26:07
 楼主| 发表于 2009-6-12 09:13 | 显示全部楼层

为了输出中文,要修改java过程

create or replace java source named UNWRAPPER
as
import java.io.*;
import java.util.zip.*;

public class UNWRAPPER
{
  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 );
      }
String hello = new String(sb.toString().getBytes("iso8859-1"), "GBK");
      return hello;

    } 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 = tmp;
      return res;
    } catch ( Exception e )
    {
    }
    return null;
  }
}
/

alter java source UNWRAPPER compile
/
conn sys/sys@orcl as sysdba
set lines 132 pages 50000 timi on
set serverout on
exec unwrap('SYS','HANMON','PACKAGE BODY');

使用道具 举报

回复
论坛徽章:
6
授权会员
日期:2007-11-13 18:28:17奥运会纪念徽章:花样游泳
日期:2008-07-30 22:59:10BLOG每日发帖之星
日期:2009-04-28 01:01:08参与2009年中国云计算大会纪念
日期:2009-06-05 10:02:28BLOG每日发帖之星
日期:2009-07-01 01:01:032010世博会纪念徽章
日期:2010-09-03 11:12:24
发表于 2009-6-12 10:37 | 显示全部楼层
不太明白,能否解释一下此程序功能

使用道具 举报

回复
论坛徽章:
394
阿斯顿马丁
日期:2014-01-03 13:53:522014年世界杯参赛球队:喀麦隆
日期:2014-07-11 12:10:53马上有对象
日期:2014-04-09 16:19:542014年世界杯参赛球队: 洪都拉斯
日期:2014-06-25 08:25:55itpub13周年纪念徽章
日期:2014-09-28 10:55:55itpub13周年纪念徽章
日期:2014-10-01 15:27:22itpub13周年纪念徽章
日期:2014-10-09 12:04:18马上有钱
日期:2014-10-14 21:37:37马上有钱
日期:2015-01-22 00:39:13喜羊羊
日期:2015-02-20 22:26:07
 楼主| 发表于 2009-6-12 11:02 | 显示全部楼层
这个程序的功能就是把用wrap命令打包的oracle 10g的存储过程/函数/包的源代码显示出来
对直接用pl/sql写的没有用,还没有做错误处理

使用道具 举报

回复
论坛徽章:
394
阿斯顿马丁
日期:2014-01-03 13:53:522014年世界杯参赛球队:喀麦隆
日期:2014-07-11 12:10:53马上有对象
日期:2014-04-09 16:19:542014年世界杯参赛球队: 洪都拉斯
日期:2014-06-25 08:25:55itpub13周年纪念徽章
日期:2014-09-28 10:55:55itpub13周年纪念徽章
日期:2014-10-01 15:27:22itpub13周年纪念徽章
日期:2014-10-09 12:04:18马上有钱
日期:2014-10-14 21:37:37马上有钱
日期:2015-01-22 00:39:13喜羊羊
日期:2015-02-20 22:26:07
 楼主| 发表于 2009-6-12 11:21 | 显示全部楼层
wrap和unwrap的过程
1.假定有一个函数dl2ml需要打包
SQL> drop function dl2ml;

函数已删除。

已用时间:  00: 00: 00.01
SQL> ho

2.先用文本编辑器做成一个sql脚本

D:\app>type 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;
/
D:\app>exit

3.用sql脚本创建函数

SQL> @function.sql

函数已创建。

已用时间:  00: 00: 00.01

4.测试函数


SQL> select dl2ml('45') from dual;

DL2ML('45')
----------------------------------------------------------------------------------------------------------
--
4

已用时间:  00: 00: 00.01
SQL> drop function dl2ml;

函数已删除。

已用时间:  00: 00: 00.01
SQL> ho
Microsoft Windows XP [版本 5.1.2600]
(C) 版权所有 1985-2001 Microsoft Corp.

5.将sql脚本打包成funtion.plb


D:\app>wrap iname=function.sql oname=funtion.plb

PL/SQL Wrapper: Release 10.2.0.3.0- Production on 星期五 6月  12 11:14:41 2009

Copyright (c) 1993, 2004, Oracle.  All rights reserved.

Processing function.sql to funtion.plb

D:\app>type funtion.plb
create or replace function dl2ml wrapped
a000000
354
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==

/
D:\app>exit

6.执行funtion.plb创建函数

SQL> @funtion.plb

函数已创建。

已用时间:  00: 00: 00.00

6.测试函数

SQL> select dl2ml('45') from dual;

DL2ML('45')
----------------------------------------------------------------------------------------------------------
--
4

已用时间:  00: 00: 00.00

5.查看源代码,是加密后的

SQL> select text from user_source where name='DL2ML';

TEXT
----------------------------------------------------------------------------------------------------------
--
function dl2ml wrapped
a000000
354
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==


已用时间:  00: 00: 00.01
7.解密函数,看到源码

SQL> exec unwrap('SYS','DL2ML','FUNCTION');
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;

PL/SQL 过程已成功完成。

已用时间:  00: 00: 00.01
SQL>

使用道具 举报

回复
论坛徽章:
2
CTO参与奖
日期:2009-02-12 11:45:48授权会员
日期:2009-06-22 18:05:24
发表于 2009-6-12 11:49 | 显示全部楼层
有点意思

顶贴 研究

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则

TOP技术积分榜 社区积分榜 徽章 电子杂志 团队 统计 虎吧 老博客 知识索引树 读书频道 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档 | IT博客
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛 | SAP ERP系统
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 网站律师 隐私政策 知识产权声明
京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表