현재 스레드가 가상머신에 연결되어 있는지 확인하고 function을 호출한다.
Java.perform(function() {
/*
do something
*/
})
변수와 메소드에 접근할 수 있는 클래스 객체를 반환한다. (인스턴스가 아닌 클래스 객체를 반환함에 주의한다.)
Java.perform(function() {
var myClass = Java.use(com.mypackage.name.class)
myClass.myMethod.implementaion = function(param) {
/*
do something
*/
}
})
스레드가 가상머신에 연결되어 있음을 확인하면, 앱에서 사용하는 클래스 객체를 반환하여 해당 객체에서 사용하는 메소드를 재작성하여 이를 사용하는 것이다.
안드로이드 앱 내부의 인스턴스를 다루기 위한 것으로, 힙에서 인스턴스화 된 객체를 찾아 callback으로 넘겨준다.
Java.perform(function() {
Java.choose(com.mypackage.name.class, {
"onMatch" : function(instance) {
console.log(instance.toString())
},
"onComplete" : function() {}
})
})
로드된 모든 클래스를 열거한다.
Java.perform(function() {
Java.enumerateLoadedClasses({
"onMatch" : function(className) {
console.log(className)
},
"onComplete" : function() {}
})
})
프리다는 에뮬레이션이 느려질 경우, 시간초과 되어 연결을 자동으로 종료하는 경우가 있기 때문에 이를 막기 위해 사용한다.
setImmediate(function() { // prevent timeout
console.log("[*] starting script");
Java.perform(function() {
myClass = Java.use("com.package.name.class.name");
myClass.implementation = function(v) {
// do something
}
})
})
오버로딩(Overloading)은 하나의 클래스 내에 동일한 이름의 메소드가 매개변수 정보를 달리 하여 여러 개 존재하는 것을 말한다.
오버로딩을 구현하기 위해 overload() 라는 것을 제공한다.
myClass.myMethod.overload().implementation = function() {
// 입력받는 인수가 없는 메소드
// do something
})
myClass.myMethod.overload("[B", "[B").implementation = function(param1, param2) {
// 두 개의 바이트 배열을 인수로 입력 받는 메소드
// do something
})
myClass.myMethod.overload("android.context.Context", "boolean").implementation = function(param1, param2) {
// 앱의 context와 Boolean 값을 인수로 입력받는 메소드
// do something
})