Notice
Recent Posts
Recent Comments
Link
«   2026/01   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

정뾰안 - 정보보안 블로그

Frida 기초 본문

Mobile

Frida 기초

정뾰안 2025. 12. 24. 21:15

1. Frida 개요

주요 구성요소

주요 구성요소 동작 설명 참고
Frida Server 디바이스 디바이스에서 실행되는 백엔드 프로세스 /data/local/tmp/frida-server
Frida Core 디바이스 및 호스트 Frida의 엔진(공유 라이브러리) libfrida-core.so
Frida Tools 호스트(PC, CLI) CLI/유틸 모음 frida, frida-ps, frida-trace 등
  • Frida Server
    -  frida-server-16.1.3-android-arm6 

    - 호스트 PC에서 Frida 명령을 보내면 서버가 디바이스 내 프로세스에 attach하여 스크립트를 주입하고 실행
  • Frida Core
    -  pip install frida 

    - 프리다의 엔진클라이언트가 서버와 통신하는 핵심 Python/JS 바인딩 라이브러리
    - attach/inject·hooking 등 인스트루먼트(Instrumentation)의 실제 기능을 제공
  • Frida Tools(CLI 클라이언트)
    -  pip install frida-tools 

    - Core를 사용해서 동작하는 명령줄 도구 모음

 

동작 흐름도

 

Frida 특징

Frida는 Android 플랫폼의 Java 계층과 Native 계층을 후킹(hooking), 조작 할 수 있기 때문에 동적 분석(dynamic analysis), 취약점 분석 등에 주로 사용한다.

 

 

 

 


2. Frida 사용법

Frida 실행 (+Anaconda)

Frida가 설치된 아나콘다 가상환경 py3을 실행한다.   conda activate py3 

 


기본 명령어

Frida는 여러 편의 기능을 제공한다. Frida에서 제공하는 명령어에 대한 간단한 설명을 하자면, Frida는 모든 기능을  frida  명령 하나에 옵션으로 넣는 대신 각 기능을 별도 CLI 툴로 제공한다. 그래서 보통 Frida를 설치하면 /usr/bin 하위에 여러 바이너리(실행 파일)가 생성된다. 주요 옵션 및 사용 방법은 다음과 같다.

 

 

 frida  명령어 : 메인 CLI

 frida 
▲ frida 명령어 기본구문 :  frida [options] [target] 

 frida -h 

▲  -h   --help  옵션 : show help message and exit

  frida -U -l [SCRIPT(절대경로)] -f [앱 패키지 이름] 
: 후킹 스크립트를 사용하여 앱 실행 명령 옵션
-U(--usb) : connect to USB device

-l(--load) [SCRIPT] : load SCRIPT

-f(--file) [TARGET] : spawn FILE
→ 프로세스를 새로 생성(spawn)해서 Frida가 그 프로세스에 attach할 수 있게 함

 

 

 

  frida-ls  명령어 : 파일시스템 전용 도구

 frida-ls 

▲ frida-ls 명령어 기본구문 :  frida-ls [options] [FILE] ... 

  frida-is -h 

▲  -h   --help  옵션 : show help message and exit

 

 

 

  frida-ps  명령어 : 프로세스 전용 도구

▲  frida-ps 

▲ frida-ps 명령어 기본구문 :  frida-ps [options] 

▲  frida-ps -h 
▲  -h   --help  옵션 : show help message and exit

 

 연결된 디바이스 장치 확인

Options 의미
frida-ps -U 연결된 디바이스에서 실행중인 모든 프로세스 목록 출력
frida-ps -Ua USB로 연결된 디바이스에서 실행 중인 앱 목록
frida-ps -Uai USB로 연결된 디바이스에서 설치된 모든 앱 목록

 

 

 

  frida-ls-devices  명령어 : 사용(연결) 가능한 디바이스 목록 조회

▲  frida-ls-devices 

 

 

 

  frida-trace  명령어 : 특정 함수 호출을 가로채서 로그를 찍어주는 도구

  frida-trace 

 frida-trace 명령어 기본구문 :  frida-trace [options] [target] 

  frida-trace -h 

 -h   --help  옵션 : show help message and exit

 

 

 

  frida-discover  명령어 : 앱 내부 함수/메서드를 스캔해서 보여주는 도구

  frida-discover 

 frida-discover 명령어 기본구문 :  frida-discover [options] [target] 

  frida-discover -h 

 -h   --help  옵션 : show help message and exit

 

 

 

  frida-kill  명령어 : 디바이스 프로세스를 강제 종료하는 도구

Frida가 attach 중인 프로세스나 특정 앱을 종료함 :  frida-kill -U com.example.app 

  frida-kill 

 frida-kill 명령어 기본구문 :  frida-kill [options] [process] 

  frida-kill -h 

 -h   --help  옵션 : show help message and exit

 

 


 

기본 문법 (JavaScript 구조)

  Java.perform() 
: Java VM이 완전히 초기화된 이후에 Java.use() 같은 작업을 안전하게 실행할 수 있게 보장하는 함수

앱 시작 초기에 Java VM은 ClassLoader가 완전히 준비된 상태가 아닐 수 있다. 그 시점에 Java.use() 등을 호출하면 Class가 로드되지 않아 에러가 발생하거나 Frida가 해당 Class를 찾지 못하는 등의 문제가 생길 수 있다. 그래서 Java VM과 ClassLoader가 완전히 준비될 때까지 기다려야 한다.

이럴 때 Java.perform()을 호출하면 콜백(작업)을 pending callbacks list에 우선 등록하고, 이후에 VM이 준비되면 pending callbacks queue를 가져와서 하나씩 실행한다.

pending callbacks list (pending callbacks queue)
Frida Java Runtime(Java bridge) 내부에 있는 작업(task) 큐

 

즉, Java.perform()은 그 큐에 작업을 등록(push)하는 역할이다.

결론. Java.perform()은 내부적으로 pending callback queue를 사용해서 Java VM과 ClassLoader가 완전히 준비된 뒤에만 작업을 수행하기 때문에 불안정한 타이밍 문제를 해결해주고 Hook이 항상 안전하게 작동하도록 하는 역할을 한다.

Java.perform(function () {
		// 후킹 코드
});

 

 

◇ 후킹(Hooking)

후킹은 Java 클래스 단에서 이루어진다.  ART 메서드 패치(브리지 변경)은 implementation 지정할 때 실행된다.(후킹 적용)

ART 메서드 패치(브리지 변경)
Android ART Runtime에서 특정 Java 메서드가 실행될 때 원래 코드로 가지 않고 Frida의 JS 코드(브리지)로 갈 수 있게 실행 흐름을 바꾸는 것
implementation 메서드
재정의(override) 속성
원래 Java 메서드 대신 내가 만든 JS 함수를 실행하도록 바꾸는 속성

Java 메서드의 실제 실행 로직을 바꿔 끼우는 자리

 

※ implementation 사용 예시

//앱에 이런 메서드가 존재한다고 했을 때
int getUserId() {
return 1234;
}
//위 코드를 Frida로 후킹한 코드 예시
myClass.getUserId.implementation = function() {
return 9999;
};

그러면 앱이 getUserId()를 호출해도 원래 코드가 실행되는 게 아니라 우리의 function이 실행된다.

 

 

 

  Java.choose(className, callbacks) 
: Frida에서 특정 Java 클래스의 인스턴스를 찾아서 조작할 때 사용하는 API

  • className : 찾고 싶은 클래스의 이름(패키지 포함)
  • callbacks : 찾은 인스턴스 각각에 대해 호출할 함수들을 지정
    • onMatch: function(instance) 일치하는 인스턴스를 찾을 때 마다 호출
      onMatch는 인스턴스를 하나씩 전달해야 해서 instance라는 변수를 사용하고, 변수명은 변경 가능
    • onComplete: function() 일치하는 인스턴스를 모두 찾은 후, 탐색이 완료되면 호출

choose를 통해 getId(); 메소드를 찾고 호출하는 예시

Java.perform(function() {
		var main;                              // 찾은 인스턴스를 저장할 변수 선언

		Java.choose(com.mypackage.name.class, {   // 해당 클래스의 모든 인스턴스를 찾음
		    onMatch: function(instance) {          // 인스턴스 하나를 찾을 때마다 호출
		        main = instance;                    // 찾은 인스턴스를 main 변수에 저장
		        console.log("Instance Matched!!"); // 인스턴스 찾았다는 로그 출력
		    },
		    onComplete: function() {                // 모든 인스턴스 탐색이 완료되면 호출
		        console.log('Solved Challenge!!!!'); // 완료 로그 출력
		    }
		});

		main.getId();                      // 찾은 인스턴스로 메서드 호출
});

 

 

 

  Java.enumerateLoadedClasses(callbacks) 
: 현재 앱(프로세스)에 로드된 모든 Java 클래스 이름을 나열(listing)하는 API

앱이 실행되면 수천 개의 클래스가 로딩되는데, 그 중에서 어떤 클래스들이 있는지 알아야 후킹할 대상을 찾을 수 있기 때문에 이때 사용하는 것이 enumerateLoadedClasses이다. 쉽게 말해 choose는 클래스의 인스턴스를, enumerateLoadedClasses는 클래스를 찾는 거라고 생각하면 된다.

 

기본 형태

Java.enumerateLoadedClasses({
		onMatch: function(className) {
				// 클래스 하나를 찾을 때마다 호출
		},
		onComplete: function() {
				// 모든 클래스 나열이 끝났을 때 호출
		}
});

 

 

 

  setImmediate(function) 
: 현재 실행 중인 JavaScript 이벤트 루프가 끝난 직후, 지정한 함수를 즉시 실행하라는 명령

즉, 지금 당장 실행해! 하지만 현재 실행 중인 작업이 끝난 뒤에!

Frida 스크립트에서  Java.perform()  보다 먼저 실행하면 문제 생기는 경우가 있어서 안전하게 코드 실행 순서를 맞추기 위해 사용한다.

 

 기본 형태

setImmediate(function() {
		console.log("즉시 실행됨!");
});

'Mobile' 카테고리의 다른 글

Nox에 Burpsuite 인증서 등록  (0) 2025.12.25
Nox 설치 및 루팅  (0) 2025.12.25
Dopamine 탈옥(아이폰SE + iOS 15.8.3)  (0) 2025.12.24
JEB (+Frida/Nox)  (0) 2025.12.19
LDPlayer 설치 및 ADB Shell 접속  (0) 2025.12.17