업데이트로 돌아가기
New releaseAug 10, 2026

r2frida v6.2.0

Radare2와 Frida는 함께하면 더 좋습니다.

공유

r2frida

Radare2와 Frida가 함께할 때 더 좋다 ci radare2

설명

radare2용 자체 포함 플러그인으로, frida를 탑재하며 Frida 스크립트 대신(또는 추가로) r2 명령어를 사용하여 로컬 또는 원격 프로세스를 계측할 수 있습니다.

radare 프로젝트는 리버스 엔지니어링을 위한 완전한 도구 체인을 제공하며, 활발히 유지관리되고 있으며 잘 관리된 기능과 함께 다른 프로그래밍 언어 및 도구로 기능을 확장할 수 있습니다.

Frida는 동적 계측 툴킷으로, 자신의 JavaScript를 주입하여 실행 중인 프로세스를 검사하고 조작하기 쉽게 해주며, 선택적으로 스크립트와 통신할 수도 있습니다.

기능

  • 수정하지 않은 Frida 스크립트 실행 (. : 명령어 사용)
  • C, JavaScript 또는 TypeScript 조각을 모든 프로세스에서 실행
  • 로컬 또는 원격 시스템에 attach, spawn, launch 가능
  • 섹션, 심볼, 익스포트, 프로토콜, 클래스, 메서드 나열
  • 에이전트 내부 또는 호스트에서 메모리 내 값 검색
  • 짧은 명령어로 메서드 구현 교체 또는 후크 생성
  • 대상 프로세스에 라이브러리 및 프레임워크 로드
  • Dalvik, Java, ObjC, Swift 및 C 인터페이스 지원
  • 파일 디스크립터 및 환경 변수 조작
  • 프로세스에 시그널 전송, 계속 실행, 중단점 설정
  • r2frida io 플러그인은 파일시스템 fsdebug 백엔드로도 작동
  • r2pipe를 사용하여 r2와 frida 자동화
  • 프로세스 메모리 읽기/쓰기
  • 함수, 시스템 콜 및 원시 코드 조각 호출
  • USB 또는 TCP/IP를 통해 frida-server에 연결
  • 앱 및 프로세스 열거
  • 레지스터, 함수 인자 추적
  • x64, arm32 및 arm64에서 Linux, Windows, macOS, iOS, Android 테스트 완료
  • 호스트에 frida가 설치되어 있지 않아도 됨 (frida-tools 불필요)
  • 에이전트에서 실행되는 플러그인으로 r2frida 명령어 확장
  • 페이지 권한 변경, 코드 및 데이터 패치
  • 이름 또는 주소로 심볼을 해석하여 r2에 플래그로 가져오기
  • 에이전트에서 호스트의 r2 명령어 실행
  • 원격 대상 프로세스 내에서 r2 API 사용 및 r2 명령어 실행
  • :db API를 사용한 네이티브 중단점
  • r_fs API를 사용한 원격 파일시스템 접근

설치

r2frida 설치의 권장 방법은 r2pm을 사용하는 것입니다:

$ r2pm -ci r2frida

컴파일이 필요 없는 바이너리 빌드는 곧 r2pmr2env에서 지원될 예정입니다. 그동안 Releases 페이지에서 최신 빌드를 다운로드하세요.

컴파일

의존성

  • radare2
  • pkg-config (Windows에서는 불필요)
  • curl 또는 wget
  • make, gcc
  • npm, nodejs (곧 제거 예정)

GNU/Debian에서는 다음 패키지를 설치해야 합니다:

$ sudo apt install -y make gcc libzip-dev nodejs npm curl pkg-config git

지침

$ git clone https://github.com/nowsecure/r2frida.git
$ cd r2frida
$ make
$ make user-install

Windows

  • meson 및 Visual Studio 설치
  • 최신 radare2 릴리스 zip을 r2frida 루트 디렉토리에 압축 해제
  • 디렉토리 이름을 radare2로 변경 (radare2-x.y.z 대신)
  • VS 컴파일러를 PATH에서 사용할 수 있도록 (preconfigure.bat)
  • configure.bat 실행 후 make.bat 실행

사용법

테스트를 위해 r2 frida://0을 사용하세요. frida에서 pid0에 attach하는 것은 로컬에서 실행되는 특별한 세션입니다. 이제 :? 명령어를 실행하여 사용 가능한 명령어 목록을 확인할 수 있습니다.

$ r2 'frida://?'
r2 frida://[action]/[link]/[device]/[target]
* action = list | apps | attach | spawn | launch
* link   = local | usb | remote host:port
* device = '' | host:port | device-id
* target = pid | appname | process-name | program-in-path | abspath
Local:
* frida://?                        # 이 도움말 표시
* frida://                         # 로컬 프로세스 목록
* frida://0                        # frida-helper에 attach (spawn 필요 없음)
* frida:///usr/local/bin/rax2      # spawn할 절대 경로
* frida://rax2                     # 위와 동일, local/bin이 PATH에 있다고 가정
* frida://spawn/$(program)         # 현재 시스템에서 새 프로세스 spawn
* frida://attach/(target)          # 현재 호스트의 대상 PID에 attach
USB:
* frida://list/usb//               # 첫 번째 USB 장치의 프로세스 목록
* frida://apps/usb//               # 첫 번째 USB 장치의 앱 목록
* frida://attach/usb//12345        # 첫 번째 USB 장치의 주어진 PID에 attach
* frida://spawn/usb//appname       # 첫 번째 확인된 USB 장치에서 앱 spawn
* frida://launch/usb//appname      # 첫 번째 USB 장치에서 앱 spawn+resume
Remote:
* frida://attach/remote/10.0.0.3:9999/558 # TCP 원격 frida-server의 PID 558에 attach
환경 변수: (`%` 명령어로 런타임에 환경 변경 가능)
  R2FRIDA_SAFE_IO=0|1              # Android/thumb에서 Frida 버그 우회
  R2FRIDA_DEBUG=0|1                # 인자 파싱 동작 디버깅에 사용
  R2FRIDA_COMPILER_DISABLE=0|1     # 새로운 frida typescript 컴파일러 비활성화 (`:. foo.ts`)
  R2FRIDA_AGENT_SCRIPT=[file]      # r2frida 에이전트 파일 경로

예제

$ r2 frida://0     # frida -p 0과 동일, 로컬 세션에 연결

이름 또는 PID로 프로그램에 attach, spawn, launch할 수 있습니다. 다음 줄은 rax2라는 첫 번째 프로세스에 attach합니다 (다른 터미널에서 rax2 -를 실행하여 이 줄을 테스트하세요)

$ r2 frida://rax2  # `rax2`라는 이름의 첫 번째 프로세스에 attach
$ r2 frida://1234  # 주어진 PID에 attach

바이너리의 절대 경로를 사용하여 spawn하면 프로세스가 생성됩니다:

$ r2 frida:///bin/ls
[0x00000000]> :dc        # 대상 프로그램 실행 계속

인자와 함께도 작동합니다:

$ r2 frida://"/bin/ls -al"

USB 디버깅으로 iOS/Android 앱을 디버깅하려면 다음 동작을 사용하세요. spawnlaunch 또는 attach로 대체 가능하며, 프로세스 이름은 bundleid 또는 PID일 수 있습니다.

$ r2 frida://spawn/usb/         # 장치 열거
$ r2 frida://spawn/usb//        # 첫 번째 iOS 장치의 앱 열거
$ r2 frida://spawn/usb//Weather # 날씨 앱 실행

명령어

다음은 가장 자주 사용되는 명령어이며, 하위 명령어 도움말을 보려면 ?를 붙이세요.

:i        # 대상 정보 가져오기 (PID, 이름, 홈, 아키텍처, 비트 등)
.:i*      # 대상 프로세스 세부 정보를 로컬 r2로 가져오기
:?        # 사용 가능한 모든 명령어 표시
:dm       # 맵 목록. ':dm|head'를 사용하고 프로그램 베이스 주소로 seek
:iE       # 현재 바이너리의 익스포트 목록 (seek)
:dt fread # 'fread' 함수 추적
:dt-*     # 모든 추적 삭제

플러그인

r2frida 플러그인은 에이전트 측에서 실행되며 r2frida.pluginRegister API로 등록됩니다.

더 많은 예제 플러그인 스크립트는 plugins/ 디렉토리를 참조하세요.

[0x00000000]> cat example.js
r2frida.pluginRegister('test', function(name) {
  if (name === 'test') {
    return function(args) {
      console.log('Hello Args From r2frida plugin', args);
      return 'Things Happen';
    }
  }
});
[0x00000000]> :. example.js   # 플러그인 스크립트 로드

: . 명령어는 r2의 . 명령어와 비슷하지만 에이전트 내부에서 실행됩니다.

:. a.js  # 플러그인을 등록하는 스크립트 실행
:.       # 플러그인 목록
:.-test  # 이름으로 플러그인 언로드
:.. a.js # 스크립트를 영구화 (분리 후에도 계속 실행)

Termux

Android에서 Termux를 통해 r2frida를 네이티브로 설치하고 사용하려면 라이브러리 의존성에 주의해야 합니다. 일부 심볼 해석 문제 때문입니다. 이를 해결하는 방법은 LD_LIBRARY_PATH 환경 변수를 Termux의 libdir보다 먼저 시스템 디렉토리를 가리키도록 확장하는 것입니다.

$ LD_LIBRARY_PATH=/system/lib64:$LD_LIBRARY_PATH r2 frida://...

문제 해결

최신 버전의 r2를 사용하고 있는지 확인하세요 (가급적 최신 릴리스 또는 git).

r2 -L | grep frida를 실행하여 플러그인이 로드되었는지 확인하세요. 아무것도 출력되지 않으면 R2_DEBUG=1 환경 변수를 사용하여 디버깅 메시지를 확인하고 원인을 찾으세요.

r2frida 컴파일에 문제가 있으면 r2env를 사용하거나 GitHub 릴리스 페이지에서 릴리스 빌드를 가져오세요. MAJOR.MINOR 버전만 일치하면 됩니다. 즉, r2-5.7.6은 5.7.0에서 5.7.8 사이에서 컴파일된 모든 플러그인을 로드할 수 있습니다.

디자인

 +---------+
 | radare2 |     radare2 도구, 나머지 위에 위치
 +---------+
      :
 +----------+
 | io_frida |    r2frida io 플러그인
 +----------+
      :
 +---------+
 |  frida  |     Frida 호스트 API 및 대상과 상호작용하는 로직
 +---------+
      :
  +-------+
  |  app  |      Frida가 JavaScript로 계측하는 대상 프로세스
  +-------+

크레딧

이 플러그인은 pancake aka Sergi Alvarez (radare2의 저자)가 NowSecure를 위해 개발했습니다.

Ole André가 Frida를 작성하고 유지관리하며, 이 결합이 작동하도록 필요한 모든 것에 대해 버그를 적극적으로 수정하고 기술적 세부 사항을 논의해준 데 대해 감사드립니다. Kudos

카테고리