목차
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')
'Security & Analysis > Frida' 카테고리의 다른 글
[Frida] 안드로이드 앱 모의해킹 - chap04. 프리다 기능(2) (0) | 2023.04.18 |
---|---|
[Frida] 안드로이드 앱 모의해킹 - chap03. 프리다 기능(1) (0) | 2023.04.11 |
[Frida] 안드로이드 앱 모의해킹 - chap02. 프리다 이해 및 환경 구축(2) (0) | 2023.03.31 |
[Frida] 안드로이드 앱 모의해킹 - chap01. 프리다 이해 및 환경 구축(1) (0) | 2023.03.28 |