原创干货 | frida环境搭建以及实战 hook

  • A+

在对app进行测试抓包的时候,经常会遇到一些问题导致测试过程十分艰难。第一种,由于app采用了证书校验,导致无法正常通过在手机配置代理抓包。第二种,app对数据包的参数内容加密,导致测试过程十分曲折。对于这种情况的抓包方式,有以下几种,第一,使用xposed框架+sslunpinning插件。第二种,对app进行逆向,找到证书和证书的密钥。第三种,利用proxifier+小飞机进行代理(这种方式无法应对ssl pinning的情况)。第四种,就是我下面介绍的frida

其实,frida和xposed相似,都是使用hook。但是我个人更推荐frida,frida可以hook从native到java层。并且不像xposed限制android版本。并且,frida脚本的开发只需要python+javascript,相比于c或者java,也相对容易很多。

【以夜神模拟器为例】

首先激活开发者模式
在设置-关于平板电脑-版本号处多次点击 打开开发者模式

image.png
再在开发者模式中打开usb调试

image.png

进入夜神的目录/bin下
E:夜神Noxbin>nox_adb.execonnect 127.0.0.1:62001 connected to 127.0.0.1:62001
打开cmd 输入adb shell

image.png

adb就可以连接到夜神模拟器了
在adb shell中输入
getprop ro.product.cpu.abi
可以看到手机cpu的版本

image.png

然后根据相应的版本去https://github.com/frida/frida/releases下载

image.png

下载好后解压 修改名字为frida-server
然后adbpush到模拟器中
这里有一个坑由于电脑的adb和模拟器的不同所以需要用模拟器自带的adb 也就是nox_adb
然后我们先给frida-server可执行权限后运行
[email protected]:/ # cd /data/local/tmp
[email protected]:/data/local/tmp# ls
frida-server
[email protected]:/data/local/tmp# chmod 777 frida-server
[email protected]:/data/local/tmp# ./frida-server
WARNING:linker: ./frida-server: unused DT entry: type 0x6ffffef5 arg 0x1c24

这样就是成功在模拟器中运行了adbshell
然后我们在cmd中运行
C:>frida-ps -U
PID Name


1442 adbd
1968 android.process.acore
2207 android.process.media
1880 com.android.inputservice
2421 com.android.keychain
2461 com.android.managedprovisioning
2482 com.android.onetimeinitializer
1897 com.android.phone
2439 com.android.providers.calendar
2502 com.android.settings
1846 com.android.systemui
2354 com.bignox.app.store.hd
1913 com.vphone.launcher
1452 debuggerd
2010 dhcpcd
1455 drmserver
。。。。
看到这样就是成功了

进行端口转发
这里由于要用到adb还是需要使用夜神自己的adb

E:夜神Noxbin>nox_adb.exeforward tcp:27042 tcp:27042
E:夜神Noxbin>nox_adb.exeforward tcp:27043 tcp:27043

【以app为例】

xxxxx 4.0.6最新版本

image.png

首先使用jadx-gui反编译试试

image.png

可以看到用到了某数字壳子并且 我们手机设置代理 没有办法直接抓包

image.png

在无法逆向 无法截包的情况下我们还需要截取数据包就需要使用frida了
首先使用burp的brida模块
brida模块可以直接在Extender里下载
注意 brida模块需要python2的环境

image.png

这是下载好后的样子
我们通过在cmd中使用frida-ps-U 找到具体的包名也可以借用工具 比如apk helper

image.png

现在知道了他的具体包名填入brida的ApplicationID 然后点击Startserver 会先看到框中有绿色的文字然后再点击Spawn application 没有红色字就说明成功 并且模拟器(手机)也可以看到这个app被唤起

image.png

点击Brida的Analyzebinary 然后点击Loadtree 可以加载出手机所有的包然后我们通过插桩测试 得到具体的方法

image.png

点开java下拉找到我们这个app的部分通过一个一个插桩 然后进行提交测试 看响应框是否会有信息

image.png
这里我测试到了com.ljhhr.resourcelib.utils.StringUtil这个并且可以看到com.ljhhr.resourcelib.utils.StringUtil.subSuffix这个方法返回了我输入的东西的明文
现在我们知道是哪个方法了但是我们还需要知道这个方法需要几个参数
点击Trapmethods

image.png
这样就可以找到我们所需要的这个方法 传入了两个Stringstring参数
这里我们就可以写脚本了(python)
为了可以抓包并且还可以不在手机里设置代理 我们需要写两个脚本一个脚本通过调用python的Flask模块在本地起一个服务器,另一个脚本,就是hook的脚本,将hook的信息发送到我们这个本地的服务器,这样就可以避开app对手机代理的检测
```
ffff.py

!/usr/bin/env python3

-- coding: utf-8 --

from flask import Flask
from flask import request

app = Flask(name)
@app.route('/',methods=['GET', 'POST'])
def index():

payload = request.get_data()
return payload if name == "main": app.run()
```

hook的脚本写的方法

首先我们需要用frida的get_remote_device()方法去获取到手机,然后使用attach获取到我们的附加进程,也就是我们这个app。
还记得我们使用brida获取到的方法么 com.ljhhr.resourcelib.utils.StringUtil.subSuffix
我们将重载subSuffix这个方法
```
linjuhehuoren.py
import frida
import json
import requests
import sys
import urllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
def my_message_handler(message, payload):
if message["type"] == "send":

my_json = message["payload"]

req_url = my_json['url']

if my_json['from'] == '/JUMBO':

req_data = my_json['payload']
req_get = requests.request('POST','http://127.0.0.1:5000',proxies={'http':'http://127.0.0.1:8080'},data=req_data,headers={'REQ_URL':req_url})

rep_content = req_get.text
script.post({"my_data": rep_content})
else:
print(message)
print('*' * 16)

print(payload)

rdev=frida.get_remote_device() #get_remote_device 获取远程设备
session =rdev.attach("com.xxxxx.xxxxxx") #attach 附加进程
strs="""
console.log("Script loaded successfully 55");
Java.perform(function () {
var string_to_recv;
var MainActivity = Java.use('com.ljhhr.resourcelib.utils.StringUtil');
MainActivity.subSuffix.overload('java.lang.String', 'java.lang.String').implementation = function (x,y) {
send({from: '/JUMBO',url:y, payload:x});
recv(function(received_json_object){

string_to_recv = received_json_object.my_data;
console.log("string_to_recv: " + string_to_recv);
}).wait();
var result_result = this.subSuffix(x,y);
return result_result;
};
});
"""
script = session.create_script(strs)
script.on("message", my_message_handler)
script.load()
sys.stdin.read()

```

首先运行ffff.py

E:frida>python ffff.py
Serving Flask app "ffff" (lazy loading)
Environment: production
WARNING: This is a developmentserver. Do not use it in a production deployment.
Use aproduction WSGI server instead.
Debug mode: off
Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
然后运行linjuhehuoren.py

E:frida>python linjuhehuoren.py Script loaded successfully55
这样就是运行成功

然后

手机不需要配置代理,在app登录界面输入账号密码 点击登录

image.png

burp截包 可以成功截取数据包

image.png
现在可以看到 就可以正常的截包了
但是frida运用hook去截取数据包存在缺点,不能使用repeater或者intruder去重复发包

相关推荐: Oracle注入简单挖掘

注入类攻击作为OWASP top10的常客广为人知,其中SQL注入首当其冲。但是由于数据库繁多,MySQL、Oracle、DB2、SqlServer…..,各个数据库的特性不尽相同,导致各种注入利用手法也五花八门。本文从Oracle数据库展开,对其注入点判断的…