나같으면 @deVbug0 님의 도움을 아~주 많이 받았지만

도움을 못받는 사람도 있을거고 안받을려는 사람도 있을거고.....


뭐 여튼 트윅제작에 대해 대충 써본다. (사실 나도 잘 모른다)


0. Tweak?

트윅을 시디아스토어에 올라온 모든 앱을 통칭하는 정도로 쓰는 사람들이 있는데 그건 아니다.


Tweak 의 사전적 의미는 뒤틀다, 수정하다 정도가 된다.

이 의미에서 알 수 있듯이 Tweak 은 이미 있는걸 수정하는 앱이다.


대표적으론 SBSettings 와 Activator 같은 것들.

이미 있는 SpringBoard(잠금화면, 홈화면 등을 주관하는 앱이 SpringBoard 이다.)를 수정하여

SBSettings 를 보이게 하고, 특정 동작에 대해 다른 작업을 할 수 있게 하는 것이다.


이를 위해서 다른 앱을 후킹해야 하는데 이 작업을 saurik 이 MobileSubstrate 란 앱으로 잘 해결해 놨다.

이부분에서 잘은 모르겠지만 앱 실행시 트윅용으로 제작된 동적라이브러리를 MobileSubstrate 가 강제로 load 시키는 듯?

탈옥툴의 성능(?)이나 MobileSubstrate 의 한계 등으로 후킹이 안되는 것들도 있다던데 이부분은 여전히 이해가 안간다..


여튼 iOS 내에선 저런게 있고, 개발시에는 substrate.h 의 함수들이 있지만 CaptainHook 나 logos(theos 에서 사용가능한 언어)로 쉽게 후킹가능하게 만들어져 있다. theos 의 경우 후킹하기가 매우 쉬움!



1. THEOS

본래는 크로스컴파일러로 시작한 것 같은데 어차피 컴파일러 등 맥이 필요한게 사실이고

사실상 맥에서만 돌아간다.(삽질을 많이 하면 리눅스기반에서도 돌릴 수는 있는 듯)

나의 경우 처음엔 템플릿을 내려받아 xcode 에서 mobilesubstrate base (즉 트윅) 를 개발했었는데

여러가지로 불편한 점도 많고 강력한 logos 언어를 사용할 수 없어서 theos 로 돌아왔음.


또한 초기에 PreferenceBundle 을 제작하고 싶어도 어떻게 할 줄을 몰라서 생ㅈㄹ을 했었는데

그냥 theos 로 만드는 거였음...ㅠㅠ


여튼 그래서 대부분의 트윅이 theos 로 컴파일 된다고 보면 된다.

사실 이 theos 는 ios 에서도 설치, 사용할 수 있는데 ios sdk3 까지 밖에 지원하지 않는다.

다른건 상관없는데 새로 등장한 코딩기법(예를 들면 블럭코딩 등)을 사용할 수 없고 이에 따른 제약들이 있다..


맥용 설치 / 사용법은 아래 주소.. 참고로 쨋든 xcode 의 설치가 필요함.

devbug 님 이 쓰신게 한글이니 걍 저거 보고 하면 된다 ㅋ

http://devbug.me/629

http://brandontreb.com/beginning-jailbroken-ios-development-getting-the-tools/



2. Cycript

나도 뒤늦게 알았다..

그리고 매우 신기하다!!

(시디아에서 설치하거나 apt-get install cycript 로 설치할 수 있다.)


이미 실행중인 프로세스에 붙어서 메서드 들을 실행할 수 있다

테스트 같은거 할때 매우 편리!!

좀더 이해할 수 있게 말하자면.. 

터미널에서 SpringBoard 에 연결해서 아이폰에 SpringBoard 가 돌아가는 상태로 바로 AlertView 를 띄우거나, 메서드 값을 확인하거나, 후킹을 하거나(이건 좀 복잡하드라) 등등이 가능하다!!


디버거 같은거일텐데 내가 디버거를 안써봐서 잘 모름;;ㅠㅠ


자바스크립트를 obj-c 로 바꿔준다고 자바스크립트가 기본이라는데 변수 선언을 var 로 하는거 말고는 딱히 왜 자바스크립트 인지 모르겠다.

여튼 좋음. 좋다! 걍 한번 써봐라 트윅제작을 한다면 계속 끼고 살게 될것임!



3. logify.pl

써보진 않았고, @typ0s2ud10 님이 트윗에 쓰셔서 알게 된거..

$THEOS/bin/ 에 있다.

헤더 파일을 input 으로 집어 넣으면 이 헤더에 선언된 메서드들을 모조리 후킹해서 호출될때 로그를 찍고 실행되게 만들어 준다.



4. symbolicate

앱이 작동하다 에러로 뻗어버릴때 에러로그는 두가지 방식으로 나온다(난 두개밖에 못봤다)

1. 어떤 메소드가 왜 문제였는지 시스템 로그에 뜸

2. 크래쉬 로그


어떨때 시스템 로그에 보여주고 어떨때 크래쉬 로그인지 잘은 모르겠지만 여튼 대충 저렇다.

첫번째의 경우 문제를 잡아내기 그나마 편리하지만 크래쉬 로그는 사실상 도움이 안된다..(아주 간혹 될때도 있음)

내가 못하는건진 모르겠지만 일반적인 앱이 사용하는 symbolicate 방식으론 이상한 결과만 나오더라.


여튼 그때 쓸 수 있는 ashikase 작품. 시디아에 라이브러리로 있다. https://github.com/ashikase/symbolicate

사실 이 역시 제대로 써보지도 않았고 작동법도 모른다.

tsProtectore 리포트 하기를 누르면 가장 최근의 크래쉬 로그를 symbolicate 로 보내는데 이걸 내 메일로 받아보니 쓸만 하겠더라.


메모리 주소를 메서드 명으로 다 바꿔주는 건 물론, 후킹을 했을 경우도 어떤 트윅이(dylib 파일명이 나옴) 어떤 메서드를 후킹했는지 알 수 있다. 또한 한 메서드를 두개의 트윅이 후킹했다면 각각이 어떤 메서드를 후킹한건지도 나온다.(물론 크래쉬 나기 이전 몇스텝 이내의 작업결과에 한해서.)


요즘엔 개발을 안해서 쓸일이 없지만 하게 된다면, 혹은 버그리포팅을 받을때 유용하게 쓸수 있을듯.

혹은 경우에 따라서 일부로 크래쉬를 내서 후킹할 메서드를 찾는 것도 도움이 될 것 같다;;




이제 나름 상당히 안다 싶었는데 여전히 모르는거, 못하는게 산더미 같이 많은 것 같다..ㅠㅠ

그리고 c 쪽이나 디버깅 같은걸 전무하다 싶을 정도로 모르니...ㅠㅠ

+ Recent posts