SQL2008,SQL2005存儲過程解密

SQL2008,SQL2005存儲過程解密
下載:附件
SQL2008,SQL2005存儲過程解密

第一步操作步驟:'程序'->'Sql Server2005'-> '配置工具'-> 'Sql Server 外圍應用配置器'-> '功能的外圍應用配置器'-> 'DataBase Engine'-> 'DAC' -> '啟用遠程DAC'



第二步:啟動SQL Server Browser 服務





第三部使用DAC模式登陸(關鍵就在這個地方)
1 登陸SQL Server Management Studio





2,新建查詢,在彈出的連接對話框中,服務器名稱改為 ADMIN:服務器名稱;然后,選項->連接屬性->連接到數據庫 改為加密存儲過程所在的數據庫->連接即可.(只能有一個查詢界面)










3 創建存儲過程 sp_windbi$decrypt (下文)

4 執行 exec sp_windbi$Decrypt '你要解密的存儲過程名',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(@procedure) and valclass = 1 order by subobjid)

--創建一個臨時表
create table #output ( [ident] [int] IDENTITY (1, 1) NOT 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(@procedure) and 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, @intProcSpace, 1,
NCHAR(UNICODE(substring(@real_01, @intProcSpace, 1)) ^
(UNICODE(substring(@fake_01, @intProcSpace, 1)) ^
UNICODE(substring(@fake_encrypt_01, @intProcSpace, 1)))))
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





posted on 2011-11-17 21:10 Fanr_Zh 閱讀(...) 評論(...) 編輯 收藏

轉載于:https://www.cnblogs.com/Amaranthus/archive/2011/11/17/2253151.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/377997.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/377997.shtml
英文地址,請注明出處:http://en.pswp.cn/news/377997.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

LeetCode 257. 二叉樹的所有路徑 思考分析

目錄題目思路一&#xff1a;深度遞歸思路二&#xff1a;廣度迭代關于回溯題目 給定一個二叉樹&#xff0c;返回所有從根節點到葉子節點的路徑。 說明: 葉子節點是指沒有子節點的節點。 示例: 輸入: 輸出: [“1->2->5”, “1->3”] 解釋: 所有根節點到葉子節點的路…

自定義django的Template context processors

簡要步驟&#xff1a; 1.編輯一個函數: def media_url(request):from django.conf import settingsreturn {media_url: settings.MEDIA_URL}2.配置settings&#xff1a; TEMPLATE_CONTEXT_PROCESSORS (myapp.context_processors.media_url,) 3.確保幾點&#xff1a; 1&#xf…

十四、Canny邊緣提取

一、算法步驟 1&#xff0c;對圖像進行GaussianBlur(高斯模糊)消除一些噪聲 2&#xff0c;對圖像進行灰度轉換cvtColor 3&#xff0c;計算梯度Sobel/Scharr 4&#xff0c;非最大信號抑制 5&#xff0c;高低閾值輸出二值圖像 設定兩個閾值T1和T2&#xff0c;凡是高于T2的都保…

scanner close_Java Scanner close()方法與示例

scanner close掃描器類close()方法 (Scanner Class close() method) close() method is available in java.util package. close()方法在java.util包中可用。 close() method is used to close this Scanner object when opened otherwise this method does not affect. 當打開…

flex3.0中打包的方法swc

flex3.0中打包的方法&#xff1a; 1. 新建一個 flex library project 2. 彈出的對話框 點 next ,在Classes下&#xff0c;找到Main source folder 點瀏覽 3. 選擇你新建的文件夾 點 new 然后點擊 OK 4. 這個時候 Classes 下多了個src 文件夾&#xff0c;打開源文件夾&#xf…

Java Hashtable get()方法與示例

哈希表類的get()方法 (Hashtable Class get() method) get() method is available in java.util package. get()方法在java.util包中可用。 get() method is used to return the value associated with the given key element (key_ele) in this Hashtable. get()方法用于返回與…

圖解PCB布線數字地、模擬地、電源地,單點接地抗干擾!

我們在進行pcb布線時總會面臨一塊板上有兩種、三種地的情況&#xff0c;傻瓜式的做法當然是不管三七二十一&#xff0c;只要是地 就整塊敷銅了。這種對于低速板或者對干擾不敏感的板子來講還是沒問題的&#xff0c;否則可能導致板子就沒法正常工作了。當然若碰到一塊板子上有多…

十五、霍夫直線檢測

一、自定義 import cv2 import numpy as np from matplotlib import pyplot as pltdef line_detection(image):gray cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)edges cv2.Canny(gray,50,150,apertureSize3)lines cv2.HoughLines(edges,1,np.pi/180,200)for line in lines:rho…

xred520

Option ExplicitResponse.BufferTrueServer.ScriptTimeOut90 腳本超時時間(單位:秒)Session.Timeout60 Session過期時間(單位:分鐘)Response.Expires-1 Sub DataConn() On Error Resume Next Dim strConn If isSQL0 Then ACCESS數據庫 If EnableDataBaseCache 1 Then ACCESS數…

【C++ grammar】對象指針、對象數組、函數參數

目錄1、Object Pointer & Dynamic Object1. Accessing Object Members via Pointers2. Creating Dynamic Objects on Heap2、Array of Objects聲明方式3、Passing Objects to Functions1、Objects as Function Arguments (對象作為函數參數)2. Objects as Function Return …

Java Date toString()方法與示例

日期類toString()方法 (Date Class toString() method) toString() method is available in java.util package. toString()方法在java.util包中可用。 toString() method is for string denotation of this Date object or in other words we can say it denotes date in a st…

十六、霍夫圓形檢測

一、獲取圓形檢測原理 原圖如下&#xff1a; 選取一個圓的任意點設定為圓形進行繪制圓形&#xff0c;交與一點 再將平面直角坐標系上的各點&#xff0c;通過公式轉到極坐標上 很明顯的看出較亮的點為圓心&#xff0c;然后通過半徑進行繪制出圓。 二、實現步驟 由于霍夫圓檢…

商務智能與交易系統的區別

商務智能與交易系統的區別 1、系統設計的區別 商務智能與交易系統之間的差異主要體現在系統設計和數據類型上&#xff08;見表 1.1 和表1.2&#xff09;。交易系統把結構強加于商務之上&#xff0c;不管誰來進行一項交易活動&#xff0c; 都會遵循同樣的程序和規則&#xff0c;…

LeetCode 572. 另一個樹的子樹 思考分析

題目 給定兩個非空二叉樹 s 和 t&#xff0c;檢驗 s 中是否包含和 t 具有相同結構和節點值的子樹。s 的一個子樹包括 s 的一個節點和這個節點的所有子孫。s 也可以看做它自身的一棵子樹。 示例 1: 給定的樹 s: 示例 2: 給定的樹 s: 思路 思路&#xff1a;首先層序遍歷s樹…

2013.8.7Java語言基礎——數組

數組是數據類型一致的變量的集合。 一個&#xff1a;變量 一堆&#xff08;多個&#xff09;&#xff1a;數組 數組語法&#xff1a; 1&#xff09;數組變量&#xff08;引用類型變量&#xff09; 數組變量通過引用地址引用了數組&#xff08;數組對象&#xff09; 2&#xff0…

ruby array_Ruby中帶有示例的Array.select方法

ruby arrayArray.select方法 (Array.select Method) In the last articles, we have seen how to iterate over the instances of Array class? We have seen that we have got methods like Array.each, Array.reverse_each and Array.map for this purpose. In this article…

十七、輪廓發現

一、輪廓發現原理 輪廓發現是在圖像邊緣提取的基礎上尋找對象輪廓的方法&#xff0c;故邊緣提取的閾值的選定會影響到最終輪廓發現的結果。 其本質是基于二值圖像的&#xff0c;邊緣提取常用Canny進行提取邊緣 輪廓發現也是基于拓撲結構&#xff0c;掃描連通圖&#xff0c;最后…

關于 WebRequest.RegisterPrefix

RegisterPrefix 方法將 WebRequest 子代注冊到服務請求。 WebRequest 后代通常被注冊來處理特定的協議&#xff08;例如 HTTP 或 FTP&#xff09;&#xff0c;但也可能被注冊來處理對特定服務器或服務器上的路徑的請求。 已注冊的預注冊保留類型包括下列類型&#xff1a; htt…

LeetCode 404. 左葉子之和思考分析

題目 計算給定二叉樹的所有左葉子之和。 如果是下面的樹&#xff0c;只有一個左葉子結點4 思考分析 由此我們可以得到左葉子結點的定義&#xff1a; cur->left !NULL && cur->left->leftNULL && cur->left->rightNULL 遞歸遍歷累積操作 …

天王蓋地虎

1&#xff0c;求有序數列中某個元素的個數 思想&#xff1a;二分找上下界&#xff1a; int element_count(int * set, int len, int e) {int f, a, b, t;for(a 0, b len - 1; a < b; set[t a b >> 1] < e ? (a t 1) : (b t - 1));for(f a, b len - 1; a…