티스토리 뷰

안녕하세요.

광주아이입니다.

https://hanssomi.kr/249

 

아이폰(iOS), 안드로이드폰(Android) 후킹(Hooking)에 대해서 #1

안녕하세요. 광주아이입니다. https://hanssomi.kr/247 Android functions hooking with XPosed 오랜만에 포스팅을 합니다. 거두절미하고 본론부터 가겠습니다. Magisk로 루팅된 단말기에 magiskhide라는 아주 좋..

hanssomi.kr

아이폰(iOS), 안드로이드폰(Android) 후킹(Hooking)에 대해서 #1

에 이어서 #2를 작성해보려합니다.

본 문서는 다시 말씀드리지만

연구용도로 작성되었으니 연구용도로만 봐주시면 정말 감사하겠습니다. :)

(직접 트윅을 제작하시거나 우회할 수 있는 방법은 드릴 수 있습니다.)

#1에서 말씀드린 루팅/탈옥 탐지 우회를 완벽하게 방어하는 방법이 없다고 말씀드렸습니다.

보통

아래와 같은 방법으로 루팅/탈옥을 탐지 하는데요.

Android : /bin/su, /xbin/su, magisk, XposedBridge ..... (루팅 관련 superuser 권한의 바이너리 혹은 프레임워크)

iOS : /bin/su, /system/cydia.log, MobileSubstrate, TweakInject.dylib...... (탈옥 관련 superuser 권한의 바이너리 혹은 프레임워크)

가 있냐 없냐

pthread_create() 함수를 이용해서 쓰레드가 생성이 되었냐

수 많은 앱의 루팅/탈옥 탐지 우회를 하다보니 대표적인 시스템 관련 함수를 예로 들었습니다.

#1의 답을 드리자면

위의 함수의 리턴값 또는 위의 파일들이 실제 존재해도 안 보이게끔 하면 끝이라는 겁니다.

자 그럼 어떻게 안 보이게 할거냐

물론

Android - Xposed Framework

iOS - Cydia Mobile Substrate

의 아주 좋은 트윅을 이용해서 함수 후킹이 들어간다는거죠.

iOS 의 

NSFileManager ClassfileExistsAtPath 라는 함수가 있습니다.

인자로는 파일명이 들어가고요.

리턴은 boolean 입니다.

함수 원형은 다음과 같습니다.

- (bool) fileExistsAtPath:(NSString *) path

실제 디바이스 내의

/private/var/stash 라는 파일이 존재를 하면 이 함수는 YES를 리턴할 것이며

탈옥되었다 라고 사용자한테 알려주겠죠.

눈치 빠르신 분들은 이미 이해하셨을 거에요.

NSFileManager 라는 클래스의 fileExistsAtPath를 후킹하면 된다는 얘기입니다.

이 함수에 후킹을 걸고

인자(path) 의 값이 들어오면 NO를 리턴해주면 없다고 판단하겠지요.

if([path isEqualToString:@"/private/var/stash"]) {

    return NO;

}

이렇게요.

하지만 이런거 가지고 탈옥이 되었다 안되었다 판단하기에는 좀 그렇죠?

그래서 개발자들은 사용자 함수를 이용해서 앱의 흐름 파악이 어렵도록 만들고 있습니다.

디버거(전 IDA)로 디버깅을 해보면 다음과 같은 화면을 줄 곳 보실 수 있을거에요.

사용자 함수

 

NSFileManager Class의 fileExistsAtPath: 함수

대략적으로만 봐도 fileExistsAtPath 함수로 먼가가 하는거 같지요?

바로 Data 영역에 저장돼 있는 탈옥관련 파일들을 손 볼 수 있는 사용자 함수의 내부 입니다.

이 사용자 함수를 후킹을 해보겠습니다.

실제 이 앱은 시중에 나와있는 앱의 사용자 함수이구요.

이 사용자 함수의 리턴은 정상 : 0, 비정상 : 0이 아닌 정수형

이다 라고 판단을 할 수는 있습니다.

Mobile Substrate

Tweak.xm

int (*orig_100032EA4)(void); // original 함수 원형

int sub_100032EA4(void) // original 함수를 대체할 함수
{
    return 0;
}

%ctor 
{
    unsigned long test1 = _dyld_get_image_vmaddr_slide(0) + 0x100032EA4; // 해당 주소(번지)에 이 함수를 덮어 씌워주는 변수
    MSHookFunction((void *)test1, (void *)sub_100032EA4, (void **)&orig_100032EA4);
}

이제 이 original 함수는 int sub_100032EA4라는 함수로 대체되게 됩니다.

너무 깔끔하게 후킹이 되어버렸죠?

(하지만 앱이 업데이트 되면 해당 번지수는 존재하지 않거나 내용이 바뀌어 버렸으니 다시 만들어줘야 합니다.)

여기서 집고 넘어가야 할 함수가 하나 존재하죠?

바로 함수를 후킹할 수 있는 MSHookFunction 설명은 아래 주소에서 들으실 수 있습니다.

http://www.cydiasubstrate.com/api/c/MSHookFunction/

 

MSHookFunction | Cydia Substrate

While modifying the behavior of high-level runtimes such as Java or Objective-C can often be something that can be done using supported features (such as custom class loaders or runtime APIs), native code can make the challenge of code instrumentation daun

www.cydiasubstrate.com

여기 보시면 아주 자세하게 Example 코드까지 나와있습니다.

참고하시면 큰 도움이 되시리라 생각합니다.

 

여기까지 잘 읽으신 분은 직접 따라해보셔도 좋으실 듯 합니다.

 

보안쪽에 일하시는 분들은 예전부터 창이 먼저냐 방패가 먼저냐 라는 말을 많으 들으셨을겁니다.

저번에도 제가 말씀드렸다시피 

저는 창이 먼저라 생각되어집니다.

어떻게 뚫었냐에 대한 답은

방패 +1 스킬업

이라는 거죠.

공격이 없으면 굳이 방패가 있을 필요가 없다라고 생각합니다. (쉴드까지는 허용하겠습니다.)

어마어마한 공격을 보안담당 및 개발파트에서 종사하시는 분들이 참고하셔서

이 시대에 IT 강대국이 되지 않았나 싶습니다.

#3에서는 Android 쪽도 다뤄볼 것입니다.

Android도 물론 잘 막을 수 있냐?

...

...

...

...

...

...

...

...

...

...

물론 없습니다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함