上一篇文章,简单对Frida有了一个了解,接下来学习一些基本的操作
Frida再面不同类型的java 函数时所,调用方法时不同的,来做一个总结;
普通函数:
public class test {
public static first(String x) {
return x;
}
...
}
hook代码:
var class=Java.use("com.test.app.test");
test.first.implementation = function(x)
{
console.log("Hook Start...");
//hook 代码
}
构造函数:函数名和类名相同,能在创建Person
实例的时候,一次性传入name
和age
,完成初始化
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
hook方法:
$init来获取该方法
重载函数:一个类中,方法名相同,但是方法参数不一样的函数
public class test {
public static String fun(int a) {
return a;
}
public static String fun(String b) {
return b;
}
}
hook方法:
test.fun.overload("int").implementation = function(a)//hook参数为a的fun函数,添加overloda(参数类型)。
{
console.log("Hook Start...");
//hook代码
}
var JavaString=Java.use("java.lang.String");
test.fun.overload('java.lang.String').implementation = function (str) { //hook参数为b的fun函数,这里要注意javascript到java的类型转换,需要引用java中的string类java.lang.String来构造,
//打印参数
str=JavaString.$new("abddfgg");
console.log("original call : str:",str);
return this.fun(str);
};
参数为对象实例的函数:该函数的参数为对象,上文的String 参数即是这种情况,需要hook该对象,实例化一个参数;
import com.test.app.abc;
public class test {
public static String fun(adc x) {
return x.value;
}
hook方法:
var jabc = Java.use("com.test.app.abc"); //hook参数类
var jtest=Java.use("com.test.app.test");
jtest.fun.implementation = function(a)
{
console.log("Hook Start...");
var a = jadc.$new("xxxx"); //$new实例化一个参数。
// a.name="xxxx";实例化以后还可修改对象的属性值。
return this.fun(a);
}
内部类函数:在一个类,中继续定义一个类,其中的函数;
class test {
class test2 { //内部类
public void fun(int x) {
return x;
}
}
}
hook方法:
var jtest = Java.use('com.test.app.test$test2')//在第一个类后面加上$即可,$内部类
jtest.fun.implementation = function()
{
.
}
实际过程中,函数的参数类型往往是最容易出错的,java是强类型,js为弱类型,js定义的参数往往要转成java适用的类型。