上一篇文章,简单对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方法:
var money=Java.use("com.test.app.Person"); Person.$init.implementation = function(a, b) //通过$init来获取该方法
{ console.log("Hook Start...");
//hook代码return this.$init(a,b); //打印返回值时也这样引用; }
重载函数:一个类中,方法名相同,但是方法参数不一样的函数
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适用的类型。