음... 테스트 해 봤는데 일단 테스트 SP에 대해서는 잘 되었음.

--;;

 

이거 이렇게 쉽게 풀리면 문제 있는거 아닌가.... 웅..

내가 담아온 포스트의 SP는 역슬래시 때문에 바로 실행하면 에러가 나서 수정한 내용 다시 올립니다.

 

최근에 이용해 볼 일이 있어 다시 해 봤는데... 치명적인 문제가 있네요...

SP 문자 수가 4000을 넘어가는 경우 제대로 수행이 안됩니다.

특히 큰 문제는 원본 SP가 에러가 나면서 삭제된다는 문제가 있습니다.

꼭 주의하세요~

--------------------------------------

SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS OFF
GO

CREATE PROCEDURE DECRYPTSP2K (@objName varchar(50))
--INPUT: object name (stored procedure,
--
-- view or trigger)
--Original idea: shoeboy <shoeboy@a
-- dequacy.org>
--Copyright ?1999-2002 SecurityFocus
--adapted by Joseph Gama
--Planet Source Code, my employer and my
--
-- self are not responsible for the use
--     of
-- this code
--This code is provided as is and for ed
--
-- ucational purposes only
--Please test it and share your results
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 ('drop PROCEDURE '+ @objName)
--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)

---------------------------------------------------------

 

테스트 쿼리

--------------------------------------------

 

CREATE PROCEDURE hello
WITH ENCRYPTION
AS
PRINT 'Hello World!'
GO

exec sp_helptext hello
GO

exec dbo.DECRYPTSP2K 'hello'
GO

exec sp_helptext hello

 

암호화한 것을 만든 후 helptext로 확인한 후, DECRYPTSP2K 를 실행시키면, 암호화 된 내용을 풀어서 다시 만들어 주게 된다.

그 후 다시 helptext로 확인하면 내용이 보입니다. --;;

+ Recent posts