
1. 안티 프리다(ANTI-FRIDA)
1-1. BYPASS FILE&PATH : 프리다 디폴트 파일, 디렉터리 탐지 방식
프리다 관련 파일이 특정 디렉토리에 존재하는지 검사하는 방법입니다. 현재 앱 소스코드에서는 /data/local/tmp 경로에서 frida, linjector 문자열이 포함된 파일을 탐색하고 있으며 isCheckFridaBinary 리턴 값 변조로 간단히 우회가 가능합니다.

1-2. BYPASS PORT : 프리다 리스닝 포트 탐지 방식
아래와 같이 프리다(Frida) 디폴트 포트의 활성화 여부로 탐지하는 경우에는 해당 함수를 후킹하여 인자 값을 변조하는 방식으로 우회할 수 있습니다.

후킹 코드는 다음과 같습니다.
setImmediate(function() {
Java.perform(function () {
var Socket = Java.use('java.net.Socket');
Socket.$init.overload('java.lang.String', 'int').implementation = function(ipAddr, port) {
console.log(`Socket.$init(${ipAddr}, ${port}) => ${this.$init(ipAddr, port)}`);
return this.$init(ipAddr, 27501);
// 27000~27500 외 범위를 포트번호로 사용하여 탐지 우회
}
})
});
1-3. BYPASS MODULE : 모듈 탐지 방식
현재 실행중인 앱 프로세스의 메모리 맵을 확인하여 frida 관련 정보(모듈)가 존재하는지 확인하는 방법입니다. StringsKt.contains$default((CharSequence) it.next(), (CharSequence) "frida", false, 2, (Object) null) 코드 부분에서 contains$default 함수의 2번째 인자(“frida”)를 후킹하여 값을 변조하거나 isCheckFridaModule 함수의 리턴 값을 변조하면 우회가 가능합니다.

현재 제 기기에서는 아래와 같이 frida 관련 모듈이 탐색되지 않아 별도 우회 과정은 필요하지 않았습니다.
1|c1q:/ # ps -ef | grep anditer
u0_a336 14743 941 1 22:42:09 ? 00:00:27 com.playground.anditer
root 17277 17250 33 23:43:18 /debug_ramdisk/.magisk/pts/3 00:00:00 grep anditer
[ . . . ]
c1q:/ # cat /proc/14743/maps | grep frida
1|c1q:/ #1-4. BYPASS : 파이프 특정 문자열 탐지 방식
netstat | grep frida 명령어를 통해 안드로이드 기기에서 실행되고 있는 frida 관련 서비스가 있는지 확인하는 방법입니다. Intrinsics.areEqual(readText, "") 함수의 인자(readText) 값을 변조하거나, isCheckFridaPipe 함수의 리턴 값을 변조하는 방식으로 우회가 가능합니다.
