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");

 

위의 소스는 의심스러운 ClassMethod를 찾는 소스입니다.

 

위에 있는 의심되는 ClassClass들을 찾은 뒤 그 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!"); }

 

위의 ClassMethod를 써넣어줍니다.. 여기에서 주의할 점은 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를 분석하여 진행하면 실수를 줄일 수 있습니다.

 

하지만 위와 같은 방법을 반복적으로 진행하여 분석하여도 전혀 문제가 되지 않으며 하나씩 하다 보면 여러 가지 방법을 찾을 수 있을 것입니다.

+ Recent posts