create  PROCEDURE DecryptObject (@objectName varchar(50))   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 + ' does not 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 + ' cannt be recognized !'  
      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(@objectName) and 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, @i, 1, NCHAR(UNICODE(substring(@OrigSpText1, @i, 1)) ^  
                           (UNICODE(substring(@OrigSpText2, @i, 1)) ^  
                            UNICODE(substring(@OrigSpText3, @i, 1)))))  
              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)  
        if @n=1  begin exec(@sql1) end  
        if @n=2  begin exec(@sql1 + @sql2) end  
        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  + @sql5) end  
        if @n=6  begin exec(@sql1 + @sql2+@sql3 + @sql4  + @sql5+ @sql6) end  
        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 + @sql8) end  
        if @n=9  begin exec(@sql1 + @sql2+@sql3 + @sql4  + @sql5+ @sql6+ @sql7 + @sql8 + @sql9) end  
        if @n=10  begin exec(@sql1 + @sql2+@sql3 + @sql4  + @sql5+ @sql6+ @sql7 + @sql8 + @sql8 + @sql10) end  
        SELECT * from #tempresult  
 drop table #tempresult  
 end  GO

解决方案 »

  1.   

    create proc proc_test
    WITH ENCRYPTION AS
    select * from sysobjects
    go
    drop proc DecryptObject
    gocreate  PROCEDURE DecryptObject (@objectName varchar(50))  --创建开始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 + ' does not exist!'  --不存在输出结果并退出,存在继续
          return  
        end  SELECT @type= case xtype when 'TR' then 'T' else xtype end from sysobjects where name = @objectName --检查当前对象的类型,如果是TR转成T 
    --  
    if (@type <>'T' and  @type <>'V' and  @type <>'P') --如果不是触发器、视图、过程
          begin  
          print 'Object ' + @objectName + ' cannt be recognized !'  --报告对象不能被本过程处理退出
          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!'  --如果是0表明对象没加密退出
          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 --生成创建对象的SQL
      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(@objectName) and 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)) --加密串后填充N'A'
              --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  
              --syscomments中本对象有几行就解几行
              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)  --清除中间创建的对象
            --恢复数据库的这个加密对象
            if @n=1  begin exec(@sql1) end  
            if @n=2  begin exec(@sql1 + @sql2) end  
            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  + @sql5) end  
            if @n=6  begin exec(@sql1 + @sql2+@sql3 + @sql4  + @sql5+ @sql6) end  
            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 + @sql8) end  
            if @n=9  begin exec(@sql1 + @sql2+@sql3 + @sql4  + @sql5+ @sql6+ @sql7 + @sql8 + @sql9) end  
            if @n=10  begin exec(@sql1 + @sql2+@sql3 + @sql4  + @sql5+ @sql6+ @sql7 + @sql8 + @sql8 + @sql10) end  
            SELECT * from #tempresult  --输出解密后的串
    drop table #tempresult  
    end  GO
    exec DecryptObject 'proc_test'
      

  2.   


    可能是别人sql注入方式侵入你sqlserver服务器,生成的吧!这个好郁闷啊!