frida-rpc操作抓取抖音
作者:互联网
抖音极速版,版本v2.0.3 pp助手可下载
frida rpc:常规Hook是被动,Hook的函数/方法要被动等待触发,不能主动调用要Hook的代码 rpc能主动调用要Hook的代码
rpc.exports = { var sig = "";get_hello: function(str){ Java.perfrom(
function(){ var some = Java.use('XXXXX')
sig = some.get_sig() }
) }
return sig; };
可以使用Python主动调用
get_hello(str)
在说这个之前先把上一节讲的酷安app换另一种方法使用rpc操作打印token,
使用jadx打开酷安app,搜索x-app-token
找到与之相关的as
现在我们可以通过hook AuthUtils这个类来调用getAs即可
hook代码大致像这样
var AuthUtils=Java.use(''com.coolapk.market.util.AuthUtils")
var as=AuthUtils.getAs(appContext,str)
str通过前面我们知道是devive_id appContext是程序运行的上下文,hook的代码是固定的
于是出现如下的hook代码
import codecs
import os
import frida
import sys
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的上下文。拿到程序中运行的上下文,本身程序的上下文,对其他对app通用
var currentApplication=Java.use('android.app.ActivityThread').currentApplication();
var context=currentApplication.getApplicationContext();
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)
print('[*] Running CTF')
script.load()
script.exports.gethello('3b943bad-3b28-3e38-9f59-fec57db00094')
成功,简单而快捷
现在我们试着操作抖音app
抖音极速版,版本v2.0.3 pp助手可下载
我们抓包时发现
发现as cp mas 是一直在变化的,且少一个参数都无法正确获取的到信息(其他版本发现
('as', 'a111111111111111111111'),
('cp', 'a000000000000000000000'),
('mas', 'null'),这三个写成这样一直不变都可以,由于 猿人学教学视频选择此链接抓取,暂时不管这些,以教学为主,找寻sa,cp,mas的规律,而且目前抖音的接口和之前的教学视频接口有些差异,本次笔记以现在的接口记录
)
我们使用jadx打开此app,找寻mas
发现很多很多参数,此时有个小技巧,你搜索mas"
这样的话,无关紧要的就很少了
找到如下代码
cp和mas都在,差个as
我们仔细观察里面的 函数实现cp是str.substring, mas是EagleEye.byteArrayToHexStr实现的
我们点开AdvanceSetting.ADVANCE_SETTING查找用例,发现这个函数就是as字符
现在我们看substring
substring是str.substring实现的。此方法的意思是截掉从0开始到i2结束的字符串,将截取下来的值赋值给str(不包括i2)。i2涉及到了位运算
Java中 >> 右移公式 M>>N=M/2^n 左移 M<<N = M*2^n 以上结果取整
也就是i2=str的长度/2
也就是说substring是str字符串的一半,也就是as
再看cp cp=str.substring(i2, length)也就是说cp截取str的后半段
再看mas mas不好理解先不看,反正都是最后一起hook的,不用太过于去分析函数意思
现在看str是什么玩意,三个函数参数都带有str
str是UserInfo.getUserInfo得到的
我们再看UserInfo
是下面的这个包得来的
根据之前的rpc-hook我们联想到,如果去hook str这个方法,来主动调动整个函数的运行,缺的参数手动补上,不就可以将as cp ,mas全部输出出来了吗
现在有个问题来了,getUserinfo 里面的参数怎么填写。
我们想到用frida hook技术去被动打印里面的参数,来观察参数变化先
像这样
我们先不overload参数,先让他自己报错,看看要填入什么参数,复制即可
打印报错发现有三个可选择。此时我们仔细观jadx里面的参数大致类型。第一个是个int 第二个是个string,第三个是个数组,第四个是个string
我们看下这三个中哪个和需要的参数一致
发现第三个最接近,我们放进代码里.重新运行代码。滑动抖音app里面的用户作品集,打印的参数是这样的
(由于目前抖音的api接口改版,加密和之前老得教学视频不一样,此次以新的加密做介绍)
v1是个时间戳
v2是个url。url里面变化的有 max_cursor,还有个ts 时间戳 useri_d 如果访问其他的用户,user_id也会变化
v3是个数组。里面的大致意思是代表设备的型号,固定不变,可以自己更换设备型号防止被封设备
v4:不变 一看就是个device_id
这些参数我们知道了,现在就好办了
我们写个hook-rpc函数,来操作sig
标签:mas,app,hook,rpc,抖音,str,frida,cp 来源: https://www.cnblogs.com/wuxianyu/p/14364405.html