前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Hook Java方法

Hook Java方法

原创
作者头像
bosh123
修改2020-12-14 15:19:46
1.6K0
修改2020-12-14 15:19:46
举报
文章被收录于专栏:my notebook

2. Hook Java方法

2.1 载入类#

Java.use方法用于加载一个Java类,相当于Java中的Class.forName()。比如要加载一个String类:

var StringClass = Java.use("java.lang.String");

加载内部类:

var MyClass_InnerClass = Java.use("com.luoyesiqiu.MyClass$InnerClass");

其中InnerClass是MyClass的内部类

2.2 修改函数的实现#

修改一个函数的实现是逆向调试中相当有用的。修改一个函数的实现后,如果这个函数被调用,我们的Javascript代码里的函数实现也会被调用。

2.2.1 函数参数类型表示#

不同的参数类型都有自己的表示方法

  1. 对于基本类型,直接用它在Java中的表示方法就可以了,不用改变,例如:
  • int
  • short
  • char
  • byte
  • boolean
  • float
  • double
  • long
  1. 基本类型数组,用左中括号接上基本类型的缩写

基本类型缩写表示表:

基本类型

缩写

boolean

Z

byte

B

char

C

double

D

float

F

int

I

long

J

short

S

例如:int[]类型,在重载时要写成[I

  1. 任意类,直接写完整类名即可

例如:java.lang.String

  1. 对象数组,用左中括号接上完整类名再接上分号

例如:[java.lang.String;

2.2.2 带参数的构造函数#

修改参数为byte[]类型的构造函数的实现

代码语言:javascript
复制
ClassName.$init.overload('[B').implementation=function(param){
    //do something
}

注:ClassName是使用Java.use定义的类;param是可以在函数体中访问的参数

修改多参数的构造函数的实现

代码语言:javascript
复制
ClassName.$init.overload('[B','int','int').implementation=function(param1,param2,param3){
    //do something
}

2.2.3 无参数构造函数#

代码语言:javascript
复制
ClassName.$init.overload().implementation=function(){
    //do something
}

调用原构造函数

代码语言:javascript
复制
ClassName.$init.overload().implementation=function(){
    //do something
    this.$init();
    //do something
}

注意:当构造函数(函数)有多种重载形式,比如一个类中有两个形式的func:void func()void func(int),要加上overload来对函数进行重载,否则可以省略overload

2.2.4 一般函数#

修改函数名为func,参数为byte[]类型的函数的实现

代码语言:javascript
复制
ClassName.func.overload('[B').implementation=function(param){
    //do something
    //return ...
}

2.2.5 无参数的函数#

代码语言:javascript
复制
ClassName.func.overload().implementation=function(){
    //do something
}

注: 在修改函数实现时,如果原函数有返回值,那么我们在实现时也要返回合适的值

代码语言:javascript
复制
ClassName.func.overload().implementation=function(){
    //do something
    return this.func();
}

3. 调用函数

和Java一样,创建类实例就是调用构造函数,而在这里用$new表示一个构造函数。

代码语言:javascript
复制
var ClassName=Java.use("com.luoye.test.ClassName");
var instance = ClassName.$new();

实例化以后调用其他函数

代码语言:javascript
复制
var ClassName=Java.use("com.luoye.test.ClassName");
var instance = ClassName.$new();
instance.func();

4. 字段操作

字段赋值和读取要在字段名后加.value,假设有这样的一个类:

代码语言:javascript
复制
package com.luoyesiqiu.app;
public class Person{
    private String name;
    private int age;
}

写个脚本操作Person类的name字段和age字段:

代码语言:javascript
复制
var person_class = Java.use("com.luoyesiqiu.app.Person");
//实例化Person类
var person_class_instance = person_class.$new();
//给name字段赋值
person_class_instance.name.value = "luoyesiqiu";
//给age字段赋值
person_class_instance.age.value = 18;
//输出name字段和age字段的值
console.log("name = ",person_class_instance.name.value, "," ,"age = " ,person_class_instance.age.value);

输出:

代码语言:javascript
复制
name =  luoyesiqiu , age =  18

5. 类型转换

Java.cast方法来对一个对象进行类型转换,如将variable转换成java.lang.String

代码语言:javascript
复制
var StringClass=Java.use("java.lang.String");
var NewTypeClass=Java.cast(variable,StringClass);

6. Java.available字段

这个字段标记Java虚拟机(例如: Dalvik 或者 ART)是否已加载, 操作Java任何东西之前,要确认这个值是否为true

7. Java.perform方法

Java.perform(fn)在Javascript代码成功被附加到目标进程时调用,我们核心的代码要在里面写。格式:

代码语言:javascript
复制
Java.perform(function(){
//do something...
});

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 2. Hook Java方法
    • 2.1 载入类#
      • 2.2 修改函数的实现#
        • 2.2.1 函数参数类型表示#
        • 2.2.2 带参数的构造函数#
        • 2.2.3 无参数构造函数#
        • 2.2.4 一般函数#
        • 2.2.5 无参数的函数#
    • 3. 调用函数
    • 4. 字段操作
    • 5. 类型转换
    • 6. Java.available字段
    • 7. Java.perform方法
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档