cycript란 javascript 와 Obj-C를 결합한 스크립트의 인터프리터이다. 실행 중인 프로세스에 attach해서 property를 변경하고 함수를 동적으로 호출할 수 있다.
설치는 cydia에서 cycript를 검색하여 쉽게 설치하였으나, http://www.cycript.org/debs/ 에서 .deb 파일을 받아서 설치할 수도 있다. mobilesubstrate와 libffi도 필수적으로 있어야 하는 것 같다. 설치하는 데는 filezilla sftp를 이용하여 파일을 넣고 filza 앱으로 간편하게 설치하였다. mobilesubstrate와 libffi 역시 cydia에서도 받을 수 있다. 단, 따로 설치하려면, 어디서든 사용할 수 있게 /usr/bin 위치에 설치해 줘야한다.
실행 시 분석할 앱이 실행중이어야 한다.
chaem-20171201ui-iPhone:~ root# ps -ef | grep Multi
501 847 1 0 0:00.00 ?? 0:03.02 /var/mobile/Containers/Bundle/Application/3662CFA9-39C7-4D7D-8C03-69605E111B53/Multi.app/Multi
0 942 834 0 0:00.00 ttys002 0:00.01 grep Multi
everspin-20171201ui-iPhone:~ root# cycript -p 834
cy#
cy# UIApp
#"<UIApplication: 0x15d7b760>"
cy# UIApp.delegate
#"<Multi.AppDelegate: 0x15e83920>"
앱의 현재 뷰 컨트롤러를 확인하기 위해, 먼저 keyWindow 속성을 찾아야 한다.
keyWindow는 사용자와 상호작용(터치 이벤트)을 받아주는 현재 화면이다. 앱의 모든 화면을 확인하고자 한다면, UIWindow 타입 클래스가 화면이라는 것을 알아두자.
cy# UIApp.windows
@[#"<UIWindow: 0x15dc4760; frame = (0 0; 320 568); autoresize = W+H; gestureRecognizers = <NSArray: 0x15dc3e40>; layer = <UIWindowLayer: 0x15db5090>>",#"<UITextEffectsWindow: 0x15ff0680; frame = (0 0; 320 568); opaque = NO; autoresize = W+H; layer = <UIWindowLayer: 0x15fe4cd0>>"]
cy# UIApp.keyWindow
#"<UIWindow: 0x15dc4760; frame = (0 0; 320 568); autoresize = W+H; gestureRecognizers = <NSArray: 0x15dc3e40>; layer = <UIWindowLayer: 0x15db5090>>"
keyWindow의 rootViewController는 이 화면의 root view controller를 보여준다. 화면의 root view controller 속성은 화면에서 보여주는 내용에 응답한다.
cy# UIApp.keyWindow.rootViewController
#"<Multi.LauncherViewController: 0x15fd1170>"
Multi.LauncherViewController가 적절한 뷰 컨트롤러를 보여주기 위해 적절한 클래스로 화면을 전환해주는 역할을 함
애플리케이션에서 확인할 수 있는 현재 뷰가 Multi.LauncherViewController라는 것을 알 수 있음
cy# UIApp.keyWindow.rootViewController
#"<Multi.EnvironmentSelectViewController: 0x156d8ea0>"
-> 처음에 뜨는 Please select server 화면
cy# UIApp.keyWindow.rootViewController
#"<Multi.LauncherViewController: 0x156355c0>"
-> 루팅 탐지된 상태의 화면
델리게이트 : 실제 테이블뷰의 데이터를 처리하는 프로토콜과 그외 셀의 디스플레이나 행동을 처리하는 프로토콜
cycript 사용법 : https://iphonedevwiki.net/index.php/Cycript_Tricks
var v = [[UIApp.keyWindow.rootViewController alloc] init]
UIApp.keyWindow.rootViewController = v
특정 클래스의 함수들을 출력해주는 함수
function printMethods(className) {
var count = new new Type("I");
var methods = class_copyMethodList(objc_getClass(className), count);
var methodsArray = [];
for(var i = 0; i < *count; i++) {
var method = methods[i];
methodsArray.push({selector:method_getName(method), implementation:method_getImplementation(method)});
}
free(methods);
free(count);
return methodsArray;
}
printMethods(UIApp.AppDelegate)
cy# printMethods(UIApp.AppDelegate)
MS:Error: _krncall(mach_vm_read_overwrite(task, data, sizeof(*baton), reinterpret_cast<mach_vm_address_t>(baton), &error)) =268435459
*** _assert(status == 0):../Inject.cpp(143):InjectLibrary
iOS 분석 프레임워크 : needle 이라는 툴이 있으나 버전에 따라 사용 불가할 수 있는 것 같다. https://m.blog.naver.com/taeyoun795/221544155974
IDA로 Controller를 검색하여 method명을 알아낸 후 cycript에서 이용할 수도 있다.
RVC = UIApp.keyWindow.rootViewController
RVC.visibleViewController
function printMethods(className, isa) {
var count = new new Type("I");
var classObj = (isa != undefined) ? objc_getClass(className).constructor : objc_getClass(className);
var methods = class_copyMethodList(classObj, count);
var methodsArray = [];
for(var i = 0; i < *count; i++) {
var method = methods[i];
methodsArray.push({selector:method_getName(method), implementation:method_getImplementation(method)});
}
free(methods);
return methodsArray;
}
printMethods(ViewController)
참고 링크
http://bitxflow.synology.me/wordpress/?p=208
https://seunit.tistory.com/2?category=784145
iOS 11.4.1 iphone6 plus에서 다음과 같은 에러 발생
chaemui-iPhone:/usr/bin/cycript_0.9.594 root# cycript -p 501
-sh: /usr/bin/cycript: Bad CPU type in executable
chaemui-iPhone:/usr/bin/cycript_0.9.594 root# ./cycript -p 501
Killed: 9
iOS 12.1.4 iphone6s 에서는 다음과 같은 에러 발생 ㅠ iOS12는 지원하지 않는다는 말도 있는 것 같긴한데 원인좀 알려주세요...
chaemui-iPhone:/usr/bin/cycript_0.9.594 root# ./cycript -p 501
Killed: 9
chaemui-iPhone:/usr/bin/cycript_0.9.594 root# cycript -p 501
-sh: /usr/bin/cycript: Bad CPU type in executable
'보안 및 개발 > MOBILE' 카테고리의 다른 글
[iOS] Unc0ver 앱을 이용한 탈옥 (0) | 2019.11.04 |
---|---|
[iOS] BurpSuite를 이용한 Proxy 설정 (response, SSL 포함) (0) | 2019.10.21 |
[iOS] otool 사용법 (0) | 2019.10.17 |
[iOS] 탈옥폰에서 분석환경 세팅 (clutch, class-dump) (0) | 2019.10.07 |
[iOS] objection 툴 사용 (0) | 2019.10.07 |