Java.use()와 Java.choose()의 차이

resur's blog·2023년 8월 25일
0

Frida

목록 보기
1/2

Frida에서 java.use와 java.choose는 Java 런타임에서 객체와 클래스를 접근하고 조작하기 위한 두 가지 중요한 기능이지만, 각각 목적과 사용 방식이 다릅니다.
이에 따라서 각각 어떤 특징과 기능을 가지며, 어떤 용도로 구분하여 사용해야하는지 알아보고 그에 맞게 사용하면 됩니다.

🐳 Java.use()?


사용 목적

특정 Java 클래스를 대상으로 해당 클래스의 참조를 가져와 클래스의 메서드나 속성을 후킹하거나 조작하는 데 사용됩니다. 이는 정의된 클래스와 연관된 것으로 실제 메모리에 있는 객체 인스턴스 와는 별개입니다.

사용 예시

var MyClass = Java.use('com.example.MyClass');

위 코드를 사용하면 MyClass 객체를 통해 com.example.MyClass 클래스의 모든 메서드와 필드에 접근할 수 있게 되며,이를 통해 MyClass.someStaticMethod()와 같은 방식으로 클래스의 정적 메서드나 필드에 접근하거나 인스턴스 메서드를 후킹하는 등의 작업을 수행할 수 있습니다.

🐳 Java.choose()?


사용 목적

런타임에서 특정 클래스의 인스턴스들을 열거하는 데 사용됩니다. 이는 메모리에서 이미 생성된 객체 인스턴스를 찾아낼 때 유용합니다.

만약 'com.example.MyClass'의 여러 객체 인스턴스들이 이미 앱 내에서 생성되었다면, Java.choose('com.example.MyClass', ...)를 사용하면 그 인스턴스들을 메모리에서 찾아서 각각에 대한 작업을 수행할 수 있습니다.

사용 예시

Java.choose('com.example.MyClass', {
    onMatch: function(instance) {
        console.log("Found instance: " + instance);
    },
    onComplete: function() {
        console.log("Finished searching");
    }
});

위 코드는 com.example.MyClass의 모든 인스턴스를 찾아내고, 각 인스턴스를 처리하기 위한 콜백 함수를 제공하며, 이를 통해 이미 생성된 객체의 상태를 확인하거나 변경할 수 있습니다. 리버스 엔지니어링이나 디버깅 과정에서 특정 객체의 상태를 알아내고 싶을 때 유용하게 사용됩니다.

🐳 예시 코드 (구현 전/후 상태 비교)


// 타겟 클래스 및 메서드 정의
var MyClass = Java.use('com.example.MyClass');

// 첫 번째 java.choose: 원래의 메서드 구현을 출력
Java.perform(function() {
    Java.choose('com.example.MyClass', {
        onMatch: function(instance) {
            console.log("Before change: " + instance.someMethod());
        },
        onComplete: function() {
            console.log("Finished enumerating instances (Before change)");
            
            // 메서드의 구현 변경
            MyClass.someMethod.implementation = function() {
                return "Changed Value";
            };

            // 두 번째 java.choose: 변경된 메서드의 구현을 출력
            Java.choose('com.example.MyClass', {
                onMatch: function(instance) {
                    console.log("After change: " + instance.someMethod());
                },
                onComplete: function() {
                    console.log("Finished enumerating instances (After change)");
                }
            });
        }
    });
});

🐋 요약


java.use"클래스는 어떻게 정의되어 있나?"에 대한 접근 방식입니다. 여기서는 클래스가 어떤 메서드와 필드를 가지고 있는지, 어떻게 작동하는지 등의 클래스의 구조와 동작에 대한 정보와 조작 기능을 제공합니다.
java.choose"이 클래스의 객체는 메모리의 어디에 있나? 이 객체들의 현재 상태는 어떻게 되나?"에 대한 접근 방식입니다. 여기서는 특정 클래스의 객체가 메모리에 어떻게 분포되어 있는지, 각 객체의 현재 상태는 어떤지 등의 객체의 상태와 위치 정보를 제공합니다.

profile
Pentester

0개의 댓글