Frida Usage - 1 (Basic Concept)
Frida란,
▶ OLE가 개발한 DBI(Dynamic Binary Instrumentation*) 프레임워크
▷ 스크립트와 함께 사용하여 실행 중인 프로그램 동작을 모니터링, 수정, 기록할 수 있다.
▶ 프리다는 파이썬 기반의 프로그램으로서, 파이썬 라이브러리를 많이 사용한다.
▶ 프리다는 대표적으로 모바일 애플리케이션 안드로이드와 iOS 환경에서 분석하는 것으로 알려졌으나,
▷ 다른 플랫폼에서도 확장성이 좋다.
▷ 자바스크립트, C, Swift 등 여러 API를 지원한다.
* instrumentation 앱이 실행중인 상태에서 해당 프로세스를 추적, 분석, 디버깅하는 도구로서, 프로그램에 코드를 삽입해 정보를 수집하는 기법 |
Frida의 주요 기능은,
▶함수 후킹
▷ 특정 함수(메소드)에 연결(HOOK)하여 매개변수나, 반환 값을 변경할 수 있다.
▶ 함수 추적
▷ 실행중인 애플리케이션 디버깅
▶인젝션
▷ 임의로 만든 코드 삽입
▶메모리 데이터 추출 및 검색
▶트래픽 스니핑 또는 암호해독
▶루팅되지 않은 단말에서도 사용가능
Frida 환경구성
▶ Frida 설치
pip install frida
# frida 사용을 위한 코드 구현에 필요
pip install frida-tools
▶ Frida-server 설치
① 안드로이드 에뮬레이트 비트 확인
▷ adb shell getprop ro.product.cpu.api
② 아래 사이트에서 기기 환경에 맞는 파일 다운로드
▷ github.com/frida/frida/releases
▷ (e.x.) x86이라면, frida-server-(버전)-android-x86.xz
▶ Frida-server 실행
▷ Frida를 사용하기 위해서는 ADB를 이용해 Frida-server을 안드로이드 기기안에 넣어 실행해야한다.
adb root
# 파일 밀어넣기
adb push [local_file_path] [remote_directory_to_push_file]
# 파일 확인
adb shell "ls -al [remote_directory_to_push_file]"
# 실행권한부여
adb shell "chmod 755 [frida-server_file]"
# 프리다 백그라운드로 실행
adb shell "/[frida-server-file] &"
# 실행 확인(안드로이드에서 입력)
adb shell ps -ef | grep frida
# 실행 확인2(윈도우 커맨드에서 입력)(연결된 장치의 프로세스 목록 확인)
frida-ps -U
Frida Command
▶ 함수 호출 추적
▷ "com.android.market"이라는 프로세스에서 "encrypt"이라는
$frida-trace -i "encrypt" -U com.android.market
▶ 현재 실행중인 프로세스 리스트
# -U: usb로 연결된 디바이스에 실행 (한개만 연결 필요)
$ frida-ps -U
Frida Hooking
▶ 기본 구조
▷ 프리다에서 제공하는 함수인 “Java.perform(function)”를 사용하여 감싸는게 기본 구조이다.
▷ “Java.perform(function)”는 현재 스레드가 가상머신에 연결되어 있는지 확인하고 “function”을 호출한다.
▷ 예시로 SSL Pinning Bypass 스크립트를 살펴보자
** 본 포스트의 모든 예시는 참고용이며 상용망에 사용할시 문제가 발생할 수 있습니다 **
** 본 정보를 사용함에 있어 발생하는 모든 책임은 당사자에게 있으며 어떠한 책임도 지지 않음을 밝힙니다 **
Java.perform(function() {
var array_list = Java.use("java.util.ArrayList");
# 1
var ApiClient = Java.use('com.android.org.conscrypt.TrustManagerImpl');
# 2
ApiClient.checkTrustedRecursive.implementation = function(a1, a2, a3, a4, a5, a6) {
# 3
console.log('BYPASS SSL Pinning');
var k = array_list.$new();
return k;
}
}, 0);
① “Java.use”를 호 출하여 com.android.org.conscrypt.TrustManagerImpl 클래스의 랩핑 된 오브젝트를 받는다
② checkTrustedRecursive 함수를 재정의하여
③ checkTrustedRecursive함수가 호출될때 재정의한 코드가 실행되도록한다.
▶ 자바 스크립트 실행
▷ 위 스크립트를 frida_sslpinning.js 라는 파일로 저장했을 때 아래와 같이 명령어를 입력한다.
# -l : javascript 실행
# -f : packagename에 해당하는 앱을 시작 (실행중이었으면 재시작)
frida -U -l frida_sslpinning.js --no-pause -f package
▶ 파이썬에서 실행
▷ 스크립트 안에 프리다 코드를 넣는 등 자동화를 위해 파이썬 바인딩이 필요할 수 있다.
import frida, sys
javascript = """ payload """
#usb 장치에 연결도니 디바이스에서 해당 패키지에 연결
session = frida.get_usb_device().attach("packagenmame")
# 연결에 성공하면, 스크립트를 생성하고 로드한다.
script = session.create_script(javascript)
script.load()
# 자바스크립트가 동작하기 전에 코드가 종료하는 것을 막기위해 sys.stdin.read()사용
sys.stdin.read()
▷ javascript 부분에 어플리케이션에 삽입할 코드를 작성해야한다.
javascript = """
setImmediate(function(){
Java.perform(function(){
//앱에서 사용되는 클래스와 연동되는 클래스를 정의
//var [변수명] = Java.use("후킹할 함수의 클래스")
var Activity = java.use("androdi.app.Activity")
//앱에서 정의된 메소드의 구현 내용을 재작성한다
//[변수명].[후킹할 함수].implementation = function(arg){[원하는코드]}
Activity.onResume.implementation = function(){
Console.log("[*] onResume() called");
};
});
});
"""
※ setImmediate 프리다는 에뮬레이션이 느려질 때 “시간초과”되는 경향이 있는데, setImmediate는 에뮬레이터가 느려져 시간초과가 되면 프리다에서 스크립트를 자동으로 재실행하고 백그라운드로 실행한다. |