가. 기초 문법
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
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
https://changkr28.tistory.com/entry/Frida-%EB%AC%B8%EB%B2%95
https://takudaddy.tistory.com/617
'Mobile App 취약점 진단 · 모의해킹 > iOS App 취약점 진단 · 모의해킹' 카테고리의 다른 글
iOS 애플리케이션 무결성 점검 및 대응 방법(앱 위변조 대응) (0) | 2023.10.07 |
---|---|
[iOS App 진단] 12강 - 탈옥 탐지 우회(이론 및 대응방법) (0) | 2023.10.03 |
바이너리 ASLR 적용유무 확인방법 - otool (0) | 2023.10.03 |
[iOS App 진단] 11강 - 애플리케이션 패칭(앱 위·변조) 실습 4 (0) | 2023.09.10 |
[iOS App 진단] 11강 - 애플리케이션 패칭(앱 위·변조) 실습 3 (0) | 2023.09.10 |