-
안드로이드 프리다(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, 앱 취약점 분석 등 허가된 환경에서 적극적으로 활용해 보길 권장한다.