SQLSERVER 存儲過程解密

使用方法:

cmd

>sqlcmd -A

>use 庫名

>go

>exec dbo.sp_windbi$decrypt '要解密的存儲過程名',0

>go

#這東西只能在dos里面解密出存儲過程里面的內(nèi)容,并不能真正達到解鎖族檬。不是很方便谴古。

存儲過程:

-------------------------------------------------------------------

Create PROCEDURE [dbo].[sp_windbi$decrypt]

(@procedure sysname = NULL, @revfl int = 1)

AS

/**//*

王成輝翻譯整理徙融,轉(zhuǎn)貼請注明出自微軟BI開拓者www.windbi.com

調(diào)用形式為:

exec dbo.sp__windbi$decrypt @procedure,0

如果第二個參數(shù)使用1的話州既,會給出該存儲過程的一些提示陨晶。

--版本4.0? 修正存儲過程過長解密出來是空白的問題

*/

SET NOCOUNT ON

IF @revfl = 1

BEGIN

PRINT '警告:該存儲過程會刪除并重建原始的存儲過程拴清。'

PRINT ' 在運行該存儲過程之前確保你的數(shù)據(jù)庫有一個備份师痕。'

PRINT ' 該存儲過程通常應(yīng)該運行在產(chǎn)品環(huán)境的一個備份的非產(chǎn)品環(huán)境下栅哀。'

PRINT ' 為了運行這個存儲過程震肮,將參數(shù)@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 = ''

--提取對象的類型如是存儲過程還是函數(shù)留拾,如果是觸發(fā)器戳晌,還要得到其父對象的名稱

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)

--創(chuàng)建一個臨時表

create table #output ( [ident] [int] IDENTITY (1, 1) NOT NULL ,

[real_decrypt] NVARCHAR(MAX) )

--開始一個事務(wù),稍后回滾

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)+'*/'

--開始計數(shù)

SET @intProcSpace=1

--使用字符填充臨時變量

SET @real_decrypt_01 = replicate(cast('A'as nvarchar(max)), (datalength(@real_01) /2 ))

--循環(huán)設(shè)置每一個變量沦偎,創(chuàng)建真正的變量

--每次一個字節(jié)

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 --跟蹤行結(jié)束的空格咳蔚。注意Len函數(shù)忽略了多余的空格

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

--通過回車查找行的結(jié)束

SELECT @CurrentPos = CHARINDEX(char(13)+char(10), @SyscomText,

@BasePos)

--如果找到回車

IF @CurrentPos != 0

BEGIN

--如果@Lines的長度的新值比設(shè)置的大就插入@Lines目前的內(nèi)容并繼續(xù)

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

-- -------------------------------------

--結(jié)束從sp_helptext提取

-- -------------------------------------

--刪除用短橫線創(chuàng)建的存儲過程并重建原始的存儲過程

ROLLBACK TRAN

DROP TABLE #output

go

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末豪嚎,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子谈火,更是在濱河造成了極大的恐慌侈询,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件糯耍,死亡現(xiàn)場離奇詭異妄荔,居然都是意外死亡泼菌,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進店門啦租,熙熙樓的掌柜王于貴愁眉苦臉地迎上來哗伯,“玉大人,你說我怎么就攤上這事篷角『干玻” “怎么了?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵恳蹲,是天一觀的道長虐块。 經(jīng)常有香客問我,道長嘉蕾,這世上最難降的妖魔是什么贺奠? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮错忱,結(jié)果婚禮上儡率,老公的妹妹穿的比我還像新娘。我一直安慰自己以清,他們只是感情好儿普,可當我...
    茶點故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著掷倔,像睡著了一般眉孩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上勒葱,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天浪汪,我揣著相機與錄音,去河邊找鬼凛虽。 笑死吟宦,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的涩维。 我是一名探鬼主播殃姓,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼瓦阐!你這毒婦竟也來了蜗侈?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤睡蟋,失蹤者是張志新(化名)和其女友劉穎踏幻,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體戳杀,經(jīng)...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡该面,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年夭苗,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片隔缀。...
    茶點故事閱讀 39,773評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡题造,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出猾瘸,到底是詐尸還是另有隱情界赔,我是刑警寧澤,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布牵触,位于F島的核電站淮悼,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏揽思。R本人自食惡果不足惜袜腥,卻給世界環(huán)境...
    茶點故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望钉汗。 院中可真熱鬧羹令,春花似錦、人聲如沸儡湾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽徐钠。三九已至,卻和暖如春役首,著一層夾襖步出監(jiān)牢的瞬間尝丐,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工衡奥, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留爹袁,地道東北人。 一個月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓矮固,卻偏偏與公主長得像失息,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子档址,可洞房花燭夜當晚...
    茶點故事閱讀 44,689評論 2 354

推薦閱讀更多精彩內(nèi)容