安卓逆向实战-抓取分析思路 | coolapk | rpc

抓取分析思路

1.先分析目标产品形态有几种(PC,H5/m站(浏览器访问的h5和APP分享出来的h5 url可能不一样),小程序,APP)
2.对目标产品形态和各功能/界面使用和了解
3.确定抓取哪种产品形态(如果你能决定抓取哪种形态)

常规抓取分析:

1.先抓包,找到要抓的目标URL(通常是列表URL和详情URL)
通过抓包要弄清楚下面几件事:
1)对同一URl要多抓包几次,对比每次请求的参数差异和特点
2)通过多次抓包对比,搞清楚请求参数里面,哪些参数是固定值,哪些参数是变化值,哪些参数可有可无
3)尝试修改每个参数,观察能否正常请求数据,确定主要控制参数有哪几个
4)如何翻页
2.写简单程序模拟目标URL的请求(从抓包工具中复制header信息和URL到程序中)

模拟请求有三种情况:

情况1:复制抓包header信息,模拟请求能成功
确定该header信息有无时效性,能否一直使用,时效性有多尝试五分钟/一小时/一天后 使用该header信息,再次模拟,检查是否请求成功。
1).如果有时效性,可以结合抓包工具,使用定时更新header的方式进行抓取
2).如果没有时效性,一直可用,直接使用抓包出来的参数一直抓取
情况2:模拟请求不成功
逆向分析APP
情况3:
难度实在太大,分析APP其它版的抓取难度(大型APP会分app版 lite版 国际版 大型节日特殊版 老版本)
PS:有的老版本在安卓4上能安装使用,在高安卓版本中不能安装

复杂抓包:

配置代理后 抓不到包的几种情况:
1.APP不走我们设置的代理
现象:打开抓包软件,抓不到包,但APP能正常访问;关闭抓包软件后 APP仍然能正常访问)
解决:
ProxyDroid APP 全局代理 强制把IP转发到代理端口上
2.APP有做ssl证书校验
现象:打开抓包软件后 APP不能访问
解决:使用justtrustme等Hook 校验代码 让APP 信任代理证书或不做证书校验
3.APP有做双向证书校验
现象:打开抓包软件后 APP不能访问,但抓包软件上会有服务端返回的错误
解决:抠出APP里的SSL证书,导入抓包软件中
4.APP的网络请求库代码有混淆(okhttp HttpURLConnection等等有混淆):
现象:打开抓包软件后 APP不能访问
解决:方1.使用升级版JustMePlus 自适配Hook混淆后的网络请求库代码(自适配okhttp)
方2.使用ssl_logger Hook 系统ssl_read ssl_write函数,在手机上抓包,无需配置代理和安装证书。
5.APP不是发的应用层http协议,使用socket走的是网络层tcp
现象:跟不走代理现象相似,配置好代理后,打开或关闭抓包软件,APP都能正常访问,抓包软件也抓不到包。
解决:tcpdump或wireshark抓包 抓tcp包 找线索Hook APP代码 抓到发包和解包的代码处
发送的数据通常是私有协议,需要逆向解密
6.能抓到包,但返回数据是加过密的看不懂
解决:找线索Hook APP 找到加解密的代码处

rpc的目标

在这里插入图片描述

import frida
import os

def adbforward():
    os.system('adb forward tcp:27042 tcp:27042')
    os.system('adb forward tcp:27043 tcp:27043')


def on_message(message, data):
    if message['type'] == 'send':
        print("[*] {0}".format(message['payload']))
    else:
        print(message)

hook_code = '''
rpc.exports = {
    gethello: function(str){
        send('hello');
        Java.perform(function(){
            // 拿到context上下文
            // send('inside')
            var currentApplication = Java.use('android.app.ActivityThread').currentApplication();
            var context = currentApplication.getApplicationContext();
            // send里面不要有逗号!!!!!!!
            send(context);
            var AuthUtils = Java.use('com.coolapk.market.util.AuthUtils');
            var sig = AuthUtils.getAS(context,str);
            send(sig);
        }
    )
    }
};
'''

process = frida.get_usb_device().attach('com.coolapk.market')
script = process.create_script(hook_code)
script.on('message',on_message)
script.load()

print(script.exports.gethello('weuhhfb345684533sde6jkfg'))
这样就能拿到加密后的请求参数了

猜你喜欢

转载自blog.csdn.net/m0_50685012/article/details/114918970
RPC