• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            牽著老婆滿街逛

            嚴以律己,寬以待人. 三思而后行.
            GMail/GTalk: yanglinbo#google.com;
            MSN/Email: tx7do#yahoo.com.cn;
            QQ: 3 0 3 3 9 6 9 2 0 .

            破解SQL2005(SQL2008)的存儲過程的存儲過程

            轉載自:http://www.cnblogs.com/amaoxp/archive/2009/06/08/1499038.html

            問題一: DAC連接問題

            自己嘗試了n次,最后總結一下連接步驟:

            1 先用有sysadmin角色的用戶登陸SQL Server Management Studio;

            2 在工具欄上選數據庫引擎查詢;服務器名稱改為 ADMIN:服務器名稱 ;選項>連接屬性>連接到數據庫 改為加密存儲過程所在的數據庫;連接

            3 運行解密的存儲過程;

            問題二: 可用的存儲過程解密代碼

            SQLServer2005里怎樣對使用with encryption選項創建的存儲過程解密

            --王成輝翻譯整理,轉貼請注明出自微軟BI開拓者www.windbi.com
            --原帖地址

            SQLServer2005里使用with encryption選項創建的存儲過程仍然和sqlserver2000里一樣,都是使用XOR進行了的加密。和2000不一樣的是,在2005的系統表syscomments里已經查不到加密過的密文了。要查密文必須使用DAC(專用管理員連接)連接到數據庫后,在系統表sys.sysobjvalues查詢,該表的列imageval存儲了相應的密文。具體可以使用下面的查詢:

            SELECT imageval FROM sys.sysobjvalues WHERE objid = object_id(@procedure) AND 
            valclass = 1 AND subobjid = 1

            下面是解密的存儲過程,具體代碼如下(這是版本4.0,最新的,修正很長的存儲過程解密出來是空白的問題):


            Create PROCEDURE [dbo].[sp__windbi$decrypt]
            (
            @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
            go


            ALTER PROCEDURE [dbo].[sp__windbi$decrypt]
            (
            @procedure sysname = NULL@revfl int = 1)
            AS
            /*
            王成輝翻譯整理,轉貼請注明出自微軟BI開拓者www.windbi.com
            目前這個存儲過程只能解密存儲過程,至于解密函數、觸發器、視圖的存儲過程本網站會進一步關注,調用形式為:
            exec dbo.sp__windbi$decrypt @procedure,0
            如果第二個參數使用1的話,會給出該存儲過程的一些提示。
            --版本2.0
            */

            SET NOCOUNT ON
            IF @revfl = 1
            BEGIN
            PRINT '警告:該存儲過程會刪除并重建原始的存儲過程。'
            PRINT ' 在運行該存儲過程之前確保你的數據庫有一個備份。'
            PRINT ' 該存儲過程通常應該運行在產品環境的一個備份的非產品環境下。'
            PRINT ' 為了運行這個存儲過程,將參數@refl的值更改為0。'
            RETURN 0
            END
            DECLARE @intProcSpace bigint@t bigint@maxColID smallint,@intEncrypted 
            tinyint,@procNameLength int
            select @maxColID = max(subobjid),@intEncrypted = imageval FROM 
            sys.sysobjvalues 
            WHERE objid = object_id(@procedure)
            GROUP BY imageval
            --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 
              
            '+REPLICATE('-'40003 - @procNameLength)
            else if @objtype='FN'
              
            SET @fake_01='ALTER FUNCTION '+ @procedure +'() RETURNS INT WITH ENCRYPTION AS BEGIN RETURN 1 
              /*
            '+REPLICATE('*'datalength(@real_01/2 - @procNameLength)+'*/ END'
            else if @objtype='V'
              
            SET @fake_01='ALTER view '+ @procedure +' WITH ENCRYPTION AS select 1 as col
              /*
            '+REPLICATE('*'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('*'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 
              
            '+REPLICATE('-'40003 - @procNameLength)
            else if @objtype='FN'
              
            SET @fake_01='CREATE FUNCTION '+ @procedure +'() RETURNS INT WITH ENCRYPTION AS BEGIN RETURN 1 
              /*
            '+REPLICATE('*'datalength(@real_01/2 - @procNameLength)+'*/ END'
            else if @objtype='V'
              
            SET @fake_01='Create view '+ @procedure +' WITH ENCRYPTION AS select 1 as col
              /*
            '+REPLICATE('*'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('*'datalength(@real_01/2 - @procNameLength)+'*/'
            --開始計數
            SET @intProcSpace=1
            --使用字符填充臨時變量
            SET @real_decrypt_01 = replicate(N'A', (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(4000)
            ,
            @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

            posted on 2011-01-29 16:38 楊粼波 閱讀(2808) 評論(0)  編輯 收藏 引用

            人妻无码αv中文字幕久久琪琪布| 久久se精品一区二区| 久久精品亚洲日本波多野结衣| 国内精品伊人久久久久777| 狠狠色丁香婷婷久久综合 | 国产精品国色综合久久| 色欲久久久天天天综合网| 久久亚洲中文字幕精品一区| 欧美日韩成人精品久久久免费看| 欧美久久综合九色综合| 久久久久国产一级毛片高清板| 久久久久久久女国产乱让韩| 久久国产一区二区| 久久这里只精品国产99热| 性做久久久久久久久老女人 | 激情伊人五月天久久综合| 久久精品aⅴ无码中文字字幕不卡 久久精品aⅴ无码中文字字幕重口 | 无码AV波多野结衣久久| 午夜精品久久久久久久久| 久久国产精品99精品国产| 久久精品国产99国产精偷| 激情综合色综合久久综合| 婷婷伊人久久大香线蕉AV| 国产精品久久国产精品99盘| 亚洲成色WWW久久网站| 精品久久久久久久久中文字幕| 久久国产精品二国产精品| 久久久久亚洲AV无码专区首JN | 久久久WWW成人免费毛片| 一日本道伊人久久综合影| 久久99国产精一区二区三区| 国产精品伊人久久伊人电影| 久久精品www| 久久久SS麻豆欧美国产日韩| 青青草国产成人久久91网| 午夜精品久久久久久久久| 久久婷婷色综合一区二区| 免费精品99久久国产综合精品| 亚洲午夜久久久影院| 亚洲伊人久久成综合人影院 | 一本色道久久HEZYO无码|