취보특개

Frida Usage - 1 (Basic Concept) 본문

Boan/모바일

Frida Usage - 1 (Basic Concept)

ha3kkkkk 2021. 1. 9. 23:20

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는 에뮬레이터가 느려져 시간초과가 되면

프리다에서 스크립트를 자동으로 재실행하고 백그라운드로 실행한다.

 

 

'Boan > 모바일' 카테고리의 다른 글

iOS jailbreaking  (0) 2021.03.14
iOS Homebrew Usage  (0) 2021.03.14
Android Rooting  (0) 2021.01.10
Android ADB Usage  (0) 2021.01.09
Android static analysis  (0) 2019.12.07
Comments