ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 안드로이드 프리다(Frida) 핵심 정리 — 설치부터 후킹까지
    카테고리 없음 2026. 4. 9. 09:31

    프리다(Frida)란 무엇인가

    프리다(Frida)는 실행 중인 앱의 내부 동작을 실시간으로 분석하고 조작할 수 있는 동적 인스트루멘테이션(Dynamic Instrumentation) 툴킷이다.
    앱을 재컴파일하거나 소스코드 없이도 JavaScript 코드를 프로세스에 주입하여 함수 호출을 가로채거나 반환값을 변경할 수 있다.
    보안 연구자, 앱 분석가, CTF 참가자들이 가장 널리 사용하는 도구 중 하나로, Java 메서드와 Native 함수 모두 후킹이 가능하다는 점에서 강력한 범용성을 갖는다.

    프리다는 PC의 클라이언트(Python/CLI)와 Android 기기의 frida-server가 USB 또는 네트워크로 통신하는 구조로 동작한다.
    클라이언트에서 JavaScript 에이전트를 작성하면 frida-server가 이를 대상 앱 프로세스에 주입한다.
    이 구조 덕분에 복잡한 앱도 런타임 단계에서 손쉽게 분석할 수 있다.

    환경 준비 및 설치

    프리다를 사용하려면 PC와 Android 기기 양쪽에 각각 준비가 필요하다.
    PC에서는 Python 3.x와 frida-tools 패키지를 설치하고, Android 기기는 루팅이 되어 있어야 한다.
    에뮬레이터(AVD)도 사용 가능하며, 비루팅 환경에서는 frida-gadget을 APK에 삽입하는 방식을 대신 활용할 수 있다.

    # PC에 frida-tools 설치
    pip install frida-tools
    
    # 설치 확인
    frida --version
    
    # 연결된 기기 아키텍처 확인
    adb shell getprop ro.product.cpu.abi

    기기 아키텍처 확인이 중요한 이유는 frida-server 바이너리를 아키텍처에 맞게 선택해야 하기 때문이다.
    arm64-v8a, x86_64 등 아키텍처가 다르면 frida-server가 실행되지 않는다.
    GitHub의 frida releases 페이지에서 버전과 아키텍처에 맞는 파일을 내려받으면 된다.

    frida-server 기기에 올리기

    frida-server는 Android 기기에서 에이전트 주입을 담당하는 데몬 프로세스다.
    압축을 해제한 바이너리를 ADB로 기기에 전송한 뒤 루트 권한으로 실행하면 된다.
    한 번 실행해 두면 PC에서 frida CLI나 Python 스크립트로 자유롭게 연결할 수 있다.

    # frida-server 기기에 전송
    adb push frida-server /data/local/tmp/
    
    # 실행 권한 부여
    adb shell chmod 755 /data/local/tmp/frida-server
    
    # 루트 쉘에서 실행
    adb shell
    su
    /data/local/tmp/frida-server &

    서버가 정상 실행되면 PC에서 frida-ps -U 명령으로 기기의 프로세스 목록을 확인할 수 있다.
    목록이 정상적으로 출력된다면 연결이 성공한 것이다.
    이 상태에서 특정 앱에 연결하거나 앱 시작과 동시에 스크립트를 주입하는 작업이 가능해진다.

    # 실행 중인 프로세스 목록 확인
    frida-ps -U
    
    # 실행 중인 앱에 연결
    frida -U -n "com.example.app"
    
    # 앱 시작과 동시에 스크립트 주입
    frida -U -f com.example.app -l hook.js --no-pause

    주요 후킹 예시

    Java 메서드 후킹 및 반환값 변경

    가장 기본적인 후킹 패턴으로, 특정 메서드의 반환값을 강제로 변경할 수 있다.
    루트 감지, 라이센스 검사, 로그인 검증 등을 우회할 때 자주 활용된다.
    Java.use()로 클래스를 가져온 뒤 implementation을 재정의하면 된다.

    // hook_basic.js
    Java.perform(function() {
        var MainActivity = Java.use('com.example.app.MainActivity');
    
        MainActivity.isRooted.implementation = function() {
            console.log('[*] isRooted() 호출됨 — false 반환');
            return false;
        };
    });

    메서드 인자 및 반환값 로깅

    앱이 어떤 값을 주고받는지 파악하고 싶을 때는 로깅 방식의 후킹이 유용하다.
    로그인 함수의 username, password를 터미널에 출력하거나 암호화된 값을 복호화 전후로 비교하는 데 쓸 수 있다.
    overload()를 사용하면 오버로드된 메서드도 정확하게 지정할 수 있다.

    Java.perform(function() {
        var Login = Java.use('com.example.app.LoginManager');
    
        Login.login.overload('java.lang.String', 'java.lang.String')
            .implementation = function(user, pass) {
                console.log('[*] login() 호출');
                console.log('    username: ' + user);
                console.log('    password: ' + pass);
                var result = this.login(user, pass);
                console.log('    반환값: ' + result);
                return result;
            };
    });

    SSL Pinning 우회

    SSL Pinning은 앱이 서버 인증서를 고정하여 중간자 공격을 방지하는 보안 기법이다.
    Frida로 인증서 검증 로직을 무력화하면 Burp Suite 같은 프록시로 HTTPS 트래픽을 분석할 수 있다.
    OkHttp3와 기본 TrustManager 두 가지 경로를 함께 우회하면 대부분의 앱에 대응할 수 있다.

    Java.perform(function() {
        // OkHttp3 Pinning 우회
        try {
            var CertificatePinner = Java.use('okhttp3.CertificatePinner');
            CertificatePinner.check.overload('java.lang.String', 'java.util.List')
                .implementation = function(hostname, certs) {
                    console.log('[*] SSL Pinning 우회: ' + hostname);
                    return;
                };
        } catch(e) {
            console.log('OkHttp3 없음');
        }
    
        // TrustManager 전체 우회
        var X509TrustManager = Java.use('javax.net.ssl.X509TrustManager');
        var TrustAll = Java.registerClass({
            name: 'com.frida.TrustAll',
            implements: [X509TrustManager],
            methods: {
                checkClientTrusted: function(chain, authType) {},
                checkServerTrusted: function(chain, authType) {},
                getAcceptedIssuers: function() { return []; }
            }
        });
        var ctx = Java.use('javax.net.ssl.SSLContext').getInstance('TLS');
        ctx.init(null, [TrustAll.$new()], null);
        Java.use('javax.net.ssl.SSLContext').setDefault(ctx);
        console.log('[*] TrustManager 우회 완료');
    });

    Python으로 자동화

    Python 스크립트를 사용하면 앱 실행부터 스크립트 주입까지 자동화할 수 있다.
    device.spawn()으로 앱을 시작하고 device.attach()로 프로세스에 붙은 뒤 스크립트를 로드하는 흐름이다.
    반복적인 분석 작업이나 CI 환경에서의 자동 테스트에도 활용할 수 있다.

    import frida, sys
    
    PACKAGE = "com.example.app"
    SCRIPT = """
    Java.perform(function() {
        var Activity = Java.use('com.example.app.MainActivity');
        Activity.checkLicense.implementation = function() {
            console.log('[*] checkLicense 우회');
            return true;
        };
    });
    """
    
    def on_message(message, data):
        if message['type'] == 'send':
            print(f"[Frida] {message['payload']}")
        elif message['type'] == 'error':
            print(f"[Error] {message['stack']}")
    
    device = frida.get_usb_device()
    pid = device.spawn([PACKAGE])
    session = device.attach(pid)
    script = session.create_script(SCRIPT)
    script.on('message', on_message)
    script.load()
    device.resume(pid)
    sys.stdin.read()

    함께 쓰면 좋은 도구

    프리다는 단독으로도 강력하지만 다른 도구와 조합하면 분석 효율이 크게 높아진다.
    특히 jadx로 APK를 디컴파일해서 클래스명과 메서드명을 파악한 뒤 프리다 스크립트를 작성하는 흐름이 일반적이다.
    objection은 프리다 기반의 CLI 도구로, SSL Pinning 우회나 루트 감지 우회를 명령어 한 줄로 처리할 수 있어 초보자에게 특히 유용하다.

    도구 역할
    objection SSL Pinning·루트 감지 원클릭 우회
    jadx APK 디컴파일, 클래스 구조 파악
    apktool APK 언패킹 및 리패킹
    Burp Suite HTTPS 트래픽 분석 (SSL 우회 후 활용)
    # objection 설치
    pip install objection
    
    # 앱에 연결
    objection -g com.example.app explore
    
    # objection 쉘 내에서
    android sslpinning disable
    android root disable

    마무리

    프리다는 동적 분석의 핵심 도구로, 앱의 런타임 동작을 제어할 수 있다는 점에서 정적 분석만으로는 알 수 없는 많은 정보를 얻을 수 있다.
    설치와 서버 실행이 다소 복잡하게 느껴질 수 있지만, 한 번 환경을 갖추면 이후 분석 작업은 JavaScript 스크립트 몇 줄로 해결되는 경우가 많다.
    보안 연구, CTF, 앱 취약점 분석 등 허가된 환경에서 적극적으로 활용해 보길 권장한다.

Designed by Tistory.