목록

페이지

2014-12-15

MS SQL 암호화 된 저장 프로시저 복호화하기

우선 관리자 전용 연결(DAC)로 연결한다.

1. SQL Server Management Studio 실행
2. 파일 - 새로 만들기 - 데이터베이스 엔진 쿼리
3. 로그인 할 서버이름 앞에 admin: 을 붙이고 로그인 (예: (local) → admin:(local) / . → admin:. / 127.0.0.1 → admin:127.0.0.1 )
4. 아래 쿼리를 복사해서 넣고 윗 부분의 USE문과 @ObjectOwnerOrSchema, @ObjectName 값을 수정 후 실행

USE DB -- DB명
DECLARE @ObjectOwnerOrSchema NVARCHAR(128)
DECLARE @ObjectName NVARCHAR(128)

SET @ObjectOwnerOrSchema = 'dbo' -- 스키마
SET @ObjectName = 'Stored_Procedure' -- 프로시저

DECLARE @i INT
DECLARE @ObjectDataLength INT
DECLARE @ContentOfEncryptedObject NVARCHAR(MAX)
DECLARE @ContentOfDecryptedObject NVARCHAR(MAX)
DECLARE @ContentOfFakeObject NVARCHAR(MAX)
DECLARE @ContentOfFakeEncryptedObject NVARCHAR(MAX)
DECLARE @ObjectType NVARCHAR(128)
DECLARE @ObjectID INT

SET NOCOUNT ON

SET @ObjectID = OBJECT_ID('[' + @ObjectOwnerOrSchema + '].[' + @ObjectName + ']')

-- Check that the provided object exists in the database.
IF @ObjectID IS NULL
BEGIN
    RAISERROR('The object name or schema provided does not exist in the database', 16, 1)
    RETURN
END

-- Check that the provided object is encrypted.
IF NOT EXISTS(SELECT TOP 1 * FROM syscomments WHERE id = @ObjectID AND encrypted = 1)
BEGIN
    RAISERROR('The object provided exists however it is not encrypted. Aborting.', 16, 1)
    RETURN
END



-- Determine the type of the object
IF OBJECT_ID('[' + @ObjectOwnerOrSchema + '].[' + @ObjectName + ']', 'PROCEDURE') IS NOT NULL
    SET @ObjectType = 'PROCEDURE'
ELSE
    IF OBJECT_ID('[' + @ObjectOwnerOrSchema + '].[' + @ObjectName + ']', 'TRIGGER') IS NOT NULL
        SET @ObjectType = 'TRIGGER'
    ELSE
        IF OBJECT_ID('[' + @ObjectOwnerOrSchema + '].[' + @ObjectName + ']', 'VIEW') IS NOT NULL
            SET @ObjectType = 'VIEW'
        ELSE
            SET @ObjectType = 'FUNCTION'

-- Get the binary representation of the object- syscomments no longer holds
-- the content of encrypted object.
SELECT TOP 1 @ContentOfEncryptedObject = imageval
FROM sys.sysobjvalues
WHERE objid = OBJECT_ID('[' + @ObjectOwnerOrSchema + '].[' + @ObjectName + ']')
        AND valclass = 1 and subobjid = 1

SET @ObjectDataLength = DATALENGTH(@ContentOfEncryptedObject)/2


-- We need to alter the existing object and make it into a dummy object
-- in order to decrypt its content. This is done in a transaction
-- (which is later rolled back) to ensure that all changes have a minimal
-- impact on the database.
SET @ContentOfFakeObject = N'ALTER ' + @ObjectType + N' [' + @ObjectOwnerOrSchema + N'].[' + @ObjectName + N'] WITH ENCRYPTION AS'

WHILE DATALENGTH(@ContentOfFakeObject)/2 < @ObjectDataLength
BEGIN
        IF DATALENGTH(@ContentOfFakeObject)/2 + 4000 < @ObjectDataLength
                SET @ContentOfFakeObject = @ContentOfFakeObject + REPLICATE(N'-', 4000)
        ELSE
                SET @ContentOfFakeObject = @ContentOfFakeObject + REPLICATE(N'-', @ObjectDataLength - (DATALENGTH(@ContentOfFakeObject)/2))
END

-- Since we need to alter the object in order to decrypt it, this is done
-- in a transaction
SET XACT_ABORT OFF
BEGIN TRAN

EXEC(@ContentOfFakeObject)

IF @@ERROR <> 0
        ROLLBACK TRAN

-- Get the encrypted content of the new "fake" object.
SELECT TOP 1 @ContentOfFakeEncryptedObject = imageval
FROM sys.sysobjvalues
WHERE objid = OBJECT_ID('[' + @ObjectOwnerOrSchema + '].[' + @ObjectName + ']')
        AND valclass = 1 and subobjid = 1

IF @@TRANCOUNT > 0
        ROLLBACK TRAN

-- Generate a CREATE script for the dummy object text.
SET @ContentOfFakeObject = N'CREATE ' + @ObjectType + N' [' + @ObjectOwnerOrSchema + N'].[' + @ObjectName + N'] WITH ENCRYPTION AS'

WHILE DATALENGTH(@ContentOfFakeObject)/2 < @ObjectDataLength
BEGIN
        IF DATALENGTH(@ContentOfFakeObject)/2 + 4000 < @ObjectDataLength
                SET @ContentOfFakeObject = @ContentOfFakeObject + REPLICATE(N'-', 4000)
        ELSE
                SET @ContentOfFakeObject = @ContentOfFakeObject + REPLICATE(N'-', @ObjectDataLength - (DATALENGTH(@ContentOfFakeObject)/2))
END


SET @i = 1

--Fill the variable that holds the decrypted data with a filler character
SET @ContentOfDecryptedObject = N''

WHILE DATALENGTH(@ContentOfDecryptedObject)/2 < @ObjectDataLength
BEGIN
        IF DATALENGTH(@ContentOfDecryptedObject)/2 + 4000 < @ObjectDataLength
                SET @ContentOfDecryptedObject = @ContentOfDecryptedObject + REPLICATE(N'A', 4000)
        ELSE
                SET @ContentOfDecryptedObject = @ContentOfDecryptedObject + REPLICATE(N'A', @ObjectDataLength - (DATALENGTH(@ContentOfDecryptedObject)/2))
END


WHILE @i <= @ObjectDataLength
BEGIN
        --xor real & fake & fake encrypted
        SET @ContentOfDecryptedObject = STUFF(@ContentOfDecryptedObject, @i, 1,
                NCHAR(
                        UNICODE(SUBSTRING(@ContentOfEncryptedObject, @i, 1)) ^
                        (
                                UNICODE(SUBSTRING(@ContentOfFakeObject, @i, 1)) ^
                                UNICODE(SUBSTRING(@ContentOfFakeEncryptedObject, @i, 1))
                        )))

        SET @i = @i + 1
END

-- PRINT the content of the decrypted object
PRINT(CAST(@ContentOfDecryptedObject AS NTEXT))

프로시저 내용이 길 경우 PRINT(@ContentOfDecryptedObject) 로 하면 내용이 짤린다. 위처럼 NTEXT로 변환해주면 안짤리고 잘 나오나 NTEXT로 변환해준 것 역시 내용이 더 길어지면 역시 짤린다. PRINT로 안하고 SELECT로 하면 짤리진 않는 것 같다. SELECT로 할 경우 보기 좋게 하기 위한 추가 작업이 필요하긴 하지만. 반복문 돌리면서 @ContentOfDecryptedObject를 특정 길이만큼씩만 짤라서 PRINT 하는 것도 생각해봐야 할듯.

2014-12-08

서피스의 타이핑 커버 펑션키(F1 ~ F12)를 Fn키 누르지 않고 입력하는 법

서피스 프로3를 사용하는데 타이핑 커버를 부착해서 써보니 펑션키(F1 ~ F12)가 입력되지 않고 볼륨키 같은 기능들이 작동을 한다. F1 ~ F12는 fn키를 누르면서 눌러야 작동을 하길래 뭔가 거꾸로 된거 같다는 느낌에 찾아보니 이 문서에서 답을 찾을 수 있었다.

Fn + Caps Lock

이 키를 눌러주면 그 이후로 fn 키를 누르지 않고도 F1 ~ F12를 입력 할 수 수 있게 되며 볼륨키 같은 것은 fn 키를 눌러야 입력이 되게 된다.

2014-11-25

Windows에서 SSL 사용안하는 WebDAV에 연결이 안될 때

Windows에서 SSL을 사용안하는 WebDAV는 기본적으로 연결이 되지 않는다. 연결을 하기 위해선 레지스트리에서 값을 수정해주어야한다. Windows 7, Windows 8.1 에서 확인하였고 그 이외에는 미확인.

1. 윈도우키 + R
2. regedit 입력 후 확인
3. HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\WebClient\Parameters
4. BasicAuthLevel 값 2로 수정
5. 재부팅

BasicAuthLevel의 기본 값은 1인데 이 문서에 따르면 각 값이 뜻하는 것은 다음과 같다.

0 - 기본 인증이 사용되지 않음
1 - SSL 연결에 대해서만 기본 인증이 사용됨
2 - SSL 및 SSL 이외의 연결 모두에 기본 인증이 사용됨

Windows에서 WebDAV에 50메가 이상 파일 업로드 하는 방법

Windows 7, Windows 8.1에서 적용가능하며 그 이외에는 미확인

1. 윈도우키 + R
2. regedit 입력 후 확인
3. HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\WebClient\Parameters
4. FileSizeLimitInBytes 값 수정
5. 재부팅

FileSizeLimitInBytes 값은 0xFFFFFFFF(4294967295) 즉 약 4기가까지 가능.

Windows 7에서 WebDAV 폴더, 파일 목록 불러오는 속도 느린 현상 수정 방법

1. Internet Explorer 실행
2. 도구 - 옵션
3. 연결 탭
4. LAN 설정
5. 자동 구성에서 자동으로 설정 검색 체크박스 해제
6. 확인
7. 적용 또는 확인

Windows 8.1에선 굳이 설정하지 않아도 속도가 빠르다.