본문으로 바로가기

가. 기초 문법

1. ObjC.available 

- 현재 프로세스에 Objective-C 런타임이 로드되었는지 여부를 지정하는 Boolean(True, False)

- 해당 앱에서 FIRDA가 실행가능한 환경인지 체크


2. ObjC.classes 

- 현재 등록된 클래스에 대한 ObjC.object 자바스크립트 바인딩에 대한 오브젝트 맵핑 클래스 이름

- 프로세스에 로드된 클래스들의 이름을 보여줌


3. Interceptor.attach(target, callbacks[, data]) 

-  target에서 함수에 대한 호출을 가로챔 (호출을 가로채고자 하는 함수의 주소를 지정하는 NativePointer)
- callbacks 인수는 하나 이상을 포함하는 오브젝트(객체)

 

3-1. onEnter: function(args) 

- NativePointer 객체의 배열로 인수를 읽거나 쓰는 데 사용할 수 있는 하나의 인수 args가 제공된 callback 함수(args[0 = self], [1 = select], [2 = 후킹 함수의 매개변수])

 

3-2. onLeave: function(retval) - retunr 값 변조 시 사용

- 원래 return 값을 포함하는 NativePointer에서 파생 객체인 인수 retval이 제공된 callback 함수
- retval.replace(1337)를 호출하여 return 값을 정수 1337로 바꾸거나,
- retval.replace(ptr(0x1234))를 포인터로 변경 가능


4. Module.findBaseAddress(name), Module.getBaseAddress(name)

- name 모듈의 base 주소를 반환
- 모듈을 찾을 수 없는 경우, find-prefixed 함수는 null을 반환하고 get-prefixed 함수는 예외를 발생함


5. NativePointer (new NativePointer(s)) 

- 메모리 주소를 "10진수" 또는 "접두사가 0x인 16진수"로 포함하는 문자열 s에서 새로운 NativePointer를 생성
- 간결하게 ptr(s)로 사용 가능

 

나. 객체 속성

6. $methods

- 주어진 객체의 클래스와 부모 클래스에 의해 노출된 기본 메소드 이름을 포함하는 배열


7. $ownMethods

- 부모 클래스를 포함하지 않고, 주어진 객체의 클래스에 의해 노출된 기본 메소드 이름을 포함하는 배열


8. context

- ia32/x64/arm에 대해 각각 EIP/RIP/PC 및 ESP/RSP/SP를 지정하는 NativePointer 객체인 pc 및 sp 키가 있는 객체
- 다른 프로세스별 키(예, eax, rax, r0, x0 등)도 사용 가능
- 이 키에 할당하여 레지스터 값을 업데이트 가능

 

다. 안드로이드 후킹 관련

1. java.perform()

현재 스레드가 VM에 연결되어 있는지 확인하고 function을 호출한다. 앱의 클래스 로더를 아직 사용할 수 없으면 호출을 연기한다. Java.performNow() 클래스에 대한 액세스가 필요하지 않은 경우 사용한다.

//소스코드 예시
Java.perform(() => {
    const Activity = Java.use('android.app.Activity');
    Activity.onResume.implementation = function () {
        send('onResume() got called! Let\'s call the original implementation');
        this.onResume();
    };
});

 

2. Java.performNow()

현재 스레드가 VM에 연결되어 있는지 확인하고 function을 호출한다.

frida로 spawn시킬때는 Java.perform()보다 Java.performNow()를 사용한다.

 

3. Java.setImmediate()

Frida는 단말기가 느려질 때 자동으로 프로세스를 종료하는 특성이 있다. setImmediate()를 사용하면 백그라운드로 자동으로 스크립트가 재실행되어 종료되지 않는다.

setImmediate(function() {
    Java.perform(function() {
        myClass = Java.use("com.package.name.class.name");
        myClass.implementation = function(v) {
            ...
        }
    })
})

 

4. Java.choose

힙을 스캔하여 클래스에서 실행 중인 인스턴스화 된 객체를 찾을 수 있다.

- onMatch : 일치하는 인스턴스를 찾을 경우 호출한다.
- onComplete : 일치하는 것을 모두 찾고난 후에 호출한다.

//소스코드 예시
Java.perform(function() {
    Java.choose(com.mypackage.name.class, {
        "onMatch" : function(instance) {
            ...
        },
        "onComplete" : function() {
            ...
        }
    })
})

 

5. Java.enumerateLoadedClasses(className, callbacks)

로드된 모든 클래스를 열거하고 모든 일치 항목을 출력한다.
- onMatch : 일치하는 인스턴스를 찾을 경우 호출한다.
- onComplete : 일치하는 것을 모두 찾고난 후에 호출한다.

Java.perform(function() {
  Java.enumerateLoadedClasses(
  {
    "onMatch" : function(className) {
      console.log(className)
    },
    "onComplete":function() {}
  })
})

 

6. Java.use(ClassName)

변수와 메소드에 접근할 수 있는 클래스 객체를 반환한다.
- implementation : 클래스에 정의된 메소드를 재작성한다.

Java.perform(function() {
    var myClass = Java.use(com.mypackage.name.class)
    myClass.myMethod.implementaion = function(param) {
        ...
    }
})

 

7. overload

오버로딩은 하나의 클래스 내에 동일한 이름의 메서드가 매개변수 정보를 달리하여 여러 개 존재하는 것을 말한다.

후킹하려는 메서드가 다양한 인자에 대해 정의되어 있다면, overload를 통하여 후킹하려는 메서드를 명시해줘야한다.

//입력받는 인수가 없을때의 예시
myClass.takudaddy_method.overload().implementation = function() {
    ...
}

//두개의 바이트 배열을 인수로 입력 받을때의 예시
myClass.takudaddy_method.overload("[B", "[B").implementation = function(param1, param2) {
    ...
}

//앱의 context와 Boolean 값을 인수로 입력 받을때의 예시
myClass.takudaddy_method.overload("android.context.Context", "boolean).implementation = 
function(param1, param2) {
    ...
}

//그외 예시
var System = Java.use("java.lang.System");
System.exit.overload('int').implementation = function(args){
    console.log("System.exit called");
};


8. Java.enumerateLoadedClasses(callbacks)

로드된 모든 클래스를 열거한다.

Java.perform(function() {
  Java.enumerateLoadedClasses({
    "onMatch" : function(className) {
      console.log(className)
    },
    "onComplete" : function() {}
  })
})

 

라. 참고 사이트

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

 

JavaScript API

Observe and reprogram running programs on Windows, macOS, GNU/Linux, iOS, watchOS, tvOS, Android, FreeBSD, and QNX

frida.re

 

https://velog.io/@yjok/%ED%94%84%EB%A6%AC%EB%8B%A4-%EA%B8%B0%EB%B3%B8-%EB%AC%B8%EB%B2%95

 

프리다 기본 문법

현재 스레드가 가상머신에 연결되어 있는지 확인하고 function을 호출한다.변수와 메소드에 접근할 수 있는 클래스 객체를 반환한다. (인스턴스가 아닌 클래스 객체를 반환함에 주의한다.).implement

velog.io

 

https://changkr28.tistory.com/entry/Frida-%EB%AC%B8%EB%B2%95

 

Frida 문법

# 목차 1. Java.perform 현재 스레드가 가상머신에 연결되었는지 확인하고 function을 호출한다. Java.perform(function(){ }); 2. Java.use(ClassName) 메소드 후킹 시 사용한다. var myClass = Java.use(com.mypackage.name.class) /

changkr28.tistory.com

 

https://cha3m.tistory.com/90

 

Frida 기본 설명

- Java.perform 현재 스레드가 가상머신에 연결되었는지 확인하고 function을 호출한다. Java.perform(function() { }); - Java.performNow() java단의 소스를 로드하기 전에 먼저 실행되는 script로 보인다. hooking 시점

cha3m.tistory.com

 

https://takudaddy.tistory.com/617

 

3. 프리다 기본 문법 (이론)

[목표] 프리다에서 제공하는 JavaScript API 중 자주 사용하는 JavaScript API 5 종류를 소개하며 사용법을 확인한다. 연습 예제 및 실전 활용에서 꾸준히 사용되는 각각의 API가 어떤 역할을 하는지 개념

takudaddy.tistory.com

 

https://chp747.tistory.com/333

 

Frida 및 nodejs 사용할 때 TMI

Frida 및 nodejs 사용할 때 TMI1. Memory.readByteArray()로 읽어온 데이터에 접근할 때Memory.readByteArray의 리턴 형은 ArrayBuffer인데, 얘로 가져온 결과는 index로 접근할 수가 없다.다음과 같이 Uint8Array로 변화하

chp747.tistory.com