破解加密存储过程

来源:互联网 发布:java threadlocal例子 编辑:程序博客网 时间:2024/04/29 13:48

CREATE  PROCEDURE sp_decrypt(@objectName varchar(50))
AS

BEGIN

SET NOCOUNT ON

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)

        SET @q=LEN(@sql1)
        SET @sql1=@sql1+REPLICATE('-',4000-@q)
        SELECT @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    -- end while

        SET @sql3=@sql3+')'
        EXEC sp_executesql @sql3,N'@Sql1 nvarchar(4000),@ varchar(8000)',@sql1=@sql1,@=@sql2

    END    --    end if

    SET @k=@k+1
END    -- end while

SET @k=0
WHILE @k<=@number
BEGIN

    IF EXISTS(SELECT 1 FROM syscomments WHERE id=OBJECT_ID(@objectname) and number=@k)
    BEGIN
        SELECT @colid=MAX(colid) FROM #temp WHERE number=@k
        SET @n=1

        WHILE @n<=@colid
        BEGIN
            SELECT @OrigSpText1=ctext,@encrypted=encrypted,@status=status FROM #temp  WHERE colid=@n and number=@k

            SET @OrigSpText3=(SELECT ctext FROM syscomments WHERE id=OBJECT_ID(@objectName) and colid=@n and number=@k)
            IF @n=1
            BEGIN

                IF @type='P'
                    SET @OrigSpText2=(CASE WHEN @number>1 THEN
                                          'CREATE PROCEDURE '+ @objectName +';'+RTRIM(@k)+' WITH ENCRYPTION AS '
                                      ELSE
                                          'CREATE PROCEDURE '+ @objectName +' WITH ENCRYPTION AS '
                                      END)


                SET @q=4000-LEN(@OrigSpText2)
                SET @OrigSpText2=@OrigSpText2+REPLICATE('-',@q)
            END
            ELSE
            BEGIN
                SET @OrigSpText2=REPLICATE('-', 4000)
            END
            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

    END
    SET @k=@k+1
END

DROP TABLE #temp
ROLLBACK TRAN
END


GO
                                                                                                          --rainboy QQ:43460043

原创粉丝点击