
r2frida v6.2.0
Radare2와 Frida는 함께하면 더 좋습니다.
r2frida
설명
radare2용 자체 포함 플러그인으로, frida를 탑재하며 Frida 스크립트 대신(또는 추가로) r2 명령어를 사용하여 로컬 또는 원격 프로세스를 계측할 수 있습니다.
radare 프로젝트는 리버스 엔지니어링을 위한 완전한 도구 체인을 제공하며, 활발히 유지관리되고 있으며 잘 관리된 기능과 함께 다른 프로그래밍 언어 및 도구로 기능을 확장할 수 있습니다.
Frida는 동적 계측 툴킷으로, 자신의 JavaScript를 주입하여 실행 중인 프로세스를 검사하고 조작하기 쉽게 해주며, 선택적으로 스크립트와 통신할 수도 있습니다.
기능
- 수정하지 않은 Frida 스크립트 실행 (
. :명령어 사용) - C, JavaScript 또는 TypeScript 조각을 모든 프로세스에서 실행
- 로컬 또는 원격 시스템에 attach, spawn, launch 가능
- 섹션, 심볼, 익스포트, 프로토콜, 클래스, 메서드 나열
- 에이전트 내부 또는 호스트에서 메모리 내 값 검색
- 짧은 명령어로 메서드 구현 교체 또는 후크 생성
- 대상 프로세스에 라이브러리 및 프레임워크 로드
- Dalvik, Java, ObjC, Swift 및 C 인터페이스 지원
- 파일 디스크립터 및 환경 변수 조작
- 프로세스에 시그널 전송, 계속 실행, 중단점 설정
- r2frida io 플러그인은 파일시스템 fs 및 debug 백엔드로도 작동
- 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 명령어 실행
:dbAPI를 사용한 네이티브 중단점r_fsAPI를 사용한 원격 파일시스템 접근
설치
r2frida 설치의 권장 방법은 r2pm을 사용하는 것입니다:
$ r2pm -ci r2frida
컴파일이 필요 없는 바이너리 빌드는 곧 r2pm 및 r2env에서 지원될 예정입니다. 그동안 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 앱을 디버깅하려면 다음 동작을 사용하세요. spawn은 launch 또는 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