WITH ENCRYPTION 選項將模組定義加密儲存於 syscomments.ctext。本預存程序利用 XOR 運算特性反推原始碼。
原始碼 XOR 偽裝碼 = 加密碼
→ 原始碼 = 加密碼 XOR 偽裝碼
步驟:
@OrigSpText1)@OrigSpText2,全 '-')@OrigSpText3)原始 = 加密 XOR (偽裝 XOR 偽裝加密)WITH ENCRYPTION 關鍵字,重建物件CREATE PROCEDURE sp_decrypt_sp (@objectName VARCHAR(50))
AS
DECLARE @OrigSpText1 NVARCHAR(4000), @OrigSpText2 NVARCHAR(4000),
@OrigSpText3 NVARCHAR(4000), @resultsp NVARCHAR(4000)
DECLARE @i INT, @t BIGINT
-- 1. 取得加密內容
SET @OrigSpText1 = (SELECT ctext FROM syscomments WHERE id = OBJECT_ID(@objectName))
-- 2. 建立偽裝物件 (全 '-')
SET @OrigSpText2 = 'ALTER PROCEDURE ' + @objectName + ' WITH ENCRYPTION AS ' + REPLICATE('-', 3938)
EXECUTE (@OrigSpText2)
-- 3. 取得偽裝物件加密內容
SET @OrigSpText3 = (SELECT ctext FROM syscomments WHERE id = OBJECT_ID(@objectName))
-- 4. 建立還原用偽裝建立腳本
SET @OrigSpText2 = 'CREATE PROCEDURE ' + @objectName + ' WITH ENCRYPTION AS ' + REPLICATE('-', 4000-62)
-- 5. XOR 解密迴圈
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
-- 6. 移除原物件、去除加密標記、重建
EXECUTE ('DROP PROCEDURE ' + @objectName)
SET @resultsp = REPLACE(@resultsp, 'WITH ENCRYPTION', '')
SET @resultsp = REPLACE(@resultsp, 'With Encryption', '')
SET @resultsp = REPLACE(@resultsp, 'with encryption', '')
EXECUTE (@resultsp)
GO
輸入參數增加 @objectType CHAR(1) ('P'/'V'/'T'),動態建構 CREATE/ALTER 陳述句,其餘邏輯相同。
sp_helptext 備份