frida需要Java基础吗_frida的基本操作

本文介绍了Frida的基本概念、在Mac和Android设备上的安装过程,以及使用Frida进行Java堆栈打印、hook方法、获取前台应用、遍历进程等操作的示例。同时,讨论了可能出现的错误及解决方法,如版本不匹配和frida-server未启动的问题。
摘要由CSDN通过智能技术生成

文章目录

frida是什么?

1、在Mac上安装Frida

2、为Android手机安装Frida

3,一些frida的基本操作:

打印java堆栈:

hook java方法:

获取在前台运行的APP

遍历所有进程

枚举进程中加载指定模块中的导出函数

如何在APK内实现注入frida的操作

Frida工具化

扫描实例类Java.choose 然后实例化一个对象,并调用里面的方法

Frida如何打印参数具体内容?

jni各种类型参数打印

4、可能会遇到的错误

frida是什么?

frida是平台原生app的Greasemonkey,说的专业一点,就是一种动态插桩工具,可以插入一些代码到原生app的内存空间去,(动态地监视和修改其行为),这些原生平台可以是Win、Mac、Linux、Android或者iOS。

1、在Mac上安装Frida

Mac系统的frida版本要与Android中的版本号保持一致。

升级Mac系统中的frida为最新版本的命令:

sudo pip install --upgrade frida

或者安装指定版本的frida,这里安装frida的12.1.2版本:

pip install frida==12.1.2

2、为Android手机安装Frida

我的root设备是Android4.4.4系统

下载frida-server到电脑中,地址:frida-server

选择合适的版本,我这里下载的是frida-server-12.1.2-android-arm.xz

下载到电脑要解压这个.xz文件,Mac系统如果不能识别这个文件,可到App Store安装一个叫"The Unarchiver"的工具。

解压后修改文件名为"frida-server",并复制文件到手机对应的目录下:

adb push frida-server /data/local/tmp/

继续在终端输入命令,为frida-server添加执行权限,并启动手机中的frida-server:

$ adb shell

shell@hammerhead:/ $ su

root@hammerhead:/ # cd /data/local/tmp/

root@hammerhead:/data/local/tmp # chmod 777 frida-server

root@hammerhead:/data/local/tmp # ./frida-server &

手机会重启,重启之后,mac新开一个终端输入命令检查手机上的frida是否运行成功:

frida-ps -U

成功则会打印手机中运行的进程:

PID Name

----- ----------------------------------------------

25851 adb

25767 adbd

31402 android.process.acore

31675 android.process.media

187 bridgemgrd

32228 com.android.defcontainer

...

...

3,一些frida的基本操作:

打印java堆栈:

console.log(Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Exception").$new()));

hook java方法:

https://www.52pojie.cn/forum.php?mod=viewthread&tid=931872

获取在前台运行的APP

import frida

import sys

rdev = frida.get_remote_device()

front_app = rdev.get_frontmost_application()

print (front_app)

遍历所有进程

import frida

import sys

rdev = frida.get_remote_device()

processes = rdev.enumerate_processes()

for processe in processes:

print (processe)

枚举进程中加载指定模块中的导出函数

import frida

import sys

rdev = frida.get_remote_device()

session = rdev.attach("com.mfw.roadbook") # 也可以使用attach(pid)的方式

modules = session.enumerate_modules()

for module in modules:

# print (module)

if module.name=="libmfw.so":

export_funcs = module.enumerate_exports()

for export_func in export_funcs:

print ("\t%s\t%s"%(export_func.name,hex(export_func.relative_address)))

如何在APK内实现注入frida的操作

https://github.com/iGio90/FridaAndroidInjector

操作命令:

frida -U --no-pause -f package_name -l hook_RegisterNatives.js

frida -U -f com.kuaishou.android.common.kwguard //直接注入APP 在APP里面操作

操作案列:

https://juejin.im/post/5b1cc2b85188257d8c7d726c

Frida工具化

https://www.anquanke.com/post/id/197657#h3-1

内存堆搜索与执行,提取内存信息。执行一些hook函数

https://jianshu.com/p/bab4f4714d98

扫描实例类Java.choose 然后实例化一个对象,并调用里面的方法

//在堆上查找实例化的对象,示例代码如下!

Java.choose("b3nac.injuredandroid", {

onMatch: function (instance) {

console.log("Found instance: " + instance);

console.log("Result of secret func: " + instance.decrypt());

},

onComplete: function () { }

});

Frida如何打印参数具体内容?

如果是自定义的实体类参数:比如okhttp的Request

var Request = Java.use('okhttp3.Request');

var Java_Request = Java.cast(arguments[j], Request);

console.log(Java_Request.url());

var Map = Java.use('java.util.HashMap');

var args_map = Java.cast(arguments[j], Map);

console.log(args_map.toString());

将参数强制转换成类对象,并打印里面的值

或者使用javascript里面的value

var1.data.value

jni各种类型参数打印

https://langgithub.github.io/2019/08/01/frida%E4%BD%BF%E7%94%A8%E6%80%BB%E7%BB%93/#okhttp%E4%B8%80%E8%88%AChook%E6%96%B9%E5%BC%8F

function abc(){

var base_address=Module.findBaseAddress('libcms.so')

if (base_address!=null){

console.log("param:ok");

var str;

Java.perform(function () {

str = Java.use("java.lang.String");

});

Interceptor.attach(base_address.add(0x16e19), {

onEnter: function (args) {

// console.log("param1>>>>>>>" + args[0].readCString());

// console.log("param1>>>>>>>" + Memory.readUtf16String(args[0]));

// readAnsiString

console.log("hook success");

var s3 = Java.cast(args[3], str);

var s5 = Java.cast(args[5], str);

console.log("param2>>>>>>>" + args[2].toInt32());

console.log("param3>>>>>>>" + s3);

const length = Java.vm.getEnv().getArrayLength(args[4]);

var array=[];

for(var i=0;i

var obj=Java.vm.getEnv().getObjectArrayElement (args[4],i)

var result=Java.vm.getEnv().stringFromJni(obj)

array.push(result);

}

console.log("param4>>>>>>>" + JSON.stringify(array));

console.log("param5>>>>>>>" + s5);

},

onLeave: function (retval) {

}

});

}

}

abc();

4、可能会遇到的错误

错误1

$frida-ps -Ua

Failed to enumerate applications: the connection is closed

我遇到的错误1和错误2,都是因为手机的Frida版本和Mac电脑的Frida版本不同导致的,安装相同版本的Frida就可解决。

使用frida强制启动chrome报错

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

Traceback (most recent call last):

File "/Users/king/Documents/PythonProject/Tornado/test/venv/bin/frida", line 11, in

sys.exit(main())

File "/Users/king/Documents/PythonProject/Tornado/test/venv/lib/python2.7/site-packages/frida_tools/repl.py", line 23, in main

from prompt_toolkit.shortcuts import create_prompt_application, create_output, create_eventloop

ImportError: cannot import name create_prompt_application

解决:

pip install ‘prompt-toolkit==1.0.15’

错误2:

Failed to spawn: unable to connect to remote frida-server

frida-server未启动

参考:

https://bbs.pediy.com/thread-252520.htm

Frida的操作教程:https://github.com/iddoeldor/frida-snippets#hook-overloads

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值