반응형

/**********************************************************************************************
-- Title : [2k] SQL 2000 암호화된 프로시저 복호화
-- Reference : 블로그 검색
-- Key word : encryption, decryptsp2k 암호화
**********************************************************************************************/
/*
-- dbo.sample proc
*/
drop proc hello
go
 
CREATE PROCEDURE hello
WITH ENCRYPTION
AS
PRINT 'Hello World!'
GO
 
exec sp_helptext hello
GO

/*
-- dbo.DECRYPTSP2K proc
*/
drop proc  DECRYPTSP2K
go
 
CREATE PROCEDURE DECRYPTSP2K (@objName varchar(50))
AS
DECLARE @a nvarchar(4000), @b nvarchar(4000), @c nvarchar(4000)
      , @d nvarchar(4000), @i int, @t bigint
--get encrypted data
SET @a=(SELECT ctext FROM syscomments WHERE id = object_id(@objName))
SET @b='ALTER PROCEDURE '+ @objName +' WITH ENCRYPTION AS '+ REPLICATE('-',4000-62)
EXECUTE (@b)
--get encrypted bogus SP
SET @c=(SELECT ctext FROM syscomments WHERE id = object_id(@objName))
SET @b='CREATE PROCEDURE '+ @objName +' WITH ENCRYPTION AS '+REPLICATE('-',4000-62)
--start counter
SET @i=1
--fill temporary variable
SET @d = replicate(N'A', (datalength(@a) / 2))
--loop
WHILE @i<=datalength(@a)/2
BEGIN
--xor original+bogus+bogus encrypted
SET @d = stuff(@d, @i, 1,NCHAR(UNICODE(substring(@a, @i, 1)) ^
                              (UNICODE(substring(@b, @i, 1)) ^
                               UNICODE(substring(@c, @i, 1)))))
SET @i=@i+1
END
--drop original SP(원본 보존위해 이름 변경으로 수정)
EXECUTE ('sp_rename '''+ @objName + ''', ''' + @objName + '_backup_for_decription''')
--remove encryption
--try to preserve case
SET @d=REPLACE((@d),'WITH ENCRYPTION', '')
SET @d=REPLACE((@d),'With Encryption', '')
SET @d=REPLACE((@d),'with encryption', '')
IF CHARINDEX('WITH ENCRYPTION',UPPER(@d) )>0
SET @d=REPLACE(UPPER(@d),'WITH ENCRYPTION', '')
--replace SP
execute( @d)
GO
 
/*
-- 확인
*/
exec DECRYPTSP2K 'hello'
GO
 
exec sp_helptext hello
GO
 
/*
-- 정리
*/
drop proc hello;
drop proc decryptsp2k;
drop proc hello_bak_decryption;

 

반응형

+ Recent posts