伯乐共勉

讨论。NET专区
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

存储过程解密,不记得是从哪来的。

Posted on 2005-11-24 14:52  伯乐共勉  阅读(257)  评论(0编辑  收藏  举报

 

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS ON 
GO


ALTER   PROCEDURE DecryptObject (@objectName varchar(50))  
-- WITH   ENCRYPTION  
AS  
    
begin   
        
declare @objectname1 varchar(100)  
        
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 , @t bigint  
        
declare @m int,@n int,@q int  
    
DECLARE @tablename varchar(255)     --触发器所对应的表名  
     DECLARE @trigtype varchar(6)        --触发器类型  
     DECLARE @type char(1)             --对象类型:P-procedure ;V-View; T-trigger  
     DECLARE @bb bit  
  
 
select @i=count(1)  from sysobjects where name = @objectName  
 
if @i=0  
      
begin  
      
print 'Object ' + @objectName + ' isnt exist!'  
      
return  
    
end  
 
select @type= case xtype when 'TR' then 'T' else xtype end from sysobjects where name = @objectName  
  
 
if (@type<>'T' and  @type<>'V' and  @type<>'P')     
      
begin  
      
print 'Object ' + @objectName + ' isnt procedure or trigger or view!'  
      
return  
    
end  
        
select @bb=encrypted FROM syscomments  WHERE id = object_id(@objectName)  
        
select @m=max(colid) FROM syscomments  WHERE id = object_id(@objectName)  
 
if @bb=0  
      
begin  
      
print 'Object ' + @objectName + ' is not encrypted!'  
      
return  
    
end  
 
-----------------------------------------------------------  
        --get encrypted data     将加密信息存储于临时表中  
        create table  #temp(colid int,ctext varbinary(8000))  
        
create table  #tempresult(cctext nvarchar(4000))  
        
insert #temp SELECT colid,ctext FROM syscomments  WHERE id = object_id(@objectName)  
     
IF @type='T'  
      
BEGIN  
              
SET @tablename=(SELECT sysobjects_1.name  
              
FROM dbo.sysobjects INNER JOIN  
               dbo.sysobjects sysobjects_1 
ON dbo.sysobjects.parent_obj = sysobjects_1.id  
              
WHERE (dbo.sysobjects.type = 'TR'AND (dbo.sysobjects.name = @ObjectName))  
              
SET @trigtype=(SELECT CASE WHEN dbo.sysobjects.deltrig > 0 THEN 'DELETE'  
                              
WHEN dbo.sysobjects.instrig > 0 THEN 'INSERT'  
                              
WHEN dbo.sysobjects.updtrig > 0 THEN 'UPDATE' END  
                  
FROM dbo.sysobjects INNER JOIN  
                   dbo.sysobjects sysobjects_1 
ON dbo.sysobjects.parent_obj = sysobjects_1.id  
                  
WHERE (dbo.sysobjects.type = 'TR'AND (dbo.sysobjects.name = @ObjectName))  
          
END  
     
SET @sql1=case @type  
      
WHEN 'P' THEN 'ALTER PROCEDURE '+ @ObjectName +' WITH ENCRYPTION AS '  
      
WHEN 'V' THEN 'ALTER VIEW '+ @ObjectName +' WITH ENCRYPTION AS SELECT dbo.dtproperties.* FROM dbo.dtproperties'  
      
WHEN 'T' THEN 'ALTER TRIGGER '+@ObjectName+' ON '+ @tablename+' WITH ENCRYPTION FOR '+@trigtype+' AS PRINT ''a'''  
      
END  
        
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)  
        
select @sql1='',@sql2='',@sql3='',@sql4='',@sql5='',@sql6='',@sql7='',@sql8='',@sql9='',@sql10=''  
        
set @n=1    --从编号为1开始   
        while @n<=@m  
        
begin  
          
SET @OrigSpText1=(SELECT ctext FROM #temp  WHERE colid=@n)  
          
SET @OrigSpText3=(SELECT ctext FROM syscomments WHERE id=object_id(@objectNameand colid=@n)  
          
if @n=1  
             
begin  
                
SET @OrigSpText2=case @type  
                        
WHEN 'P' THEN 'CREATE PROCEDURE '+ @ObjectName +' WITH ENCRYPTION AS '  
                        
WHEN 'V' THEN 'CREATE VIEW '+ @ObjectName +' WITH ENCRYPTION AS SELECT dbo.dtproperties.* FROM dbo.dtproperties'  
                        
WHEN 'T' THEN 'CREATE TRIGGER '+@ObjectName+' ON '+ @tablename+' WITH ENCRYPTION FOR '+@trigtype+' AS PRINT ''a'''  
                        
END  
                
set @q=4000-len(@OrigSpText2)  
                
set @OrigSpText2=@OrigSpText2+REPLICATE('-',@q)  
             
end  
          
else  
            
begin  
              
SET @OrigSpText2=REPLICATE('-'4000)  
            
end  
          
SET @i=1  
          
--fill temporary variable  
          SET @resultsp = replicate(N'A', (datalength(@OrigSpText1/ 2))  
          
--loop  
          WHILE @i<=datalength(@OrigSpText1)/2  
          
BEGIN  
              
--reverse encryption (XOR original+bogus+bogus encrypted)  
              SET @resultsp = stuff(@resultsp@i1NCHAR(UNICODE(substring(@OrigSpText1@i1)) ^  
                           (
UNICODE(substring(@OrigSpText2@i1)) ^  
                            
UNICODE(substring(@OrigSpText3@i1)))))  
              
SET @i=@i+1  
          
END  
          
if @n=1  begin set @sql1=@resultsp end  
          
if @n=2  begin set @sql2=@resultsp end  
          
if @n=3  begin set @sql3=@resultsp end  
          
if @n=4  begin set @sql4=@resultsp end  
          
if @n=5  begin set @sql5=@resultsp end  
          
if @n=6  begin set @sql6=@resultsp end  
          
if @n=7  begin set @sql7=@resultsp end  
          
if @n=8  begin set @sql8=@resultsp end  
          
if @n=9  begin set @sql9=@resultsp end  
          
if @n=10  begin set @sql10=@resultsp end  
      
insert into #tempresult values (@resultsp)  
          
set @n=@n+1  
        
end  
      
drop table #temp  
        
SET @resultsp=case @type  
                
WHEN 'P' THEN 'drop PROCEDURE '+ @ObjectName  
                
WHEN 'V' THEN 'drop VIEW '+ @ObjectName  
                
WHEN 'T' THEN 'drop TRIGGER '+@ObjectName  
                
END  
        
Execute@resultsp)  
        
print @resultsp +';' +Cast(@n as varchar(20))
        
if @n=1  begin exec(@sql1end  
        
if @n=2  begin exec(@sql1 + @sql2end  
        
if @n=3  begin exec(@sql1 + @sql2+@sql3 ) end  
        
if @n=4  begin exec(@sql1 + @sql2+@sql3 + @sql4 ) end  
        
if @n=5  begin exec(@sql1 + @sql2+@sql3 + @sql4  + @sql5end  
        
if @n=6  begin exec(@sql1 + @sql2+@sql3 + @sql4  + @sql5+ @sql6end  
        
if @n=7  begin exec(@sql1 + @sql2+@sql3 + @sql4  + @sql5+ @sql6+ @sql7 ) end  
        
if @n=8  begin exec(@sql1 + @sql2+@sql3 + @sql4  + @sql5+ @sql6+ @sql7 + @sql8end  
        
if @n=9  begin exec(@sql1 + @sql2+@sql3 + @sql4  + @sql5+ @sql6+ @sql7 + @sql8 + @sql9end  
        
if @n=10  begin exec(@sql1 + @sql2+@sql3 + @sql4  + @sql5+ @sql6+ @sql7 + @sql8 + @sql8 + @sql10end  
         
print @sql1 + @sql2+@sql3 + @sql4  + @sql5+ @sql6+ @sql7 + @sql8 + @sql8 + @sql10
        
if exists(select 1 from tempdb..sysobjects where id=object_id('tempdb..##result'))
        
drop table ##result
        
select * into ##result from #tempresult  
     
drop table #tempresult  
 
end  
/************************************************/
--if exists(select 1 from sysobjects where id=object_id('DecryptObject1'))
--
drop proc DecryptObject1

GO
SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO