728x90
반응형
목차
1. 프리다(Frida)란?
2. 프리다의 주요 기능
3. 프리다 환경 구축
  - 녹스(Nox) 앱플레이어 설치
  - 아나콘다 파이썬 환경 구축
  - 프리다 설치 및 실행
4. 프리다 기능 살펴보기

  - 기본 명령어 활용(Frida CLI 이해)
  - 기본 명령어 활용(프로세스, 트레이스, 디바이스 제어)
  - 기본 명령어 활용(프로세스 중지)
5. 프리다 기본 문법
  - Java.perform(fn)

  - Java.use(className)
  - Java.choose(className, callbacks)
  - Java.enumerateLoadedClasses(callbacks)
  - setImmediate(fn)
  - Overloading
-
프리다 CLI 활용
자바스크립트 파일 사용
파이썬 바인딩 이해
프리다 챌린지로 연습해보기
프리다 실무 활용

5. 프리다 기본 문법

Java.perform(fn)

Java.use(className)

Java.enumerateLoadedClasses(callbacks)

Java.choose(className, callbacks)

setImmediate(fn)

Overloading

 

기본 뼈대 구조

Java.perform(fn)

  • 현재 스레드가 가상머신에 연결되어 있는지 확인하고 fn을 호출

- Java.perform이 실행이 되면 fn 내부로 입력한 코드가 지정한 앱애 접근하여 실행하게 됨

Java.perform(function() {
/*
	...
    do sth
    ...
*/
})

Java.use(className)

  • Java.use ()는 변수와 메소드에 액세스 할 수 있는 클래스 객체를 반환
  • 메소드 구현을 변경하려면 새로운 메소드로 덮어 써야 함
  • 인스턴스를 반환하는 것이 아닌 클래스 객체를 반환함

- className 클래스를 사용하겠다고 선언

- 인스턴스를 다루기 위해서는 Java.choose라는 API를 사용해야 함

  • 앱에서 사용하는 클래스와 연동되는 myClass를 정의
  • .implementation: 앱에서 정의된 메소드의 구현 내용을 재작성
Java.perform(function() {
	var myClass = Java.use(com.mypackage.name.class)
    
    myClass.myMethod.implementation = function(param) {
    	// do sth
    }
}

myClass 내 myMethod 메소드를 다룸, implementation를 하여 myMethod를 재작성하여 진단자 마음대로 해당 메소드를 재작성

위의 코드는 parameter가 하나인 경우, 인자값이 두 개 이상이라면 function(p1, p2)로 기재


Java.choose(className, callbacks)

  • Java.choose(className, callbacks)
  • 힙에서 인스턴스화 된 객체 찾기 가능
  • callbacks: onMatch, onComplete
  • onMatch: 실시간으로 인스턴스에 대해 호출
  • onComplete: function()의 모든 인스턴스가 열거될 때 호출
Java.perform(function() {
	Java.choose(com.mypackage.name.class, {
    	"onMatch": function(instance) {
        	console.log(instance.toString())
        },
        "onComplete": function() {}
    })
})

Java.perform: 가상머신 연결 확인

Java.choose: com.mypackage.name.class라는 클래스를 지정하고, 해당 클래스에 대한 인스턴스(instance) 객체로 받게 됨

onMatch는 Frida가 요청에 일치하는 것을 찾으면 하나 이상의 인수로 호출됨

console.log라는 함수를 통해 해당 인스턴스를 문자열 값(toString)으로 주게 됨 -> 찾은 인스턴스에 대한 값이 콘솔로 출력됨

모든 출력을 마치면(일치하는 것을 모두 찾으면) onComplete 사용 -> Java.choose 사용


Java.enumerateLoadedClasses(callbacks)

  • 로드된 모든 클래스를 열거하고 모든 일치 항목을 출력
  • onMatch: 일치하는 것을 찾으면 호출
  • onComplete: 가능한 일치(Match)를 모두 마치면 사용됨
Java.perform(function() {
	Java.enumerateLoadedClasses( {
    	"onMatch": function(className) {
        	console.log(className)
        },
        "onComplete": function() {}
    })
})

setImmediate(fn)

  • Process terminated 오류 해결하기
setImmediate(function() {	// prevent timeout
	console.log("[*] Starting script");
    
    Java.perform(function() {
    	myClass = Java.use("com.packagen.name.class.name");
        myClass.implementation = function(v) {
        	// do sth.
	}
})})

 

메소드 구현을 재작성할 때 유의 (다형성)

만약 다음과 같이 세 가지의 경우는 어떻게 처리할까? overload() 제공

  • 첫 번째, 입력받는 인수가 없는 메소드
  • 두 번째, 두 개의 바이트 배열을 인수로 입력받는 메소드
  • 세 번째, 앱의 context와 Boolean 형태의 인수로 입력받는 메소드
// 1) 입력받는 인수가 없는 메소드
myClass.myMethod.overload().implementation = function() {
	// do sth
}

// 2) 두 개의 바이트 배열을 인수로 입력받는 메소드
myClass.myMethod.overload("[B", "[B").implementation = function(param1, param2) {
	// do sth
}

// 3) 앱의 context와 Boolean 형태의 인수로 입력받는 메소드
myClass.myMethod.overload("android.context.Context", "boolean").implementation = function(param1, param2) {
	// do sth
}

Overloading

overload() 매개변수 카테고리

.overload()

.overload('int')

.overload('float')

.overload('[B') // byte array

.overload('[B', '[B', '[B')

.overload('java.io.File')

.overload('java.lang.String')

.overload('android.view.View')

.overload('android.app.Activity')

.overload('android.content.Context')

.overload('android.content.Context', 'java.lang.String')

.overload('java.lang.String', 'java.lang.String')

.overload('android.graphics.Bitmap')

.overload('java.util.List')

.overload('android.content.Context', 'java.lang.String', 'java.lang.String')

.overload('android.app.Activity', 'int', 'int', 'int', 'boolean')

 

 

728x90
728x90
728x90
반응형
목차
1. 프리다(Frida)란?
2. 프리다의 주요 기능
3. 프리다 환경 구축
  - 녹스(Nox) 앱플레이어 설치
  - 아나콘다 파이썬 환경 구축
  - 프리다 설치 및 실행
4. 프리다 기능 살펴보기

  - 기본 명령어 활용(Frida CLI 이해)
  - 기본 명령어 활용(프로세스, 트레이스, 디바이스 제어)
  - 기본 명령어 활용(프로세스 중지)

-
프리다 기본 문법
프리다 CLI 활용
자바스크립트 파일 사용
파이썬 바인딩 이해
프리다 챌린지로 연습해보기
프리다 실무 활용

4. 프리다 기능 살펴보기

독립된 가상 환경으로 접속한 상태

frida-trace -i "open" -U com.android.chrome

Nox Chrome에서 동작 시 open() 함수에 대해 출력

open: Auto-generated handler at "C:\\Users\\user\\__handlers__\\libc.so\\open.js"

해당 경로로 open.js 파일 확인해보면,

onEnter할 때, open()이라는 함수를 출력하도록 되어 있음

onLeave는 별도 처리하지 않음

(py3) user@DESKTOP-JII5KL2 C:\Users\user\__handlers__\libc.so
$ type open.js
/*
 * Auto-generated by Frida. Please modify to match the signature of open.
 * This stub is currently auto-generated from manpages when available.
 *
 * For full API reference, see: https://frida.re/docs/javascript-api/
 */

{
  /**
   * Called synchronously when about to call open.
   *
   * @this {object} - Object allowing you to store state for use in onLeave.
   * @param {function} log - Call this function with a string to be presented to the user.
   * @param {array} args - Function arguments represented as an array of NativePointer objects.
   * For example use args[0].readUtf8String() if the first argument is a pointer to a C string encoded as UTF-8.
   * It is also possible to modify arguments by assigning a NativePointer object to an element of this array.
   * @param {object} state - Object allowing you to keep state across function calls.
   * Only one JavaScript function will execute at a time, so do not worry about race-conditions.
   * However, do not use this to store function arguments across onEnter/onLeave, but instead
   * use "this" which is an object for keeping state local to an invocation.
   */
  onEnter(log, args, state) {
    log('open()');
  },

  /**
   * Called synchronously when about to return from open.
   *
   * See onEnter for details.
   *
   * @this {object} - Object allowing you to access state stored in onEnter.
   * @param {function} log - Call this function with a string to be presented to the user.
   * @param {NativePointer} retval - Return value represented as a NativePointer object.
   * @param {object} state - Object allowing you to keep state across function calls.
   */
  onLeave(log, retval, state) {
  }
}

 

log('open()'); 를 다음과 같이 코드 변경하여

onEnter function의 args를 통해 호출 인수가 어떻게 접근이 가능한지 알아볼 것

 

notepad open.js 로 메모장 열어서 파일 내용 수정

log('open(' + 'pathname=' + args[0] + ', flags=' + args[1] + ')');

* 참고: Windows 명령 프롬프트(cmd) 파일 편집 방법

1) notepad (file.js)

2) 리눅스 기반의 vi, vim 사용 (bash  사용 - 리눅스 프로그램 설치 후 사용)

 

다시 open trace 실행

frida-trace -i "open" -U com.android.chrome:privileged_process0

(py3) user@DESKTOP-JII5KL2 C:\Users\user
$ frida-trace -i "open" -U com.android.chrome:privileged_process0
Instrumenting...
open: Loaded handler at "C:\\Users\\user\\__handlers__\\libc.so\\open.js"
Started tracing 1 function. Press Ctrl+C to stop.
           /* TID 0x1132 */
  9955 ms  open(pathname=0xd6fb8a31flags=0x2)
           /* TID 0x1133 */
  9971 ms  open(pathname=0xd6fb8a31flags=0x2)
           /* TID 0x10d4 */
 10010 ms  open(pathname=0xd6fb8a31flags=0x2)
           /* TID 0x10f4 */
 32908 ms  open(pathname=0x55833950flags=0x80000)
 35102 ms  open(pathname=0x55836060flags=0x80000)

fride.re > DOCS > API Reference - JavaScript API > find "Memory" 참조

https://frida.re/docs/javascript-api/

open.js 수정

log('open(' + 'pathname=' + Memory.readUtf8String(args[0]) + ', flags=' + args[1] + ')');

메모리 주소가 아닌 어느 경로에서 불러오는지 확인

 

프로세스 중지(process Name이나 PID)

frida-kill -U Chrome

Chrome process 종료

 

 

728x90
728x90
728x90
반응형
목차
1. 프리다(Frida)란?
2. 프리다의 주요 기능
3. 프리다 환경 구축
  - 녹스(Nox) 앱플레이어 설치
  - 아나콘다 파이썬 환경 구축
  - 프리다 설치 및 실행
4. 프리다 기능 살펴보기

  - 기본 명령어 활용(Frida CLI 이해)
-
프리다 기본 문법
프리다 CLI 활용
자바스크립트 파일 사용
파이썬 바인딩 이해
프리다 챌린지로 연습해보기
프리다 실무 활용

4. 프리다 기능 살펴보기

frida

프리다 CLI인 REPL 인터페이스, 신속한 프로토타이핑과 손쉬운 디버깅을 목표로 하는 도구

* REPL: Read, Eval, Print, Loop - 읽고, 실행하고, 출력하고, 반복하는 과정

frida-ps

프리다에 연결된 프로세스 목록을 출력하기 위한 도구

frida-ls-devices

연결된 디바이스를 출력하는 도구

frida-trace

함수 호출을 동적으로 추적하기 위한 도구

frida-kill

프로세스를 종료하는 도구

frida -U

Nox 애뮬레이터에 대해 사용

 

Playstore에서 Chrome 다운로드

frida-ps -U

Chrome에 해당하는 프로세스 옵션을 확인

Failed to attach: unable to connect to remote frida-server: closed

에러 원인: 에뮬레이터 프로세스 실행하지 않음

frida를 (USB를 통해) 안드로이드 애뮬레이터에 연결하고 chrome 디버깅을 시작

* 참고: https://github.com/frida/frida/issues/92

user@DESKTOP-JII5KL2 C:\Users\user
$ nox_adb devices
List of devices attached
127.0.0.1:62001 device


user@DESKTOP-JII5KL2 C:\Users\user
$ nox_adb shell
d2q:/ # whoami
root
d2q:/ # cd /data/local/tmp/frida-server-16.0.11-android-x86/
d2q:/data/local/tmp/frida-server-16.0.11-android-x86 # ls -al
total 52368
drwxrwxr-x 2 root  root      4096 2023-03-31 08:38 .
drwxrwxrwx 4 shell shell     4096 2023-04-07 09:02 ..
-rwxrwxrwx 1 root  root  53612252 2023-03-31 08:37 frida-server-16.0.11-android-x86
d2q:/data/local/tmp/frida-server-16.0.11-android-x86 # ./frida-server-16.0.11-android-x86 &
[1] 4871
1|d2q:/data/local/tmp/frida-server-16.0.11-android-x86 # ps | grep frida-server
root      4871  4860  62676  49640            d4415cc0 S ./frida-server-16.0.11-android-x86

다시 시도

frida -U com.android.chrome

Tab 입력 시 사용 가능한 명령어 확인

frida -U com.android.chrome -l chrome.js

frida를 USB를 통해 android 에뮬레이터에서 실행 중인 chrome app에 연결하고, chrome.js를 load함

(py3) user@DESKTOP-JII5KL2 C:\Users\user
$ frida -U com.android.chrome -l chrome.js
usage: frida [options] target
frida: error: [Errno 2] No such file or directory: 'C:\\Users\\user\\chrome.js'

파일 생성 후 다시 시도..

-Ua 옵션: 현재 실행중인 앱만 출력

(py3) user@DESKTOP-JII5KL2 C:\Users\user
$ frida-ps -Ua
 PID  Name      Identifier
4  --------  --------------------
4024  Chrome    com.android.chrome
2686  Facebook  com.facebook.katana
2344  설정        com.android.settings
frida-ls-devices
frida-ps -D 127.0.0.1:62001

frida-ls-devices: 프리다에 연결된 디바이스 출력 도구(여러 개의 디바이스와 상호작용할 때 유용)

 

 

728x90
728x90
728x90
반응형
목차
1. 프리다(Frida)란?
2. 프리다의 주요 기능
3. 프리다 환경 구축
  - 녹스(Nox) 앱플레이어 설치
  - 아나콘다 파이썬 환경 구축
  - 프리다 설치 및 실행 

-
프리다(Frida) 주요 기능 이해
프리다 환경 구축
프리다 기능 살펴보기
프리다 기본 문법
프리다 CLI 활용
자바스크립트 파일 사용
파이썬 바인딩 이해
프리다 챌린지로 연습해보기
프리다 실무 활용

3. 프리다 환경 구축

아나콘다 파이썬 환경 구축

아나콘다(Anaconda)란?

파이썬을 포함한 데이터 과학에 필요한 다양한 언어 및 패키지의 배포

 

프리다는 파이썬 기반으로 동작, 파이썬 필수 설치

프리다는 파이썬 버전의 영향을 많이 받아 버전 관리 필요(2.x버전 → 3.x버전만 Frida 동작)

아나콘다라는 프로그램을 이용해 독립된 파이썬 실행환경 구축 가능(버전 변경 번거로움 없이 콘솔 창으로 전환 가능)

수학과 과학 분야의 라이브러리 포함됨(numpy, matplotlib, pandas 등 라이브러리 포함되어 데이터 과학/기계학습 쉽게 사용 가능)

 

아나콘다 설치

https://www.anaconda.com/products/distribution

Download 혹은 Download 하단 아이콘 클릭 - OS 환경에 맞는 Installer 설치(64-Bit Graphical Installer (786 MB)

Anaconda 설치 도중, Advanced Options - Add Anaconda to my PATH environment variable 체크 후 Install

Destination Folder: C:\Users\user\anaconda3

[참고] ConEmu 설치: color scheme default 설정값 <ConEmu>

cmd 창에서 'conda --version', 'python --version' 입력하여 버전 확인

# 독립된 가상 환경 설정: 이름 py3, 버전 3.10

conda create -n py3 python=3.7

Downloading and Extracting Packages

Preparing transaction: done
Verifying transaction: done
Executing transaction: done
#
# To activate this environment, use
#
#     $ conda activate py3
#
# To deactivate an active environment, use
#
#     $ conda deactivate

activate py3 - 프롬프트 가장 앞에 (py3) 생성

python 2 version도 설치

conda create -n py2 python=2.7

py3 에서

pip install frida-tools

frida version은 16.0.11 / Android는 32bit


프리다 설치 및 실행

frida.re (상단바) DOCS > Tutorials - Android > releases page 이동 (https://github.com/frida/frida/releases)

- download the latest frida-server for Android from our releases page and uncompress it.

frida-server-16.0.11-android-x86.xz

압축 해제 후, 로컬 컴퓨터와 녹스와 통신 가능하도록 설정

권한 상승 후 백그라운드로 실행(& 연산자), 실행 프로세스 확인(4077)

New console dialog...

py3에서 안드로이드에서 실행 중인 프로세스 목록 나열(PID, Name)

-U: USB 장치 확인

frida-ps -U

 

728x90
728x90
728x90
반응형
목차
1. 프리다(Frida)란?
2. 프리다의 주요 기능
3. 프리다 환경 구축
  - 녹스(Nox) 앱플레이어 설치

-
프리다(Frida) 주요 기능 이해
프리다 환경 구축
프리다 기능 살펴보기
프리다 기본 문법
프리다 CLI 활용
자바스크립트 파일 사용
파이썬 바인딩 이해
프리다 챌린지로 연습해보기
프리다 실무 활용

1. 프리다(Frida)란?

  • Ole가 개발한 DBI* 프레임워크
  • 프로세스를 모니터/디버깅하는 데 사용할 수 있는 툴킷
  • 다양한 플랫폼에서 프로세스에 대한 인젝션이 가능, 확장성이 큼
  • 자바스크립트를 Native App에 삽입 가능

* DBI: Dynamic Binary Instrumentation, 앱이 실행 중인 상태에서 코드 명령어를 삽입해 동적으로 바이너리 프로세스를 추적·분석·디버깅하는 도구


2. 프리다의 주요 기능

  • 프리다를 기반으로 사용하는 도구: AppMon*, Needle**
  • 함수 후킹(특정 함수에 연결하여 반환 값 변경 및 함수 재작성 가능)
  • 실행 중인 애플리케이션의 디버깅 수행 가능(실행 중인 함수를 추적하여 함수 재작성 가능 - 로그 출력, 내부 로직 변경 등)
  • 힙 메모리 내 객체 인스턴스 검색 및 사용 가능(프리다 기본 문법인 java.choose라는 함수를 사용하여 손쉽게 힙을 스캔)
  • 실시간 트래픽 스니핑 또는 암호 해독(암호화되기 전의 값을 변조)
  • 탈옥 또는 루팅되지 않은 단말기에서도 사용 가능(제한적이므로 추천하지 않음)

* AppMon: 앱의 시스템 API 호출을 모니터링하고 변경하는 자동화된 프레임워크(macOS, iOS, Android OS) - system 및 API 호출을 모니터링할 수 있음

* Needle: iOS 보안 테스팅 프레임워크(안드로이드의 드로저와 유사)


3. 프리다 환경 구축

필요 도구: 녹스 앱플레이어(Nox), 아나콘다(파이썬), 프리다, 프리다 서버(Android)

녹스(Nox) 앱플레이어 설치

무료 안드로이드 에뮬레이터, 실제 디바이스와 유사한 환경에서 진단이 가능하며, 멀티 앱 플레이어 기능으로 다수 앱 동시 진단 가능

안드로이드 애플리케이션 취약점 분석 및 악성코드 분석에 주로 사용됨

우측 상단의 시스템 설정

성능 > 해상도 설정: (기본) 1600x900 설정되어 있음, (변경) 960x540

성능 > 그래픽 모드: (기본) 호환+모드, (변경) 기본모드(DirectX)

일반 > 시작항목: ROOT켜기 체크 (안드로이드 실제 단말기에서 루팅한 것과 동일한 환경을 만들어주는 것)

인터페이스 > 선택적으로 설정

모든 설치가 완료되면 Nox ADB를 환경변수 설정함

ADB(Android Debug Bridge): 안드로이드를 위한 디버깅 툴, 안드로이드 애뮬레이터와 통신 가능

설정 위치: C:\Program Files (x86)\Nox\bin\nox_adb.exe

 

윈도우 '시스템 환경 변수 편집' 내 시스템 속성 - 고급 - 환경 변수 > 시스템 변수(Path) 설정 클릭 후 편집

 > 새로 만들기(N) 후 위의 설정 위치(bin 까지) 추가 후 설정

명령 프롬프트(cmd)에서 nox_adb 입력 시 해당 정보 출력되는 정보 확인(환경변수 설정이 잘 이루어짐)

연결된 nox_adb 쉘 접속

-s <specific device> - directs command to the device or emulator with the given serial number or qualifier. Overrides ANDROID_SERIAL environment variable.
nox_adb -s 127.0.0.1:62001 shell

 

728x90
728x90

+ Recent posts