在上一篇文章Android Hook工具之Frida 安装配置教程 中讲解了如何安装配置Frida工作环境,这篇文章主要讲解一下Frida的基础使用方式.

在运行以下任何命令之前必须先启动手机中的frida-server

使用frida-trace命令跟踪某个特定的函数:

frida-trace -U -i [函数名] [程序包名]

例: 跟踪Chrome中的open函数,先在手机中启动Chrome,否则会跟踪失败,启动后,在终端窗口中输入frida-trace命令

frida-trace -U -i open com.android.chrome

Instrumenting functions...

open: Auto-generated handler at "/Users/wangw/unapk/frida/__handlers__/libc.so/open.js"

Started tracing 1 function. Press Ctrl+C to stop.

跟踪成功后,会在当前路径下创建以下JavaScript文件(/Users/wangw/unapk/frida/handlers/libc.so/open.js),Frida会将JavaScript文件中的代码注入到进程中并跟踪指定的函数调用,可以修改生成的JavaScript文件实现Hook功能,下面就是自动生成Js文件内容

{

onEnter: function (log, args, state) {

log("open(" +

"path=\"" + Memory.readUtf8String(args[0]) + "\"" +

", oflag=" + args[1] +

")");

},

onLeave: function (log, retval, state) {

}

}

跟踪成功后就会打印出Chrome调用open函数每一次调用,输出结果类似下面这样:

frida-trace -U -i open com.android.chrome

Instrumenting functions...

open: Auto-generated handler at "/Users/wangw/unapk/frida/__handlers__/libc.so/open.js"

Started tracing 1 function. Press Ctrl+C to stop.

/* TID 0x2252 */

1312 ms open(path="/data/user/0/com.android.chrome/code_cache/com.android.opengl.shaders_cache", oflag=0xc2)

1314 ms open(path="/data/user/0/com.android.chrome/code_cache/com.android.opengl.shaders_cache", oflag=0xc2)

/* TID 0x2298 */

3264 ms open(path="/data/user/0/com.android.chrome/shared_prefs/com.android.chrome_preferences.xml", oflag=0x241)

强制启动一个应用进程

frida -U --no-pause -f [应用包名]

使用-f选项表示强制启动一个应用程序,--no-pause选项表示不中断应用程序的启动,如果不使用这个选项总是会遇到 在强制启动应用程序2秒左右后程序自动退出,

例: 强制启动Chrome并attach到当前进程

frida -U --no-pause -f com.android.chrome

____

/ _ | Frida 10.6.52 - A world-class dynamic instrumentation toolkit

| (_| |

> _ | Commands:

/_/ |_| help -> Displays the help system

. . . . object? -> Display information about 'object'

. . . . exit/quit -> Exit

. . . .

. . . . More info at http://www.frida.re/docs/home/

Spawned `com.android.chrome`. Resuming main thread!

[HUAWEI EVA-AL10::com.android.chrome]->

当attach成功后,就可以开始Hook Java函数和对象了。

关于Friada框架中Java部分的API可以查看官方文档,下面总结几个常用的API。

Java.available 返回一个Boolean值,表示当前进程是否加载了 JVM也就是是否运行在Dalvik 或 ART环境中.如果返回false则Java 相关的API则无法调用

[HUAWEI EVA-AL10::com.android.chrome]-> Java.available

true

Java.enumerateLoadedClasses(callbacks) 列出已加载的类

[HUAWEI EVA-AL10::com.android.chrome]-> Java.perform(function(){Java.enumerateLo

adedClasses({"onMatch":function(className){ console.log(className) },"onComplete

":function(){console.log(onComplete) }})})

org.chromium.chrome.browser.ntp.ContentSuggestionsNotifier

org.chromium.chrome.browser.snackbar.undo.UndoBarController

所有的代码逻辑都封装在Java.perform(function(){ … })中,逻辑很简单,就是使用Java.enumerateLoadedClassesFridas API 列出所有已加载的类,并将每个类的className输出到控制台,这种使用方式是Frida框架中最常用的,它其实就是一个回调对象模板,

{

"onMatch":function(arg1, ...){ ... },

"onComplete":function(){ ... },

}

一旦Frida匹配到你的请求,就会使用一个或多个参数调用onMeth方法,如果匹配完成时就会调用onComplete,

Java.use(className) 根据className动态获取一个JavaScript wrapper,获取到后可以调用$new()方法来实例化一个对象,也可以调用$dispose()方法进行释放

Java.perform(function () {

var Activity = Java.use("android.app.Activity");

var Exception = Java.use("java.lang.Exception");

Activity.onResume.implementation = function () {

throw Exception.$new("Test!");

};

});

Frida框架还支持加载外部脚本代码,而不用直接写到Cli中运行,使用-f选项后面跟着脚本文件路径即可,比如我们将上面的代码保存到一个文件中并命名为Test.js,使用命令运行:

frida -U -l Test.js --no-pause -f com.android.chrome

Frida有时候会有超时的提示,为防止这种情况,可以将脚本里面的代码包装在setImmediate函数中或导出为rpc

例: 将Test.js中的代码修改一下,然后再次运行上面的命令重新部署一下即可。

setImmediate(function() {

Java.perform(function () {

var Activity = Java.use("android.app.Activity");

var Exception = Java.use("java.lang.Exception");

Activity.onResume.implementation = function () {

throw Exception.$new("Test!");

};

});

});

如何Hook一个java方法

使用Java.use(className)命令获取 JavaScript wrapper

调用获取到的 JavaScript wrapper对象的方法[JavaScript wrapper对象].[要Hook的方法名].implementation=function(){...}

注1: 如果要Hook的方法有多个重载时,必须使用overload()方法调用,参数必须是完全匹配的,参数类型必须是全类名的也就是全引用名的。

注2: Hook方法中的参数,可以通过arguments数组访问,也可以在implementation函数中声明对应的形参

Android 代码:

public class MainActivity extends AppCompatActivity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

findViewById(R.id.mBtnTest).setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(final View v) {

helloAndroid();

test1();

test2(123);

test3("str");

test4("str", true);

}

});

}

private void helloAndroid() {

System.out.println("helloAndroid()");

}

private void test() {

System.out.println("test1()");

}

private void test(int i) {

System.out.println("test2(int) " + i);

}

private void test(String s) {

System.out.println("test3(String) " + s);

}

private void test(String s, boolean b) {

System.out.println("test4(String, boolean) " + s + ", " + b);

}

}

JavaScript Hook代码

Java.perform(function () {

var MainActivity = Java.use("com.github.fridademo.MainActivity");

MainActivity.helloAndroid.implementation = function () {

console.log("helloAndroid()");

this.private_func();

};

MainActivity.test.overload().implementation = function () {

console.log("test1()");

this.private_func();

};

MainActivity.test.overload("int").implementation = function (i) {

console.log("test2(int): " + i);

this.private_func(i);

};

MainActivity.test.overload("java.lang.String").implementation = function () {

console.log("test3(String): " + arguments[0]);

this.private_func(arguments[0]);

};

MainActivity.test.overload("java.lang.String", "boolean").implementation = function (s, b) {

console.log("test4(String,boolean): " + s + ", " + b);

this.private_func(s, b);

};

});

frida需要Java基础吗_Android Hook工具之Frida 基础使用相关推荐

  1. Android Native Hook工具

    前言 在目前的安卓APP测试中对于Native Hook的需求越来越大,越来越多的APP开始逐渐使用NDK来开发核心或者敏感代码逻辑.个人认为原因如下: 安全的考虑.各大APP越来越注重安全性,NDK ...

  2. PS图片基础知识及常用工具介绍

    一.PS图片基础知识及常用工具介绍 PS基础教程 http://zx.kaitao.cn/tupianchuli/20120919170827.htm 选框.套索.裁剪.画笔工具:http://zx. ...

  3. 5、frida进阶-Android逆向之旅---Hook神器家族的Frida工具使用详解

    本文转载自:https://www.cnblogs.com/qwangxiao/p/9255328.html 一.前言 在逆向过程中有一个Hook神器是必不可少的工具,之前已经介绍了Xposed和Su ...

  4. objection - 基于frida的命令行hook工具食用手册

    0x1 介绍&安装Objection objection是基于frida的命令行hook工具, 可以让你不写代码, 敲几句命令就可以对java函数的高颗粒度hook, 还支持RPC调用 目前只 ...

  5. 收藏|Java程序员必看的几本基础书籍和常用工具

    java程序员必看基础书籍和工具 1计算机基础 1.<深入理解计算机系统> 著名的CSAPP,从c语言到汇编语言到硬件再到操作系统,写得非常好.是一本能帮助深入理解计算机系统的书.基本上把 ...

  6. VirtualHook: 基于VirtualApp的Java代码hook工具

    VirtualHook: 基于VirtualApp的Java代码hook工具 nabla 2017-4-1 10:16  21442 转自 https://bbs.pediy.com/thread-2 ...

  7. Java基础教程:JavaArrays工具类

    Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承.指针等概念.Java不但可以用来开发网站后台.PC客户端和AndroidAPP,还在数据分析.网络爬虫 ...

  8. Redis 基础 Jedis -- Jedis(Java程序操作Redis的工具)

    文章目录 1. Jedis -- Jedis(Java程序操作Redis的工具) 1.1 Jedis简介 1.2 HelloWorld(Jedis版) 1.2.1 准备工作 1.2.2 编写Java程 ...

  9. 实用frida进阶:内存漫游、hook anywhere、抓包

    目录 1 内存漫游 1.1 获取基本信息 1.2 提取内存信息 1.3 内存堆搜索与执行 1.4 启动activity或service 2 Frida hook anywhere 2.1 object ...

最新文章

  1. linux救援模式无法识别分区,Linux操作系统出现严重故障后的救援模式
  2. 通过创建 HttpCookie 对象的实例编写 Cookie
  3. MySQL建表枚举分区SQL,【mysql备份】02、Xtrabackup备份mysql
  4. VRPM包安装失败解决方案:had non-zero exit status
  5. php和mysql的版本区别_MySQL各个版本区别_MySQL
  6. python中dict的fromkeys用法
  7. 互联网1分钟 |1130
  8. 整理你的个人IT资料库
  9. 一个按钮触发多个a标签,只有一个可以下载,其他的window.open()被浏览器拦截...
  10. 用vim替代source insight
  11. oracle怎么存视频地址,oracle的警告文件存储方式和地址
  12. 【ANSYS命令流】结构分析单元与材料模型
  13. 基于Helm和Operator的K8S应用管理
  14. python 战舰_代码战争战舰受损或沉没Python
  15. mysql脏读,幻读,不可重复读以及间隙所解决幻读
  16. 全国计算机绘图师第三期工业产品,2018年全国CAD技能等级考试指导丛书:工业产品类CAD技能等级考试试题集...
  17. Java虚拟机的基本结构
  18. 电磁学第1章作业题答案
  19. 微软电脑管家2.0公测版体验
  20. 网易云音乐称酷狗抄袭计算机,网易云音乐称酷狗抄袭 双方有何恩怨?

热门文章

  1. SPT20 协议_【笔试时间有变】关于国家电网三方协议的那些事!
  2. 小鹏汽车2021财年总收入209.9亿元 同比增长259.1%
  3. 长远锂科:拟发行可转债募资不超32.5亿元
  4. 19天备战 691亿次红包互动 京东云独立抗住了
  5. 滴!你的“十三香”已发货,iPhone 13系列今日正式发售
  6. 警方通报6少年深夜洗劫小米专卖店
  7. Redmi K40发布时间定档:2月25日见
  8. 知乎启动首部科幻剧《寒梅工程2021》 概念片首次曝光
  9. 苹果或在2021年新iPhone上增加屏下Touch ID
  10. 台积电预计5nm芯片四季度出货量将超过15万片晶圆,9成供应苹果