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

+ Recent posts