(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.
Felicitaciones Felipe.
ReplyDeleteMuy buen trabajo.
Espero seguir visitando tu blog, en busca de tan buenos aportes.
saludos
Anamaria B.
Grande Maestro!!!!.... Quedo demostrado que la Encriptacion de Microsoft vale Yuyo.... :)
ReplyDeleteGracias por el Aporte. Yo que iba a implementar la seguridad de mi sistema con esto...jajajaja
noooo en sql server 2005 no. Efectivamente elimina el procedimiento. Antes de ejecutar algo Siempre revisa el código estimado amigo.
ReplyDeletecomo puedo desencriptar un sp de sql 2008?
ReplyDeleteEstimado 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.
ReplyDeletehttp://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.