본문 바로가기
보안 및 개발/MOBILE

[iOS] cycript 사용법

by CH@3M 2019. 10. 17.

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 
반응형