内部类hook
内部类的分类
- 成员内部类,作为一个类成员,可以拥有private访问权限、protected访问权限、public访问权限及包访问权限。
- 局部内部类,作用域在一个方法或者一个作用域里面的类,就像是方法里面的一个局部变量一样,是不能有public、protected、private以及static修饰符的。
- 匿名内部类,没有构造器的类,大部分匿名内部类用于接口回调。匿名内部类在编译的时候由系统自动起名为Outter$1.class。一般来说,匿名内部类用于继承其他类或是实现接口,并不需要增加额外的方法,只是对继承方法的实现或是重写。匿名内部类也是不能有访问修饰符和static修饰符的。
- 静态内部类,类似成员内部类,只是声明为static,是不需要依赖于外部类的,这点和类的静态成员属性有点类似,并且它不能使用外部类的非static成员变量或者方法。
内部类示例
//内部类
class UserAsserts{
public String getRMB() {
return RMB;
}
public void setRMB(String RMB) {
this.RMB = RMB;
}
public String getDollar() {
return Dollar;
}
public void setDollar(String dollar) {
Dollar = dollar;
}
String RMB;
String Dollar;
}
这是内部类作为类成员的一种情况
hook示例
此时内部类必须依存于外部类,也就是必须先实例化这个外部类才能使用这个“类成员”内部类
外部类想要调用成员内部类的类成员方法时,必须先获取这个内部类的实例
//hook内部类
function hooktest5(){
var assertsObj=Java.use("com.alex.javahooktarget.MyUser$UserAsserts");
assertsObj.setRMB.implementation=function(str){
console.log("Hook 到 setRMB,传参:",str);
this.setRMB("hooked!!!");
}
assertsObj.setDollar.implementation=function(str){
console.log("Hook 到 setDollar,传参:",str);
this.setDollar("23333333333");
}
}
//hook static内部类
function hooktest6(){
var staticClsObj=Java.use("com.alex.javahooktarget.MyUser$static_inner_cls");
staticClsObj.setEducation.implementation=function(str){
console.log("Hook 到 setEducation,传参:",str);
this.setEducation("hooked!!!");
}
}
//hook 局部内部类,这个Hook提示找不到类……
function hooktest7(){
var sub2ClsObj=Java.use("com.alex.javahooktarget.MyUser$Sub2");
sub2ClsObj.setGreeting.implementation=function(str){
console.log("Hook 到 setGreeting,传参:",str);
this.setGreeting("hooked!!!");
}
}
//hook 匿名类
function hooktest6_1(){
Java.perform(function(){
var nimingClsObj=Java.use("com.alex.javahooktarget.MyUser$1");
nimingClsObj.sayYeah.implementation=function(){
console.log("Hook 到 sayYeah");
this.sayYeah();
}
})
}
要注意内部类的表示方法,是Class$inner$inner
原理上是可以有无限嵌套的内部类的。。
匿名类一般是$1或者$2345……