[목표]
프리다에서 제공하는 JavaScript API 중
자주 사용하는 JavaScript API 5 종류를
소개하며 사용법을 확인한다.
연습 예제 및 실전 활용에서
꾸준히 사용되는 각각의 API가
어떤 역할을 하는지 개념적으로 살펴보고
추후 실습을 통해 파악한 기능을 연습하며
몸으로 익혀본다.
[목차]
# 이론
1. Java.perform(fn)
2. Java.use(className)
3. Java.choose(className, callbacks)
4. Java.enumerateLoadedClasses(callbacks)
5. setImmediate(fn)
6. [추가] Overloading
1. Java.perform(fn)
- 현재 스레드가 가상머신에 연결되어 있는지 확인하고 fn을 호출
- 프리다를 활용하려면 반드시 해당 메서드를 통해 가상머신 또는
단말기 연결을 확인해야 하므로 가장 많이 사용됨
# 기본 뼈대 구조
Java.perform(function() { // 대소문자 주의!
/*
...
do sth
...
*/
})
2. Java.use(className)
- Java.use()는 변수와 메서드에 액세스 할 수 있는 클래스 객체를 반환
예) Java.use(A)를 선언한 경우 지정한 A 클래스를 사용한다고 선언한 것!
> 클래스의 인스턴스를 반환하는 것이 아닌 클래스의 객체를 반환한다!
> 안드로이드 앱의 내부 코드 중 인스턴스를 반환하려면
Java.choose라는 API를 사용해야 함
- 메서드 구현을 변경하려면 새로운 메서드로 덮어 써야 함
- 주의! 인스턴스를 반환하는 것이 아닌 클래스 객체를 반환함
> 한 마디로 지정한 클래스를 사용하는 것!
# Java.use() 기본 뼈대 구조 확인
- 앱에서 사용하는 클래스와 연동되는 myClass를 정의
- .implementation : 앱에서 정의된 메서드의 구현 내용을 재작성
Java.perform(function() { // Java.perform으로 가상머신 연결 후
var myClass = Java.use(com.mypackage.name.class) // 연결 되면 내부의 Java.use 메소드를 통해
// com.mypackage.name 이라는 클래스를 다룸
myClass.myMethod.implementation = function(param) // myClass 내 myMethod라는 메소드를 다루는데
{ // implementation을 통해 myMethod 재작성 가능
// do sth
}
}
# 정리
Java.use()는
변수와 메서드에 접근할 수 있는 클래스 객체를 반환하여
반환된 값을 활용해 내부에 있는 함수를 재작성 하는 기능을 함
3. Java.choose(className, callbacks)
- 힙을 스캔하여 클래스에서 실행 중인 인스턴스화 된 객체 찾기 가능
- callbacks : onMatch, onComplete
- onMatch : 실시간으로 인스턴스에 대해 호출
- onComplete : function()의 모든 인스턴스가 열거될 때 호출
# 기본 코드 뼈대 구조
java.perform(function() { // 가상머신 연결 확인되면 내부 Java.choose 코드 실행
Java.choose(com.myPackage.name.class, { // com.myPackage.name.class 라는 클래스의 instance를
"onMatch" : function(instance){ // onMatch function 내부의 instance 인자로 받는다.
// 프리다는 요청에 일치하는 것을 찾으면 하나 이상의 인수로 호출
console.log(instance.toString()) // 찾은 instance 값을 문자열로 출력
}
"onComplete" : function() {}
})
})
# 정리
Java.choose()는 힙을 스캔하여
className 이름을 가진 클래스의
실행 중인 인스턴스화된 객체를 찾아
callback에 넘겨주고 일치하는 것을
찾을 때마다 console.log로 출력
4. Java.enumerateLoadedClasses(callbacks)
- 로드된 모든 클래스를 열거하고 모든 일치 항목을 출력
- onMatch : 실시간으로 인스턴스에 대해 호출
- onComplete : function()의 모든 인스턴스가 열거될 때 호출
Java.perform(function() {
Java.enumeratLoadedClasses({ // 로그된 모든 클래스 열거 후
"onMatch" : function(className) { // className 이라는 인수로 받는다
console.log(className)
},
"onComplete":function() {}
})
})
5. setImmediate(fn)
- Process terminated 오류 해결하기
자바스크립트 payload 작성 전 주의사항이 있는데
프리다는 emulation이 느려져 시간 초과가 되는 경우
연결을 자동으로 종료하는 경우가 있는데
이를 막기 위해 아래 코드처럼 스크립트를
setImmediate 함수로 포장한다.
setImmediate(function() { // prevent timeout!
console.log("[+] 연결 종료 방지!!");
Java.perform(function() {
myClass = Java.use("com.takudaddy.name.class.name");
myClass.implementation = function(v) {
// do sth.
}
})})
스크립트 수정 시
위와 같이 setImmediate 적용하면
에뮬레이터가 느려져 시간 초과되더라도
setImmediate가 프리다에서
스크립트를 백그라운드에서
자동으로 재실행 해주기 때문에
스크립트를 작성할 때
혹시 모를 상황을 대비해
함께 사용함!
6. Overloading
- 메서드 구현을 재작성할 때 유의 사항 : 다형성
Java에서는 overloading이 존재하는데
overloading 이란 하나의 클래스에
같은 이름의 메서드가 여러 개 존재하는 것을
말한다.
다만 각 메서드마다 인자의 타입이나 개수는
다르며 달라야 한다.
예로 아래 코드를 보면 myClass라는 클래스에
takudaddy_method라는 동일한 이름의 메서드가
3개 존재하는데
myClass.takudaddy_method.overload().implementation = function() {
// do sth
}
myClass.takudaddy_method.overload("[B", "[B").implementation = function(param1, param2) {
// do sth
}
myClass.takudaddy_method.overload("android.context.Context", "boolean).implementation =
function(param1, param2) {
// do sth
}
overloading이 적용된 메서드가 여러 개 있는 경우
프리다에서 처리 방식은 위 코드와 같다.
첫 번째는 입력받는 인수가 없는 메서드
두 번째는 두 개의 바이트 배열을 인수로 입력 받는 메서드
세 번째는 앱의 context와 Boolean 형태의 인수로 입력받는 메서드!
# overload() 매개변수 카테고리
.overload()
.overload('int’)
.overload('boolean')
.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')
이 밖에 JavaScript API는 프리다 공홈
DOCS > JavaScript API에서 확인!
[도움 출처]
: 보안프로젝트 김태영 팀장
'APP 진단 > Android 2' 카테고리의 다른 글
5. 프리다 기본 실습 2 (0) | 2022.12.07 |
---|---|
4. 프리다 기본 실습 (1) | 2022.12.03 |
2. 프리다 기능 살펴보기 (0) | 2022.12.02 |
1. 프리다 소개 및 진단 환경 구축 (1) | 2022.12.01 |
프리다를 이용한 안드로이드 앱 모의해킹 과정 커리큘럼 (0) | 2022.11.28 |