1. 개요
Frida는 다양한 활용법이 있습니다. 우선 Frida를 이용한 Method 변환 방법을 해보도록 하겠습니다.
2. 준비
Frida가 설치된 환경
3. 방법
참조 : https://blog.attify.com/bypass-jailbreak-detection-frida-ios-applications/
※전부 위의 주소를 참조하여 진행하였습니다.※
위의 페이지는 iOS 위주로 설명 중이지만 같은 방법으로 Android에도 적용 가능하며 변형하여 활용할 수도 있습니다.
for (var className in ObjC.classes){
if (ObjC.classes.hasOwnProperty(className))
{console.log(className);} }
위의 코드는 Class명을 찾는 소스입니다. 위의 소스를 .js파일로 만들어 Frida 실행 시에 소스를 주입하여 실행시키는 형식입니다.
frida -U -l ~~.js <어플명> > class.txt
페이지에서는 직접 띄우는 형식이거나 grep으로 해당 부분을 찾아내는 형식이었지만 windows환경에서 활용하기에는 파일로 업데이트하여 직접 찾는 것이 훨씬 수월했습니다.
console.log("[*] Started: Find All Methods of a Specific Class");
if (ObjC.available) {
try {
var className = "의심되는 Class명";
var methods = eval('ObjC.classes.' + className + '.$methods');
for (var i = 0; i < methods.length; i++) {
try { console.log("[-] "+methods[i]); }
catch(err) { console.log("[!] Exception1: " + err.message); }
} }
catch(err) { console.log("[!] Exception2: " + err.message); } }
else { console.log("Objective-C Runtime is not available!"); }
console.log("[*] Completed: Find All Methods of a Specific Class");
위의 소스는 의심스러운 Class의 Method를 찾는 소스입니다.
위에 있는 “의심되는 Class명”은 Class들을 찾은 뒤 그 Class내에 있는 Method들 중 필요한 Method를 변조하기 위한 과정입니다.
위의 소스 또한 .js파일로 만들어 줍니다.
frida -U -l ~~.js <어플명> > test.txt
전에 말씀드린 것과 같이 windows의 환경을 고려하여 txttxt 파일로 만들어주어 찾기 쉽도록 한 것입니다.
위의 txt 파일에 Method들 중 의심스러운 Method 혹은 확인된 Method를 변조하는 과정을 수행하기 전에 해당 Method의 반환 값을 확인하는 과정을 진행합니다.
if (ObjC.available) {
try { var className = "의심되는 Class명";
var funcName = "의심되는 Method명";
var hook = eval('ObjC.classes.' + className + '["' + funcName + '"]');
Interceptor.attach(hook.implementation, {
onLeave: function(retval) { console.log("[*] Class Name: " + className);
console.log("[*] Method Name: " + funcName);
console.log("\t[-] Type of return value: " + typeof retval);
console.log("\t[-] Return Value: " + retval); } }); }
catch(err) { console.log("[!] Exception2: " + err.message); } }
else { console.log("Objective-C Runtime is not available!"); }
위의 Class와 Method를 써넣어줍니다.. 여기에서 주의할 점은 Method명을 넣을 때 Method의 “-” 혹은 “ ”처럼 띄어쓰기 및 빼기 표시는 꼭 같이 넣어주어야 합니다.
위처럼 진행할 경우 해당 Method의 반환 값이 True 혹은 False이거나 0x0 혹은 0x1의 값을 확인할 수 있습니다.
위와 같은 반환 값 즉 return value를 알게 되었다면 해당 값을 반대 값으로 바꾸어 줍니다. 이 과정을 수행하는 이유는 정상적으로 작동하는 앱에서 만약 문제 발생 시에 차단하는 것을 문제 존재 시 정상적으로 넘어가는 형식으로 바꾸어주는 것이라 생각하시면 되겠습니다.
if (ObjC.available) {
try {
var className = "의심되는 Class명";
var funcName = "의심되는 Method명";
var hook = eval('ObjC.classes.' + className + '["' + funcName + '"]');
Interceptor.attach(hook.implementation, {
onLeave: function(retval) { console.log("[*] Class Name: " + className);
console.log("[*] Method Name: " + funcName);
console.log("\t[-] Type of return value: " + typeof retval);
console.log("\t[-] Original Return Value: " + retval);
newretval = ptr("수정할 값")
retval.replace(newretval)
console.log("\t[-] New Return Value: " + newretval) } }); }
catch(err) { console.log("[!] Exception2: " + err.message); } }
else { console.log("Objective-C Runtime is not available!"); }
위의 수정할 값에는 0x0일 경우 0x1을 넣어주는 방식으로 진행하시면 됩니다.
위의 과정은 한 번에 성공할 확률이 높지 않습니다. 이 과정을 조금 더 세밀하고 정확하게 진행하고 싶으신 분은 ollydbg, IDA와 같은 동적 분석 툴을 이용하여 Method의 동작이나 탐지되는 Class를 분석하여 진행하면 실수를 줄일 수 있습니다.
하지만 위와 같은 방법을 반복적으로 진행하여 분석하여도 전혀 문제가 되지 않으며 하나씩 하다 보면 여러 가지 방법을 찾을 수 있을 것입니다.
'Android' 카테고리의 다른 글
Frida를 이용한 SSL Pinning 우회 [Hooking] (0) | 2019.12.27 |
---|---|
frida-gadget 설치 및 사용방법 (0) | 2019.12.26 |
XposedInstaller/Just trust me를 활용한 SSL Pinning 우회 (0) | 2019.12.24 |
인증서 설치를 통한 SSL Pinning 우회 (0) | 2019.12.23 |
frida와 frida-server 진단환경 구성 (0) | 2019.11.05 |