쫓고 쫓기고, 막고 찌르고, 궁극의 공격과 궁극의 방어는 사실 존재 하지 않는 것 같습니다.
특히나 DRM 이라는 솔루션은, 돈을 벌기 위한 방어 수단으로서 등장 했다고 해도 과언이 아닌 것 같습니다.
이제는 DRM이라는 것이 알게 모르게 생활 속 깊숙한 곳에 파고 들었습니다.

a bike that can only run on special roads.
a bike that can only run on special roads. by vrogy 저작자 표시

하지만 이 DRM 솔루션 이라는 것이 결국 자유로운 생활에 하나의 가시방석 같은 존재로서 느껴지는 것은 왜일까요?

특정 사이트에 접근 하는 것 만으로도 이 이상한 DRM 솔루션이 깔려버리고, 이후에 PC가 이상 동작하는 것은 또 왜일까요?
아! MS Windows가 아니면 그러한 DRM 매체를 사용 하는 것 조차 접근 못할 수가 있습니다.

서론이 길었습니다.
많은 DRM기술이 있지만... 여기서 다루어 보고자 하는 내용은 PC의 성능을 엄청나게 갈가 먹어 버리는 API Hooking 기반 DRM, 보안 솔루션 속을 좀 벌려 볼까 합니다.

여기서 혹자는 질문을 할 수 있겠습니다.
  왜! 보안을 해치는 짓을 하냐고?
  너 나쁜 놈이지?
  잡아 넣고 말겠어!

그러면 저는 무어라 답을 할까요?
  ㅎㅎ 저는 보안을 해치지도 않고, 나쁜놈도 아니고,
  어디에 들어갈 위인도 아닙니다.

  다만 그들의 이상하고 무식한 솔루션을 좀더 이상적이고, 무난하게 바꾸었으면 할 뿐입니다.

저를 나쁘다고 하기 전에! - 그들의 솔루션을 '제대로' 만들길 바랄 뿐입니다.
  치사하게 URL Blocking 하지 마시구요.
  Hooking을 좋아 하시더니 Blocking도 사랑 하시는 듯!



1. API Hooking
API Hooking 이라는 것을 DRM 솔루션에 한정하여 이야기 해 보겠습니다.(다른 보안 솔루션에서도 절찬리 채택 중이랍니다. 쩝.)
DRM의 본연의 역할이 파일 등의 매체로 저장 될 때 원본과 달리 권한, 암호와 같은 부가 정보와 함께, 원본을 암호화(Encryption)하게 됩니다. 그리고 다시 읽어 들이게 되면, 부가 정보를 확인 하여 권한이 있는 사용자일 경우 암호화된 부분을 원복(Decryption)하여 문서를 볼 수 있게 됩니다.
이러한 과정은 결국 매체(HDD 혹은 네트웍 드라이브 등등)로의 파일 저장 혹은 파일 읽기로 요약 될 수 있습니다.

그런데 API Hooking 기반 DRM은 이러한 과정에서 필수 적으로 사용되는 OS API를 가로채기를 하여 OS에서 만들어진 동작을 하는게 아니라 자기의 부가 동작을 하게 됩니다.
즉 워드프로세스에서 저장을 하게 되면 파일로 문서가 저장이 되는데, 이 파일 저장 과정에 가로채기를 하여 원본 자료가 아닌 다르게 변화가 된 자료가 저장 되게 되는 것입니다.



하지만 이 API Hooking에는 많은 '비용'을 지불하게 됩니다.
대부분 Hooking 기법에는 부가적인 DLL 사용이 이루어지게 되고, 이로인해 시스템 메모리 증가, 특히 성능이 낮은 PC에서는 엄청난 부하로서 동작을 하게 됩니다.

한가지 더 슬픈 소식은, 의외로 많은 '보안'관련 솔루션이 앞다투어서 API Hooking을 행한다는 사실!
그래서 솔루션끼라 박치기 하는 일도 흔하게 되어, PC환경이 먹통이 되기도 합니다.

API Hooking은 인터넷에 많은 자료가 이미 공게 되어 있습니다. 구글 검색 하기로 가 보시면 좀더 넓은 세상을 보실수 있습니다.


2. Overhead
API Hooking 만으로도 무언가 복잡하고 문제가 있다는 것은 쉽게 이해 갈 듯 합니다 ^^
그러나 실체는 더욱더 엄청난 문제를 가지고 있습니다.
API Hooking을 하게 되면 기존 API 동작으로 그대로 흘러 갈지,  부가 동작여부를 반드시 판단 해야 합니다. 여기서 판단 루틴에 의해 기존 동작에 비해서 느려 질 수 밖에 없습니다.

더구나 이 Hooking 함수의 코드를 살짝만 봐서 너무나 많은 부가 동작을 하고 있습니다. 특히 파일 관련 hooking 함수를 보면 경악 할 수 밖에 없습니다. 많은 솔루션이, 파일명을 통째로 복사를 하거나 파일명에 대한 스트링 확인을 행하는데, "최적화"의 '최' 자도 생각 하지 않은 code가 대부분이었습니다.

그냥 "느리게" 살면 되겠습니다만. 그러기에는 PC 성능 저하가 너무나 심하다는 것에 화가 날 수 밖에 없더군요.


3. 광고만큼 보안을 지키지는 못한다
저마다 자신의 솔루션이 최고라고 자랑들을 많이 합니다. 몇몇 업체는 어찌나 WWW 에서 "얼굴" 알리기를 열심히 하시던지 놀라울 따름입니다!
하지만 그들이 자랑하는 그 솔루션에는 자랑과 함께 '구멍'이 있다는 것을 알아야 합니다. 아니 이미 알고 있습니다.
모든 PC에 대해서 자동으로 철통 보안이라 자랑 하지만 - 특히 API Hooking 기번으로 흥한 자는 API Hooking으로 망할 수 밖에 없습니다!
Easy Come Easy Go !

먼 말이냐! 그들이 자랑하는 API Hooking은 쉽게 구멍을 뚫어서 사용 하는 것입니다. 역으로 그들에게도 그 구멍은 똑같이 적용 된다는 것이죠.
Hooking한 루틴을 제 Hooking 하거나 Hooking 동작에 추가 구멍을 뚫을 수 있다는 이야기 입니다.
별도로 언급하겠지만! 이 API Hooking이 그들의 핵심 기반 기술이고 쉽게 이용하는 만큼 남들에게도 동일한 기회가 있다는 것입니다.

훅(Hook?!)~ 하면 다 날아 가버릴 수 있다고 해야 할까요!


4. 복잡하지만 단순하다.
어떤 자동차업체 담당자 인터뷰에서 말하길 '안전장치가 왜 빠졌냐 라고 질문에'  "다르지만 같다"고 하셨는데요 ㅎ~ 동급으로 저는 "복잡하지만 단순하다"를 언급 드릴까 합니다.
각종 DRM 솔수션이 있는데 API Hooking 기반의 경우 기존 Application의 읽고 쓰기 동작을 최대한 막아서 호작질을 하게 됩니다.
그런데, 아무 App.에 대해서만 호작질을 하게 되면 여러 문제가 생가게 되므로, 감시 대상 App.에 대해서만 이런 '지랄'같은 동작을 합니다.
이 부분은 자세히 살펴 보지 못했지만, 최초 Load시에 판단을 하는 것으로 보아서는 아마도 진입 code등을 call-stack등을 확인 하지 않을까 의심이 들구요~. 일단 감시 대상 App.이 판명나면 온갖 API을 Hooking을 걸어 버립니다.
파일 입출력은 물론이고 OLE관련 사항(문서 포함 기술을 방해 해야 하기에!), 표준 Message 처리 까지... 그 갯수가 너무나 많더군요.
철통 보안이 아닌 철통 Hooking 걸기라고 할까요 ㅠㅠ
하지만! 이러한 규모에 비해 결국 핵심은 Hooking이고, 이 것은 쉽게 확인이 된다는 것이죠.
파일을 원본으로 만들고 싶다면! 저장시에 Hooking걸려 이상하게 변하는 것을 Hooking이전으로 돌리면 된다로 단순화 할 수 있습니다.



5. Hooking으로 흥한자 Hooking으로 훅~ 간다

5.1. 들어가기 전에
자~ 이제 좀더 세부적으로 파헤쳐 보겠습니다.
아래 내용은 Hooking을 이용한 여러 솔루션에 공통 적인 내용입니다. 괜시리 도둑 제발저리시지 마시기를 바랍니다.
제가 경험한 솔루션의 예를 들겠습니다. 다만 직접적으로 모두 까발리지 않고 기본 원리 위주로 설명 하겠습니다. 이 솔루션은 몇몇 공공 사이트에서 사용 중이라 직접 경험도 가능 하겠습니다. 다만, 준-바이러스라 한번 설치하고서 삭제하려면 고생좀 할 수 있는 솔루션이기도 합니다.

5.2. DRM파일을 원본으로 저장하기의 다른 접근
이번 시도도 읽기 권한이 있는 문서 파일에 대해서 DRM 솔루션의 제어를 벗어나, Encrypt되지 않은 원본으로 저장 하려고 합니다.
 *권한 없는 파일에 대해서는 능력 밖의 일이라, 언급 하지 않습니다.
이전에 올린 내용을 보면 Excel VBA를 이용해서 직접적인 파일 Read, Write를 해서 아주 간단하게 DRM 솔루션의 구멍을 이용하는 방법 이었습니다.
그러나 이 방법은 이제 막혀 버렸죠. 하지만 제목 처럼 "Hooking 기법"에 기반한 솔루션의 경우 결국 Hooking 함수에 있을 수 밖에 없는 "구멍"을 다시금 이용 할 수 있습니다.
지난번 처럼 간단하지 않지만, 지난번 처럼 쉽게 막을 수 있는 구멍이 아니기도 합니다.

5.3. DRM파일을 읽을 수 있는 실행 파일이 시작지점
지난번에 Excel을 이용해서 쉽게 구멍을 이용 했는것과 마찬 가지로, 결국 이번에도 시작은 DRM파일을 읽을 수 있는 프로그램에서 시작 해야 합니다.
뭐~ DRM 솔루션을 완전히 속여 버리면 좋겠지만, 그것 분석하는 것은 결국 맞장 뜨자는 이야기가 되어서 출혈도 너무 크고, 이후에 문제가 될 수도 있기에, 기존 App.을 수정 하는 방법으로 접근 합니다.
이번에도 만만한 App.하나 골라 잡았습니다(Excel은 아닙니다 ㅋ~). 당연히 DRM원본을 읽을 수 있는 App.에 한정합니다. (어떤 App. 이냐구요? 비밀 입니다. 그들이 제 블로그에서 정보만 빼 가고, 저는 엿이나 먹어라는 행동을 미리 막기 위함 입니다. 리버스엔지니어링 취미가 있으신 분들께서는 쉽게 시도 가능한 내용으로 판단 됩니다.)

그리고 아래와 같은 전략을 세웠습니다.
 A. 파일 읽는 루틴을 찾는다
 B. 찾은 파일 읽기 루틴 직후에 새로이 파일 저장 루틴을 만든다 [이것으로 끝나길 바랬습니다]
 C. 파일 저장 루틴이 동작 되기 전에 Hooking을 막게끔 처리한다.
 D. 파일 저장 후, Hooking을 다시금 원복 처리 한다.

위와 같이 정리 될 수 있는데, 실제 행해야 할 일은 참으로 많습니다. 왜냐면 읽기 루틴을 손상을 주지 않고 쓰기 동작을 추가 해야 하는 어려움이 있습니다.
그러기 위해서는 Disassembly를 해야 합니다.
대표적은 Tool인 IDA를 이용해서 이 과정을 수행 합니다.

5.4. 기존 App.의 파일 Open 후 Read 루틴 직후 버퍼에서는 원본을 볼 수 있다
당연히 기대한 대로 App.에서 DRM원본 파일을 읽은 직후 해당 버퍼를 확인 하면, 원본을 그대로 확인 할 수 있답니다.(뻔~) App.은 encrypt된 내용을 직접 해석하지 못하므로 후킹꾼이 ReadFile 중간에서 원복 해 주는 것이죠.
결론은 나온듯 합니다. 이 원본 내용을 저장만 다시 하면 되는 것이죠. [실은 말만 쉽다고...]

5.5. 원본을 파일로 저장
공략 대상 App.을 Disassemble 하고, Create, WriteFile을 구성하기 위한 code를 새로이 만드는 과정은 약간의 노가다와 Assembly과정 그리고 그것을 Hex code로 새로이 이식하는 과정이 필요 합니다. 이 부분은 가능하면 공략 대상에 이미 존재하는 code를 최대한 활용하여 자르고 붙여서 이식을 했습니다.

그리하여, 파일을 Create 하고, WriteFile을 했습니다. 그런데 @@. 생각과 달리 파일명, 확장자를 다른 것으로 바꾸고 쇼쇼쇼~ 를 했지만, 결국 원본이 아닌 Encrypt된 파일로만 출력이 되더군요.
휴... 지난번 Excel구멍을 보고 그들이 제대로 막은 듯 합니다.
그래서 한참을 다른 방법으로 파 보았지만... 쉽지 않더군요.
알고보니 이 망할 넘이 거의 모든 File I/O API는 물로 OLE API 까지 다 Hooking으로 말아 먹었더군요!
그렇습니다. 결국 이 보안모듈에 의해서 모든 파일 I/O가 통제 되는 상황에서 좀더 고급 방법을 사용 하지 않고 파일 저장은 불가 합니다.
간단하게는 PIPE를 사용 해서 다른 파일로 전송 후 저장하는 방법도 시도 하려 했으나... 너무나 귀찮다는 것입니다. 또한 실제 사용도 거추장 스럽죠!
저의는 원본을 Drag & Drop으로 해제된 파일을 얻고자 했습니다. 그 꿈을 접기에는 아쉽다는 것이죠.

관련 작업 내용을 살짝 언급하면 아래와 같습니다.
걍 힌트일 뿐 직접 이용은 불가능 합니다.
낑구기(?!ㅎ) 소스 구성 -수도 코드 구성
아래 코드의 회색 부분에 해당하는 code를 모두 NOP에 준한 처리를 하고, 아래 code를 만들어 넣는다!
    //--- Saving용 파일명 준비
    nChars = lstrlen( sz );
    sz[nChars] = '_';
    sz[nChars+1] = 0;

    //--- 파일 생성  ?? 0100★★
    fp = CreateFile( sz, .... -> 함수 SaveFile의 두번째 argument를 그대로 이용)

    //--- 기록
    WriteFile( fp, lpBuf, len, &nBytesRead, NULL);    // nBytesRead unused !!!
        // 혹은 옆에껄로        &nChars  --> 주소 넘겨야 함!

    //--- 닫고 끝내기
    CloaseHandle( fp );
     fp=INVALID_HANDLE_VALUE;

    //--- 아무일 없었는 것 처럼 끝내기
   UnmapViewOfFile( B );
    return FALSE;

실제 assembly 코드 만들기 과정
file path 수정 수행.
nChars = lstrlen( sz );






sz[nChars] = '_';
sz[nChars+1] = 0;



mov     edi, [ebp+sz]
push     edi
ds:lstrlenW
mov     ebx, eax
mov     [ebp+nChars], ebx
mov     ecx, eax

shl     ecx, 1    ; wide 이므로!
add      edi, ecx
mov     ebx, 0x5F
mov     [edi], ebx

8B 7D ★
57
FF 15 ★★★★
8B D8
89 9D ★★★★
8B  C8

C1 E1 01
03 F9
BB 5F 00 00 00
89 1F


파일 생성, fp 받아오기
fp = CreateFile( sz,










xor      esi, esi
push    esi    ;NULL
push    80h   ;FILE_ATTRIBUTE_NORMAL
push    4      ;OPEN_ALWAYS
  --> 2 CREATE_ALWAYS 로 바꾸자
push    esi    ;NULL
push    3      ;~READ|~WRITE
push    0C0000000h ;~READ|~WRITE
push    [ebp+sz]
call    ds:CreateFileW
mov     fp, eax
33  F6
56
68 80 00 00 00
6A 04

56
6A 03
68 00 00 00 C0
FF 75 ★
FF 15 ★★★★
A3 ★★★★

esi 는 이미 0 상태 (위 코드에서 이어지므로)
파일로 기록, WriteFile( fp, lpBuf, len, &nBytesRead, NULL);
WriteFile(fp, ~







push    esi    ;NULL
lea     eax, [ebp+nChars]
push   eax
push    [ebp+len]  ; len은 file size OK
push    [ebp+B]
push    fp
call    ds:WriteFile

56
8D 85 ★ FD FF FF
50
FF B5 ★ FD FF FF
FF B5 ★ FD FF FF
FF 35 ★★★★
FF 15 ★★★★


닫 고 끝내기 CloaseHandle( fp );   fp=INVALID_HANDLE_VALUE;
CloaseHandle( fp );
fp=
INVALID_HANDLE_VALUE;

push    fp
call    ds:CloseHandle
or      fp, 0FFFFFFFFh

FF 35 ★★ 00 01
FF 15 ★★★★
83 0D ★★ 00 01 FF


아무일 없었는 것 처럼 끝내기     UnmapViewOfFile( lpBuf );    return FALSE;


push   [ebp+B]
call    ds:UnmapViewOfFile
jmp     loc_★★★★ ; 0 set, return
FF B5 ★★ FF FF
FF 15 ★★ 00 01
E9 ★ 04 00 00
* 해당 jmp 명령★★★★ - address - 5 해야 함!

★ 처리 한 것은, 더이상 그들에게 편리를 주지를 않기 위해서 입니다.


5.6. Hooking 을 뒤집어라!
결국 호랑이를 잡기 위해 호랑이 굴로 들어갈 수 밖에 없습니다.
즉 CreateFile, WriteFile에 대해서 Hooking동작을 살펴 보아야 한다는 것입니다. 왜냐면 CreateFile, WriteFile 흐름에서 이 보안 모듈에서 Hooking으로 '호작질'을 하고 있기 때문입니다. 이 호작질을 훌쩍 넘겨 버리고, 기존의 system 함수를 그대로 이용 하게 한다면, 고생끝 행복 시작이 가능 한 것입니다.

다만 호랑이 잡으려다 보니 IDA 디버깅은 죽어 버립니다. 나름 보안장치를 하셨군요! 대신 국민 디버거인 Visual C++ 는 멀쩡히 돌아 가는 군요!
우선 수술한 App.을 실행 시킵니다.
그리고 강제로 Process를 VC에 Attach 시킨 후 우선 Pause 합니다.
그리고 이식 수술한 CreateFile위치에 break point를 설정 합니다.
그리고 Go~
DRM 파일을 하나 Drag & Drop 합니다.
곧 앞서 걸어 두었던 break point가 걸리고, Step을 밟고 들어 갑니다.! 호랑이 굴에 들어 가는 것이죠!
두둥! 넵 진입 했습니다.
그리고 CallStack을 보고, DLL 모듈이 어느 것이지 확인 합니다. 물론 주소값도 미리 기록 합니다.
'역공'의 핵심은 기록입니다.

★c.dll 임을 확인 되었습니다. 이넘이 바로 Hooking을 밥먹듯이 걸어 버리는 주체입니다. 이 넘의 배를 갈라볼 필요가 있는 것이죠!
다시금 IDA를 통해서 Disassembly를 합니다. 그리고 앞서 기록한 주소값에 해당하는 code를 찾습니다.
이넘이 바로 그 CreateFile을 대신하여 Hooking 하는 본체인 것이죠.
그리고 살펴 봅니다.

ㅎㅎ 역시 Hooking함수에서 필연적으로 나타 날수 밖에 없는 패턴이 보입니다.
'호작질' 동작을 계속 할 것인지, Hooking전의 원본 동작을 할 것인지 판단을 하고, 분기 하는 logic이 나타 납니다.
이 logic은 있을 수 밖에 없는  루틴 입니다. 특히나 CreateFile이라면, 모든 파일 I/O 전에서 호출 되어야 하는데... 실제 파일 I/O는 온갖파일이 다 지나가게 되고, 관심 대상인지 아닌지를 판단해야만 합니다.
바로 이 판단하는 부분을 먹통을 만들면, 만사 형통이 되겠습니다.
호랭이 잡는 다는 것이죠!
간단히 디버거에서 해당 판단 루틴을 뒤집어서, 저~ 밑으로 가는 흐름으로 돌려 보았습니다. 슝~
가서 파일 기록 까지 끝내고 나니!!!

5.7. Hooking 함수는 막장 쓰레기!
여기서 잠깐 - 이 함수의 첫 시작이, 파일명을 몽창 변환하는 logic이 등장합니다. 뭐 하긴 제가 살펴본 다른 보안 모듈도 비슷했습니다. 쓸대없이 파일명 복사해다가 파일명을 뒤져서 다른 판단하더군요.
만일 file path가 엄청 길다면 더욱더 끔찍합니다. 단지 파일면 열었을 뿐인데 Hooking함수에서 쓸데없는 시간을 다 잡아 먹어 버리게 됩니다.

5.8. 뒤집고 얻은 원본
파일 기록까지 시켜 보니 원본이 얻어 졌습니다. ㅠㅠ 감동의 결과 입니다.
Hooking 루틴의 특정 흐름만 뒤집으면 그냥 보안 동작 대신 원래 동작으로 원본 파일을 얻을 수 있다는 것입니다.
자! 그렇다면, 이 Hooking 함수 흐름을 수정하여, 원래 동작을 하는 방법을 찾아야 합니다.

의외로 간단합니다.
앞서 언급했지만 Hooking 함수에는 특정 flag혹은 이와 동등한 동작을 하는 메모리 값이 있습니다. 이 메모리 값을 공략대상 App.에서 살짝 다른 값으로 바꾸었다가, 원복 해 주면 됩니다.
이 과정은 단지 메모리 값을 빼와서 보관, 수정, 파일 저장, 원복으로 해결 할 수 있습니다.
더군다나 Hooking DLL은 공략 대상에 기생하는 DLL입니다. 그래서 어려움 없이 동일 process 이므로 걍 메모리 직접 읽고, 쓰기가 되어서 쉽게 원하는 동작이 가능합니다.
그래서 Hooking으로 흥하면 Hooking으로 망한다고 할 수 있겠죠 ㅎㅎ
자~ 위 동작으로 어렵게 다시 Assembly code로 만들고 Hex code로 patch합니다.
그리고, 최종 완성한 우리만의 App.이 만들어 졌습니다.
그리고 원본 파일을 Drag&Drop! - 그러면 원복된 파일이 만들어 지는 것이죠 ㅎㅎ
꿈에 그리던, 원본 던지면, 결과물이 원본 위치에 생성 됩니다.

관련 잡업 내용을 소개하면 아래와 같습니다.
★에서 ★c.dll 의 특정 변수값을 임시 보관 후, 무조건 분기하도록 조건을 수정 한 값을 넣고,
Write작업 후 해당 변수값을 복원하자!
특히나 ★c.dll 은 고정된 메모리값을 가지는 것으로 보인다!
이 변수값은  dword_61★★★ 로 사용 중 void* 로도 사용 중으로 IDA분석 됨
    
    mov    eax, dword_61★ ★★    // [61F4AFA8] A1 61
    push    eax                             // 보관하기! 50    
    mov    dword_61★★★★, 0     // ebx가 이미 0 이므로 mov mem, ebx 를 찾아보자
                                                  // 89 1D 61
    ..... Create file기존 patch code ...            

    pop     eax                             //  58
    mov    dword_61★★★, eax    // A3 61

    ..... Create file 이후 patch code


6. Easy Come Easy Go
컴퓨터가 굴러가는 세상에서, 기술은 많습니다. 그중 MS계열에서는 API Hooking 기술도 있는 것입니다.
하지만 이 API Hooking은 쉽게 이용 할 수 있는 만큼, 쉽게 역으로 재이용 당할 수도 있습니다.
Easy Come Easy Go - 바로 API Hooking에서도 적용 된다는 사실.
잊지 않았으면 합니다.



지난 번 처럼 자료를 직접 공유 드리지 못해서 죄송 합니다.
하지만, 위에 언급 드린 내용 만으로도, 관심 있는 매니아들에게는 출발점을 충분히 전달 드렸다고 봅니다.
저는 보안 모듈 자체를 거부하지는 않습니다. 다만 얕은 기술과 외형만 중시하는 일부 몰지각한 솔루션에 대해서 제대로된 기술을 가질 것을 바랄 뿐입니다.
특히나 컴퓨터 성능을 잡아 먹는 그런 솔루션은 없어져야 할 것입니다.
DRM관련 하여 저와 비슷한 생각을 가지신 분의 글이 있어 소개 드립니다.
아래 글은 해당 사이트에 소개된 글을 요약하여 제공 하는 것이며, 저의 개인 의견과는 다를 수 있다는 것을 분명히 밝혀 두는 바입니다.


갱신: 2010-01-21
아래 원문 링크를 방문 해 보니... 모두 공개설정을 빼버렸더군요.
역시 이 동네 꾼들은 기술 보다는 얼굴로 어떻게 해 보려는 습성이 강한것 같습니다. 이쁘지도 않으면서 말이죠!
기술 보다는 말로서 자신들의 부끄러운 곳을 감춘다고 그것이 없어지는 것도 아닌데. . . . . .



저작권은 DailyGrid에 있습니다.

해당 글을 모두 보고 싶다면 아래 URL로 접속 해 보시기 바랍니다.
http://www.dailygrid.net/html/tag.php?part=a.title&tag=DRM+%B9%AB%BF%EB%B7%D0&x=0&y=0


원문 차례대로 내용을 요약 하도록 해 보겠습니다.

1. DRM 적용해도, 기밀 문서 무방비 유출
문서보안은 기업이 만들어 보관하는 다양한 문서의 유출을 막아, 기업의 권리와 이익을 보호해주는 기술과 서비스를 통칭한다. 이를 위해 불법 복제와 변조를 방지하는 기술 등을 제공한다.
제품 선전은 그럴싸하지만, 실제로 이들 업체의 제품은 기업의 문서를 완벽히 보호하지 못한다.
작성 과정의 문서에 대해선 DRM 기능을 적용하지 못한다.
"DRM은 이처럼 중요한 생성단계의 문서를 보호하기 위한 어떤 기능도 제공하지 못한다"


2. PC DRM 무력화 "너무 쉽죠"
PC에서 DRM을 기술을 직접 걸어 문서를 암호화하는 PC DRM 기술이 A업체 혹은 B업체 등과 같은 벤더들에 의해 시장에 소개돼 있다.
이들 업체의 설명에 따르면 PC DRM이란 PC에서 생성되는 문서에 자동으로 DRM을 적용하는 PC 문서보안 기술이다.
"결코 효과적이지 않다. 문서는 얼마든지 유출될 수 있다"는 것이 보안 전문가들의 지적이다.
DRM 기술의 암호화 루틴을 파악한 후 이를 역으로 분석해 문서를 복호화할 수 있다는 설명이다.
즉 메모리 해킹을 통해 DRM이 걸리지 않은 상태서 문서를 외부로 빼낼 수 있다는 설명이다.
사용자들이 PC DRM을 완전히 무력화시킬 수도 있는 점을 거론해야 한다.
"DRM을 대체할 다양한 보안 기술에 기대를 걸어야 한다"고 강조.


3. 워터마크 제거 "식은 죽 먹기야"
DRM 업계가 차세대 먹거리로 생각하고 있는 ‘워터마크’가 기술적으로 매우 취약.
이 기술은 매우 조잡해, 프로그램 전문가 손쉽게 워크마크를 제거할 수 있는 것으로 확인됐다.
실제로 워터마크가 제거된 막대한 콘텐츠들이 불법적으로 유통되고 있는 것이 현실


4. 실행 프로그램과 무작위 충돌
실행 프로그램과 무작위 충돌…사용자 불만 팽배
부품을 수입한 한 중소기업의 무역 담당자는 관세청 홈페이지에서 수입세금계산서를 발행하는 과정에서 DRM으로 인해 심한 불편을 겪었다.
이후 사용자가 쓰고 있는 프로그램을 다양하게 점검한 후, 상당수 프로그램을 중지 혹은 제거하는 시도를 여러 번 거친 후에야 세금계산서를 겨우 다운받을 수 있었다.
DRM이 사용자 PC에 깔려 있는 모든 프로그램과 호환성을 갖추고 있지 않아, 꽤 심각한 불편을 겪었던 것


5. 문서 작업엔 훼방꾼일 뿐이죠
문서보안을 위해 DRM을 구축하는 기업들이 있는데, 이는 일종의 면피용으로 이해.
DRM은 실제론 문서를 보호하는 기능도 못하면서 임직원이 문서 작업을 할 때는 엄청난 방해꾼이 될 뿐.
시장에 공급하고 있는 DRM 기술이 허점이 많아 기업의 기밀 문서가 쉽게 외부로 유출된다는 점을 집어보았다.
문서에 DRM이 걸린 때문에 상호 간에 문서를 읽지 못하는 상황 수시로 발생.
해외 바이어들과의 문서 교류에선 DRM을 아예 쓰지 않기로 결정.

모 업체의 경우 DRM 적용 후 문서에 걸린 바이러스가 제거되지 않는 현상이 발생.
"해외 기업들은 기업 간의 문서교류를 신뢰를 바탕으로 진행하고 있다"며 "문제가 생기면 그 때 법적인 것으로 처리하면 된다는 생각을 갖고 있다"고 밝혔다.
해외 기업들의 경우 문서 DRM에 대한 경험이 매우 생소한 실정


6. "표준" 없는 "막무가내" 기술
문서보안의 무슨 **꾼이란 ‘허명(虛名)’으로 알려져 있는 DRM의 허점을 독자들의 이해를 돕기 위해 대강 알아 보고 있다.
"메모리 해킹에 무방비 노출" "DRM 기능 강제 종료 통한 문서 유출" "암호화 루틴 역분석 해킹" "워터마크 제거 식은죽 먹기" "협업 방해 생산성 급락" "암호화로 악성코드 인지불가, 이로 인한 해킹 위협 상시 존재"

지금까지 파악한 것만으로도 A업체, B업체, C업체 등의 업체가 주로 팔아 먹고 있는 DRM이란 이 해괴한 기술은, 문서를 보호한다는 미명 아래, 진실은 문서를 외부로 손쉽게 유출시키면서, 해킹 위협에 문서를 고스란히 방치시킨다.

거기다 협업 방해로 업무 생산성을 크게 떨어 뜨리니, DRM은 기업들이 문서작업을 수행하는데 과연 "공공의 적"
살펴볼 단점들이 그 앞을 헤아릴 수 없이 많으니, DRM 솔루션을 팔아 그간 연명해왔던 업체들은 무신 낯짝을 쳐들고 백주대낮에 부끄럼을 견딜까 하는 생각이 문득 스친다.

표준 기술 프로세스를 전혀 갖추고 있지 않은, 그러니까 막돼먹은 막무가내 기술이어서, 이를 이용하는 기업들 불만
A엔지니어링 관계자는 "고객들은 전달된 문서를 특정한 뷰어를 통해 보게 된다"며 "이 뷰어가 전달된 문서에 걸린 특정회사의 DRM과 호환성을 갖추고 있지 않은 경우, 고객들은 문서를 볼 수 없는 심각한 문제점이 발생한다"고 설명했다.

이어 "이런 문제점을 해결하기 위해 DRM 공급사에 주기적으로 특정 뷰어에 대한 호환성을 갖추도록 지원 요청을 하고 있지만, 지원해야 할 뷰어가 셀 수도 없이 많다보니, DRM 회사의 반복적인 기술 지원 행태는 번거롭다 못해 이젠 아주 진저리쳐지는 일"
고객들은 이런 이용 절차의 표준을 따를 수 없는 DRM 이용을 자제하고, DRM을 대체할 수 있는 기술들에 속히 관심을 가져야 할 것

DRM의 경우 표준이 완전히 배제된 형태의 문제점이 많은 이상한 기술

"그러는 사이 대외 사업엔 심각한 차질을 겪고, 고객의 불만도 폭증한다"


간단한 유틸리티를 소개 드립니다.
Excel VBA학습 자료도 함께 소개 드립니다.

Excel VBA를 이용한 파일 복사루틴 입니다.
용도는 파일 복사 입니다. 활용은 개인의 용도에 따라 다를 수 있겠습니다.

Excel 실행 프로세스로 수행
되기 때문에 특수 용도의 test로 사용 가능 합니다.

Windows환경에서 File Create / Read / Write 함수 hijacking 을 이용한 Encryption, Decryption 을 이용한 일반적 I/O 안정성을 확인 가능 합니다.

특히 Excel(혹은 동등한 오피스 프로그램 포함) 실행 프로세스에 대해서 암호화 과정을 허락하고, 앞서 hijacking 함수를 이용하는 환경에서 제대로된 안정성 여부를 판단 할 수 있을 것입니다.

제대로된 솔루션이 아닌 경우 복사 결과 파일에 대해서 Decryption된 결과를 기대 할 수 있습니다.

갱신: 2010-04-26
다른 방법으로 DRM 원본 파일을 얻을 수 있는 내용을 정리 했습니다.
직접적인 내용은 제공 드리지 못하고 힌트만 알려 드립니다.

아래 글을 참고 하세요
2010/04/22 - [소프트웨어/역공 [리버스엔지니어링]] - DRM, 보안 솔루션! - API Hooking 을 맹신 말라!


갱신: 2010-03
-01

아래 방법으로는 더 이상 특정 DRM 솔루션에 대한 원복 기능이 동작 하지 않습니다.
혹시나 원복을 하시려고 아래 내용을 활용 하실 경우 오해 없으시길 바랍니다.

갱신: 2010-03-25
아래 리플로 언급한 Send to 기능도 달라졌더군요! ㅎ~
그들이 제 블로그에 출근 도장이라도 찍는 듯 합니다!
 - 감사패라도 받아야 할 것 같은데요. <진짜로!>

곧 흥미 진진한 소식을 하나 전달 하겠습니다. 다만 감사패 없이 다 알려 드릴 수는 없고 맛보기 만으로~ / 개봉 박두!


아래에 대한 기본 동작을 제공 합니다.
 1. Excel 에서 파일 읽기
 2. Excel 에서 파일 기록
 3. Excel 에서 읽고 쓰기를 해서 파일 내용 복사
 

Surface Tension by nickwheeleroz (on holiday) 저작자 표시비영리동일조건 변경허락




1. 파일 선택하기

아래 문장으로 파일명(Full path 포함)을 받아 오게 됩니다.
Dim fileName As String
fileName = Application.GetOpenFilename(fileFilter:="Any file (*.*), *.*", Title:="Set File path and name for read.")

위와 같은 명령이 실행 되면, File에 대한 full path를 fileName 변수로 받아오게 됩니다.



2. 원본 / 복사본 파일 열기

RandomFileIO는 제가 별도로 구성한 class 입니다.
상세 내용은 Microsoft Knowlege Base(http://support.microsoft.com/kb/189981)를 참고 바랍니다.
아! 추가로 다음 KB도 보셔야 겠네요 (http://support.microsoft.com/kb/165942)도 참고 바랍니다.
Dim SrcFile As RandomFileIO         ' 원본 파일
Dim DestFile As RandomFileIO        ' 복사 파일
......
Set SrcFile = New RandomFileIO
Set DestFile = New RandomFileIO
  
'━━ 원본은 읽기 전용으로
SrcFile.OpenFile fileName, False
......
'━━ 복사용의 쓰기 전용
fileName = fileName + "_Copy"
DestFile.OpenFile fileName, True
......



3. 원본에서 복사본으로 파일 복사

마지막 작업은 '걍' 읽고, 동일 내용을 쓰기 하는 것으로 끝입니다.
읽은 파일과 동일한 결과를 _Copy 확장자로 복사가 완료 됩니다.

Do
    fSuccess = SrcFile.Reads(fileData(0), BUFFER_SIZE, lBytesRead, 0)
    If fSuccess Then
        fSuccess = DestFile.Writes(fileData(0), lBytesRead, lBytesWritten, 0)
    End If
Loop While (fSuccess And lBytesRead > 0)



4. 공개한 Excel add-on 설치 방법

파일받기


Excel 2007 기준 입니다. 이전 버전에서는 도구에서 해당 옵션을 찾을 수 있을 겁니다 (아마도?!)


1. Excel 실행
2. File 메뉴 선택
3. 오른쪽 밑의 [Excel 옵션(I)] 버턴 선택
4. "추가 기능" 선택
5. 아래쪽의 관리: [Excel추가 기능] 상태에서 [이동(G)...] 선택
6. "추가 기능" 창에서 [찾아보기(B)...] 선택
7. 저장한 add-on 파일 선택


설치를 완료 했다면 Excel 2007  리본 메뉴 "추가 기능" 혹은 이전버전(Excel 2003)의 경우 ToolBar 로 메뉴가 추가 됩니다.
여러분이 하실 일은 단지 [Copy] 혹은 [Copy for all formats] 버턴을 누르고 복사 원본을 선택 하시면 됩니다.
그러면 해당 파일의 동일 위치에 복사된 파일이 [ 원본파일명 + _Copy ] 형태로 생성이 됩니다.

[Copy for all formats]는 내부적으로 확장자를 .xls로 바꾸고 복사 과정은 동일하게 수행합니다.
특수 목적으로 유용하게 사용 가능한 기능 입니다.
다만 .NET framework - Scripting.FileSystemObject 에 의존적이기에 사용자 환경에 따라 동작 안할 수도 있습니다.
해당 내용은 (http://msdn.microsoft.com/en-us/library/6kxy1a51(VS.85).aspx)에서 찾아 보실 수 있습니다.

Excel VBA 학습과,  파일 복사 test, 암호화 안정성 확인 용도로 유용하게 사용하세요.


법률 조언을 거쳐서 주요 내용을 수정 반영 했습니다.
향후 법률적 의견은 적법한 절차에 의해서 진행 해 주시기 바랍니다.



Eliminate DRM! by baughj 저작자 표시동일조건 변경허락

법률 조언을 거쳐서 주요 내용을 수정 반영 했습니다.
향후 법률적 의견은 적법한 절차에 의해서 진행 해 주시기 바랍니다.


[참조 링크]
유사 솔루션인 - 웹페이지 보안 관련 참고 사항 
  2011/03/06 [역공]간단하고 깔끔한 - 웹 보안 프로그램 회피방법 (Fiddler-Web Debugging Proxy 활용) 


아래방법을 극복한 궁극의 구멍 뚫기
  2010/04/22 DRM, 보안 솔루션! - API Hooking 을 맹신 말라!




DRM Elimination Crew Suit by GregoryH 저작자 표시비영리동일조건 변경허락



보안을 강조 하는 것은 당연하 이치로 보입니다.
특히나 기업에서의 보안은 그 중요성을 누구나 잘 알고 있다고 봅니다.

그러나 그 '보안' 때문에 업무와 일이 주가 된 것이 아니라 '보안'이 주가 되고, 이 '보안' 아래에 일을 해야만 하는 주객 전도의 세상을 살아야 하는 현실이 되어 버렸습니다.
기업마다 온갖 종류의 보안 솔루션을 갖추고, 혹시나 일을지 모르는 일(?)에 대비를 하고 있는 것으로 보입니다.
문마다 보안장치와 보안요원은 기본이고, 컴퓨터 사용에도 몇중의 솔수션을 설치하고 감시받아야 하는 사항이죠.
외국 회사에 방문 해 보셨습니까? 그들이 한국 회사만큼 중요성을 몰라서 그렇게 하지는 않을 것 같구요.

대부분의 보안 문제는 내부 행위자 한명의 마음 먹기에 달렸더군요.
몇중의 막음과, 솔루션 도입 대신에 사람 마음 잡기가 더 중요할 것 같습니다

저도 평범한 직장인이라 이러한 보안 솔루션에 갇혀서 살아야 하는데, 가장 마음에 들지 않는 것 중 하나(그 중의 하나일 뿐!)가 문서 보안설정이 있습니다.
뭐- 도입 배경 설명은 맞습니다. 혹시나의 유출, 의도적 유출에 대비해서 무조건 적으로 문서에 대해서 DRM을 걸어 버리고 암호화 해 버리면 - 외부에서 해당 문서는 쓰레기 일 뿐이죠.

하지만 내부 사용과 활용에도 기본권(?)을 뺏기고 있는 느낌이라고 할까요?
내부 사용자 끼리 문서가 이리저리 전송되면서 DRM으로 인해 열어 보지도 못하는 경우도 자주 일어나고, 특정 시스템만 사용하는 그런 가슴아픈(?) 문제가 속속 발견 되고 있습니다.

그래서, 개인적으로 답답한 상황에 잠시 사용 할 해결책을 만들었습니다.

쉽게 설명하면,
DRM에 의해 암호화된 파일을 상황에 따라 암호화를 해제하는 것입니다.
중요한 필수 조건으로 해당 파일에 대한 읽기 권한은 있어야 합니다. 읽기조차 불가능한 파일을 해제 하는 방법은 저도 불가능하네요.


아래 내용은 법률자문 결과 적법한 방식대로 설명을 수정했습니다.
또한 더이상 아래 방법으로는 원하는 결과를 얻을 수 없습니다. 참고글로만 남겨 둡니다.

1. 반갑지 않은 손님

어느날 문득! 그분이 오셨습니다. 이름은 ★★! - 오실 필요 없다고했으나, 걍 컴퓨터를 지켜 주신다고 오셨다네요.
그리고 동거가 시작 되었습니다. 이미 같이 살면서 소통을 감시하고 있던 다른 넘과 함께, 시스템 리소스까지 쭉쭉 빼가면서 말이죠.

그러던 ★★께서 이젠 나의 글은 더이상 나의 글이 아니라고, 글을 작성할 때 마다 암호화를 하셨답니다. 그리고 읽을 때에는 ★★님께서 직접 번역해서 돌려 주시는 군요. 혹시나 나의 글이 적들에게 노출 될까 불안해서 그렇답니다.

그런데 이 ★★님께서는 오피스 파일에 대해서만 관심이 많더군요.
오피스에서 작성한 오피스 관련 파일은 모조리 DRM 걸어 주시는 친절함! 눈물을 앞을 가립니다. PDF까지도 잊지 않고 챙겨 주시는 군요.

하지만 이 ★★님에게도 구멍이 있어보였습니다!
오피스 실행 프로그램을 조작하지도 않고도 해당 결과물에 대해서 만능으로 "척척" DRM을 걸었다가 해제 해 주시는 능력! 이것이 구멍인 것이죠.

즉 제가만든 가짜를 오피스라고 속이면 ★★께서 알아서 속아 넘어 갈듯한 느낌으로 일은 시작 되었습니다.



2. ★★를 속이기는 쉬울까?

처음 시작은 메모장(notepad.exe)이었습니다.
DRM파일을 열어보면 DRM 파일임을 밝히는 문자열이 포함되어 있습니다. 이 부분을 보기 쉬운 메모장의을 이용해서 파일명만 Winword.exe(MS 워드)로 변환을 하면 ★★가 '허'하지 않을 까 하구요.

이름만 Winword.exe로 바꾸고 DRM 파일을 열었는데!
헉! - DRM 문자열이 없었습니다. DRM해제된 상태로 open되었다는 것이죠.
UltraEdit에서 열어 보았습니다. DRM상태 그래도 열렸습니다.

즉 제 잔머리가 통한것으로 보였습니다.
★★DRM은 원본 실행 파일을 수정 하는 것이 아니라, 파일열 열고, 읽고, 저장 하는 단계에서 조작을 가하는 것으로 이해 될 수 있습니다.

그래서, 새로 만든 application을 이용해 ★★DRM을 속이고, 저장은 다른 방법 - 왜냐면 파일 저장시에 DRM화 해 버리면 원본을 얻을 수 없기에 - 또 다른 실행 파일로 PIPE 연결을 통해서 별도 프로세스(DRM감시에 포함되지 않는)에서 저장 하려고 계획을 세웠답니다.

그리고 VC++로 메모장을 하나 만들고, 파일명을 위와 같이 Winword.exe로 바꾸었습니다.
별도로 만든 app.에서 DRM파일을 열고, 다른 방식으로 파일을 저장만 하면 되는 것으로 생각해서였죠!

그런데! - DRM해제 되지 않는 것입니다. 걍 DRM 인코딩된 상태로 읽어 버렸네요.

실행 파일 이름 변경만으로 ★★DRM은 속지 않는 다는 것이죠 (제가 ★★를 넘 물로 본것인가요 ㅋ~)



3. ★★는 오피스를 잘 알고 있었다

그제서야 SysInternals의 Dbgview.exe로 디버깅 메시지를 보니!

넵. 그렇네요. ★★는 오피스를 비롯한 메모장을 실시간으로 인식하고 있었습니다.

아래는 Notepad.exe실행시의 debug 출력 내용 입니다.
?????? 은 제가 숨김 처리 했는 내용 입니다. (혹시나 절 잡어러 오실까바? 그런데 뭔 근거로 절 잡나요?)
[0000] API Hook / getCMHLatestMoudelPath --> C:\Program Files\??????\??????.dll
[0000] * [★★Notepad] ================================================================================
[0000] * [★★Notepad] [ C★★e : Version v?.?.?.?                                                  ]
[0000] * [★★Notepad] [ C★★e : ★★ is 'c:\program files\??????\??????\??????.log'       ]
[0000] * [★★Notepad] [ C★★e : ★★el = , U★★ ★★ = 'TRUE'             ]
[0000] * [★★Notepad] --------------------------------------------------------------------------------
[0000] N [★★Notepad] << Ex★★ ★★ - ??????.dll : ★★on ★★ - v?.?.?.? >>
[0000] N [★★Notepad] --------------------------------------------------------------------------------
[0000]
[0000] D [★★Notepad] [★★] DATATYPE_★★_★★_COPYPASTE

다른 오피스 실행 파일 (워드, 엑셀, 파워포인트 등등)도 유사 log가 출력됩니다.
이 내용은 ★★DRM이 특정 실행 파일에 대해서 DRM 처리에 대한 판단을 하고, 통제를 한다는 의미가 되겠습니다.

그렇다면 앞서 파일명만 바꾸어서는 아니고, 오피스 실행파일로 완전히 속여야만 한다는 것인데요. ★★의 정신세계에 들어 가기 위해서는 리버스엔지니어링 - 즉 '역공'을 해야 하는데, 귀찮기도 하고 혹시나 법으로 밀어 부치면 어쩔 도리가 없으니...

쉬운 방법을 생각 해 냈습니다.



4. 오피스에 숨어 들어가기

★★ 덕분에 오피스에서 출력 해 내는 아크로벳(PDF) 파일도 DRM에 걸려 버리더군요.
★★는 특정 application의 파일 조작에 대해서 철저하게 동작을 달리 한다고 할 수 있는 단서이기도 합니다.
다시 요약하면 API hooking 혹은 hijacking 이라는 기술을 사용 하는 것이죠.

몇몇 감시 프로그램에서 행하는 공통 행동으로 유추하면, Windows API인, CreateFile, ReadFile, WriteFile 에 대해서 일일이 호작질(?)을 하여 오피스 등의 실행 파일의 경우에 대해서 현재 컴퓨터의 DRM 정책에 따라 열고, 읽고, 쓰기 시점에 적절히 DRM 동작을 수행 하는 것이죠.

자! 여기서 새로운 아이디어를 내어 봅니다.
최초 목적이 특정 파일에 대해서 DRM해제를 하고자 했습니다. 다시 말해 원래부터 제가 직접 작성한 문서 혹은 제가 읽을 수 있는 문서를 DRM 해제 하는 것이였으므로, 해당 문서에 대해서 제가 최소한 열어볼 수는 있다는 것입니다.
열어 볼수가 있다는 말은 파일이 오피스프로그램에 의해서는 DRM 해제가 된다는 것으로 해석이 됩니다.
아래의 과정이 일어 나는 것이죠.

    DRM 인코딩된 문서 파일 --> ★★DRM 모듈 --> 오피스실행파일

읽기 권한만 있어도 결국 DRM 인코딩된 문서 파일이 파일 Open, Read 시점에는 DRM해제가 되어야 한다는 것도 당연한 과정입니다. 오피스는 열고 있는 파일이 당연히 자신의 포맷으로 작성된 파일이 아니라 DRM 인코딩된 파일을 스스로 해결을 못하기 때문이죠 (이것이 핵심적인 구멍 입니다)

오피스 자체적으로 읽어 들인 파일에 대해서는 DRM해제가 투명하게 이루어 진다는 것으로 해석이 됩니다.

만일 오피스 스크립트 언어인 - VBA(Visual Basic for Application) 실행을 통한 파일 Open, Read에 대해서는 어떻게 될까?
만일 VBA 내에서 파일을 열고, 읽은 파일이 DRM해제가 된다면! - 절반은 성공 한 것이죠.

실험 해 보았습니다. - 단 VBA 자체적인 파일 read는 제약이 있기에 별도의 Win API 어댑터를 통했습니다.
1. 대화상자로 파일 선택
2. 선택한 파일을 버퍼로 읽기
3. 버퍼로 읽은 파일 내용을 출력 하기


3번 과정에서 만일 아래와 같은 문자열이 발견 되었다면, DRM파일 읽기 실패(혹은 권한 없는 파일) 입니다.
<!--★★★★★★★★★★★★★★★★ -->
혹은 사용 환경에 따라 유사한 다른 text가 될 수 있습니다.
일반 text 뷰어로도 확인이 가능 합니다.

그런데! - 위와 다른 내용을 얻었습니다.
넵! 정리하면 아래와 같습니다.

Office에서 VBA로 만든 실행 코드에서 DRM 파일을 Open하게 되면(권한이 있을 경우),
당연히 DRM해제 동작이 일어나게 되어 Read한 내용은 DRM 처리 되지 않은 원본 내용을 얻을 수가 있다!



5. 원본 파일을 얻다!

Office VBA에서 파일을 열고, Read 하면 DRM 해제가 된 원본 파일 스트림을 얻게 된다는 것 까지 확인을 했습니다.
그러면, 읽은 스트림을 바로 파일로 저장하면 어떻게 될까요?

앞서 별도로 test한 사항이 있습니다.
Office에서 다른이름으로 저장을 해 봤습니다.
당연히 확장자가 다르면 어떻게 될지 여부의 실험이었죠! - 혹시나 했는데 ㅎㅎㅎ
강제로 확장자를 붙여 줘 버립니다! 놀랍군요! - Office 에서는 이런 친절을 배푼적은 없습니다. 바로 ★★님의 '호작질' 중에 하나라는 것이죠.

여기서 중요한 단서가 하나더 나왔습니다! 두둥!
★★님의 DRM화 저장은 결국 파일의 확장자가 중요한 판단 기준으로 작용 한다 입니다!
여기서 아픔이 느껴지는 군요! - 이렇게 할 수 밖에 없는 이유는 충분히 공감이 갑니다.

Office도 인간이 아닌 컴퓨터 실행 파일이고 결과 파일만 저장 하는 것이 아니라 각종 설정 파일 저장은 물론이고 Win 표준 API인 CreateFile(기존 파일 열기에도 이것 사용합니다), ReadFile, WriteFile을 광범위 하게 사용 할 것이라는 것입니다.
당연히 위 API는 파일 I/O 뿐만 아니라 여러 스트림 입/출력에도 공통적으로 사용하게 되므로 모든 동작에 대해서 DRM을 걸어 버리면 - 결과적으로 Office가 바보가 되어 버리는 큰일이 벌어질 것이라는 겁니다.

그래서 아픔은 있으나, 타협안으로 Office 파일에 대한 확장자를 눈이 뚫어지라 지켜 보다가, 해당 파일만 DRM 인코딩, 디코딩을 해 주는 것으로 결론을 낸 것 같습니다.

그래서! 앞서 VBA로 열고, 버퍼로 읽어들인 파일을 - 곧바로 저장하지 않고, 확장자만 변경을 했습니다.
예로서 .xls 라면 .xls_unpacked 식으로 말이죠!

결과는!!!!!! - 예상대로(너무나 허무하게?) DRM에 걸리지 않은 파일을 얻게 되었습니다.
사실 설명은 길었습니다만... 간단하게 정리하면 아래와 같습니다.

★★ DRM은
-파일 Create, Read, Write 시점에 DRM 인코딩, 디코딩을 행한다.
-오피스 실행 파일을 알아 차리고 DRM 과정을 행한다. (듣보잡 실행파일은 DRM파일 읽기 불가)
-허용된 실행파일에서 파일 읽기 과정에서 확장자 기준으로 DRM파일이면 DRM해제 과정을 행한다
-DRM해제 과정은 VBA로 만들어진 code(오피스 파일 Read) 에서도 유효하다
-파일 Write 과정에서 확장자가 DRM 대상이 아니라면 DRM 인코딩 과정은 일어나지 않는다.




6. ★★의 구멍!

DRM해제된 파일을 성공적으로 변환 하고서, 궁금증으로 ★★(www.★★.com)을 방문 해 보았습니다.
소개된 기술 문서를 보니, 앞서 제가 일일이 잔머리 굴렸던 내용에 대해서 답안을 떡 하니 제시 해 놓았네요!

★★ DRM은 API-Hooking(나쁜 말로 Hijacking)을 사용
그리고, API-Hooking방식이 다른 방식에 비교해서 1등으로 좋음(정말로? 진짜로? 참말로? 에이 설마!)
그리고서는 File system filter 방식보다 보안성이 좋다고 이야기를 하네요!

허허!. 제가 보기에는 File system filter 방식이 더 보안성이 좋다고 보입니다 (저의 생각일 뿐이지만)

위에 설명드린 내용은, 아주 passive하게 역공한 것으로 ★★DRM은 건드리지도 않았습니다. 그래서 구멍 찾기가 맞는 표현이고 역공(Reverse engineering)은 아니라고 할 수 있습니다.
하지만 API hooking 방식은 결과적으로 재 hooking동작과 더불어 해당 모듈에 대한 hooking handler 코드에 대한 patch 동작으로 DRM화 동작을 무력화 할 수도 있습니다.
그래서, 제 입장에서는 File syste filter 방식보다도 좀더 손쉽게 접근 가능해 보입니다.

어느 방식이든 구멍이 없는 것은 아니지만...





이글은 마무리 하고, 실제 DRM해제 파일 얻기위한 code는 추가 글로 올립니다.
계속 즐 DRM 되길 바라며~





+ Recent posts