作者:yueji0j1anke
首发于公号:剑客古月的安全屋
字数:1500
阅读时间: 15min
声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任。合法渗透,本文章内容纯属虚构,如遇巧合,纯属意外
目录
-
前言
-
frida绕过
-
定位验签
-
native ollvm
-
unidbg补环境
-
trace
-
结果展示
-
总结
0x00 前言
本期来分析一下a+1站相关算法,之前破解过a+1站的frida,想着不去搞一波太可惜了
这里为a+1最新版本8.36,感谢前人老版本分析
文章参考链接 https://mp.weixin.qq.com/s?__biz=MjM5NDMzMzAwNQ==&mid=2247484936&idx=1&sn=ea3b6ee39cec7205b5a2c18f9cfd6dd1&chksm=a7bf7916ee9c2868b5c1f6d41e149ff1d9fc76e308744c027552577c72400fb25a1ddf747117&mpshare=1&scene=1&srcid=0306DdNJ1pwcJlpS1ryAqvxg&sharer_shareinfo=0c64d667c46be3ab2b5a7ff6a7358c0d&sharer_shareinfo_first=0c64d667c46be3ab2b5a7ff6a7358c0d&version=4.1.31.99548&platform=mac#rd
0x01 frida绕过
这里hook_dlsym即可,最新版的libmsaoaidsec.so 已经隐藏了pthread_create
0x02 定位验签
可以看到,这里存在sign值
那现在可以用jadx去定位sign,---但像这种中大厂,一般在这一步会花很多时间去进行定位,这里我直接告诉大家位置了
这里我hook了一下,有蛮多事件可以触发该构造函数的
毕竟是出于研究,随便找一个构造就行,随后找到调用点,看看如何调用
Java.perform(function () {
letLibBili=Java.use("com.bilibili.nativelibrary.LibBili");
LibBili["s"].implementation=function (sortedMap) {
console.log('s is called'+', '+'sortedMap: '+sortedMap);
// 创建一个TreeMap对象来接收 sortedMap 中的内容
letTreeMap=Java.use("java.util.TreeMap");
letmap=TreeMap.$new();
// 复制
map.putAll(sortedMap);
// 获取TreeMap的键集
letkeys=map.keySet().toArray();
// 遍历键并获取对应的值
for (leti=0; i<keys.length; i++) {
letkey=keys[i];
letvalue=map.get(key);
console.log('key: '+key+', value: '+value);
}
// 调用原始方法
letret=this.s(sortedMap);
console.log('s ret value is '+ret);
returnret;
};
})
发现传入参数没有sign,传出参数就有sign了
可以基本判定sign值在native中产生的,这里存在几个native函数,都是可以生成sign值的,不同接口用到的对应函数不同
接下来判断加密so位置
直接inlinehook libart.so
最终找到so地址
0x03 native层ollvm分析
一打开。。
我的痛苦在你之上!!!!
0x04 unidbg补环境
这里可以选择用stalker,也可以选择用unidbg去trace....
我这里选择用unidbg去trace了
首先还是补环境
这里参数可随hook参数进行填充
so is called, sortedMap: [object Object]
key: access_key, value:
key: actual_played_time, value: 0
key: aid, value: 113241510515626
key: appkey, value: 1d8b6e7d45233436
key: auto_play, value: 0
key: build, value: 8360300
key: c_locale, value: zh_CN
key: channel, value: xiaomi_cn_tv.danmaku.bili_20210930
key: cid, value: 26118327197
key: disable_rcmd, value: 0
key: epid, value: 0
key: epid_status, value: 0
key: from, value: 7
key: from_spmid, value: tm.recommend.0.0
key: last_play_progress_time, value: 0
key: list_play_time, value: 0
key: max_play_progress_time, value: 0
key: mid, value: 476402463
key: miniplayer_play_time, value: 0
key: mobi_app, value: android
key: network_type, value: 1
key: oaid, value: cb0677e1448a466c
key: paused_time, value: 0
key: platform, value: android
key: play_mode, value: 1
key: play_status, value: 0
key: play_type, value: 1
key: played_time, value: 0
key: polaris_action_id, value: 8F9595B5
key: quality, value: 64
key: report_flow_data, value: {"flow_card_type":"av","flow_source":"high_quality_newuser_ann_dssm_u2i_v2"}
key: s_locale, value: zh_CN
key: session, value:
key: sid, value: 0
key: spmid, value: united.player-video-detail.0.0
key: start_ts, value: 0
key: statistics, value: {"appId":1,"platform":3,"version":"8.36.0","abtest":""}
key: sub_type, value: 0
key: total_time, value: 0
key: track_id, value: all_49.router-pegasus-1956706-7ffd87d79b-c96cg.1741762720104.36
key: type, value: 3
key: user_status, value: 0
key: video_duration, value: 868
扣了几个环境下来,
差不多补了两百行结果就出来了
最后补出的sign和我们hook到的sign值是一样的
这里注意我把ts参数固定了
有的朋友可能会在补这里的时候直接加上ts,但这里补入的ts是无法进入最终的map的,运算还是有map的参与
0x05 trace
拿着我们的fe6a142c8afc19db5535130e40b3d9c5 出发
这里可以拿最后四个字节去进行搜索
c5d9b340
ida对应跳过去
这里还是存在一定混淆,但分析一下就知道程序最终会这样走向
这里存在相关运算
此处为字节第一次出现的地方
字节所存在的两个函数都可以成为突破点
我这里用frida inlinehook了一下
video_duration=868 为最后一个变量,后面跟着的很有可能是salt
我们同样可以尝试用unidbg尝试,看的更清楚
这里直接读取x13
我的hook代码
发现是层层输入数据并进行循环md5操作
debugger.addBreakPoint(module.base + 0x106c4);
搞个断点看看
那对应的此处就是输入md5要加密的数据
继续打断电在第二个函数执行处
可以看到最后这里就是加盐的地方
0x06 结果展示
0x07 总结
本期总结
1.frida绕过 通过inlinehook dlsym继而替换pthread
2.验签定位
3.如何快速从ollvm中找到关键信息 -> stalker unidbg
4.native层中关键函数定位
原文始发于微信公众号(剑客古月的安全屋):android逆向攻防-某二次元站OLLVM算法分析
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论