Nov 14, 2007

Sql Server: desencriptando Procedimientos almacenados

(Atención: funciona sólo en sqlserver 2000, en las versiones actuales les  borrará el SP correspondiente, ojo con aquello)

Para desencriptar procedimientos almacenados debemos hacer lo siguiente:

Si tenemos un procedimiento encriptado como el siguiente:

CREATE PROCEDURE desencriptame
WITH ENCRYPTION
AS
PRINT 'desencriptame porfavor'
GO

y si luego quiesieramos visualizar el texto de este procedimiento nos apareceria lo siguiente:

exec sp_helptext desencriptame

mensaje: Los comentarios de objeto han sido cifrados.

Para ver el código desencriptado hagamos lo siguiente. Vamos a crear un procedimiento que desencripte esto. este procedimiento se llamará DECRYPTSP2K y su código es el siguiente: compilenlo:

CREATE PROCEDURE [DBO].[DECRYPTSP2K](
@objName VARCHAR(50))
AS
DECLARE @a NVARCHAR(4000),
@b NVARCHAR(4000),
@c NVARCHAR(4000),
@d NVARCHAR(4000),
@i INT,
@t BIGINT
--get encrypted data
SET @a = (SELECT CTEXT
FROM SYSCOMMENTS
WHERE ID = OBJECT_ID(@objName))
SET @b = 'ALTER PROCEDURE ' + @objName + ' WITH ENCRYPTION AS ' +

REPLICATE('-',4000 - 62)


EXECUTE( @b)
--get encrypted bogus SP
SET @c = (SELECT CTEXT
FROM SYSCOMMENTS
WHERE ID = OBJECT_ID(@objName))
SET @b = 'CREATE PROCEDURE ' + @objName + ' WITH ENCRYPTION AS ' +

REPLICATE('-',4000 - 62)
--start counter
SET @i = 1
--fill temporary variable
SET @d = REPLICATE(N'A',(DATALENGTH(@a) / 2))
--loop
WHILE @i <= DATALENGTH(@a) / 2
BEGIN
--xor original+bogus+bogus encrypted
SET @d = STUFF(@d,@i,1,NCHAR(UNICODE(SUBSTRING(@a,@i,1)) ^ (UNICODE(SUBSTRING(@b,@i,1)) ^ UNICODE(SUBSTRING(@c,@i,1)))))
SET @i = @i + 1
END
--drop original SP
EXECUTE( 'drop PROCEDURE ' + @objName)
--remove encryption
--try to preserve case
SET @d = REPLACE((@d),'WITH ENCRYPTION','')
SET @d = REPLACE((@d),'With Encryption','')
SET @d = REPLACE((@d),'with encryption','')
IF CHARINDEX('WITH ENCRYPTION',UPPER(@d)) > 0
SET @d = REPLACE(UPPER(@d),'WITH ENCRYPTION','')
--replace SP
EXECUTE( @d)
Luego ejecutenlo de la siguiente manera:

exec DECRYPTSP2K 'desencriptame'
go

Luego vuelvan a ejecutar el sp_helptext y obtendrán el código desencriptado:

exec sp_helptext desencriptame

mensaje:
Text
CREATE PROCEDURE desencriptame

AS
PRINT 'desencriptame porfavor'

Saludos. Felipe D.

5 comments:

  1. Felicitaciones Felipe.
    Muy buen trabajo.
    Espero seguir visitando tu blog, en busca de tan buenos aportes.

    saludos

    Anamaria B.

    ReplyDelete
  2. Grande Maestro!!!!.... Quedo demostrado que la Encriptacion de Microsoft vale Yuyo.... :)

    Gracias por el Aporte. Yo que iba a implementar la seguridad de mi sistema con esto...jajajaja

    ReplyDelete
  3. noooo en sql server 2005 no. Efectivamente elimina el procedimiento. Antes de ejecutar algo Siempre revisa el código estimado amigo.

    ReplyDelete
  4. como puedo desencriptar un sp de sql 2008?

    ReplyDelete
  5. Estimado lo que yo he probado es utilizar este software que me ha servidor, es una versiòn pagada pero hay unaversiòn trial que puedes usar.

    http://www.devlib.net/decryptsql.htm

    lamentablemente no hay una soluciòn directa como en SQL Server 2000. 2005 y 2008 requieren de herramientas externas para desencriptar.

    ReplyDelete