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


[참조 링크]
유사 솔루션인 - 웹페이지 보안 관련 참고 사항 
  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