承接上篇,解密流程核心在於利用 syscomments 儲存的加密文本、重建的原始建立腳本、以及已知的固定模式,透過 XOR 運算還原原始碼:
-- 關鍵解密迴圈
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
IF @type='V'
SET @OrigSpText2='CREATE VIEW '+@objectname+' WITH ENCRYPTION AS SELECT 1 as f';
SET @q = 4000 - LEN(@OrigSpText2);
SET @OrigSpText2 = @OrigSpText2 + REPLICATE('-', @q);
ELSE
SET @OrigSpText2 = REPLICATE('-', 4000);
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
SET @orgvarbin = CAST(@OrigSpText1 AS VARBINARY(8000));
SET @resultsp = CASE WHEN @encrypted=1
THEN @resultsp
ELSE CONVERT(NVARCHAR(4000),
CASE WHEN @status & 2 = 2 THEN UNCOMPRESS(@orgvarbin) ELSE @orgvarbin END)
END;
PRINT @resultsp;
SET @n = @n + 1;
END;
SET @k = @k + 1;
END;
DROP TABLE #temp;
ROLLBACK TRAN;
加密文本 XOR (已知模式 XOR 原始文本) = 原始文本。@OrigSpText2)。@status & 2 判斷是否壓縮,需 UNCOMPRESS。ROLLBACK 避免污染系統表。CREATE CERTIFICATE、ADD SIGNATURE)。本系列揭示 WITH ENCRYPTION 的脆弱性,展示 XOR 解密完整實作。開發者應採用更強健的知識產權保護方案。