首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 加密預存程序破解技術深度解析(上):sp_decrypt 完整實作與原理揭秘

     編輯:關於SqlServer

背景

SQL Server WITH ENCRYPTION 選項僅對 syscomments 文字進行簡單混淆,非真正加密。本文提供完整 sp_decrypt 實作,可還原預存程序、函數、檢視、觸發器原始碼。

核心原理

  1. 從 syscomments 取得加密文本(ctext)、encrypted、status 欄位。
  2. 依物件類型(P/FN/TF/IF/TR/V)動態產生**固定長度**的標準建立腳本(@OrigSpText2)。
  3. 利用 XOR 運算:原始碼 = 加密文本 XOR (標準腳本 XOR 系統儲存原始碼)。
  4. 處理壓縮狀態(status & 2),必要時 UNCOMPRESS。

完整 sp_decrypt 程式碼(上半部)

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;

關鍵技術細節

  • 動態 ALTER 腳本:重建與原物件同名、同參數、同加密選項的標準腳本,長度補齊 4000 字元(以 - 填充)。
  • sp_executesql 參數化:將標準腳本作為參數傳遞,觸發系統加密並寫入 syscomments,取得 @OrigSpText3(系統儲存的加密後標準腳本)。
  • 多區塊處理:number、colid 支援超過 4000 字元的大型物件。
  • 物件類型完整支援:預存程序、標量/資料表值函數、觸發器(INSTEAD OF/FOR)、檢視。

安全性警示

此技術僅供教學與合法審計用途。**嚴禁用於未授權存取**。生產環境請改用模組簽名、CLR 混淆或原始碼管控保護智慧財產權。

小結

本文揭示 WITH ENCRYPTION 混淆機制,提供完整 sp_decrypt 實作上半部(環境建置、標準腳本重建、觸發系統加密)。下篇將詳細解析 XOR 解密核心迴圈與結果輸出。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved