diff --git a/_posts/2023-09-15-dedrm-yes24-crema.markdown b/_posts/2023-09-15-dedrm-yes24-crema.markdown index c1a1ef2..22c4e5a 100644 --- a/_posts/2023-09-15-dedrm-yes24-crema.markdown +++ b/_posts/2023-09-15-dedrm-yes24-crema.markdown @@ -14,8 +14,8 @@ comments: true Yes24 에서 책을 구매하면 표준 epub 으로 제공한다고 명시되어있음. 하지만 막상 책을 구매하고 epub 을 다른 e-book reader 기에 넣으면 읽을 수 없음. 왜냐면 DRM 이 걸려있기 때문. -epub 형식은 대충 설명하자면 .epub 파일 속에 아래 사진처럼opf 파일이 있고 그 속에서 책의 내용을 control 한다 -![basic structure](../_images/epub_structure.png). +epub 형식은 대충 설명하자면 .epub 파일 속에 아래 사진처럼opf 파일이 있고 그 속에서 책의 내용을 control 한다 +![basic structure](../_images/epub_structure.png). 실제 텍스트들은 .opf 파일 속 내용에 적혀있는 경로를 따라가보면 존재한다. yes24 에서 어떻게 drm 이 걸어뒀냐면, html 파일들의 내용들이 encrypt 되어서 이상한 값들로 채워져있다. yes24 crema 를 실행시켜보면, 문서폴더에서 임시파일들을 생성하는 것을 확인할 수 있다. @@ -44,21 +44,24 @@ decrypt 로직을 분석해서 프로그램을 만드는 것이 좀 더 어렵 ### Analysis -우선 암호화된 파일이 어떻게 사용되는지 data flow 를 쭉 따라가봤음. kernel32.dll 의 CreateFile 에 breakpoint 를 걸고 condition 도 함께 걸자. -![x32dbg breakpoint](../_images/conditional_breakpoint.png) +우선 암호화된 파일이 어떻게 사용되는지 data flow 를 쭉 따라가봤음. kernel32.dll 의 CreateFile 에 breakpoint 를 걸고 condition 도 함께 걸자. +![x32dbg breakpoint](../_images/conditional_breakpoint.png) msdn 을 참조해보면 알겠지만, CreateFile 은 file handle 을 리턴할 뿐임. file handle 로 fread 를 하는 로직을 찾아서 데이터를 넣는 메모리를 따라갈 수 있다. -그렇게 생성된 메모리에 hardware breakpoint 를 걸고 쭉쭉 따라가다보면 어느 순간 plain text 로 변경하는 순간이 있음. -![hookpoint analysis](../_images/hookpoint_analysis.png) +그렇게 생성된 메모리에 hardware breakpoint 를 걸고 쭉쭉 따라가다보면 어느 순간 plain text 로 변경하는 순간이 있음. +![hookpoint analysis](../_images/hookpoint_analysis.png) 그러면 이 지점에서 hook 을 걸고 메모리를 탈취해서 새로운 파일로 만들면 되겠다라는 생각이 든다. 한 가지 주의해야할 점은 이 메모리의 첫 3바이트는 signature 라서 무시하고 end of string( null ) 까지가 내용임. ### Hook the subroutine 이 함수는 내부적으로 사용되는 함수기 때문에 import table 의 조작으로 hook 을 할 수 없음. 기본적으로 그냥 code hook 이 제일 깔끔하고 좋아서 이 방식을 선호함. - -![hookpoint interface](../_images/hookpoint_interface.png) + +![hookpoint interface](../_images/hookpoint_interface.png) 인터페이스를 보면 argument1, argument2 는 register 로 들어가고, 나머지는 스택으로 들어감. -calling convention은 usercall 이라고 되어있지만 실제로는 cdecl임. call 이후에 스택 정리로직이 있는 것을 볼 수 있음 +calling convention은 usercall 이라고 되어있지만 실제로는 cdecl임. call 이후에 스택 정리로직이 있는 것을 볼 수 있음 +![hookpoint interface](../_images/evidence_of_cdecl.png) + + 훅을 하고 나면 아래와 같은 시나리오로 프로그램이 제어될 것이다. 1. 프로그램 실행 @@ -73,13 +76,21 @@ calling convention은 usercall 이라고 되어있지만 실제로는 cdecl임. 10. install hook dll hook 을 만드는데 있었던 문제는 주로 visual studio 설정들이었음. +정리하자면 아래와 같음 ++ 증분 링크때문에 코드 보기 복잡해짐.이 옵션 꺼야함. + + 이 옵션이 켜져있으면 jmp table 이 나열되어있고 함수 콜이 jmp table 로 뛰는 식으로 코드 생성됨. + + 프로젝트 설정 -> 링커 -> 증분링크 옵션 끄기 ++ security cookie 검사하는 코드 때문에 보기 힘듬. 꺼야함 + + 프로젝트 설정 -> C/C++ 코드생성-> 보안검사 사용안함(/GS-) ++ 초기화 하지않은 변수에 대해 초기화하는 0xCCCCCC 로 초기화하는 코드가 생성됨 이것 역시 dl, ecx 전달하는데 방해가됨. + + 프로젝트 설정 -> C/C++ -> 기본 런타임 검사를 기본값으로 설정하면 사라짐( /RTCu 가 초기화코드에 대한 내용임) 위의 설계대로 실행하면 Yes24 가 책을 열고 난 뒤 모든 html 파일에 대해 복호화 로직을 실행하게되고 그 작업들이 모두 끝날 때까지 기다려야한다. 언제가 될지 모르기때문에 눈으로 봐야한다는 맹점이 있다... ### Make a decrypted epub by hand -아래 그림처럼 문서 폴더 내의 Yes24 폴더에 text 제외에 decrypted epub 형식의 폴더가 존재한다. -![hookpoint interface](../_images/hookpoint_interface.png) +아래 그림처럼 문서 폴더 내의 Yes24 폴더에 text 제외에 decrypted epub 형식의 폴더가 존재한다. +![hookpoint interface](../_images/hookpoint_interface.png) 이 폴더에서 text 들을 모두 복호화된 파일들로 갈아치우고 zip 파일을 생성한다. calibre 프로그램으로 zip to epub 컨버팅을 하게 되면 decrypted epub 파일을 갖게된다. 작업 결과물은 어느 정도 만족스럽지만, 각주에 대해 미흡하고 몇가지 알 수 없는 기호들이 거슬린다.