이전에는 모바일에서 DRM을 분석을 해보았다면 이번에는 PC에 적용되는 DRM을 분석해 보자.
이번 포스팅은 분석 과정과 기술적인 내용이 포함되어 있어 조금 내용이 많을 수가 있다.
국내에서 PC 문서 DRM으로 유명한 솔루션 업체는 2개가 있다.
대부분 파수(Fasoo)와 마크애니(MarkAny)를 사용한다.


일단 분석을 하기 위해서는 DRM이 적용된 파일이 있어야 한다.
따라서, 현재 분석할 PC에 적용된 DRM 솔루션은 Fasoo이므로 파수에 대해서 분석을 진행 보았다.
먼저 어떻게 DRM이 적용될까???라는 생각을 했다.
Fasoo 솔루션이 설치된 PC에서 파일이나 문서를 저장하게 된다면 처음에는 아래와 같이 자물쇠 모양이 없다.

하지만 몇 초 있다가 보면 아래와 같이 자물쇠 모양이 생긴다.

즉, 처음에는 평문으로 문서가 저장이 되다가 Fasoo Agent가 파일이 닫힌 시점,
즉 문서 파일 핸들이 닫히는 순간 원본을 암호화한다.
DRM이 적용된 파일을 보면 아래와 같이 Fasoo에 의해 암호화가 되었다는 것을 확인할 수 있다.

어떻게 DRM이 적용될까???라는 질문에 대한 답은 아래처럼 간단하게 답을 할 수 있다.
그냥 DRM은 파일을 암호화하는 것이다.
그렇다면 암호화/복호화가 된다는 것은 Key가 무조건 대칭키일 수밖에 없다.
그리고 대부분의 대칭키이면 AES 계열이다.
그럼 DRM을 적용한 즉, 암호화 때 사용한 Key만 획득하면
모든 DRM이 적용된 문서를 복호화해서 원본을 획득할 수 있지 않을까?
라는 생각으로 분석을 진행하였다.
한참 분석을 진행하다가 문득 다음과 같은 생각이 들었다.
회사에 수많은 PC가 있을것이고, 거기서 수 많은 문서들이 DRM이 적용이 될 텐데,
여기서 암호화 Key가 하나일까?
그렇다면 해당 Key만 획득하면 회사의 모든 PC에 적용된 DRM 문서를 복호화할 수 있다고???
위의 가정이 크게 문제가 되지 않지만 이렇게 되면 사실상 큰일이다.
왜냐하면 Key 하나만 유출됐을 뿐인데 회사 내 모든 PC에 적용된 DRM 파일을 복호화할 수 있다는 말이다.
결국 위의 궁금증을 해결하기 위해서는 실제로 암호화에 쓰인 Key를 눈으로 확인하고 비교해봐야 한다.
두 파일의 Key를 뽑아서 비교해 보면 끝나는 문제다.
같으면 "회사에 Key 하나", 다르면 "파일마다 Key가 따로"인 것이다.
그런데 우리가 원하는 암호화 Key를 비교하기 위해서는 그 Key가 도대체 어디서 만들어지고,
어디를 지나가는지부터 알아야 한다.
그래야 후킹을 하던 뭘 하던 Key가 어떻게 만들어지고, 그 암호화 Key가 뭔지를 알 수 있기 때문이다.
그래서 순서를 이렇게 잡았다.
① 암/복호화가 어디서 일어나는가??
② 1번에서 위치를 확인했다면 해당 Key를 확인한다.
③ 두 개의 Key를 비교한다.
①번에서 위치를 크게 아래와 같이 2가지로 나눌 수 있다.
커널단과 유저단이다.
커널에서 만약 복호화가 된다면 DRM이 적용된 문서는 커널에서 복호화가 된 데이터를 받는다.
따라서, 암/복호화 Key는 커널에 존재하고 그 과정도 커널에서 진행한다.
하지만 유저단, 즉 프로그램 안에서 복호화가 진행된다면 암/복호화 Key는 프로그램 메모리 단에 존재한다는 것이다.
따라서 이때 Key를 추출하면 된다.
자, 간단한 예시를 들어보자.
예를 들자면 잠긴 상자를 열어주는 열쇠집이 있다고 하자.
나는 잠긴 상자(DRM이 적용된 파일)를 들고 해당 열쇠집을 방문했다.
열쇠공이 해당 잠긴 상자를 들고
작업실(커널)에서 상자를 열면, 나는 대기실에서 열린 내용물만 받는다.
열쇠는 작업실 밖으로 안 나오니 어떤 열쇠인지 나는 알 수가 없다.
반대로 열쇠공이 내 눈앞에서 상자를 열면, 어떻게 생겼고 어떤 열쇠인지도 확인할 수 있다.
어쨌든 이 둘 중 어느 쪽인지부터 가려야 했다.
그래서 복호화는 도대체 어디서 일어나는가?
"커널이냐, 프로그램 안이냐"를 가르려면,
먼저 파일을 읽는다는 게 컴퓨터 안에서 실제로 어떤 경로를 타는지부터 알아야 한다.
파일 하나를 열 때는 프로그램에서 아래와 같이 두 단계가 발생한다.
열기(Open), 읽기(READ)
당연한 소리다.
파일을 열어야지 읽을 수 있다.
하지만, 이때 사용되는 함수를 살펴야 한다.
그래야지 Key가 어디서 사용이 되고, Key가 뭔지를 알 수 있기 때문이다.
파일을 Open 할 때는 CreateFileW라는 함수를 사용한다.
HANDLE h = CreateFileW(
L"C:\\report.txt", // 어떤 파일을
GENERIC_READ, // "읽기만 할게요" (읽을 권한 요청)
FILE_SHARE_READ, // 남들도 같이 읽는 건 허용
NULL,
OPEN_EXISTING, // 이미 있는 파일을 열겠다 (새로 안 만듦)
FILE_ATTRIBUTE_NORMAL,
NULL
);
CreateFileW는 대출 창구에 가서 "이 책 좀 볼게요" 하고 대출증(핸들)을 받는 행위라고 생각하면 된다.
즉, 아직 내용은 한 글자도 안 읽었습니다. 통로만 뚫린 상태이다.
그다음은 이제 ReadFile로 파일을 읽어야 한다.
char buffer[100];
DWORD bytesRead;
ReadFile(
h, // 아까 받은 대출증(핸들)
buffer, // 여기다 내용을 담아줘
100, // 100바이트만
&bytesRead, // 실제로 몇 바이트 읽었는지 알려줘
NULL
);
이제 위의 ReadFile은 여러 층을 거쳐서 커널까지 내려간다.
[DRM 파일]
│ ① ReadFile() 호출
▼
kernel32.dll ← 프로그램이 제일 먼저 부름. (유저모드, 맨 위 계단)
│ ② 내부적으로 NtReadFile() 호출
▼
ntdll.dll의 NtReadFile ← 유저모드의 "마지막 단계"
│ ③ syscall 명령으로 커널에 진입 (여기서 유저모드 끝)
══════════════ 유저모드 / 커널 경계 ══════════════
그래서 ①, ②, ③에 각각 후킹을 걸어보았다.
결과는 다음과 같았다.
①: kernel32!ReadFile -> 원본
②: ntdll.dll!NtReadFile -> 원본
③ syscall -> 암호화
이것으로 복호화는 커널단이 아니라 프로그램(유저모드)에서 일어난다는 것을 알 수 있다.
DRM이 설정된 파일이나 문서가 실행될 때 FASOO 에이전트에 의해 FASOO에서 개발한 DLL 파일이 인젝션 된다.
따라서 어떤 DLL에서 어떤 함수에서 Key를 관리하고, 암/복호화를 담당하고 있는지를 찾는다면?
끝이다.
그래서 FASOO에서 사용하는 모든 DLL을 분석해서 몇 가지 가능성이 있는 DLL을 추렸다.
분석한 결과 암/복호화 과정을 수행하는 DLL과 함수를 찾을 수 있었다.
여기서 파일에 적용한 DRM의 암호화 Key를 획득할 수 있었다.

이제 DRM이 적용된 파일 2개를 비교하여 Key가 같으면
"회사에 Key 하나", 다르면 "파일마다 Key가 따로"인 것에 대한 질문에 답이 나온다.
따라서 아래와 같이 DRM이 적용된 2개의 파일에 대해서 DRM Key를 추출해보니 Key가 서로 달랐다.

이것으로 파일마다 DRM을 적용하는 암/복호화 Key가 다르다는 것을 알 수 있었다.
이제 해당 Key를 가지고 파일을 복호화를 해주면, DRM이 적용된 파일도 아래와 같이 복호화를 할 수 있다.


'개인 프로젝트' 카테고리의 다른 글
| 43. Flutter 애플리케이션 패킷 캡쳐하기 - 우리동네GS (0) | 2026.09.17 |
|---|---|
| 42. 코레일(Korail) + 고속 버스 매크로 - 표의 민족 (2) | 2026.09.15 |
| 41. 고속버스 티머니 매크로 (16) | 2026.09.10 |
| 40. 모바일 게임 분석: 우르르 용병단(Unity IL2CPP-LIAPP) (0) | 2026.06.15 |
| 39. 모바일 게임 분석: 드래곤 슬레이어 키우기(Unity IL2CPP - DoveRunner) (0) | 2026.06.10 |








































































































































