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 함수의 리턴 값을 변조하는 방식으로 우회가 가능합니다.


REFERENCE

  1. https://github.com/naroSEC/Anditer?tab=readme-ov-file
  2. https://www.igloo.co.kr/security-information/anditer%eb%a5%bc-%ed%99%9c%ec%9a%a9%ed%95%9c-%ec%95%88%eb%93%9c%eb%a1%9c%ec%9d%b4%eb%93%9c-%ec%9c%84%ed%98%91-%ed%83%90%ec%a7%80-%eb%b0%8f-%ec%9a%b0%ed%9a%8c-%eb%b0%a9%ec%95%88-part-3-%ed%94%84/