• <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)  編輯 收藏 引用

            久久香蕉一级毛片| 国产精品日韩深夜福利久久| 久久精品国产精品青草app| 少妇高潮惨叫久久久久久| 色8激情欧美成人久久综合电| 97久久国产亚洲精品超碰热| 亚洲AV无码一区东京热久久| 人妻无码αv中文字幕久久琪琪布| 国内精品久久久久久久久电影网| 亚洲嫩草影院久久精品| 欧美精品一区二区精品久久| 国产精品久久久久久久久| 精品久久久久久久无码| 东京热TOKYO综合久久精品| 久久婷婷激情综合色综合俺也去| 色偷偷88888欧美精品久久久| 色综合久久久久综合体桃花网| 亚洲国产精品久久久天堂| 久久精品无码专区免费青青| 久久久老熟女一区二区三区| 久久久久四虎国产精品| 品成人欧美大片久久国产欧美| 国内精品欧美久久精品| 天天做夜夜做久久做狠狠| 久久婷婷色香五月综合激情| 国产精品99久久久精品无码| 亚洲欧美伊人久久综合一区二区| 亚洲精品国产字幕久久不卡| 国产精品一区二区久久不卡| 久久噜噜电影你懂的| 蜜桃麻豆www久久国产精品| 无码人妻久久一区二区三区蜜桃| 无码专区久久综合久中文字幕| 大伊人青草狠狠久久| 久久久久国产一级毛片高清板| 偷偷做久久久久网站| 久久最新精品国产| 四虎国产精品成人免费久久| 精品久久久久久国产91| 久久久久久国产精品美女| 久久久久高潮毛片免费全部播放|