반응형

루팅 탐지를 하여 종료시키는 안드로이드 앱의 경우 종종 "System.exit()"나 "Process.killPorcess()" 함수를 후킹하면 앱 종료를 막아서 루팅 탐지 우회가 가능합니다.(실무에서도 꽤 많은 사례가 있습니다)

 

그런데, iOS의 경우 탈옥 탐지 우회에 "exit()"함수를 후킹했다는 사례를 눈을 씻고 찾아봐도 없습니다.

왜 그럴까 찾아봤더니, 애플에서 exit() 함수를 써서 앱을 종료시키면 앱 출시를 못하게 한다고 합니다.

부드럽게 종료되지 않아서 사용자에게 안 좋은 인상을 주는게 이유라고 합니다.

 

그러면, 앱스토어에 올라가지 않는 앱의 경우에는 exit() 함수를 써서 종료시켜도 무관하겠군요.

네, 기업 내부앱들(앱스토어를 통해 배포하지 않고 MDM등으로 배포하여 기업 임직원들만 사용)의 경우에는 앱스토어 정책에 영향을 받지 않기 때문에 exit() 함수를 써서 종료시키기도 합니다.

 

최근에, 기업 내부에 들어가서 진단을 수행하였는데 현존하는 모든 "탈옥탐지 우회 트윅"들을 사용하여도 우회가 안되어 보안진단에 애를 먹었습니다.

그런데, 탈옥탐지 알림창이 뜨고 "확인"버튼을 클릭했을때 뭔가 기분나쁘게 툭하고 꺼지는 것이 안드로이드의 exit() 함수를 사용한 종료와 닮아 있었습니다.

아니나 다를까, IDA로 까보니 exit()함수가 보입니다.

 

"-[example systemExit:]" 함수를 후킹하여 exit()함수를 호출하지 못하게 해봤습니다.(frida iOS Method Swizzling)

if (ObjC.available)
{
    try
    {
        var example = ObjC.classes.example ;
        var systemExit = example['- systemExit:'];
        var systemExitImpl = systemExit.implementation;
        systemExit.implementation = ObjC.implement(systemExit, function(handle, selector){
            console.log('muffin!');
        });
    }
    catch(err)
    {
        console.log("[!] Exception2: " + err.message);
    }
}
else
{
    console.log("Objective-C Runtime is not available!");
}

 

 

이후에는 탈옥탐지 알림창에서 "확인" 버튼을 클릭하여도 앱이 종료되지 않고, Method Swizzling한 결과인 "muffin" 문구가 출력되었습니다.

 

반응형

+ Recent posts