iOS App Runtime 조작

2015. 8. 17. 17:24


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   // 관련 윈도우 등 출력


+ Recent posts