欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Oracle下如何用wrap加密自己的源代码?

程序员文章站 2022-08-09 18:30:50
oracle提供了一种简易的源代码保护方式,wrap,它能把程序的代码变成一堆看不懂的字符。 oracle很多内置程序都使用wrap进行 比如下面是sys用户下的一个函数: create or...

oracle提供了一种简易的源代码保护方式,wrap,它能把程序的代码变成一堆看不懂的字符。

oracle很多内置程序都使用wrap进行

比如下面是sys用户下的一个函数:

create or replace function cube_table wrapped
a000000
1
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
8
7f a2
qzuf5jytzy3etzxtulohhpfavqgwg0wyf8upynsmkelpgex2czcew3msamd/oju1nxxgho9i
nhfijgajjkkkp9zp/u14pcb4zmqbzt2k30frpc1yomk3jzfjjxrfbwkl00mevl1rb6eu4n3b
ep6w/1vexmt2zw==

统计下源代码dba_source里面含wrapped声明的程序,发现大量程序都是加密过的:

sql> select type,count(1) from dba_source where instr(text,'wrapped')>0 group by type;
type           count(1)
------------ ----------
procedure            49
package body       1028
library             122
package             503
type body           165
function            127
type                115
7 rows selected

用wrap加密自己的一个程序

很多时候我们并不想让客户看到自己的程序代码,为了商业秘密或者掩盖自己的愚蠢(哈哈)

很简单,wrap是一个操作级命令,在oracle安装目录的bin目录下,在配置好oracle_home环境变量后,只要执行以下语句即可

wrap iname=input_file [ oname=output_file ]

比如下面是一个简单的自定义函数:

create or replace procedure p_log
  (v_guid    varchar2 
  ,v_spname  varchar2 default null
  ,n_op      number   default 1
  ,dt_start  date     default sysdate
  ,dt_end    date     default null
  ,v_content varchar2 default null)
  authid definer  is
  pragma autonomous_transaction;
begin
  if n_op=0 then
    --新增一条日志
    insert into t_log(guid,
                      spname,
                      stime,
                      etime,
                      content)
      values (v_guid,v_spname,dt_start,dt_end,v_content||chr(10));
   else
     --更新一条日志
     update t_log set etime=dt_end
                     ,content=content||'@'||to_char(sysdate,'yyyy-mm-dd hh24:mi:ss')||'#'||v_content||chr(10)
       where guid=v_guid;
   end if;
  commit;
end p_log;

将这段代码保存到一个.sql(任何后缀都可以)文件,然后执行wrap命令

c:\users\administrator>echo %oracle_home%
d:\oracle\product\11.2.0\dbhome_1
d:\>wrap iname=p_log.sql

pl/sql wrapper: release 11.2.0.4.0- 64bit production on mon mar 12 20:32:19 2018
copyright (c) 1993, 2009, oracle.  all rights reserved.

processing p_log.sql to p_log.plb

用文本方式打开p_log.plb,看到的是加密后的代码:

create or replace procedure p_log wrapped 
a000000
354
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
7
2d8 1e2
+vjiocwrbue/anldct7fhkioam8wgxajlvzqfhrvrz3ms4ttwmti2io2ixsn4opncnmiadpt
2xcqyiq/wcjfnqupykcskcmhm3au8pde54tokvlzpsj/oiff3x+eur8vhdfu4hriuobulfov
bauanzmqlgx7dfuluieqs5slt3zmmmm4ffz/vucx7tsycm205eya/p1eefduaf0utsktng4q
fv7gxnxwmvvmpnbwldvt94kdfozmytwgtiqhjnldxzt3vrcf44zdeg7l76z8ssakwhim+qyc
gactamp33wpupigjbdpu27wfmtlpy4czevufmugxrwisvcg7/+gmux6ftmfciaxwu7g+dzek
r/zpwr0hohump8xqypt2q/w8qbcusprz48t6pavvky0lshfi3g4esibjbk7/y63zd5m/ilge
m7ooqlbxhw1zvgtbrmawcjp9yxsnoajafzjpovtta03q
/

直接拿到sql命令行下执行,再看代码:

sql> select text from user_source where name='p_log';
text
-------------------------------------------------------------------------
procedure p_log wrapped
a000000
354
abcd
..........(略)
abcd
7
2d8 1e2
+vjiocwrbue/anldct7fhkioam8wgxajlvzqfhrvrz3ms4ttwmti2io2ixsn4opncnmiadpt
2xcqyiq/wcjfnqupykcskcmhm3au8pde54tokvlzpsj/oiff3x+eur8vhdfu4hriuobulfov
bauanzmqlgx7dfuluieqs5slt3zmmmm4ffz/vucx7tsycm205eya/p1eefduaf0utsktng4q
fv7gxnxwmvvmpnbwldvt94kdfozmytwgtiqhjnldxzt3vrcf44zdeg7l76z8ssakwhim+qyc
gactamp33wpupigjbdpu27wfmtlpy4czevufmugxrwisvcg7/+gmux6ftmfciaxwu7g+dzek
r/zpwr0hohump8xqypt2q/w8qbcusprz48t6pavvky0lshfi3g4esibjbk7/y63zd5m/ilge
m7ooqlbxhw1zvgtbrmawcjp9yxsnoajafzjpovtta03q

程序执行正常:

Oracle下如何用wrap加密自己的源代码?

使用wrap的注意事项

1.不能对存储过程名称进行加密;

2.不能加密匿名块;

3.不能加密触发器;

4.不能使用sql*plus替代变量(&)

5.加密的过程中不会检查语法错误,但在编译时会检查。

6.向上兼容,10g中wrap的程序可以在11g上运行,反之不行;

wrap程序解密

看了上面2个 wrap程序,可以发现有很多一样的程序代码,比如a000000、abcd等,可见oracle并不是对代码做了真正的加密,而是一种“封装”。

因此很多人就开始对此进行研究,并研制了解密的算法。

我也不清楚谁是始作俑者,这里就贴一篇排版清楚点的文章,有兴趣可以试试。

oracle 加密package解密(unwrap)