lldb 사용 방법
환경
- 기종: iPhone 5S
- 버전: iOS 12.0.1
- 탈옥 여부: 반탈옥 (Chimera, uncOver 이용)
- Xcode, iFunBox 사용
설치
1. 아이폰에 디버그서버 설치
(1) Xcode
에서 기기를 선택합니다.
(2) Indexing | Processing files
가 완료되면 아이폰에 디버그 서버가 자동으로 설치됩니다.
2. 디버그서버를 맥에 복사
(1) Cydia
에서 OpenSSH
를 설치한 후 터미널을 이용하였습니다.
// iPhone
cp /usr/bin/debugserver /private/var/mobile/Media/
(2) iFunbox
- Raw File System
에서 debugserver
를 선택한 후 Copy To Mac
을 선택하여 맥으로 가져옵니다.
3. entitlements.plist 수정 (첨부파일 참고)
(1) 디버그서버에서 plist를 생성합니다.
// Mac
codesign --display --entitlements entitlements.plist debugserver
(2) plist 파일을 수정합니다. seatbelt-profiles
자격은 제거하고, get-task-allow
, task_for_pid-allow
자격을 추가합니다.
<key>get-task-allow</key>
<true/>
<key>task_for_pid-allow</key>
<true/>
(3) plist 파일을 사용하여 디버그서명에 서명합니다. (바이너리 권한을 덮어씌웁니다.)
// MAC
codesign -s - --entitlements entitlements.plist -f debugserver
4. 서명한 디버그서버를 아이폰에 전송
(1) iFunBox
- Raw File System
에 디버그서버를 복사합니다. (드래그 앤 드롭 또는 Copy from Mac
이용)
(2) 기존 디버그서버를 백업한 후 디버그서버를 /usr/bin
으로 옮깁니다.
// iPhone
mv /usr/bin/debugserver /usr/bin/debugserver-old
cp /private/var/mobile/Media/debugserver /usr/bin/
(3) 디버그서버에 실행 권한을 추가합니다.
// iPhone
chmod +x /usr/bin/debugserver
5. 스프링보드 재시작
디버그서버를 구동했을 때 "Killed: 9"가 나오면 스프링보드를 재시작해야 합니다.
// iPhone
killall -9 SpringBoard
6. 디버그서버 구동
(1) 아이폰에서 디버그서버를 구동합니다. "path_to_binary"에는 바이너리 경로를 넣어줍니다.
바이너리 경로는 앱을 시작한 후 "ps aux | grep 검색어" 명령어로 확인할 수 있습니다.
// iPhone
ps aux | grep XXX
debugserver localhost:1234 -x backboard path_to_binary
(2) iproxy 명령어를 사용하여 USB 포트와 TCP 포트 사이에서 프록시처럼 작동하게 합니다.
// Mac
brew install usbmuxd // 설치
iproxy 1234 1234 &
(3) lldb를 실행합니다.
// Mac
lldb
process connect connect://127.0.0.1:1234
사용
참고: https://lldb.llvm.org/use/map.html (gdb, lldb 명령어 맵핑)