효투의 세상 로딩중...
효투의 세상 로딩중...
반응형

2022.05.03 - [모바일/Ios] - [ios] 프리다 후킹 (Frida Hooking)을 통한 탈옥 탐지 우회 방법

 

[ios] 프리다 후킹 (Frida Hooking)을 통한 탈옥 탐지 우회 방법

최근 탈옥우회 트윅들이 퀄리티가 좋지않다... 애용했던 FlyJB X도 개발이 멈춰 지원이 되지않고 ios 14.3 이하버전이 아니라면 호환이 되지않음 그래서 어쩔수 없이 코드 분석을 통해 변조로 우회

hyotwo.tistory.com

 

저번에 깃허브에서 가져왔던 스크립트 모음 폴더를 보면 정말 다양한 약 50개의 스크립트가 있다

https://github.com/noobpk/frida-ios-hook

 

GitHub - noobpk/frida-ios-hook: A tool that helps you easy trace classes, functions, and modify the return values of methods on

A tool that helps you easy trace classes, functions, and modify the return values of methods on iOS platform - GitHub - noobpk/frida-ios-hook: A tool that helps you easy trace classes, functions, a...

github.com

이 중에선 똑같은 기능을하는 스크립트들도 있고

대체 어디에 어떤 상황에서 써먹어야하는지 모르겠는 스크립트도 있지만 탈옥 탐지 우회나

디버깅 탐지 우회 등 어떤 특정 클래스를 후킹해야할 때 유용한 스크립트 몇개를 선별했다.

 

1. raptor_frida_ios_enum

raptor_frida_ios_enum 스크립트는 키워드로 클래스를 추출할 때 메소드를 추출할 때

클래스 및 메소드를 추출할 때 유용하게 사용할 수 있다.

스크립트의 제일 밑단에 주석처리 되어있는 로그를 찍어주는 코드들을 풀어주고

"/키워드/i" 로 수정하여 스크립트를 동작하게되면 대소문자 상관없이 클래스 및 메소드를 찾아준다.

여러개를 해도 무방

 

2.show-all-methods-of-specific-class

show-all-methods-of-specific-class 스크립트는 특정 클래스의 모든 메소드들을 뽑아준다.

특정 클래스의 이름을 알았다면 역시 제일 밑단에 클래스 이름을 적어준다

여러개를 해도 동작하는 한계까지 괜찮다.

결과

 

3. hook-all-methods-of-specific-class

hook-all-methods-of-specific-class 스크립트는 특정 클래스의 모든 메소드를 후킹해준다.

위 두스크립트를 메소드 클래스를 파악하고 특정 메소드를 후킹해서 값을 변조했지만 우회하지 못했을 때,

이 클래스가 확실하다고 판단되거나 추정될 때  이 스크립트 한번 돌리면서 찔러주면 편하다.

 

역시 스크립트 제일 아랫단에 클래스명을 기입해주면된다

여러개의 클래스를 기입해도 무방함

그럼 아래 사진처럼 어떤 클래스의 어떤 메소드를 후킹했는지알려주며

Hooking successful 이라는 로그가 찍히는데

 

사실 위 코드를 보면 알겠지만 값을 변조하는 retval.replace 코드가 없어서 메소드에 후킹은 하지만

해당 클래스 및 메소드가 실행되어도 트레이스만 해줄 뿐 값을 변조하진 않는다

그래서 코드 수정이 필요하다.

 

retval.replace 코드를 추가해주고 function 및 하는 김에 로그에 색깔도 입혀서 가시성을 높임

수정된 코드는 다음과 같다

var colors = {
    "resetColor": "\x1b[0m",
    "green": "\x1b[32m",
    "yellow": "\x1b[33m",
    "red": "\x1b[31m",
	"BrightRed": "\x1b[31;1m"
}

function hook_class_method(class_name, method_name)
{
	var hook = ObjC.classes[class_name][method_name];
		Interceptor.attach(hook.implementation, {
			onLeave: function(retval) { 
			
			console.log("\x1b[33m","\t[*] Detected call to: [" + class_name+" "+method_name+"]",colors.resetColor);
			console.log("\x1b[32;1m","\t[*] 변조전 리턴: " + retval,colors.resetColor);
								
			retval.replace(0x0);
			console.log("\x1b[32m","\t[*] 변조후 리턴: " + retval,colors.resetColor);		
			
			} 
	});
}

function run_hook_all_methods_of_specific_class(className_arg)
{
	console.log("\x1b[31;1m","[*] Started: Hook all methods of a specific class",colors.resetColor);
	console.log("\x1b[32m","[+] Class Name: " + className_arg);
	//Your class name here
	var className = className_arg;
	//var methods = ObjC.classes[className].$methods;
	var methods = ObjC.classes[className].$ownMethods;
	for (var i = 0; i < methods.length; i++)
	{
		console.log("\x1b[33;1m","[-] "+methods[i],colors.resetColor);
		console.log("\x1b[36m","\t[*] Hooking into implementation",colors.resetColor);
		
		var className2 = className;
		var funcName2 = methods[i];
		hook_class_method(className2, funcName2);
		console.log("\t[*] Hooking successful");
		 
	}
	console.log("\x1b[34;1m","[*] Completed: Hook all methods of a specific class\n",colors.resetColor);
}

function hook_all_methods_of_specific_class(className_arg)
{
	setImmediate(run_hook_all_methods_of_specific_class,[className_arg])
}

//Your class name goes here
hook_all_methods_of_specific_class("DVIA_v2.ApplicationPatchingDetailsViewController")
hook_all_methods_of_specific_class("DVIA_v2.JailbreakDetectionViewController")
hook_all_methods_of_specific_class("JailbreakDetection")
hook_all_methods_of_specific_class("클래스명")

 

이제 이 수정된 스크립트를 돌리게 되면 아래 처럼 알록달록한 로그가 찍히며 후킹을 했다는 것을 알려주고

후킹된 메소드가 실행되면 값까지 변조한다

 

하지만  DVIA_v2.ApplicationPatchingDetailsViewController 클래스의 모든 메소드를 후킹해버려서

init 메소드의 값이 변조되자 에러가 나면서 프로세스가 종료된다.

실제로 탈옥탐지를 우회할 때 이  스크립트를 사용하게되면 많이 겪는 현상이다.

변조를 하지말아야할 메소드를 변조해버려서 에러가 발생하는 것이다

이럴 때 사용할 수 있는 방법이 2가지 정도가 더 있는데

하나는 다음 스크립트를 사용하는 것 

다른 하나는 if문을 활용하는 방법이 있다 (마지막에 정리)

반응형

 

4. hook-specific-method-of-class

hook-specific-method-of-class 스크립트는 위 특정 클래스의 모든 메소드를 후킹해서 변조한 결과 에러가 발생했다면

특정 클래스의 특정 메소드만 후킹하여 변조하는 스크립트이다.

사실 1편 포스팅에서 사용한 스크립트에 스크립트코드들을 추가해서 하는 것과 별반 다를게 없지만

클래스 및 메소드 작성하는게 훨씬 간단하고 편리해서 좋다.

이것 역시 아래 사진처럼 값 변조가 없기 때문에 코드 수정이 필요하다.

 

수정 코드

var colors = {
    "resetColor": "\x1b[0m",
    "green": "\x1b[32m",
    "yellow": "\x1b[33m",
    "red": "\x1b[31m",
	"BrightRed": "\x1b[31;1m"
}


function hook_specific_method_of_class(className, funcName)
{
    var hook = ObjC.classes[className][funcName];
    Interceptor.attach(hook.implementation, {
      onLeave: function(retval) {
        // args[0] is self
        // args[1] is selector (SEL "sendMessageWithText:")
        // args[2] holds the first function argument, an NSString
        console.log("[*] Detected call to: " + className + " -> " + funcName);
		
		console.log("\x1b[33m","\t[*] Detected call to: [" + className+" "+funcName+"]",colors.resetColor);
			console.log("\x1b[32;1m","\t[*] 변조전 리턴: " + retval,colors.resetColor);
			
			if (retval == 0x1) {
			
			retval.replace(0x0) }
			
			console.log("\x1b[32m","\t[*] 변조후 리턴: " + retval,colors.resetColor);
        //For viewing and manipulating arguments
        //console.log("\t[-] Value1: "+ObjC.Object(args[2]));
        //console.log("\t[-] Value2: "+(ObjC.Object(args[2])).toString());
        //console.log(args[2]);
      }
    });
}

//Your class name  and function name here



hook_specific_method_of_class("DVIA_v2.JailbreakDetectionViewController", "- jailbreakTest1Tapped:")
hook_specific_method_of_class("DVIA_v2.JailbreakDetectionViewController", "- jailbreakTest2Tapped:")
hook_specific_method_of_class("DVIA_v2.JailbreakDetectionViewController", "- jailbreakTest3Tapped:")
hook_specific_method_of_class("DVIA_v2.JailbreakDetectionViewController", "- jailbreakTest4Tapped:")
hook_specific_method_of_class("DVIA_v2.JailbreakDetectionViewController", "- jailbreakTest5Tapped:")
hook_specific_method_of_class("JailbreakDetection", "+ isJailbroken")
//hook_specific_method_of_class("className", "funcName")
//hook_specific_method_of_class("className", "funcName")

 

이렇게 수정된 스크립트를 돌려주면 아래 그림과 같이 특정 메소드가 실행될 때마다 후킹을 해주고

값이 변조는 되는 것을 로그로 확인할 수 있다.

 

 

마지막으로 3번 스크립트에서 if문을 활용해서 0x1 값만 변조하도록 하면

 

에러가 나지않고 0x1 값만 변조되는 것을 볼 수 있다.

다른 값들은 변조되지 않고 그대로 유지된다.

 

스크립트파일이 다양한 만큼 정말 신기하고 재밌는 스크립트들이 많고

아직 어떻게 활용해야할 지 모르는 스크립트도 많은데 알아보면 좋을것같다.

반응형
  • hyotwo7658@gmail.com

복사 완료 👍