私はFridaを学ぼうとしており、これまでに少し実験してきました。ありがたいことに、私を助けるのに十分な例とチュートリアルを見つけることができたので、物事はほとんどうまくいきました。ただし、現時点では、非常に具体的なタスクが迫っています。
以下は、私が参照している Frida フックであるとしましょう。
Java.perform(function () {
var Activity = Java.use("myPack.myClass");
Activity.methodM1.overload('[B', 'java.lang.String').implementation = function (a, str) {
var retval = this.methodM1(a, str);
console.log("[*] return value4: "+retval);
return retval;
};
});
これまでの私の理解によると、上記の Java.use を使用して、 myPackage.myClass のオブジェクトが作成され、そのオブジェクトがメソッドmethodM1を呼び出す場合は常に、代わりに私の javascript 関数に制御を取得し、言及されていることは何でも行うと言っています。そこで。
期待どおりに機能します。ただし、ポイント (この議論のために興味深い) は次のとおりです。オブジェクトが作成された場合、これが発生します。
同様に、Java.use の代わりに、Java.choose() についても話している場合、状況は同じでした。その場合でも、オブジェクトが作成されたら、コールバックを呼び出すと言っています。
では、抽象クラスのメソッドにフックしようとするとどうなるでしょうか。メソッドにフックしようとしているとしましょう。
java.security.KeyPairGenerator (抽象クラス) の「static getInstance(String)」。
このクラスはabstractであり、実際にはまったく作成されないオブジェクトです。メソッドはstaticであるため、クラス名自体を使用して直接呼び出されます。したがって、この場合、Java.use() も Java.choose() も役に立ちません(上記の私の理解が正しければ)。
では、そのような状況で getInstance() にフックするにはどうすればよいでしょうか?
これは私がすでに試したことです:
Java.perform(
function()
{
Java.enumerateLoadedClasses(
{
onMatch: function(className)
{
if(className == "java.security.KeyPairGenerator")
{
var item = Java.use(className);
console.log("the PrivateKey class was just loaded");
item.getInstance.overload('java.lang.String').implementation = function(str)
{
console.log("[*] This got called ");
var ret = item.getInstance(str);
console.log("[*] return value4: "+retval);
return retval;
}
}
},
onComplete:function(){}
});
}
);
しかし、これはうまくいきません。ここでも、オブジェクトが作成されて getInstance() が呼び出されるたびに、それをフックすると仮定します。しかしここでは、KeyPairGeneratorは抽象クラスであるため、そもそも実際にインスタンス化されることはありません。私も試しました:
クラス名.getInstance()
それ以外の
item.getInstance()
それもうまくいきません。