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]);

例子:
APP渗透抓不到包/安卓逆向--Frida_第1张图片

hexdump输出16进制

参考实战hook陌陌so层【43分43秒】
APP渗透抓不到包/安卓逆向--Frida_第2张图片

模板

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)
重载就是函数名字一样,例如:
APP渗透抓不到包/安卓逆向--Frida_第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的代码段如下:
APP渗透抓不到包/安卓逆向--Frida_第4张图片

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逆向,android)