Monday, October 5, 2015

Oracle PL/SQL unwrap

Dear my readers here i put how to unwrap a pl/sql wrapped code
SQL> get sample1.sql
  1  create or replace procedure test_proc (pv_num in number,
  2     pv_var in varchar2, pv_var3 in out integer)  is
  3     l_num number:=3;
  4     l_var number;
  5     j number:=1;
  6     procedure nested (pv_len in out number)
  7     is
  8             x number;
  9     begin
 10             x:=pv_len*5;
 11     end;
 12  begin
 13     case l_num
 14             when 1 then
 15                     -- IF 1
 16                     l_var:=3;
 17                     dbms_output.put_line('This is a header');
 18                     dbms_output.put_line('The number is '||l_var);
 19                     dbms_output.put_line('The case var is '||l_num);
 20             when 2 then
 21                     -- IF 2
 22                     l_var:=4;
 23                     dbms_output.put_line('This is a header');
 24                     dbms_output.put_line('The number is '||l_var);
 25                     dbms_output.put_line('The case var is '||l_num);
 26             when 3 then
 27                     -- IF 3
 28                     l_var:=6;
 29                     dbms_output.put_line('This is a header');
 30                     dbms_output.put_line('The number is '||l_var);
 31                     dbms_output.put_line('The case var is '||l_num);
 32             else
 33                     dbms_output.put_line('wrong choice');
 34     end case;
 35     if ((j=1) and (j=3)) then
 36             dbms_output.put_line('here is IF');
 37     elsif ((j=2) or (j!=3)) then
 38             dbms_output.put_line('The elsif clause');
 39     else
 40             dbms_output.put_line('else clause');
 41     end if;
 42     j:=4;
 43     nested(j);
 44     dbms_output.put_line('nested=:'||j);
 45     for j in reverse 1..pv_num
 46     loop
 47             if mod(j,2) = 0 then
 48                     dbms_output.put_line('for loop with reverse');
 49             end if;
 50     end loop;
 51* end;
SQL>




I can then wrap this with the 9i wrap utility:




C:\unwrapper>wrap iname=sample1.sql oname=sample1.plb

PL/SQL Wrapper: Release 9.2.0.1.0- Production on Mon Jun 01 14:02:34 2009

Copyright (c) Oracle Corporation 1993, 2001.  All Rights Reserved.

Processing sample1.sql to sample1.plb

C:\unwrapper>head sample1.plb




Then I can show it is indeed wrapped by viewing the contents (Note the above commands are in a DOS box, the head command is on the same machine but from cygwin as the head command is available:




$ head -20 sample1.plb
create or replace procedure test_proc wrapped
0
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
3
7
9200000




Now load the wrapped file into an 11gR1 database and check its stored wrapped:




SQL> @sample1.plb

Procedure created.

SQL> select substr(text,1,60)
  2  from dba_source
  3  where name='TEST_PROC'
  4  and rownum=1;

SUBSTR(TEXT,1,60)
------------------------------------------------------------
procedure test_proc wrapped
0
abcd
abcd
abcd
abcd
abcd
abcd


SQL>




Now we can simply unwrap it using my PL/SQL based unwrapper:




SQL> @unwrap_c

unwrap_c: Release 1.4.0.0.0 - Production on Mon Jun 01 14:07:13 2009
Copyright (c) 2008, 2009 PeteFinnigan.com Limited. All rights reserved.

NAME OF OBJECT TO CHECK                 [P1]: TEST_PROC
OWNER OF OBJECT TO CHECK               [SYS]: SYS
TYPE OF THE OBJECT               [PROCEDURE]: PROCEDURE
OUTPUT METHOD Screen/File                [S]: S
FILE NAME FOR OUTPUT              [priv.lst]:
OUTPUT DIRECTORY [DIRECTORY  or file (/tmp)]:

create or replace procedure TEST_PROC( PV_NUM in NUMBER,
 PV_VAR in VARCHAR2, PV_VAR3 in out INTEGER) is
 L_NUM NUMBER:=3;
 L_VAR NUMBER;
 J NUMBER:=1;
procedure NESTED( PV_LEN in out NUMBER) is
 X NUMBER;
begin
 X:= PV_LEN * 5;
end;
begin
case L_NUM
 when 1 then
 L_VAR:=3;
 DBMS_OUTPUT. PUT_LINE('This is a header');
 DBMS_OUTPUT. PUT_LINE('The number is ' ||  L_VAR);
 DBMS_OUTPUT. PUT_LINE('The case var is ' ||  L_NUM);
 when 2 then
 L_VAR:=4;
 DBMS_OUTPUT. PUT_LINE('This is a header');
 DBMS_OUTPUT. PUT_LINE('The number is ' ||  L_VAR);
 DBMS_OUTPUT. PUT_LINE('The case var is ' ||  L_NUM);
 when 3 then
 L_VAR:=6;
 DBMS_OUTPUT. PUT_LINE('This is a header');
 DBMS_OUTPUT. PUT_LINE('The number is ' ||  L_VAR);
 DBMS_OUTPUT. PUT_LINE('The case var is ' ||  L_NUM);
else
 DBMS_OUTPUT. PUT_LINE('wrong choice');
end case;
if ( ( J = 1) and ( J = 3)) then
 DBMS_OUTPUT. PUT_LINE('here is IF');
elsif ( ( J = 2) or ( J != 3)) then
 DBMS_OUTPUT. PUT_LINE('The elsif clause');
else
 DBMS_OUTPUT. PUT_LINE('else clause');
end if;
 J:=4;
 NESTED( J);
 DBMS_OUTPUT. PUT_LINE('nested=:' ||  J);
for J in reverse 1.. PV_NUM loop
if MOD( J,2) = 0 then
 DBMS_OUTPUT. PUT_LINE('for loop with reverse');
end if;
end loop;
end;
/

INFO: Elapsed time = [.1 Seconds]


PL/SQL procedure successfully completed.

No comments:

Post a Comment