SQL Server WITH ENCRYPTION 選項僅對 syscomments 文字進行簡單混淆,非真正加密。本文提供完整 sp_decrypt 實作,可還原預存程序、函數、檢視、觸發器原始碼。
syscomments 取得加密文本(ctext)、encrypted、status 欄位。@OrigSpText2)。原始碼 = 加密文本 XOR (標準腳本 XOR 系統儲存原始碼)。status & 2),必要時 UNCOMPRESS。CREATE PROCEDURE sp_decrypt(@objectName VARCHAR(50))
AS
BEGIN
SET NOCOUNT ON;
-- 版本 V3.1 支援 SP、FN、TF、IF、TR、V 且無位元組限制
BEGIN TRAN;
DECLARE @objectname1 VARCHAR(100), @orgvarbin VARBINARY(8000);
DECLARE @sql1 NVARCHAR(4000), @sql2 VARCHAR(8000), @sql3 NVARCHAR(4000), @sql4 NVARCHAR(4000);
DECLARE @OrigSpText1 NVARCHAR(4000), @OrigSpText2 NVARCHAR(4000), @OrigSpText3 NVARCHAR(4000), @resultsp NVARCHAR(4000);
DECLARE @i INT, @status INT, @type VARCHAR(10), @parentid INT;
DECLARE @colid INT, @n INT, @q INT, @j INT, @k INT, @encrypted INT, @number INT;
SELECT @type=xtype, @parentid=parent_obj FROM sysobjects WHERE id=OBJECT_ID(@ObjectName);
CREATE TABLE #temp(number INT, colid INT, ctext VARBINARY(8000), encrypted INT, status INT);
INSERT #temp SELECT number, colid, ctext, encrypted, status FROM syscomments WHERE id=OBJECT_ID(@objectName);
SELECT @number=MAX(number) FROM #temp;
SET @k=0;
WHILE @k <= @number
BEGIN
IF EXISTS(SELECT 1 FROM syscomments WHERE id=OBJECT_ID(@objectname) AND number=@k)
BEGIN
IF @type='P'
SET @sql1 = CASE WHEN @number>1
THEN 'ALTER PROCEDURE '+@objectName+';'+RTRIM(@k)+' WITH ENCRYPTION AS '
ELSE 'ALTER PROCEDURE '+@objectName+' WITH ENCRYPTION AS ' END;
IF @type='TR'
BEGIN
DECLARE @parent_obj VARCHAR(255), @tr_parent_xtype VARCHAR(10);
SELECT @parent_obj=parent_obj FROM sysobjects WHERE id=OBJECT_ID(@objectName);
SELECT @tr_parent_xtype=xtype FROM sysobjects WHERE id=@parent_obj;
IF @tr_parent_xtype='V'
SET @sql1='ALTER TRIGGER '+@objectname+' ON '+OBJECT_NAME(@parentid)+' WITH ENCRYPTION INSTEAD OF INSERT AS PRINT 1 ';
ELSE
SET @sql1='ALTER TRIGGER '+@objectname+' ON '+OBJECT_NAME(@parentid)+' WITH ENCRYPTION FOR INSERT AS PRINT 1 ';
END;
IF @type='FN' OR @type='TF' OR @type='IF'
SET @sql1 = CASE @type
WHEN 'TF' THEN 'ALTER FUNCTION '+@objectName+'(@a CHAR(1)) RETURNS @b TABLE(a VARCHAR(10)) WITH ENCRYPTION AS BEGIN INSERT @b SELECT @a RETURN END '
WHEN 'FN' THEN 'ALTER FUNCTION '+@objectName+'(@a CHAR(1)) RETURNS CHAR(1) WITH ENCRYPTION AS BEGIN RETURN @a END '
WHEN 'IF' THEN 'ALTER FUNCTION '+@objectName+'(@a CHAR(1)) RETURNS TABLE WITH ENCRYPTION AS RETURN SELECT @a AS a ' END;
IF @type='V'
SET @sql1='ALTER VIEW '+@objectname+' WITH ENCRYPTION AS SELECT 1 as f';
SET @q=LEN(@sql1);
SET @sql1=@sql1+REPLICATE('-',4000-@q);
SET @sql2=REPLICATE('-',8000);
SET @sql3='EXEC(@sql1';
SELECT @colid=MAX(colid) FROM #temp WHERE number=@k;
SET @n=1;
WHILE @n <= CEILING(1.0*(@colid-1)/2) AND LEN(@sql3)<=3996
BEGIN
SET @sql3=@sql3+'+@';
SET @n=@n+1;
END;
SET @sql3=@sql3+')';
EXEC sp_executesql @sql3, N'@Sql1 NVARCHAR(4000),@ VARCHAR(8000)', @sql1=@sql1, @=@sql2;
END;
SET @k=@k+1;
END;
SET @k=0;
WHILE @k <= @number
BEGIN
-- 解密迴圈見下篇
...
END;
END;
- 填充)。syscomments,取得 @OrigSpText3(系統儲存的加密後標準腳本)。number、colid 支援超過 4000 字元的大型物件。此技術僅供教學與合法審計用途。**嚴禁用於未授權存取**。生產環境請改用模組簽名、CLR 混淆或原始碼管控保護智慧財產權。
本文揭示 WITH ENCRYPTION 混淆機制,提供完整 sp_decrypt 實作上半部(環境建置、標準腳本重建、觸發系統加密)。下篇將詳細解析 XOR 解密核心迴圈與結果輸出。