Páginas

domingo, septiembre 26, 2010

Encriptar PL SQL

Semanas anteriores revisaba un codigo API de Oracle APPS, y para mi sorpresa estaba encriptado, ni modo!! Me quede con las ganas de echarle un ojo para ver que hacia e ingeniarmelas para solucionar un problema!! y el cual me desperto el interes para poder desencriptar mi codigo y por mas que busque y ni encontre nada pero vaya!! encontre el codigo que lo encripta.
En un blog de Oracle de un usuario, explica dos ejemplos del comando Wrap!
El ocultamiento de codigo o Encriptacion del mismo, a nivel BD Oracle es muy facil y sencillo con este comandito!! Aqui el ejemplo.
Vamos a encriptar un procedimiento. Para ello ya tenemos el código del mismo en un archivo file.sql, copiado en el servidor de la base de datos. Todo lo que tenemos que hacer es entrar en la consola y ejecutar:
wrap edebug=wrap_new_sql iname=file.sql

PL/SQL Wrapper: Release 9.2.0.8.0- Production on Thu Aug 13
11:38:30 2009 Copyright (c) Oracle Corporation 1993, 2001. All Rights Reserved.

Processing file.sql to file.plb
Nota: El flag edebug=wrap_new_sql es necesario para poder soportar el nuevo compilador de sql y corregir un bug existente con algunas sintaxis de sql avanzado.
La salida, es el archivo encriptado file.plb, el cual ahora podemos compilar en SQL*plus.
SQL> @file.plb

Procedure created.
Listo. El código del procedure en la base de datos no es más legible, ya sea usando cualquier programa de desarrollo, paquete Oracle o vista del diccionario. Sin embargo es perfectamente ejecutable como cualquier otro procedimiento.

sábado, febrero 20, 2010

Oracle PL SQL Sobrecarga de metodos.....


La sobrecarga de métodos es una estrategia del lenguaje de programación que permite que diferentes métodos tengan el mismo nombre con diferente firma en el mismo bloque de código (sub programa, paquete o tipo de objeto). La firma especifica los valores de entrada y de salida. El lenguaje verifica cual procedimiento utilizar de acuerdo a la firma. Aquí les dejo un pequeño ejemplo.

create or replace package overload_util
is
        procedure print_log (p_buff varchar2);

   procedure get_pass (p_org_id in number, p_item in varchar2, p_exit out varchar2);
   function get_pass ( p_org_id in number, p_item in varchar2)
        return varchar2;
   procedure principal;

end overload_util;


create or replace package body overload_util
is
procedure print_log (p_buff varchar2) is
begin
dbms_output.put_line (p_buff);
end;

   procedure get_pass (
        p_org_id in number
      , p_item in varchar2
      , p_exit out varchar2)
   is
      begin
         p_exit := ' ITS A PROCEDURE';
         exception
            when others then
                print_log ('Error: '||SQLERRM );
                p_exit := 'Error: '||SQLERRM;
      end;


   function get_pass (p_org_id in number, p_item in varchar2)
      return varchar2
   is
   begin
      return 'ITS A FUNCTION';
   exception
      when others then
         print_log ('Error: '||SQLERRM );
         return 'Error: '||SQLERRM;
   end;


procedure principal
is
   vproc varchar2(50);
   vfunc varchar2(50);
begin

   get_pass(1,'ITEM', vproc);
   vfunc := get_pass (1,'ITEM');
   print_log('PROCEDURE: '||vproc);
   print_log('FUNCTION: '||vfunc);

   exception
      when others then
      print_log ('ERROR PRINCIPAL:'|| SQLERRM);
   end principal;
end overload_util;

Con el sig. bloque anónimo, previamente habilitamos y limpiamos el buffer del dbms.

declare

begin
   overload_util.principal;
end;

Resultado de la ejecución

PROCEDURE: ITS A  PROCEDURE
FUNCTION: ITS A FUNCTION