新版a+1站ollvm算法分析

2023-12-21 20:30
文章标签 算法 分析 新版 ollvm

本文主要是介绍新版a+1站ollvm算法分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

闲来无聊,想看下b占安全防护做的如何,于是分析了下新版b占的最新版app,最后把算法弄了出来,虽然相较于原版算法并没有啥改变,但是分析的难度确增加了很多,本文笔者以一个安全研究员的身份来分析下。

1.反调试绕过

笔者分析在arm32位下和arm64位下,关于检测frida的点

在这里插入图片描述
在armv8中对应
0x1A858

在这里插入图片描述
0x1b8b4
在这里插入图片描述
针对这个两个关键点进行patch

然后进入/data/app/tv.danmaku.bili-AK6NWgW6BtysktmJyUc8Ag==/lib/arm64,libmsaoaidsec.so换成我们patch的so即可

2.算法定位

frida-trace -U -j ‘*!sign’ -f tv.**.bili

在这里插入图片描述

发现有那么多的结果,还是光重复一条,根本不适合我们定位算法

frida-trace -U -j '!sign’ -J ‘!signal’ -f tv.

这里经过了好多种试法,终于找到了。。。。

frida-trace -U -j ‘?igned!’ -J ‘!signal’ -f tv.

在这里插入图片描述
在这里插入图片描述
frida-trace -U -j ‘LibBili!’ -f tv.danmaku.bili

停留在b占主页面,然后稍微下滑一点,我们可以看出日志

在这里插入图片描述
可以得出每次调用算法的时候,总会拿到getAppKey然后去调用 lubBili.s

{/*** Called synchronously when about to call LibBili.s.** @this {object} - The Java class or instance.* @param {function} log - Call this function with a string to be presented to the user.* @param {array} args - Java method arguments.* @param {object} state - Object allowing you to keep state across function calls.*/onEnter(log, args, state) {log(`LibBili.s(${args.map(JSON.stringify).join(', ')})`);log(args[0].entrySet().toArray())},/*** Called synchronously when about to return from LibBili.s.** See onEnter for details.** @this {object} - The Java class or instance.* @param {function} log - Call this function with a string to be presented to the user.* @param {NativePointer} retval - Return value.* @param {object} state - Object allowing you to keep state across function calls.*/onLeave(log, retval, state) {if (retval !== undefined) {log(`<= ${JSON.stringify(retval)}`);log("结果"+retval.toString());}}
}

在这里插入图片描述
我们多拿几对结果值

appkey=1d8b6e7d45233436,build=7320400,c_locale=zh_CN,channel=bili,disable_rcmd=0,mobi_app=android,model=MI 8,platform=android,s_locale=zh_CN,statistics={"appId":1,"platform":3,"version":"7.32.0","abtest":""}appkey=1d8b6e7d45233436&build=7320400&c_locale=zh_CN&channel=bili&disable_rcmd=0&mobi_app=android&model=MI%208&platform=android&s_locale=zh_CN&statistics=%7B%22appId%22%3A1%2C%22platform%22%3A3%2C%22version%22%3A%227.32.0%22%2C%22abtest%22%3A%22%22%7D&ts=1686105777&sign=5b1ec26ead34e091f6572749262b241d

我们在手机上打开评论

action=story_comment_click&appkey=1d8b6e7d45233436&build=7320400&c_locale=zh_CN&channel=bili&disable_rcmd=0&extra=%7B%22from_spmid%22%3A%22tm.recommend.0.0%22%2C%22goto%22%3A%22vertical_av%22%2C%22spmid%22%3A%22main.ugc-video-detail-vertical.0.0%22%2C%22track_id%22%3A%22all_42.router-pegasus-1165524-88564bbf7-k59s2.1686105778860.338%22%7D&item_id=783291971&item_type=story&mobi_app=android&platform=android&s_locale=zh_CN&statistics=%7B%22appId%22%3A1%2C%22platform%22%3A3%2C%22version%22%3A%227.32.0%22%2C%22abtest%22%3A%22%22%7D&ts=1686105979&uid=21837784&sign=1b2cbab0f3db64e63e96ca3bb7dfefa2

特征就是输入的都是原始的值,但是输出都进行了编码。

那去构造个主动调用吧

function funsign() {Java.perform(function () {var TreeMap = Java.use("java.util.TreeMap");var map = TreeMap.$new();map.put("appkey", "1d8b6e7d45233436");map.put("build","7320400");var result =Java.use("com.bilibili.nativelibrary.LibBili").s(map);console.log("result=>",result.toString());return result;});}

在这里插入图片描述
但是我很好奇,每次生成时间戳,那么如果我给她固定时间戳呢,

在这里插入图片描述

会发现没有变化,那么肯定一个问题,就是输入+时间戳 进行加密,不掺杂其他的变量。

但是现在不知道哪个so调用,可以使用下方脚本进行测试,

https://github.com/lasting-yang/frida_hook_libart/blob/master/hook_RegisterNatives.js

最终确认加密的so在 libili

在这里插入图片描述
打开jni_onload,家人们谁懂啊,上来就是ollvm

我们上方得到动态注册的函数偏移是0x9110

进去了一看也是ollvm,按照我的做法,绝对不会去还原控制流的# 3.ollvm流程trace
在这里插入图片描述

3.ollvm流程trace

libbili.so!0x194e4 libbili.so!0xc464c -3
libbili.so!0xc4790 libart.so!0x38c380 -2
libbili.so!0xc479c libbili.so!0xb1444 -1
libbili.so!0xb1684 libart.so!0x3de338 0
libbili.so!0x19ca4 libart.so!0x3c450c -1
libbili.so!0x19cb8 libbili.so!0xc3b4c 0
libbili.so!0xc3b7c libbili.so!0xc3990 1
libbili.so!0xc3ac8 libart.so!0x38ac98 2
libbili.so!0xc3b88 libbili.so!0xb1444 2
libbili.so!0xb1684 libart.so!0x3de338 3
libbili.so!0x19950 libart.so!0x3c4ef4 2
libbili.so!0x19960 libbili.so!0x1b0b0 3
libbili.so!0x1be20 libbili.so!0x82a0 4
libbili.so!0x19e54 libbili.so!0x1a884 3
libbili.so!0x1a998 libart.so!0x3c450c 4
libbili.so!0x1a9ac libbili.so!0xc3b4c 5
libbili.so!0xc3b7c libbili.so!0xc3990 6
libbili.so!0xc3ac8 libart.so!0x38ac98 7
libbili.so!0xc3b88 libbili.so!0xb1444 7
libbili.so!0xb1684 libart.so!0x3de338 8
libbili.so!0x1ab00 libbili.so!0xb2634 7
libbili.so!0xb2778 libart.so!0x386ea8 8
libbili.so!0x1ab0c libbili.so!0xb2634 8
libbili.so!0xb2778 libart.so!0x386ea8 9
libbili.so!0x19e68 libbili.so!0x1ab44 8
libbili.so!0x1ab98 libart.so!0x3ae4dc 9
libbili.so!0x1acac libbili.so!0xb1118 10
libbili.so!0xb12fc libart.so!0x3de338 11
libbili.so!0x19e84 libart.so!0x3c4ef4 10
libbili.so!0x19f60 libart.so!0x3c548c 11
libbili.so!0x19f68 libbili.so!0x8390 12
libbili.so!0x19ae0 libbili.so!0x8320 12
libbili.so!0x19af4 libbili.so!0x1c000 12
libbili.so!0x1c07c libbili.so!0x83c0 13
libbili.so!0x1c084 libbili.so!0xfb28 13
libbili.so!0x1c094 libbili.so!0xfb3c 13
libbili.so!0x10224 libbili.so!0x83a0 14
libbili.so!0x1c104 libbili.so!0x82c0 13
libbili.so!0x1c114 libbili.so!0xfb3c 13
libbili.so!0x10224 libbili.so!0x83a0 14
libbili.so!0x1c104 libbili.so!0x82c0 13
libbili.so!0x1c114 libbili.so!0xfb3c 13
libbili.so!0x100d4 libbili.so!0x83a0 14
libbili.so!0x100e4 libbili.so!0x11384 14
libbili.so!0x135f4 libbili.so!0x15e44 15
libbili.so!0x10224 libbili.so!0x83a0 14
libbili.so!0x1c104 libbili.so!0x82c0 13
libbili.so!0x1c114 libbili.so!0xfb3c 13
libbili.so!0x10224 libbili.so!0x83a0 14
libbili.so!0x1c104 libbili.so!0x82c0 13
libbili.so!0x1c114 libbili.so!0xfb3c 13
libbili.so!0x10224 libbili.so!0x83a0 14
libbili.so!0x1c410 libbili.so!0x15a6c 13
libbili.so!0x15aa0 libbili.so!0x15b30 14
libbili.so!0x15ad4 libbili.so!0xfb3c 14
libbili.so!0x10224 libbili.so!0x83a0 15
libbili.so!0x15ae4 libbili.so!0xfb3c 14
libbili.so!0x100d4 libbili.so!0x83a0 15
libbili.so!0x100e4 libbili.so!0x11384 15
libbili.so!0x135f4 libbili.so!0x15e44 16
libbili.so!0x10224 libbili.so!0x83a0 15
libbili.so!0x15af4 libbili.so!0x15b30 14
libbili.so!0x15b04 libbili.so!0x83c0 14
libbili.so!0x1c444 libbili.so!0x82c0 13
libbili.so!0x1c444 libbili.so!0x82c0 13
libbili.so!0x1c444 libbili.so!0x82c0 13
libbili.so!0x1c444 libbili.so!0x82c0 13
libbili.so!0x1c444 libbili.so!0x82c0 13
libbili.so!0x1c444 libbili.so!0x82c0 13
libbili.so!0x1c444 libbili.so!0x82c0 13
libbili.so!0x1c444 libbili.so!0x82c0 13
libbili.so!0x1c444 libbili.so!0x82c0 13
libbili.so!0x1c444 libbili.so!0x82c0 13
libbili.so!0x1c444 libbili.so!0x82c0 13
libbili.so!0x1c444 libbili.so!0x82c0 13
libbili.so!0x1c444 libbili.so!0x82c0 13
libbili.so!0x1c444 libbili.so!0x82c0 13
libbili.so!0x1c444 libbili.so!0x82c0 13
libbili.so!0x1c444 libbili.so!0x82c0 13
libbili.so!0x19afc libbili.so!0x8410 12
libbili.so!0x19b10 libart.so!0x3c450c 12
libbili.so!0x19c28 libbili.so!0xb2634 13
libbili.so!0xb2778 libart.so!0x386ea8 14
libbili.so!0x1a050 libart.so!0x388b7c 14

在这里插入图片描述

这个时候我们看 v6的交叉引用是env,v70的交叉引用是 上方的a2

j经过一阵很长的分析,发现,,,没啥发现,函数太多了,还是直接trace指令吧

4.ollvm arm指令trace

用stalker写了个脚本,去trace了下指令

在这里插入图片描述
因为trace的结果是appkey=1d8b6e7d45233436&build=7320400&ts=1686106983&sign=e66bbde177f4978281656f64b62c696d

sign为32位盲猜md5, 首先b62c696d,把最后四个字节拿出来,转换一下端序为0x6d692cb6

那么就在trace文件中进行搜索

在这里插入图片描述
有四个结果,我们可以去看四个结果调用的偏移在ida的那个函数,其实就是根据这四个,然后去ida中定位
在这里插入图片描述


function funsign() {Java.perform(function () {var TreeMap = Java.use("java.util.TreeMap");var treemap = TreeMap.$new();treemap.put("appkey", "1d8b6e7d45233436");treemap.put("build","7320400");treemap.put("ts","1686106983");var result =Java.use("com.bilibili.nativelibrary.LibBili").s(treemap);console.log("result=>",result);return result;});}function  hook_1(){let base_bili = Module.findBaseAddress("libbili.so");let sub_19024 = base_bili.add(0x11384);
Interceptor.attach(sub_19024 , {onEnter(args) {console.log(hexdump(args[0]))console.log(hexdump(args[1]));console.log(hexdump(args[2]));//console.log(args[1])}, onLeave(retval) {console.log(retval)console.log("end-hook-------------")}
})}

5.结果及其彩蛋

在这里插入图片描述
ios我也搞了下,更简单就不记录了

appkey:27eb53fc9058f8c3, 2ed53a74eeefe3cf99fbd01d8c9c375是salt

欢迎关注公众号:二进制科学,获取更多精彩内容

这篇关于新版a+1站ollvm算法分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/521393

相关文章

golang字符串匹配算法解读

《golang字符串匹配算法解读》文章介绍了字符串匹配算法的原理,特别是Knuth-Morris-Pratt(KMP)算法,该算法通过构建模式串的前缀表来减少匹配时的不必要的字符比较,从而提高效率,在... 目录简介KMP实现代码总结简介字符串匹配算法主要用于在一个较长的文本串中查找一个较短的字符串(称为

通俗易懂的Java常见限流算法具体实现

《通俗易懂的Java常见限流算法具体实现》:本文主要介绍Java常见限流算法具体实现的相关资料,包括漏桶算法、令牌桶算法、Nginx限流和Redis+Lua限流的实现原理和具体步骤,并比较了它们的... 目录一、漏桶算法1.漏桶算法的思想和原理2.具体实现二、令牌桶算法1.令牌桶算法流程:2.具体实现2.1

Springboot中分析SQL性能的两种方式详解

《Springboot中分析SQL性能的两种方式详解》文章介绍了SQL性能分析的两种方式:MyBatis-Plus性能分析插件和p6spy框架,MyBatis-Plus插件配置简单,适用于开发和测试环... 目录SQL性能分析的两种方式:功能介绍实现方式:实现步骤:SQL性能分析的两种方式:功能介绍记录

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动

C#使用DeepSeek API实现自然语言处理,文本分类和情感分析

《C#使用DeepSeekAPI实现自然语言处理,文本分类和情感分析》在C#中使用DeepSeekAPI可以实现多种功能,例如自然语言处理、文本分类、情感分析等,本文主要为大家介绍了具体实现步骤,... 目录准备工作文本生成文本分类问答系统代码生成翻译功能文本摘要文本校对图像描述生成总结在C#中使用Deep

Redis主从/哨兵机制原理分析

《Redis主从/哨兵机制原理分析》本文介绍了Redis的主从复制和哨兵机制,主从复制实现了数据的热备份和负载均衡,而哨兵机制可以监控Redis集群,实现自动故障转移,哨兵机制通过监控、下线、选举和故... 目录一、主从复制1.1 什么是主从复制1.2 主从复制的作用1.3 主从复制原理1.3.1 全量复制

Python中的随机森林算法与实战

《Python中的随机森林算法与实战》本文详细介绍了随机森林算法,包括其原理、实现步骤、分类和回归案例,并讨论了其优点和缺点,通过面向对象编程实现了一个简单的随机森林模型,并应用于鸢尾花分类和波士顿房... 目录1、随机森林算法概述2、随机森林的原理3、实现步骤4、分类案例:使用随机森林预测鸢尾花品种4.1

Redis主从复制的原理分析

《Redis主从复制的原理分析》Redis主从复制通过将数据镜像到多个从节点,实现高可用性和扩展性,主从复制包括初次全量同步和增量同步两个阶段,为优化复制性能,可以采用AOF持久化、调整复制超时时间、... 目录Redis主从复制的原理主从复制概述配置主从复制数据同步过程复制一致性与延迟故障转移机制监控与维

Redis连接失败:客户端IP不在白名单中的问题分析与解决方案

《Redis连接失败:客户端IP不在白名单中的问题分析与解决方案》在现代分布式系统中,Redis作为一种高性能的内存数据库,被广泛应用于缓存、消息队列、会话存储等场景,然而,在实际使用过程中,我们可能... 目录一、问题背景二、错误分析1. 错误信息解读2. 根本原因三、解决方案1. 将客户端IP添加到Re

Redis主从复制实现原理分析

《Redis主从复制实现原理分析》Redis主从复制通过Sync和CommandPropagate阶段实现数据同步,2.8版本后引入Psync指令,根据复制偏移量进行全量或部分同步,优化了数据传输效率... 目录Redis主DodMIK从复制实现原理实现原理Psync: 2.8版本后总结Redis主从复制实