SQL存储过程解密 Encrypted object is not transferable, and script can not be generated

存储过程解密(破解函数,过程,触发器,视图.仅限于SQLSERVER2000)

 

/* --调用示例: 

--解密指定存储过程 
exec sp_decrypt '存储过程名' 

--
*/  

 

 

create   PROCEDURE  sp_decrypt( @objectName   varchar ( 50 )) 
AS  
begin  
begin   tran  
declare   @objectname1   varchar ( 100 ), @orgvarbin   varbinary ( 8000
declare   @sql1   nvarchar ( 4000 ), @sql2   nvarchar ( 4000 ), @sql3   nvarchar ( 4000 ), @sql4   nvarchar ( 4000 ), @sql5   nvarchar ( 4000 ), @sql6   nvarchar ( 4000 ), @sql7   nvarchar ( 4000 ), @sql8   nvarchar ( 4000 ), @sql9   nvarchar ( 4000 ), @sql10   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 '  
set   @sql1 = ' ALTER TRIGGER  ' + @objectname + '  ON  ' + OBJECT_NAME ( @parentid ) + '  WITH ENCRYPTION FOR INSERT AS PRINT 1  '  

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  '  

set   @q = len ( @sql1
set   @sql1 = @sql1 + REPLICATE ( ' - ' , 4000 - @q
select   @sql2 = REPLICATE ( ' - ' , 4000 ), @sql3 = REPLICATE ( ' - ' , 4000 ), @sql4 = REPLICATE ( ' - ' , 4000 ), @sql5 = REPLICATE ( ' - ' , 4000 ), @sql6 = REPLICATE ( ' - ' , 4000 ), @sql7 = REPLICATE ( ' - ' , 4000 ), @sql8 = REPLICATE ( ' - ' , 4000 ), @sql9 = REPLICATE ( ' - ' , 4000 ), @sql10 = REPLICATE ( ' - ' , 4000
exec ( @sql1 + @sql2 + @sql3 + @sql4 + @sql5 + @sql6 + @sql7 + @sql8 + @sql9 + @sql10
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 '  
set   @OrigSpText2 = ' CREATE TRIGGER  ' + @objectname + '  ON  ' + OBJECT_NAME ( @parentid ) + '  WITH ENCRYPTION FOR INSERT AS PRINT 1  '  

if   @type = ' V '  
set   @OrigSpText2 = ' CREATE VIEW  ' + @objectname + '  WITH ENCRYPTION AS SELECT 1  '  

set   @q = 4000 - len ( @OrigSpText2
set   @OrigSpText2 = @OrigSpText2 + REPLICATE ( ' - ' , @q
end  
else  
begin  
SET   @OrigSpText2 = REPLICATE ( ' - ' 4000
end  
-- start counter 
SET   @i = 1  
-- fill temporary variable 

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

-- loop 
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  
-- execute( @resultsp) 
set   @n = @n + 1  

end  

end  
set   @k = @k + 1  
end  

drop   table  # temp  
rollback   tran  
end  
GO

你可能感兴趣的:(encrypt)