zoukankan      html  css  js  c++  java
  • SQL2000 2005 破解函数,过程,触发器,视图

     --破解函数,过程,触发器,视图.仅限于SQLSERVER2000   
        
      
    --作者:J9988--  
      --调用示例   
        
      
    --解密指定存储过程   
      exec   sp_decrypt   'AppSP_test'   
        
      
    --对所有的存储过程解密   
      declare   tb   cursor   for   
      
    select   name   from   sysobjects   where   xtype='P'   and   status>0   
        
      
    declare   @name   sysname   
      
    open   tb   
      
    fetch   next   from   tb   into   @name   
      
    while   @@fetch_status=0   
      
    begin   
      
    print   '-------存储过程   ['+@name+']   -----------'   

      
    exec   sp_decrypt   @name   
      
    fetch   next   from   tb   into   @name   
      
    end  
     
      
    close   tb  --关闭游标  
      deallocate   tb   --删除游标 
     
        
      
    if   exists   (select * from  dbo.sysobjects where id=object_id(N'[dbo].[sp_decrypt]'and  OBJECTPROPERTY(id,N'IsProcedure'=1)   
      
    drop procedure [dbo].[sp_decrypt]   
      
    GO   
        
      
    CREATE  PROCEDURE sp_decrypt(@objectName   varchar(50))   
      
    AS   
      
    begin   
      
    set   nocount   on   
      
    --CSDN:j9988   copyright:2004.04.15     
      --V3.1     
      --破解字节不受限制,适用于SQLSERVER2000存储过程,函数,视图,触发器   
      --修正上一版视图触发器不能正确解密错误   
      --发现有错,请E_MAIL:CSDNj9988@tom.com   
      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 

     

     

     

     

    sql2005破解
    1.使用 DAC 与服务器连接 
    在 SQL Server Management Studio 中,不打开其他 DAC,单击工具栏上的“数据库引擎查询”。 
    在“连接到数据库引擎”对话框的“服务器名称”框中,键入 ADMIN:,并在其后继续键入服务器实例的名称。例如,若要连接到名为 ACCT\PAYABLE 的服务器实例,请键入 ADMIN:ACCT\PAYABLE。
    完成“身份验证”部分(提供 sysadmin 组成员的凭据),然后单击“连接”。将建立连接。

    2.--DAC设置可以连接,

    0 - 指明仅允许本地连接使用 DAC 
    1 - 指明允许远程连接使用 DAC
    sp_configure 
    'remote admin connections'1;
    GO
    RECONFIGURE;
    GO 

    在STUDIO DAC模试下执行或在sqlcmd 
    --o c:\1.txt模式下执行,输出文件 

    DECLARE @return_value int

    EXEC @return_value = [dbo].[sp__windbi$decryptb]
      
    @procedure = testencry,
      
    @revfl = 0

    SELECT 'Return Value' = @return_value 

    GO

    解密存储过程如下:

     
    view plaincopy to clipboardprint?
         
    Create PROCEDURE [dbo].[sp_undecrypt]     
    (
    @procedure sysname = NULL@revfl int = 1)     
    AS     
    /**//*    
    王成辉翻译整理,转贴请注明出自微软BI开拓者www.windbi.com    
    调用形式为:    
    exec dbo.sp__windbi$decrypt @procedure,0    
    如果第二个参数使用1的话,会给出该存储过程的一些提示。    
    --版本4.0  修正存储过程过长解密出来是空白的问题    
    */     
    SET NOCOUNT ON     
    IF @revfl = 1     
    BEGIN     
    PRINT '警告:该存储过程会删除并重建原始的存储过程。'     
    PRINT ' 在运行该存储过程之前确保你的数据库有一个备份。'     
    PRINT ' 该存储过程通常应该运行在产品环境的一个备份的非产品环境下。'     
    PRINT ' 为了运行这个存储过程,将参数@refl的值更改为0。'     
    RETURN 0     
    END     
    DECLARE @intProcSpace bigint@t bigint@maxColID smallint,@procNameLength int     
    select @maxColID = max(subobjid) FROM     
    sys.sysobjvalues 
    WHERE objid = object_id(@procedure)     
    --select @maxColID as 'Rows in sys.sysobjvalues'     
    select @procNameLength = datalength(@procedure+ 29     
    DECLARE @real_01 nvarchar(max)     
    DECLARE @fake_01 nvarchar(max)     
    DECLARE @fake_encrypt_01 nvarchar(max)     
    DECLARE @real_decrypt_01 nvarchar(max),@real_decrypt_01a nvarchar(max)     
    declare @objtype varchar(2),@ParentName nvarchar(max)     
    select @real_decrypt_01a = ''     
    --提取对象的类型如是存储过程还是函数,如果是触发器,还要得到其父对象的名称     
    select @objtype=type,@parentname=object_name(parent_object_id)     
    from sys.objects where [object_id]=object_id(@procedure)     
    -- 从sys.sysobjvalues里提出加密的imageval记录     
    SET @real_01=(SELECT top 1 imageval FROM sys.sysobjvalues WHERE objid =     
    object_id(@procedureand valclass = 1 order by subobjid)     
         
    --创建一个临时表     
    create table #output ( [ident] [int] IDENTITY (11NOT NULL ,     
    [real_decrypt] NVARCHAR(MAX) )     
    --开始一个事务,稍后回滚     
    BEGIN TRAN     
    --更改原始的存储过程,用短横线替换     
    if @objtype='P'     
      
    SET @fake_01='ALTER PROCEDURE '+ @procedure +' WITH ENCRYPTION AS select 1     
      /**//*
    '+REPLICATE(cast('*'as nvarchar(max)), datalength(@real_01/2 - @procNameLength)+'*/'     
    else if @objtype='FN'     
      
    SET @fake_01='ALTER FUNCTION '+ @procedure +'() RETURNS INT WITH ENCRYPTION AS BEGIN RETURN 1     
      /**//*
    '+REPLICATE(cast('*'as nvarchar(max)), datalength(@real_01/2 - @procNameLength)+'*/ END'     
    else if @objtype='V'     
      
    SET @fake_01='ALTER view '+ @procedure +' WITH ENCRYPTION AS select 1 as col     
      /**//*
    '+REPLICATE(cast('*'as nvarchar(max)), datalength(@real_01/2 - @procNameLength)+'*/'     
    else if @objtype='TR'     
      
    SET @fake_01='ALTER trigger '+ @procedure +' ON '+@parentname+'WITH ENCRYPTION AFTER INSERT AS RAISERROR (''N'',16,10)     
      /**//*
    '+REPLICATE(cast('*'as nvarchar(max)), datalength(@real_01/2 - @procNameLength)+'*/'     
    EXECUTE (@fake_01)     
    --从sys.sysobjvalues里提出加密的假的     
    SET @fake_encrypt_01=(SELECT top 1 imageval FROM sys.sysobjvalues WHERE objid =     
    object_id(@procedureand valclass = 1 order by subobjid )     
    if @objtype='P'     
      
    SET @fake_01='Create PROCEDURE '+ @procedure +' WITH ENCRYPTION AS select 1     
      /**//*
    '+REPLICATE(cast('*'as nvarchar(max)), datalength(@real_01/2 - @procNameLength)+'*/'     
    else if @objtype='FN'     
      
    SET @fake_01='CREATE FUNCTION '+ @procedure +'() RETURNS INT WITH ENCRYPTION AS BEGIN RETURN 1     
      /**//*
    '+REPLICATE(cast('*'as nvarchar(max)), datalength(@real_01/2 - @procNameLength)+'*/ END'     
    else if @objtype='V'     
      
    SET @fake_01='Create view '+ @procedure +' WITH ENCRYPTION AS select 1 as col     
      /**//*
    '+REPLICATE(cast('*'as nvarchar(max)), datalength(@real_01/2 - @procNameLength)+'*/'     
    else if @objtype='TR'     
      
    SET @fake_01='Create trigger '+ @procedure +' ON '+@parentname+'WITH ENCRYPTION AFTER INSERT AS RAISERROR (''N'',16,10)     
      /**//*
    '+REPLICATE(cast('*'as nvarchar(max)), datalength(@real_01/2 - @procNameLength)+'*/'     
    --开始计数     
    SET @intProcSpace=1     
    --使用字符填充临时变量     
    SET @real_decrypt_01 = replicate(cast('A'as nvarchar(max)), (datalength(@real_01/2 ))     
    --循环设置每一个变量,创建真正的变量     
    --
    每次一个字节     
    SET @intProcSpace=1     
    --如有必要,遍历每个@real_xx变量并解密     
    WHILE @intProcSpace<=(datalength(@real_01)/2)     
    BEGIN     
    --真的和假的和加密的假的进行异或处理     
    SET @real_decrypt_01 = stuff(@real_decrypt_01@intProcSpace1,     
    NCHAR(UNICODE(substring(@real_01@intProcSpace1)) ^     
    (
    UNICODE(substring(@fake_01@intProcSpace1)) ^     
    UNICODE(substring(@fake_encrypt_01@intProcSpace1)))))     
    SET @intProcSpace=@intProcSpace+1     
    END     
         
         
    --通过sp_helptext逻辑向表#output里插入变量     
    insert #output (real_decrypt) select @real_decrypt_01     
    --select real_decrypt AS '#output chek' from #output --测试     
    --
     -------------------------------------     
    --
    开始从sp_helptext提取     
    --
     -------------------------------------     
    declare @dbname sysname     
    ,
    @BlankSpaceAdded int     
    ,
    @BasePos int     
    ,
    @CurrentPos int     
    ,
    @TextLength int     
    ,
    @LineId int     
    ,
    @AddOnLen int     
    ,
    @LFCR int --回车换行的长度     
    ,@DefinedLength int     
    ,
    @SyscomText nvarchar(max)     
    ,
    @Line nvarchar(255)     
    Select @DefinedLength = 255     
    SELECT @BlankSpaceAdded = 0 --跟踪行结束的空格。注意Len函数忽略了多余的空格     
    CREATE TABLE #CommentText     
    (LineId 
    int     
    ,
    Text nvarchar(255) collate database_default)     
    --使用#output代替sys.sysobjvalues     
    DECLARE ms_crs_syscom CURSOR LOCAL     
    FOR SELECT real_decrypt from #output     
    ORDER BY ident     
    FOR READ ONLY     
    --获取文本     
    SELECT @LFCR = 2     
    SELECT @LineId = 1     
    OPEN ms_crs_syscom     
    FETCH NEXT FROM ms_crs_syscom into @SyscomText     
    WHILE @@fetch_status >= 0     
    BEGIN     
    SELECT @BasePos = 1     
    SELECT @CurrentPos = 1     
    SELECT @TextLength = LEN(@SyscomText)     
    WHILE @CurrentPos != 0     
    BEGIN     
    --通过回车查找行的结束     
    SELECT @CurrentPos = CHARINDEX(char(13)+char(10), @SyscomText,     
    @BasePos)     
    --如果找到回车     
    IF @CurrentPos != 0     
    BEGIN     
    --如果@Lines的长度的新值比设置的大就插入@Lines目前的内容并继续     
    While (isnull(LEN(@Line),0+ @BlankSpaceAdded +     
    @CurrentPos-@BasePos + @LFCR> @DefinedLength     
    BEGIN     
    SELECT @AddOnLen = @DefinedLength-(isnull(LEN(@Line),0+     
    @BlankSpaceAdded)     
    INSERT #CommentText VALUES     
    @LineId,     
    isnull(@Line, N''+ isnull(SUBSTRING(@SyscomText,     
    @BasePos@AddOnLen), N''))     
    SELECT @Line = NULL@LineId = @LineId + 1,     
    @BasePos = @BasePos + @AddOnLen@BlankSpaceAdded = 0     
    END     
    SELECT @Line = isnull(@Line, N''+     
    isnull(SUBSTRING(@SyscomText@BasePos@CurrentPos-@BasePos + @LFCR), N'')     
    SELECT @BasePos = @CurrentPos+2     
    INSERT #CommentText VALUES@LineId@Line )     
    SELECT @LineId = @LineId + 1     
    SELECT @Line = NULL     
    END     
    ELSE     
    --如果回车没找到     
    BEGIN     
    IF @BasePos <= @TextLength     
    BEGIN     
    --如果@Lines长度的新值大于定义的长度     
    While (isnull(LEN(@Line),0+ @BlankSpaceAdded +     
    @TextLength-@BasePos+1 ) > @DefinedLength     
    BEGIN     
    SELECT @AddOnLen = @DefinedLength -     
    (
    isnull(LEN(@Line),0+ @BlankSpaceAdded)     
    INSERT #CommentText VALUES     
    @LineId,     
    isnull(@Line, N''+ isnull(SUBSTRING(@SyscomText,     
    @BasePos@AddOnLen), N''))     
    SELECT @Line = NULL@LineId = @LineId + 1,     
    @BasePos = @BasePos + @AddOnLen@BlankSpaceAdded =     
    0     
    END     
    SELECT @Line = isnull(@Line, N''+     
    isnull(SUBSTRING(@SyscomText@BasePos@TextLength-@BasePos+1 ), N'')     
    if LEN(@Line< @DefinedLength and charindex(' ',     
    @SyscomText@TextLength+1 ) > 0     
    BEGIN     
    SELECT @Line = @Line + ' '@BlankSpaceAdded = 1     
    END     
    END     
    END     
    END     
    FETCH NEXT FROM ms_crs_syscom into @SyscomText     
    END     
    IF @Line is NOT NULL     
    INSERT #CommentText VALUES@LineId@Line )     
    select Text from #CommentText order by LineId     
    CLOSE ms_crs_syscom     
    DEALLOCATE ms_crs_syscom     
    DROP TABLE #CommentText     
    -- -------------------------------------     
    --
    结束从sp_helptext提取     
    --
     -------------------------------------     
    --
    删除用短横线创建的存储过程并重建原始的存储过程     
    ROLLBACK TRAN     
    DROP TABLE #output  


    本文来自CSDN博客,转载请标明出处:http:
    //blog.csdn.net/friendliu/archive/2010/04/13/5481461.aspx


  • 相关阅读:
    ORACLE 查看进程数,已执行任务数, 剩余任务数,删除指定任务
    ORACLE 收集统计整个用户数据
    解决Hystrix dashboard Turbine 一直 Loading…… 及其他坑
    利用 Maven 构造 Spring Cloud 微服务架构 模块使用 spring Boot构建
    AES加解密
    JAVA POI XSSFWorkbook导出扩展名为xlsx的Excel,附带weblogic 项目导出Excel文件错误的解决方案
    JAVA 文件的上传下载
    shell启停服务脚本模板
    JAVA 设计模式之 原型模式详解
    JAVA 设计模式之 工厂模式详解
  • 原文地址:https://www.cnblogs.com/zengxiangzhan/p/1565387.html
Copyright © 2011-2022 走看看