Android逆向之hook框架Frida:Frida的环境搭建及入门实战

作者 原文传送
littley www.littley.top

简介

Frida是一款基于python + javascript 的hook框架,可运行在android ios linux windows osx等各平台,主要使用动态二进制插桩技术;由于是基于脚本(javascript)的交互,因此相比xposed和substrace cydia更加便捷
官网址址:https://frida.re/
github地址:https://github.com/frida/frida

配置环境需求

  1. python使用版本python3.7:https://www.python.org/
  2. mumu android模拟器:http://mumu.163.com/baidu/
  3. adb驱动:https://adb.clockworkmod.com/
  4. jadx-gui(apk反编译):http://www.pc6.com/softview/SoftView_579787.html
  5. apkhelper v3.0(应用包名等查看):http://www.pc6.com/softview/SoftView_472196.html
  6. vscode编辑器(主要用于源码分析):https://code.visualstudio.com/
  7. windows10 64位
  8. nice app(实战使用的app):https://www.wandoujia.com/apps/2604261

环境配置

Frida的安装很简单,需要在windows安装frida客户端和在安卓安装frida服务端。

windows安装frida客户端:

pip install frida-tools
pip install frida   

Android 安装frida服务端

下载 : https://github.com/frida/frida/releases相应的版本
我用的是mumu模拟器所以下载的是frida-server-12.8.6-android-x86.xz
Android逆向之hook框架Frida:Frida的环境搭建及入门实战_第1张图片Android逆向之hook框架Frida:Frida的环境搭建及入门实战_第2张图片
下载后解压(主意下载是压缩包,要解压一下)
Android逆向之hook框架Frida:Frida的环境搭建及入门实战_第3张图片
使用adb连接mumu模拟器(注意打开root权限及usb调试模式)

adb connect 127.0.0.1:7555

关闭指令为

adb disconnect 127.0.0.1:7555

将上面的解压得到的文件传送至模拟器上到/data/local/tmp 目录,并命名为frida-server

adb push frida-server-12.8.6-android-x86 /data/local/tmp/frida-server

进入adb shell并设置frida-server的权限

Android逆向之hook框架Frida:Frida的环境搭建及入门实战_第4张图片

使用./frida-server启动服务

之后另外开启一个命令窗口运行命令:frida-ps -U(查看运行的进程)

Android逆向之hook框架Frida:Frida的环境搭建及入门实战_第5张图片出现上图说明服务起成功

最后将手机端的端口转发到PC端进行通信
adb forward tcp:27042 tcp:27042

adb forward tcp:27043 tcp:27043

反编译nice app,找到hook点

使用jdax-gui工具打开nice-main-5.4.29-release.apk(反编译时间过长,耐心等待…),反编译完点击jdax-gui的File—> Save as gradle project将源码保存在本地,并使用vscode打开
本次实战hook点是使用已有账登录,输入账号密码后,点登录获取账号密码信息
Android逆向之hook框架Frida:Frida的环境搭建及入门实战_第6张图片Android逆向之hook框架Frida:Frida的环境搭建及入门实战_第7张图片Fiddler代理设置请自行百度

通过Fiddlert查看,每获次登录的请求响应如下
Android逆向之hook框架Frida:Frida的环境搭建及入门实战_第8张图片由上图片得出请求路径:/account/login

分析源码

vscode中全文搜索/account/login
在bil.java中a方法中找到
在这里插入图片描述
Android逆向之hook框架Frida:Frida的环境搭建及入门实战_第9张图片
由此得见,我们从a方法就是我们的hook点,a方法的参数jsonObject str即是我们要获取的内容

编写脚本

import frida
import sys

# hook逻辑脚本
jscode = """
Java.perform(function () {
//获取bli类型,使用js将其包状成代理对象
  var bil = Java.use('bil');


  var function_a = bil.a;
  //重写方法a
  function_a.overload("org.json.JSONObject","java.lang.String").implementation = function (obj,str) {
    // Show a message to know that the function got called
    send('function_a');
	 send('obj'+obj);
	 send('str'+str);
    // Call the original onClick handler
    //调用实际的a方法(即包装之前的a方法,类似于装饰器工能)
 return    this.a( obj,str);
  };
});
"""

# 注入进程,attach传入进程名称(字符串)或者进程号(整数)
rdev = frida.get_remote_device()
session = rdev.attach("com.nice.main")
script = session.create_script(jscode)
#int()函数把字符串表示的16进制数转换成整数
#上面的jscode % int(sys.argv[1], 16)是python格式化字符串的语法

# 接收脚本信息的回调函数
# message是一个对象,type属性为send则表示send函数发送的信息,其内容在payload里
# 下面这个on_message函数可以做固定用法,一般无需改动,当然也可直接打印message看看里边的内容
def on_message(message, data):
    if message['type'] == 'send':
        print(message['payload'])
    elif message['type'] == 'error':
        print(message['stack'])
# 应该是设置message事件的回调函数
script.on('message', on_message)
# 加载hook脚本
script.load()
# 保持主线程不结束(也可以使用time.sleep循环)
sys.stdin.read()

#在反编译的文件中有些类没有包名如:
Android逆向之hook框架Frida:Frida的环境搭建及入门实战_第10张图片package defpackage;说明没有包名,在使用Java.use();方法时
直接使用类名就可以了如Java.use(‘bil’);

参考:https://blog.csdn.net/chifu5720/article/details/102861359

运程脚本

运行脚本前一定要先在模拟器中将nice app运行起来
然后在cmd中运行

python my_script.py

Android逆向之hook框架Frida:Frida的环境搭建及入门实战_第11张图片
然后输入账号密码即可获取到账号与密码(此处密码是加密后的)等相关内容
在这里插入图片描述成功hook!!!

相关资料:
https://blog.csdn.net/qq_44906504/article/details/89672518
https://blog.csdn.net/u014476720/article/details/83537843
https://blog.csdn.net/qq_44906504/article/details/89672518

https://blog.csdn.net/jinangl_vsnake/article/details/72919329
https://www.cnblogs.com/tjp40922/p/11353808.html

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

扩展

在使用frida过程中发现有些app会对27042 /27043端口或frida-server服务名称进行检测,导制一运行frida注入app就闪退,解决方法如下:
1.重命名服务frida-server为不fs64或其他名字
2.frida服务默认启动端口为27042可指定端口端启动如:

chmod 777 fs64
fs64 -l 0.0.0.0:1234

然后转发

adb forward tcp:1234 tcp:1234

客户端使用方式:
frida-cli的使用自定端口的方式:

frida -H 127.0.0.1:1234 package_name -l hook.js 

python脚本使用自定义端口的方式:

host = '127.0.0.1:1234'
manager = frida.get_device_manager()
device= manager.add_remote_device(host)

备注:get_remote_device()方法,后来发现这个函数默认连接的是127.0.0.1:27042,使用上面代码代替即可

相关资料:
https://bbs.pediy.com/thread-254974.htm
https://wrlu.cn/cyber-security/mobile-security/android-frida/

作者 原文传送
littley www.littley.top

你可能感兴趣的:(python)