android逆向之frida脚本中overload带的参数

原创
2020/11/22 21:27
阅读数 204

该篇文章主要介绍frida脚本hook android app的对象方法以及当方法重载时如何使用。


一、hook android app的对象方法

  1. 创建一个类对象(以文中提供的测试app为例,具体测试app代码即frida脚本,可在公众号回复“overload测试代码”进行下载)

    //创建的类对象即我们要hook的方法所在的类的类名,具体类名根据实际需求填写var parametersTestClass = Java.use("com.example.parameterstest.ParametersTest");


  2. 调用对象方法

    //创建完类对象中,即可通过类对象调用对象的方法,如下所示parametersTestClass.multiply.implementation = function(val1,val2){//在这里我们可以做一些hook操作,比如打印参数   var result = this.multiply(val1,val2);//在这里我们可以做一些hook操作,比如打印返回值   return result;}


  3. 如果我们调用的对象方法有其他重载方法时,则需要通过overload指定具体参数类型,否则会报如下错误。当然错误中也提供了具体的参数类型,可通过错误信息提取我们需要的参数类型进行hook即可

    {'type''error''description'"Error: multiply(): has more than one overload, use .overload(<signature>) to choose from:\n\t.overload('long', 'long')\n\t.overload('short', 'short')\n\t.overload('int', 'int')\n\t.overload('byte', 'byte')\n\t.overload('float', 'float')\n\t.overload('double', 'double')"'stack'"Error: multiply(): has more than one overload, use .overload(<signature>) to choose from:\n\t.overload('long', 'long')\n\t.overload('short', 'short')\n\t.overload('int', 'int')\n\t.overload('byte', 'byte')\n\t.overload('float', 'float')\n\t.overload('double', 'double')\n    at pe (frida/node_modules/frida-java-bridge/lib/class-factory.js:549)\n    at ve (frida/node_modules/frida-java-bridge/lib/class-factory.js:538)\n    at frida/node_modules/frida-java-bridge/lib/class-factory.js:911\n    at /script1.js:11\n    at frida/node_modules/frida-java-bridge/lib/vm.js:11\n    at frida/node_modules/frida-java-bridge/index.js:392\n    at frida/node_modules/frida-java-bridge/index.js:377\n    at we (frida/node_modules/frida-java-bridge/lib/class-factory.js:598)\n    at frida/node_modules/frida-java-bridge/lib/class-factory.js:581"'fileName''frida/node_modules/frida-java-bridge/lib/class-factory.js''lineNumber'549'columnNumber'1}


二、类方法重载时指定具体参数(overload

  1. 当方法重载时,则我们需要通过如下方式进行hook(在overload方法中指定参数类型)

    parametersTestClass.multiply.overload('int','int').implementation = function(val1,val2){            //在这里我们可以做一些hook操作,比如打印参数            var result = this.multiply(val1,val2);            //在这里我们可以做一些hook操作,比如打印返回值            return result;        }


  2. 如下列出了大部分的参数类型(Java中参数类型对应JS脚本中参数类型

    Java Type (Java中参数类型) Frida Type (frida脚本中参数类型)
    int int
    byte
    byte
    short
    short
    long
    long
    float
    float
    double double
    char
    char
    <Object>(比如String、List)
    <package>.<Object>(比如java.lang.String、java.util.List
    int[]
    [I
    byte[]
    [B
    short[]
    [S
    long[]
    [J
    float[]
    [F
    double[]
    [D
    char[]
    [C
    <Object>[](比如String[])
    L<package>.<Object>; (比如 [Ljava.lang.String;)


    当参数是某个类对象时,则需要在overload中填写其完整包名路径+类名即可,跟上面的<Object>(比如String、List)一样,如下所示

    parametersTestClass.display.overload("com.example.parameterstest.ParametersTest").implementation = function (val1){  this.display(val1);}

本文分享自微信公众号 - 网络安全技术点滴分享(gh_c85d6ae14603)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部