IDA로 코드를 분석할 때 탈옥탐지 코드에 심볼(Symbol)이 살아있어 클래스와 메소드가 명시되어
2022.05.03 - [모바일/Ios] - [ios] 프리다 후킹 (Frida Hooking)을 통한 탈옥 탐지 우회 방법
위와 같은 방법으로 후킹이 가능한 반면
심볼이 없는 클래스 및 메소드들은 IDA에서 자동으로 파싱을해서
sub_10000C24C __text 000000010000C24C 000000D8 00000030 FFFFFFFFFFFFFFF8 R . . . B . .
이런식으로 IDA에서 네이밍을 해준다.
근데 만약에 아래 사진처럼 서브루틴에 탈옥탐지 코드가 있다면 기존 후킹방법으로는 후킹이 불가하다.
왜냐하면 클래스와 메소드를 스크립트에 명시해줘야 하는데 offset 외에는 알 수 없기 때문
그래서 폭풍 구글링을 해보았지만 모든 포스팅들이 다 똑같은 말을 했는데
직접 해보니까 적어도 스크립트에서 원하는 주소값을 구하는 방식은 아닌것 같았다.
그래서 실제로 바이너리의 offset을 확인하고 서브루틴의 주소를 구해보려 노력했다.
바이너리 파일 확인
후킹할 서브루틴의 절대주소와 시작주소
어디에 사용되는지는 모르겠으나
이 서브루틴 즉 사용자 함수 주소 계산 방식이
섹션 오프셋 + ( 함수 절대주소 - 섹션 시작주소 or 함수 시작주소)
계산해보면 0xBBAC8 등을 비롯하여 값이 좀 나오는데 정확히 알기어렵다
해당 부분에 후킹을 시도해보았더니 어떤 부분을 후킹해서 결과값은 떨어지나
원하는 탈옥탐지 우회는 되지않았다.
나 같은 경우엔 이 사용자 함수의 주소를 계산으로 구하거나 그러지 않고
그냥 서브루틴 시작주소의 값을 가져와서 후킹을 시도했다.
구글링에서 찾을 수 있는 기존 코드는 아래 코드 2개
if (ObjC.available) {
try {
/*------------------------ByPass JailBreak------------------*/
var module_base = Module.findBaseAddress('callhelper')
var custom3_ED3C = module_base.add(0x87AC); // add function offset 0xBBDC
Interceptor.attach(custom3_ED3C, { // set hook
onEnter: function (args) {
console.log("[S] !!!!!!!!!!!!!! custom3() called");
},
onLeave: function (retval) {
console.log(retval);
}
});
}
catch(err) { console.log("[!] Exception2: " + err.message); } }
if(ObjC.available){
try{
var module_base = Module.findBaseAddress('example'); // get base addr.
var sub_3F7BC = module_base.add(0x3F7BC); // add function offset
Interceptor.attach(sub_3F7BC, { // set hook
onEnter: function (args) {
console.log("[+] sub_3F7BC() called");
// args[0] = self, args[1] = selector, args[2-n] = arguments
console.log(args[2]+", "+args[3]+", "+args[4]+", "+args[5]+", "+args[6]);
},
onLeave: function (retval) {
connsole.log("[-] sub_3F7BC ret: " + retval.toString() ); // after call
}
});
}
catch(err){
console.log("[!] Exception2: " + err.message);
}
}
else {
console.log("Objective-C Runtime is not available!");
}
근데 두 코드 모두 약간의 오류가 존재하고 값을 변환하는 명령이 없어서 아주 약간
후킹 시 가시성과 리턴값 변환까지 수정을 했다
if(ObjC.available){
try{
var module_base = Module.findBaseAddress('Base'); //앱 Base명 입력
var sub = module_base.add(offset); // 오프셋 값 입력
Interceptor.attach(sub, {
onEnter: function (args) {
console.log("");
console.log("서브루틴 주소:" + sub);
console.log("베이스주소:" + module_base);
console.log("[+] 사용자함수 호출");
console.log("args: " + args[2]+", "+args[3]+", "+args[4]+", "+args[5]+", "+args[6]);
},
onLeave: function (retval) {
console.log("\t[-] Type of return value: " + typeof retval);
console.log("\t[-] Original Return Value: " + retval);
retval.replace(0x0); // 리턴값 변환
console.log("\t[-] Type of return value: " + typeof retval);
console.log("\t[-] Return Value: " + retval);
}
});
}
catch(err){
console.log("[!] Error: " + err.message);
}
}
else {
console.log("Objective-C Runtime is not available!");
}
아래 박스친 부분에 필요한 값들을 채워준 후 스크립트를 돌리면 된다.
현재 앱스토어에 올라와있는 2개정도의 앱으로 테스트 결과
모두 정상적으로 후킹이 되어 탈옥탐지가 우회되었다.
찍힌 로그를 보면 0x1이 0x0으로 변환되어 우회되는 것을 확인할 수 있다.
이렇게 만든 스크립트를 추가적으로 분석한 결과
진짜 BaseAddress가 무엇인지 필요한 Offset 및 서브루틴 (사용자함수)의 정확한 주소 계산방법도 알 수 있었다.
일단 문제의 BaseAddress는 otool이 아닌 lldb에서 확인할 수 있다. image list
바로 바이너리(베이스) 파일에서 가져오는 주소값이다.
그리고 문제의 Offset은 쉽게말해 서브루틴의 Start주소값이다
로그를 추가한 결과를 보면
서브루틴 주소는 0x100a3b628
Base Address는 0x100a0c000 베이스 주소는
방금 lldb에서 확인한 주소와 동일한 것을 확인할 수 있다.
서브루틴 주소는 이 베이스 주소 + 오프셋이다.
즉 사용자 함수의 시작주소를 더 베이스주소에 더해주면
0x100a3b628 서브루틴이 동작된 주소와 동일한 값을 알 수 있다.
여기서 Base 주소와 서브루틴 주소는 항상 바뀌지만 Offset은 변하지 않는다
시작주소는 항상 동일
그래서 스크립트 코드를 분석해보면
module_base 변수는 findBaseAddress라는 모듈을 통해 바이너리에서 베이스주소를 가져온 후
sub 변수에 module_base 변수 즉 베이스주소에 offset을 더한다 이 때 offset은 아까 말했던것 처럼 변하지않는
시작주소의 값이고
이 sub 변수는 위에서 로그로 출력된 서브루틴 주소가 되어 Attach되고 후킹이 되는 원리다
try{
var module_base = Module.findBaseAddress('Base');
var sub = module_base.add(offset);
Interceptor.attach(sub, {
onEnter: function (args) {
'모바일 > Ios' 카테고리의 다른 글
[ios] 프리다 후킹 (Frida Hooking)을 통한 탈옥 탐지 우회 방법 2 (스크립트 활용) (0) | 2022.06.13 |
---|---|
[ios] Frida Trace를 이용한 클래스 및 메소드 동작 추적 (3) | 2022.06.10 |
[ios] ios 클래스 및 메소드 추적 Frida-Trace (2) | 2022.05.04 |
[ios] 앱과 아이폰 버전 및 ios 버전 호환이 안맞을 때 앱 설치 방법 (0) | 2022.05.03 |