APP渗透抓不到包/安卓逆向--Frida

Posted 向阳-Y.

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了APP渗透抓不到包/安卓逆向--Frida相关的知识,希望对你有一定的参考价值。

android检测代理

应用程序检测到使用代理后就会抓包异常
IS_ICS_OR_LATER

相关文章:
https://www.it610.com/article/1280480273930141696.htm

解决方法:
使用VPN原理的软件进行抓包:
黄鸟 postaman charles

证书校验

单向认证:

特征:抓包可以抓到,但是报错,400、ssl
解决方法:Xposed+JustTrustMe

双向认证(rsa算法):

特征:略
解决方法:证书+密码


Frida入门

小技巧:
这串代码可以在notepad++中直接运行python脚本,x.py指的是要执行的py路径

cmd /k python "c://x.py" & ECHO & PAUSE & EXIT

frida-ps -U 可以查看apk的包名称

首先安装frida模块(python3.9)

PC端:

方案一(推荐安装低版本frida,兼容性好):

pip install frida==14.2.18
pip install frida-tools==9.2.5
pip install objection==1.8.4

如果在这一步一直卡着安装不成功就试试方案二
方案二:
https://pypi.org/project/frida/#files下载frida-12.7.16-py3.7-win-amd64.egg。
并把它放到E:\\Program Files\\Python37\\Lib\\site-packages中。
此时执行pip install frida就OK了

测试:
打开powershell,
输入frida-ps -U,此时无报错说明成功

设备端:frida-server 14.2.18

下载地址:https://github.com/frida/frida/releases
判断模拟器手机的架构

大部分为两种情况:
手机端下载 frida-server-版本-android-arm64.xz
模拟器下载 frida-server-版本-android-x86.xz

adb -s 设备名 shell getprop ro.product.cpu.abi //我的是32位x86


下载对应版本并解压:

连接模拟器

我这里使用的是逍遥模拟器,21503是逍遥模拟器的默认端口
(夜神:adb connect 127.0.0.1:62001)
其他adb命令补充

adb kill-server
adb start-server
adb devices 查看设备列表
adb install f:/1.apk #表示安装apk文件
adb -s 设备名 shell getprop ro.product.cpu.abi # 查看cpu架构,用于判断适合安装哪个版本的frida

adb connect 127.0.0.1:21503
adb shell
adb push 文件路径 /data/local/tmp
cd /data/local/tmp/
ls
chmod 777 frida-server-15.1.22-android-x86   //赋予frida执行权限
./frida-server-15.1.22-android-x86           //运行frida,此时frida就已经跑起来了

最后转发一下端口:

adb forward tcp:27042 tcp:27042
adb forward tcp:27043 tcp:27043

注意:

如果开了两个模拟器则需要匹配使用哪一个模拟器:
adb devices #列出模拟器列表
adb -s 模拟器名 shell


问题集合

byte类型hook

当遇到byte格式数据(类似于下图),需要hook时

解决方法

var string=Java.use('java.lang.String');
string.$new(arguments[0]);

例子:

hexdump输出16进制

参考实战hook陌陌so层【43分43秒】

模板

Frida模板【普通方法】

补充:
查看软件包名方法(其他方法):

adb shell pm list packages -3
adb shell am monitor   //需要先运行此命令,再运行需要查看包名的APP

import frida,sys
jscode="""
Java.perform(function()
    var utils = Java.use('包名.类名')
    utils.函数.implementation = function(函数值1,函数值2)  //如果是构造方法这里还能utils.$init.inplementation
        console.log("Hook Start...");
        send("Success!");
        return this.函数(函数值1,函数值2);  //同理,这里就写return this.$init(函数1,函数2)
    
);
"""

def message(message,data):
    if message["type"] == 'send':
        print("[*] 0".format(message['payload']))
    else:
        print(message)
process = frida.get_remote_device().attach('app包名')
script=process.create_script(jscode)
script.on("message",message)
script.load()
sys.stdin.read()

Frida模板【构造方法】

构造方法指的是new一个对象

import frida,sys
jscode="""
Java.perform(function()
    var utils = Java.use('包名.类名')
    utils.$init.implementation = function(函数值1,函数值2) 
        console.log("Hook Start...");
        send("Success!");
        return this.$init(函数值1,函数值2);  
    
);
"""

def message(message,data):
    if message["type"] == 'send':
        print("[*] 0".format(message['payload']))
    else:
        print(message)
process = frida.get_remote_device().attach('app包名')
script=process.create_script(jscode)
script.on("message",message)
script.load()
sys.stdin.read()

Frida模板【重载方法】

add(1,2)
add(1,2,3)
重载就是函数名字一样,例如:

import frida,sys
jscode="""
Java.perform(function()
    var utils = Java.use('包名.类名')
    utils.函数.overload("类型").implementation = function(函数值1,函数值2) //类型指的是int,java.lang.String等
        console.log("Hook Start...");
        send("Success!");
        return this.函数(函数值1,函数值2);  
    
);
"""

def message(message,data):
    if message["type"] == 'send':
        print("[*] 0".format(message['payload']))
    else:
        print(message)
process = frida.get_remote_device().attach('app包名')
script=process.create_script(jscode)
script.on("message",message)
script.load()
sys.stdin.read()

Frida模板【构造对象参数】

需要hook的代码段如下:

import frida,sys
jscode="""
Java.perform(function()
    var utils = Java.use('包名.类名')
    utils.函数.overload("com.xiaojianbang.app.Money").implementation = function(obj) //因为这里的类型为对象,所以写上对象的路径
        console.log("Hook Start...");
        send("Success!");
        send(obj.getInfo())
        var mon = mon.$new(1000,'港币')     //自己构造一个对象
        return mon.getInfo()
    
);
"""

def message(message,data):
    if message["type"] == 'send':
        print("[*] 0".format(message['payload']))
    else:
        print(message)
process = frida.get_remote_device().attach('app包名')
script=process.create_script(jscode)
script.on("message",message)
script.load()
sys.stdin.read()

推荐技术文章!:
https://bbs.pediy.com/thread-272270.htm

以上是关于APP渗透抓不到包/安卓逆向--Frida的主要内容,如果未能解决你的问题,请参考以下文章

frida-某资讯app逆向的过程

frida-某资讯app逆向的过程

腾讯动漫app安卓逆向分析

失败案例之安全抓包测试

安卓逆向,瑞数破解 Frida食药监apk数据抓取,采集逆向,签名

app逆向入门分析——APP登陆请求参数