フリーダでAndroidアプリをフックするときにリストの内容を印刷しようとしましたが、うまくいきません。
Javaでフックしたいオブジェクトは次のようになります
import com.fasterxml.jackson.annotation.JsonIgnore;
import java.util.List;
public final class Hello extends HelloParent{
@JsonIgnore
public final List sampleList;
}
このパブリックオブジェクトにはゲッターがないため、別のオブジェクト(オブジェクトを「Bye」と呼びましょう)のメソッド(byeMethodB)を使用してこの値を監視する必要があります。
これは私のfrida-scriptがどのように見えるかです:
setTimeout(function() {
Java.perform(function(){
Java.use("Bye").byeMethodA.implementation = function(){
try{
//Returns a Hello object
var helloObject = Java.cast(this.byeMethodB(),Java.use("Hello"))
printListContent(Java.cast(helloObject.sampleList,Java.use("java.util.List"))))
}catch(err){
console.log(err)
}
}
})
},1000)
function printListContent(list){
var listIter = list.iterator()
while(listIter.hasNext()){
console.log(listIter.next())
}
}
「helloObject.sampleList」オブジェクトをリストにキャストしない場合、出力は次のようになります。
[object Object]
だから私はそれがnullではないと確信しています
を使用してキャストした場合Java.cast(helloObject.sampleList,Java.use("java.util.List"))
、
次のエラーが発生します。
私も試しました:
Java.cast(helloObject.sampleList,Java.use("java.util.List<>"))
(私はそれが文字列であるとかなり確信しています) Java.cast(helloObject.sampleList,Java.use("java.util.List<String>"))
Java.cast(helloObject.sampleList,Java.use("java.util.List<java.lang.String>"))
Java.cast(helloObject.sampleList,Java.use("[String"))
Java.cast(helloObject.sampleList,Java.use("[Ljava.lang.String"))
まったくうまくいっていません。助けていただければ幸いです
フリーダでは、フィールドへのアクセスはJavaと同じではありません。helloObject.sampleList
Fridaで実行すると、フィールド値自体ではなく、フィールドを説明するJavaScriptオブジェクトが取得されます。
フィールド値が必要な場合は、実行する必要がありますhelloObject.sampleList.value
。
したがって、次のコードが機能するはずです。
Java.cast(helloObject.sampleList.value, Java.use("java.util.List")),
ジェネリックはコンパイル時にのみ存在しますが、fridaは実行時に機能します。したがってjava.util.List<>
、山かっこ付きの他のクラス名は機能しません。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加