iOS App Runtime 조작
iOS 앱을 조작하는 방법에는 여러가지가 있다. 그중 cycript 를 이용한 방법에 대해 알아보자.
먼저 앱에 어떤 클래스가 있는지 어떤 메소드가 존재하는지 확인을 해야 수월한 분석이 가능하다. 하나씩 차분히 확인해 보도록 하자.
1. 클래스 분석
바이너리 클래스 분석에는 여러가지 툴이 사용되나, 아래 세가지 정도가 주로 사용된다.
1) class-dump-z
2) class-dump
3) IDA Pro
공통적으로 위 툴들을 사용하기 위해서는 바이너리 암호화를 먼저 풀어주어야 한다. 수동으로 복호화 할 수도 있지만
여기에선 clutch 를 이용한 자동 복호화를 알아 보자.
clutch 는 복호화 과정(메모리 덤프 - cryptid 조작)을 편리하게 자동으로 모두 해 준다.
iPhone:~ root# ./Clutch 2015-08-17 16:16:10.789 Clutch[887:24896] checking localization cache You're using a Clutch development build, checking for updates.. Your version of Clutch is up to date! Clutch 1.4.7 (git-2) --------------------------------- is iOS 8 application listing method brah is iOS 8 application listing method brah DEBUG | Preferences.m:42 | preferences_location: /etc/clutch.conf DEBUG | Preferences.m:43 | { RemoveMetadata = YES; } Daum maps HyundaiAppCard kbbank-ios kbminibank MiniSmartShinhan ShcTopsClub ShinhanCard SHRNDCard SHSmartPay YelloJihachul |
옵션없이 실행하면 위와 같이 현재 설치된 앱들 목록이 출력된다. 해당 앱을 선택하면 간단히 크랙(복호화)된다.
gimmanbog-ui-iPhone:~ root# ./Clutch ****bank
Clutch 1.4.7 (git-2)
---------------------------------
is iOS 8 application listing method brah
DEBUG | Preferences.m:42 | preferences_location: /etc/clutch.conf
DEBUG | Preferences.m:43 | {
RemoveMetadata = YES;
}
DEBUG | main.m:609 | app to crack {
ApplicationBasename = "kbminibank.app";
ApplicationBundleID = "com.kbstar.minibank";
ApplicationContainer = "/var/mobile/Containers/Bundle/Application/B8D46E0B-28D6-482F-8A23-C610A127DF90/";
ApplicationDirectory = "kbminibank.app";
ApplicationDisplayName = "\Uc2a4\Ud0c0\Ubc45\Ud0b9\Ubbf8\Ub2c8";
ApplicationExecutableName = kbminibank;
ApplicationName = kbminibank;
ApplicationVersion = "1.0.5.1";
MinimumOSVersion = "5.1.1";
PlugIn = 0;
RealUniqueID = "B8D46E0B-28D6-482F-8A23-C610A127DF90";
}
...(중략)...
DEBUG | Binary.m:1291 | 32-bit Region Size: 16384 5242880
DEBUG | Binary.m:1291 | 32-bit Region Size: 5242880 5242880
dumping binary: performing dump
dumping binary: patched cryptid
[====================================================>] 100%
dumping binary: writing new checksum
...(중략)...
DEBUG | Cracker.m:326 | Saved cracked app info!
/User/Documents/Cracked/**뱅킹미니-v1.0.5.1-no-name-cracker-(Clutch-1.4.7).ipa
elapsed time: 7.26s
Applications cracked:
****bank
Total success: 1 Total failed: 0
2. Cycript 연결
cycript 연결은 단순히 PID 값만 옵션으로 주면 된다. ps -ef 를 이용하여 확인한 PID 를 넣어 주도록 하자.
# ps -ef
...
0 865 1 0 0:00.00 ?? 0:00.03 /System/Library/PrivateFrameworks/CoreSymbolication.framework/c
0 881 1 0 0:00.00 ?? 0:00.28 sshd: root@ttys001
501 892 1 0 0:00.00 ?? 0:00.97 /var/mobile/Containers/Bundle/Application/240AD9E1-8F55-4A99-9E
...
immanbog-ui-iPhone:~ root# cycript -p 892
cy#
cy# UIApp.delegate
#"<RnDCardAppDelegate: 0x17e7ee70>"
cy# var m = [[MainViewController alloc ] init ] // 변수 m 에 메인 뷰 할당
#"<MainViewController: 0x17df3530>"
cy# UIApp.keyWindow.rootViewController = m // 현재 뷰를 강제로 메인 뷰로 바꿈
#"<MainViewController: 0x17df3530>"
=> 로그인 절차 등을 우회하여 메인 뷰 강제 이동 가능. 다만 로그인이 되지 않은 상태로 강제 이동이므로 사용에 제한이 있을 수 있음
cy# var m = [[LoginViewController alloc ] init ] // 로그인 뷰 할당
#"<LoginViewController: 0x17db21b0>"
cy# UIApp.keyWindow.rootViewController = m // 현재 뷰를 로그인 뷰로 바꿈
#"<LoginViewController: 0x17db21b0>"
=> 루팅, 무결성 탐지창이 뜨고 화면이 멈춘 상태에서 cycript 를 이용하여 강제로 로그인 화면으로 전환
cy# app.keyWindow.recursiveDescription // 관련 윈도우 등 출력
'iOS App Hacking' 카테고리의 다른 글
ios 앱 사용자 함수 hooking (using frida) (2) | 2017.08.16 |
---|---|
ios app 복호화 - Clutch 2.x 버전 (0) | 2017.02.14 |
iOS App Debugging - LLDB (1) | 2015.08.18 |
ios app hacking - (1) ios app 의 구조 (0) | 2014.02.03 |