2022.05.03 - [모바일/Ios] - [ios] 프리다 후킹 (Frida Hooking)을 통한 탈옥 탐지 우회 방법
저번에 깃허브에서 가져왔던 스크립트 모음 폴더를 보면 정말 다양한 약 50개의 스크립트가 있다
https://github.com/noobpk/frida-ios-hook
이 중에선 똑같은 기능을하는 스크립트들도 있고
대체 어디에 어떤 상황에서 써먹어야하는지 모르겠는 스크립트도 있지만 탈옥 탐지 우회나
디버깅 탐지 우회 등 어떤 특정 클래스를 후킹해야할 때 유용한 스크립트 몇개를 선별했다.
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 값만 변조되는 것을 볼 수 있다.
다른 값들은 변조되지 않고 그대로 유지된다.
스크립트파일이 다양한 만큼 정말 신기하고 재밌는 스크립트들이 많고
아직 어떻게 활용해야할 지 모르는 스크립트도 많은데 알아보면 좋을것같다.
'모바일 > Ios' 카테고리의 다른 글
[iOS] 트윅 호환성이 좋은 Checkra1n + Odyssey 탈옥 (Feat. Ventoy) (4) | 2022.10.21 |
---|---|
[ios] 주소값 변조를 통한 탈옥 탐지 우회 (4) | 2022.07.15 |
[ios] Frida Trace를 이용한 클래스 및 메소드 동작 추적 (3) | 2022.06.10 |
[ios] 사용자 함수(User Function) or 서브 루틴(Sub Routine) 프리다 후킹 및 변조 (0) | 2022.05.04 |