Crear procedimientos ofuscados utilizando un procedimiento encapsulado
Una manera frecuente de crear un procedimiento almacenado ofuscado es creando un “derivador” de procedimiento almacenado que tome la definición y el cuerpo del procedimiento y cree el procedimiento ofuscado, como en el ejemplo siguiente:
TEST.TESTSCH(USR)=> CREATE OR REPLACE PROCEDURE wrap_proc(text, text)
RETURNS BOOL LANGUAGE NZPLSQL AS
BEGIN_PROC
DECLARE
proc alias for $1;
body alias for $2;
enc text;
sql text;
BEGIN
enc := wrap_nzplsql(body);
sql := proc || '' || '' || quote_literal(enc) || '';
RAISE NOTICE '%;', sql;
EXECUTE IMMEDIATE sql;
return true;
END;
END_PROC;
CREATE PROCEDURE
Llame al procedimiento
wrap_proc() y especifique la definición principal de
CREATE OR REPLACE en el primer valor de entrada; a continuación, especifique el contenido de
BEGIN PROC/END PROC en el segundo valor de entrada. Debe escribir la definición principal
(el primer valor de entrada) entre comillas simples. No escriba el segundo valor de entrada (el cuerpo de procedimiento)
entre comillas simples porque el procedimiento incorporado wrap_nzplsql()
toma el texto como si se hubiera especificado para un mandato CREATE OR
REPLACE PROCEDURE. A continuación se ofrece un ejemplo:TEST.TESTSCH(USR)=> CALL wrap_proc('CREATE OR REPLACE PROCEDURE customer()
RETURNS INT4 LANGUAGE NZPLSQL AS',
BEGIN_PROC
BEGIN
RAISE NOTICE 'The customer name is alpha';
END;
END_PROC);
NOTICE: CREATE OR REPLACE PROCEDURE customer() RETURNS INT4 LANGUAGE
NZPLSQL
AS'TlpQU1FMV1JBUDEwWWk5NUhrQzVhR0xyRFRxTWR3VE5sQT09JEdFQ1B5LzVkSU1KMTI
1a0dUK3NTWjlkb3ZGL3ZHalhpVExPVG5UajRkK3gxSkxvZVhKejdZQmJOVHN0aU1waFRlb
mhoaWtYdHJUTVkKUUNrWDY5Nko5Rms2NlBIYUxra21xeWNZYXdWclBCQT0=';
wrap_proc
-----------
t
(1 row)
Al llamar a un procedimiento ofuscado, el sistema utiliza rutinas internas para
“leer” el texto de cuerpo ofuscado y ejecutar el procedimiento. El comportamiento y la salida del procedimiento ofuscado es idéntico a una versión de texto simple
del procedimiento, por ejemplo:
TEST.TESTSCH(USR)=> CALL customer();
NOTICE: The customer name is alpha
customer
----------
(1 row)