본문으로 바로가기

페이플레이(Fairplay) DRM 이란?

- 앱(어플)의 바이너리 파일을 암호화하여 분석 및 변조가 어렵도록 하는 것.
- 앱 스토어(App Store)에서 다운로드한 앱은 모두 페이플레이 DRM으로 암호화되어 있음.
- 페어플레이 DRM 적용여부는 Otool 도구를 이용하여 확인 가능.

- 페어플레이 DRM이 복호화될 경우 작동방식 및 내부 클래스 구조등을 쉽게 파악하게 되어 보안기능을 우회할 수 있음.

 

페어플레이 DRM 복호화 방법

1. CRACKERXI+

복호화 과정이 매우 쉬움. 아래의 링크 참조.

2023.02.26 - [Mobile App 취약점 진단/iOS App 진단] - 페어플레이 DRM 복호화 방법 - CRACKERXI+

 

페어플레이 DRM 복호화 방법 - CRACKERXI+

페어플레이(Fairplay) DRM 이란? - 앱(어플)의 바이너리 파일을 암호화하여 분석 및 변조가 어렵도록 하는 것. - 앱 스토어(App Store)에서 다운로드한 앱은 모두 페이플레이 DRM으로 암호화되어 있음. -

hagsig.tistory.com

 

2. Clutch

복호화 과정이 쉬움. 아래의 링크 참조.

2023.02.26 - [Mobile App 취약점 진단/iOS App 진단] - 페어플레이 DRM 복호화 방법 - Clutch

 

페어플레이 DRM 복호화 방법 - Clutch

페어플레이(Fairplay) DRM 이란? - 앱(어플)의 바이너리 파일을 암호화하여 분석 및 변조가 어렵도록 하는 것. - 앱 스토어(App Store)에서 다운로드한 앱은 모두 페이플레이 DRM으로 암호화되어 있음. -

hagsig.tistory.com

 

3. Frida-iOS-Dump

복호화 과정이 매우 복잡하고 어려움. 본문 하단 참조.

 

Frida-iOS-Dump을 이용한 복호화 방법

1. 윈도우 환경

디바이스와 PC의 연결을 위해 아래의 iTunesDriver64 관련 파일을 모두 다운로드한 뒤, 압축을 해제하여 프로그램을 설치한다.

※ 파일은 분할압축되어져 있음. 세 개의 파일을 모두 다운로드한 후  iTunesDriver64_0205.zip 을 압축해제한다.

iTunesDriver64_0205.z01
19.53MB
iTunesDriver64_0205.z02
19.53MB
iTunesDriver64_0205.zip
7.38MB

중국에서 만든 프로그램이므로 중국어가 나오고 한글이 깨진다. 당황하지 말고 설치를 완료한다.

 

아래의 사이트에 접속하여 디바이스와 PC를 연결해줄 프로그램을 다운로드한 뒤 압축을 해제한다.

https://code.google.com/archive/p/iphonetunnel-usbmuxconnectbyport/downloads

 

Google Code Archive - Long-term storage for Google Code Project Hosting.

 

code.google.com

 

디바이스와 PC를 연결한다음, 명령프롬프트(CMD)를 이용하여 아래의 명령어를 실행한다.

> itunnel_mux.exe --iport 22 --lport 2222

 

아래의 사이트에 접속하여 Frida-iOS-Dump 도구를 다운로드한 뒤, 압축을 해제한다.
https://github.com/AloneMonkey/frida-ios-dump

 

GitHub - AloneMonkey/frida-ios-dump: pull decrypted ipa from jailbreak device

pull decrypted ipa from jailbreak device. Contribute to AloneMonkey/frida-ios-dump development by creating an account on GitHub.

github.com

 

아래의 명령어를 실행하여 frida-ios-dump 를 최신버전으로 업데이트한다.

> pip install -r requirements.txt --upgrade

※ 파이썬이 설치되어 있지 않으면 pip 명령어가 실행되지 않는다. 아래의 글을 참고하여 파이썬을 설치한다.

2021.01.31 - [파이썬] - [파이썬 강의] - 0.1 파이썬 개발 환경 구축

 

[파이썬 강의] - 0.1 파이썬 개발 환경 구축

가. 윈도우즈에서 파이썬 개발 1. 설치 파일 다운로드 아래의 링크를 클릭해 파이썬 공식 다운로드 페이지로 이동한다. Download Python The official home of the Python Programming Language www.python.org 가장 높은

hagsig.tistory.com

 

frida-ios-dump의 dump.py 파일은 리눅스 환경에서 동작하도록 코딩되어 있다. 윈도우 환경에서 실행시키려면 다음과 같이 소스를 수정하여 주어야 한다.

 

dump.py 파일을 메모장 또는 코딩 전문 프로그램으로 아래와 같이 수정한 후 저장한다.

#25 line Add
import stat

#89 line Modify
#zip_args = ('zip', '-qr', os.path.join(os.getcwd(), ipa_filename), target_dir)
zip_args = (os.getcwd() + '\\7z.exe', 'a', '-r', os.path.join(os.getcwd(), ipa_filename), target_dir)

#123 ~ 127 line Modify
#chmod_args = ('chmod', '655', chmod_dir)
#try:
    #subprocess.check_call(chmod_args)
#except subprocess.CalledProcessError as err:
    #print(err)
if not os.access(chmod_dir, os.W_OK):
    os.chmod(chmod_dir, stat.S_IWUSR)
    
#141 ~ 145 line Modify
#chmod_args = ('chmod', '755', chmod_dir)
#try:
    #subprocess.check_call(chmod_args)
#except subprocess.CalledProcessError as err:
    #print(err)
if not os.access(chmod_dir, os.W_OK):
    os.chmod(chmod_dir, stat.S_IWUSR)

 

7z.exe, 7z.dll 파일을 dump.py가 있는 폴더로 옮긴다.

※ PC에 7z이 설치되어 있지 않으면 아래의 사이트에 접속하여 다운로드한다.

https://www.7-zip.org/

 

7-Zip

7-Zip 7-Zip is a file archiver with a high compression ratio. Download 7-Zip 22.01 (2022-07-15) for Windows: Link Type Windows Size Download .exe 64-bit x64 1.5 MB Download .exe 32-bit x86 1.2 MB Download .exe 64-bit ARM64 1.5 MB License 7-Zip is free soft

www.7-zip.org

※ 위 과정을 스킵하고 싶은 사람은 아래의 파일을 다운로드한다.

frida-ios-dump-master_WindowsVer.zip
12.81MB

 

위 과정을 통해 소스코드를 수정하였다면 아래의 명령어를 입력하여 복호화할 앱의 Identidier값을 확인한다.

> frida-ps -Ua (현재 실행 중인 앱의 정보를 표시하는 명령어)

 

Identidier값을 확인하였다면 아래의 명령어를 입력하여 페어플레이 DRM 복호화를 실행한다.

> python dump.py "앱의 Identidier값"

※ unexpectedly timed out while waiting for app to launch이라는 문구가 뜬다면 디바이스에 복호화할 앱이 실행되었을 것이다. 그 상태로 다시 한번 명령어를 입력하면 복호화가 정상적으로 실행된다.

 

※ 아래와 같이 SSH 접속 오류가 발생한다면 디바이스 설정에 맞게 password와 port 번호를 바꾸어 주면 된다.

오류내용
C:\frida-ios-dump-master>python dump.py "com.highaltitudehacks.DVIAswiftv2"
Exception (client): Error reading SSH protocol banner
Traceback (most recent call last):
  File "C:\Python\lib\site-packages\paramiko\transport.py", line 2268, in _check_banner
    buf = self.packetizer.readline(timeout)
  File "C:\Python\lib\site-packages\paramiko\packet.py", line 374, in readline
    buf += self._read_timeout(timeout)
  File "C:\Python\lib\site-packages\paramiko\packet.py", line 611, in _read_timeout
    raise socket.timeout()
socket.timeout

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Python\lib\site-packages\paramiko\transport.py", line 2091, in run
    self._check_banner()
  File "C:\Python\lib\site-packages\paramiko\transport.py", line 2273, in _check_banner
    "Error reading SSH protocol banner" + str(e)
paramiko.ssh_exception.SSHException: Error reading SSH protocol banner

*** Caught exception: <class 'paramiko.ssh_exception.SSHException'>: Error reading SSH protocol banner
Traceback (most recent call last):
  File "C:\Python\lib\site-packages\paramiko\transport.py", line 2268, in _check_banner
    buf = self.packetizer.readline(timeout)
  File "C:\Python\lib\site-packages\paramiko\packet.py", line 374, in readline
    buf += self._read_timeout(timeout)
  File "C:\Python\lib\site-packages\paramiko\packet.py", line 611, in _read_timeout
    raise socket.timeout()
socket.timeout

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "dump.py", line 340, in <module>
    ssh.connect(Host, port=Port, username=User, password=Password, key_filename=KeyFileName)
  File "C:\Python\lib\site-packages\paramiko\client.py", line 420, in connect
    t.start_client(timeout=timeout)
  File "C:\Python\lib\site-packages\paramiko\transport.py", line 702, in start_client
    raise e
  File "C:\Python\lib\site-packages\paramiko\transport.py", line 2091, in run
    self._check_banner()
  File "C:\Python\lib\site-packages\paramiko\transport.py", line 2273, in _check_banner
    "Error reading SSH protocol banner" + str(e)
paramiko.ssh_exception.SSHException: Error reading SSH protocol banner

Port를 22로 바꾸면 되는 경우도 있다.

 

아래와 같이 [앱이름].ipa 파일이 생성되었다면 페어플레이 DRM 복호화가 제대로 된 것이다.

 

2. 리눅스 환경

위와 같이 수정하였음에도 불구하고 계속해서 오류가 발생한다면 리눅스환경에서 실행하는 것을 추천한다.

VM에서 칼리(Kali)를 실행한 뒤 PC와 디바이스를 연결한다. 칼리의 배경화면에 디바이스 관련 아이콘이 생성되었다면 제대로 연결된 것이다.

 

아래의 명령어를 실행하여 PC와 디바이스를 연결해 주는 도구를 설치한다. sudo 명령어로 실행할 시 오류가 발생할 수 있으므로 root 계정으로 실행한다.

> apt install libusbmuxd-tools

 

아래의 명령어를 실행하여 디바이스와 PC를 연결한다.

> iproxy 2222 22

 

아래의 사이트에 접속하여 Frida-iOS-Dump 도구를 다운로드한 뒤, 압축을 해제한다.

https://github.com/AloneMonkey/frida-ios-dump

 

GitHub - AloneMonkey/frida-ios-dump: pull decrypted ipa from jailbreak device

pull decrypted ipa from jailbreak device. Contribute to AloneMonkey/frida-ios-dump development by creating an account on GitHub.

github.com

 

아래의 명령어를 입력하여 페어플레이 DRM 복호화할 앱의 Identidier값을 확인한다.

> frida-ps -Ua (현재 실행 중인 앱의 정보를 표시하는 명령어)

 

Identidier값을 확인하였다면 아래의 명령어를 입력하여 페어플레이 DRM 복호화를 실행한다.
> python dump.py "앱의 Identidier값"

아래와 같이 [앱이름].ipa 파일이 생성되었다면 페어플레이 DRM 복호화가 제대로 된 것이다.