解密SQLSERVER2000存储过程,函数,视图,触发器


CREATE   PROCEDURE  sp_decrypt( @objectName   varchar ( 50 )) 



AS  

begin  

set  nocount  on  

-- CSDN:j9988 copyright:2004.04.15 

-- V3.1 

-- 破解字节不受限制,适用于SQLSERVER2000存储过程,函数,视图,触发器 

-- 修正上一版视图触发器不能正确解密错误 

-- 发现有错,请E_MAIL:[email protected] 

begin   tran  

declare   @objectname1   varchar ( 100 ), @orgvarbin   varbinary ( 8000

declare   @sql1   nvarchar ( 4000 ), @sql2   varchar ( 8000 ), @sql3   nvarchar ( 4000 ), @sql4   nvarchar ( 4000

DECLARE   @OrigSpText1   nvarchar ( 4000 ),  @OrigSpText2   nvarchar ( 4000 ) ,  @OrigSpText3   nvarchar ( 4000 ),  @resultsp   nvarchar ( 4000

declare   @i   int , @status   int , @type   varchar ( 10 ), @parentid   int  

declare   @colid   int , @n   int , @q   int , @j   int , @k   int , @encrypted   int , @number   int  

select   @type = xtype, @parentid = parent_obj  from  sysobjects  where  id = object_id ( @ObjectName


create   table  # temp ( number   int ,colid  int ,ctext  varbinary ( 8000 ),encrypted  int ,status  int

insert  # temp   SELECT   number ,colid,ctext,encrypted,status  FROM  syscomments  WHERE  id  =   object_id ( @objectName

select   @number = max ( number from  # temp  

set   @k = 0  


while   @k <= @number  

begin  

if   exists ( select   1   from  syscomments  where  id = object_id ( @objectname and   number = @k

begin  

if   @type = ' P '  

set   @sql1 = ( case   when   @number > 1   then   ' ALTER PROCEDURE  ' +   @objectName   + ' ; ' + rtrim ( @k ) + '  WITH ENCRYPTION AS  '  

else   ' ALTER PROCEDURE  ' +   @objectName + '  WITH ENCRYPTION AS  '  

end


if   @type = ' TR '  

begin  

declare   @parent_obj   varchar ( 255 ), @tr_parent_xtype   varchar ( 10

select   @parent_obj = parent_obj  from  sysobjects  where  id = object_id ( @objectName

select   @tr_parent_xtype = xtype  from  sysobjects  where  id = @parent_obj  

if   @tr_parent_xtype = ' V '  

begin  

set   @sql1 = ' ALTER TRIGGER  ' + @objectname + '  ON  ' + OBJECT_NAME ( @parentid ) + '  WITH ENCRYPTION INSTERD OF INSERT AS PRINT 1  '  

end  

else  

begin  

set   @sql1 = ' ALTER TRIGGER  ' + @objectname + '  ON  ' + OBJECT_NAME ( @parentid ) + '  WITH ENCRYPTION FOR INSERT AS PRINT 1  '  

end  


end  

if   @type = ' FN '   or   @type = ' TF '   or   @type = ' IF '  

set   @sql1 = ( case   @type   when   ' TF '   then  

' ALTER FUNCTION  ' +   @objectName + ' (@a char(1)) returns @b table(a varchar(10)) with encryption as begin insert @b select @a return end  '  

when   ' FN '   then  

' ALTER FUNCTION  ' +   @objectName + ' (@a char(1)) returns char(1) with encryption as begin return @a end '  

when   ' IF '   then  

' ALTER FUNCTION  ' +   @objectName + ' (@a char(1)) returns table with encryption as return select @a as a '  

end


if   @type = ' V '  

set   @sql1 = ' ALTER VIEW  ' + @objectname + '  WITH ENCRYPTION AS SELECT 1 as f '  


set   @q = len ( @sql1

set   @sql1 = @sql1 + REPLICATE ( ' - ' , 4000 - @q

select   @sql2 = REPLICATE ( ' - ' , 8000

set   @sql3 = ' exec(@sql1 '  

select   @colid = max (colid)  from  # temp   where   number = @k  

set   @n = 1  

while   @n <= CEILING ( 1.0 * ( @colid - 1 ) / 2 and   len ( @sQL3 ) <= 3996  

begin  

set   @sql3 = @sql3 + ' +@ '  

set   @n = @n + 1  

end  

set   @sql3 = @sql3 + ' ) '  

exec  sp_executesql  @sql3 ,N ' @Sql1 nvarchar(4000),@ varchar(8000) ' , @sql1 = @sql1 ,@ = @sql2  


end  

set   @k = @k + 1  

end  


set   @k = 0  

while   @k <= @number  

begin  

if   exists ( select   1   from  syscomments  where  id = object_id ( @objectname and   number = @k

begin  

select   @colid = max (colid)  from  # temp   where   number = @k  

set   @n = 1  


while   @n <= @colid  

begin  

select   @OrigSpText1 = ctext, @encrypted = encrypted, @status = status  FROM  # temp   WHERE  colid = @n   and   number = @k  


SET   @OrigSpText3 = ( SELECT  ctext  FROM  syscomments  WHERE  id = object_id ( @objectName and  colid = @n   and   number = @k

if   @n = 1  

begin  

if   @type = ' P '  

SET   @OrigSpText2 = ( case   when   @number > 1   then   ' CREATE PROCEDURE  ' +   @objectName   + ' ; ' + rtrim ( @k ) + '  WITH ENCRYPTION AS  '  

else   ' CREATE PROCEDURE  ' +   @objectName   + '  WITH ENCRYPTION AS  '  

end



if   @type = ' FN '   or   @type = ' TF '   or   @type = ' IF '  

SET   @OrigSpText2 = ( case   @type   when   ' TF '   then  

' CREATE FUNCTION  ' +   @objectName + ' (@a char(1)) returns @b table(a varchar(10)) with encryption as begin insert @b select @a return end  '  

when   ' FN '   then  

' CREATE FUNCTION  ' +   @objectName + ' (@a char(1)) returns char(1) with encryption as begin return @a end '  

when   ' IF '   then  

' CREATE FUNCTION  ' +   @objectName + ' (@a char(1)) returns table with encryption as return select @a as a '  

end


if   @type = ' TR '  

begin  


if   @tr_parent_xtype = ' V '  

begin  

set   @OrigSpText2 = ' CREATE TRIGGER  ' + @objectname + '  ON  ' + OBJECT_NAME ( @parentid ) + '  WITH ENCRYPTION INSTEAD OF INSERT AS PRINT 1  '  

end  

else  

begin  

set   @OrigSpText2 = ' CREATE TRIGGER  ' + @objectname + '  ON  ' + OBJECT_NAME ( @parentid ) + '  WITH ENCRYPTION FOR INSERT AS PRINT 1  '  

end  


end  


if   @type = ' V '  

set   @OrigSpText2 = ' CREATE VIEW  ' + @objectname + '  WITH ENCRYPTION AS SELECT 1 as f '  


set   @q = 4000 - len ( @OrigSpText2

set   @OrigSpText2 = @OrigSpText2 + REPLICATE ( ' - ' , @q

end  

else  

begin  

SET   @OrigSpText2 = REPLICATE ( ' - ' 4000

end  

SET   @i = 1  


SET   @resultsp   =   replicate (N ' A ' , ( datalength ( @OrigSpText1 /   2 )) 


WHILE   @i <= datalength ( @OrigSpText1 ) / 2  

BEGIN  


SET   @resultsp   =   stuff ( @resultsp @i 1 NCHAR ( UNICODE ( substring ( @OrigSpText1 @i 1 ))  ^  

(
UNICODE ( substring ( @OrigSpText2 @i 1 ))  ^  

UNICODE ( substring ( @OrigSpText3 @i 1 ))))) 

SET   @i = @i + 1  

END  

set   @orgvarbin = cast ( @OrigSpText1   as   varbinary ( 8000 )) 

set   @resultsp = ( case   when   @encrypted = 1  

then   @resultsp  

else   convert ( nvarchar ( 4000 ), case   when   @status & 2 = 2   then  uncompress( @orgvarbin else   @orgvarbin   end

end

print   @resultsp  


set   @n = @n + 1  


end  


end  

set   @k = @k + 1  

end  


drop   table  # temp  

rollback   tran  

end  

  
/* -----------------------------------------------------------------------------------------------------------------------
名  稱:
調用對像:
備註說明:
修改日志:
程式作者:小曹
-----------------------------------------------------------------------------------------------------------------------
*/
CREATE PROCEDURE [ dbo ] . [ UP_DECRYPT ]
(
@OBJECTNAME VARCHAR ( 50 )
)
AS
BEGIN
SET NOCOUNT ON

BEGIN TRAN
DECLARE @OBJECTNAME1 VARCHAR ( 100 ), @ORGVARBIN VARBINARY ( 8000 )
DECLARE @SQL1 NVARCHAR ( 4000 ), @SQL2 VARCHAR ( 8000 ), @SQL3 NVARCHAR ( 4000 ), @SQL4 NVARCHAR ( 4000 )
DECLARE @ORIGSPTEXT1 NVARCHAR ( 4000 ), @ORIGSPTEXT2 NVARCHAR ( 4000 ) , @ORIGSPTEXT3 NVARCHAR ( 4000 ), @RESULTSP NVARCHAR ( 4000 )
DECLARE @I INT , @STATUS INT , @TYPE VARCHAR ( 10 ), @PARENTID INT
DECLARE @COLID INT , @N INT , @Q INT , @J INT , @K INT , @ENCRYPTED INT , @NUMBER INT
SELECT @TYPE = XTYPE, @PARENTID = PARENT_OBJ FROM SYSOBJECTS WHERE ID = OBJECT_ID ( @OBJECTNAME )

CREATE TABLE # TEMP ( NUMBER INT ,COLID INT ,CTEXT VARBINARY ( 8000 ),ENCRYPTED INT ,STATUS INT )
INSERT # TEMP SELECT NUMBER ,COLID,CTEXT,ENCRYPTED,STATUS FROM SYSCOMMENTS WHERE ID = OBJECT_ID ( @OBJECTNAME )
SELECT @NUMBER = MAX ( NUMBER ) FROM # TEMP
SET @K = 0
WHILE @K <= @NUMBER
BEGIN
IF EXISTS ( SELECT 1 FROM SYSCOMMENTS WHERE ID = OBJECT_ID ( @OBJECTNAME ) AND NUMBER = @K )
BEGIN
IF ( @TYPE = ' P ' )
SET @SQL1 = (
CASE WHEN @NUMBER > 1 THEN ' ALTER PROCEDURE ' + @OBJECTNAME + ' ; ' + RTRIM ( @K ) + ' WITH ENCRYPTION AS ' ELSE ' ALTER PROCEDURE ' + @OBJECTNAME + ' WITH ENCRYPTION AS ' END
)

IF @TYPE = ' TR '
BEGIN
DECLARE @PARENT_OBJ VARCHAR ( 255 ), @TR_PARENT_XTYPE VARCHAR ( 10 )
SELECT @PARENT_OBJ = PARENT_OBJ FROM SYSOBJECTS WHERE ID = OBJECT_ID ( @OBJECTNAME )
SELECT @TR_PARENT_XTYPE = XTYPE FROM SYSOBJECTS WHERE ID = @PARENT_OBJ
IF @TR_PARENT_XTYPE = ' V '
BEGIN
SET @SQL1 = ' ALTER TRIGGER ' + @OBJECTNAME + ' ON ' + OBJECT_NAME ( @PARENTID ) + ' WITH ENCRYPTION INSTERD OF INSERT AS PRINT 1 '
END
ELSE
BEGIN
SET @SQL1 = ' ALTER TRIGGER ' + @OBJECTNAME + ' ON ' + OBJECT_NAME ( @PARENTID ) + ' WITH ENCRYPTION FOR INSERT AS PRINT 1 '
END

END

IF @TYPE = ' FN ' OR @TYPE = ' TF ' OR @TYPE = ' IF '
SET @SQL1 = (
CASE @TYPE
WHEN ' TF ' THEN
' ALTER FUNCTION ' + @OBJECTNAME + ' (@A CHAR(1)) RETURNS @B TABLE(A VARCHAR(10)) WITH ENCRYPTION AS BEGIN INSERT @B SELECT @A RETURN END '
WHEN ' FN ' THEN
' ALTER FUNCTION ' + @OBJECTNAME + ' (@A CHAR(1)) RETURNS CHAR(1) WITH ENCRYPTION AS BEGIN RETURN @A END '
WHEN ' IF ' THEN
' ALTER FUNCTION ' + @OBJECTNAME + ' (@A CHAR(1)) RETURNS TABLE WITH ENCRYPTION AS RETURN SELECT @A AS A '
END
)

IF @TYPE = ' V '
SET @SQL1 = ' ALTER VIEW ' + @OBJECTNAME + ' WITH ENCRYPTION AS SELECT 1 AS F '

SET @Q = LEN ( @SQL1 )
SET @SQL1 = @SQL1 + REPLICATE ( ' - ' , 4000 - @Q )
SELECT @SQL2 = REPLICATE ( ' - ' , 8000 )
SET @SQL3 = ' EXEC(@SQL1 '
SELECT @COLID = MAX (COLID) FROM # TEMP WHERE NUMBER = @K
SET @N = 1
WHILE @N <= CEILING ( 1.0 * ( @COLID - 1 ) / 2 ) AND LEN ( @SQL3 ) <= 3996
BEGIN
SET @SQL3 = @SQL3 + ' +@ '
SET @N = @N + 1
END
SET @SQL3 = @SQL3 + ' ) '

EXEC SP_EXECUTESQL @SQL3 ,N ' @SQL1 NVARCHAR(4000),@ VARCHAR(8000) ' , @SQL1 = @SQL1 ,@ = @SQL2

END
SET @K = @K + 1
END

SET @K = 0
WHILE @K <= @NUMBER
BEGIN
IF EXISTS ( SELECT 1 FROM SYSCOMMENTS WHERE ID = OBJECT_ID ( @OBJECTNAME ) AND NUMBER = @K )
BEGIN
SELECT @COLID = MAX (COLID) FROM # TEMP WHERE NUMBER = @K
SET @N = 1
WHILE @N <= @COLID
BEGIN
SELECT @ORIGSPTEXT1 = CTEXT, @ENCRYPTED = ENCRYPTED, @STATUS = STATUS FROM # TEMP WHERE COLID = @N AND NUMBER = @K
SET @ORIGSPTEXT3 = ( SELECT CTEXT FROM SYSCOMMENTS WHERE ID = OBJECT_ID ( @OBJECTNAME ) AND COLID = @N AND NUMBER = @K )
IF @N = 1
BEGIN
IF @TYPE = ' P '
SET @ORIGSPTEXT2 = (
CASE WHEN @NUMBER > 1
THEN ' CREATE PROCEDURE ' + @OBJECTNAME + ' ; ' + RTRIM ( @K ) + ' WITH ENCRYPTION AS '
ELSE
' CREATE PROCEDURE ' + @OBJECTNAME + ' WITH ENCRYPTION AS '
END
)

IF @TYPE = ' FN ' OR @TYPE = ' TF ' OR @TYPE = ' IF '
SET @ORIGSPTEXT2 = (
CASE @TYPE
WHEN ' TF '
THEN ' CREATE FUNCTION ' + @OBJECTNAME + ' (@A CHAR(1)) RETURNS @B TABLE(A VARCHAR(10)) WITH ENCRYPTION AS BEGIN INSERT @B SELECT @A RETURN END '
WHEN ' FN ' THEN
' CREATE FUNCTION ' + @OBJECTNAME + ' (@A CHAR(1)) RETURNS CHAR(1) WITH ENCRYPTION AS BEGIN RETURN @A END '
WHEN ' IF ' THEN
' CREATE FUNCTION ' + @OBJECTNAME + ' (@A CHAR(1)) RETURNS TABLE WITH ENCRYPTION AS RETURN SELECT @A AS A '
END
)

IF @TYPE = ' TR '
BEGIN
IF @TR_PARENT_XTYPE = ' V '
BEGIN
SET @ORIGSPTEXT2 = ' CREATE TRIGGER ' + @OBJECTNAME + ' ON ' + OBJECT_NAME ( @PARENTID ) + ' WITH ENCRYPTION INSTEAD OF INSERT AS PRINT 1 '
END
ELSE
BEGIN
SET @ORIGSPTEXT2 = ' CREATE TRIGGER ' + @OBJECTNAME + ' ON ' + OBJECT_NAME ( @PARENTID ) + ' WITH ENCRYPTION FOR INSERT AS PRINT 1 '
END
END

IF @TYPE = ' V '
SET @ORIGSPTEXT2 = ' CREATE VIEW ' + @OBJECTNAME + ' WITH ENCRYPTION AS SELECT 1 AS F '

SET @Q = 4000 - LEN ( @ORIGSPTEXT2 )
SET @ORIGSPTEXT2 = @ORIGSPTEXT2 + REPLICATE ( ' - ' , @Q )
END
ELSE
BEGIN
SET @ORIGSPTEXT2 = REPLICATE ( ' - ' , 4000 )
END
SET @I = 1
SET @RESULTSP = REPLICATE (N ' A ' , ( DATALENGTH ( @ORIGSPTEXT1 ) / 2 ))
WHILE @I <= DATALENGTH ( @ORIGSPTEXT1 ) / 2
BEGIN
SET @RESULTSP = STUFF ( @RESULTSP , @I , 1 , NCHAR ( UNICODE ( SUBSTRING ( @ORIGSPTEXT1 , @I , 1 )) ^ ( UNICODE ( SUBSTRING ( @ORIGSPTEXT2 , @I , 1 )) ^ UNICODE ( SUBSTRING ( @ORIGSPTEXT3 , @I , 1 )))))
SET @I = @I + 1
END
SET @ORGVARBIN = CAST ( @ORIGSPTEXT1 AS VARBINARY ( 8000 ))
SET @RESULTSP = (
CASE WHEN @ENCRYPTED = 1 THEN @RESULTSP
ELSE
CONVERT ( NVARCHAR ( 4000 ), CASE WHEN @STATUS & 2 = 2 THEN UNCOMPRESS( @ORGVARBIN ) ELSE @ORGVARBIN END )
END
)
PRINT @RESULTSP
SET @N = @N + 1
END
END
SET @K = @K + 1
END
DROP TABLE # TEMP
ROLLBACK TRAN
END
GO

你可能感兴趣的:(sqlserver2000)