App逆向百例|05|某视频App参数分析

简介: App逆向百例|05|某视频App参数分析

观前提示:

本文章仅供学习交流,切勿用于非法通途,如有侵犯贵司请及时联系删除


样本:aHR0cHM6Ly93d3cuYWxpeXVuZHJpdmUuY29tL3MvMzV4a1BzcFRnQkg=

0x1 抓包

安装样本App 打开抓包软件

登录失败 一气呵成 可以判断可能存在证书验证

上hook脚本

配合手机AppPostern食用更佳

打开 Charles抓包并启动脚本

建议使用spawn模式来hook

然后就可以正常抓包啦

找到本次需要分析的包https://***/x/passport-login/oauth2/login

看里面PostData 其中需要分析的值只有

Name Value
password FPvjUpqde8PaW5cONQtxuEEbF6MFBR5XNX8QPVxakZfzcL7Crz02/F1JOwk4kAMfD+YYNEPT8Ib3cE5b9+jxA2PDPwwvzYeX/G3yhmbZ1yEVjwiJesRO4zb5qKkPtQdEpJi3a5WoAqZhpX3/dv7FssH5b1fQxaq1aqcaR6bZ7Nw=
sign 1b20efbb2f975326ea41dbddcafa7e9b

0x2 找加密

使用jdax打开样本apk

样本很大 你忍一下 如果出现内存不足的情况 则需要修改更大的内存来解决

参考文章:https://www.cnblogs.com/wuxianyu/p/14382310.html

正常打开后 搜索passport-login/oauth2/login

只有一个结果 双击进入方法 然后 往上找调用

其中出现了明显的encryptPassword 这里就是password的加密入口

进入b.b方法

其中a方法对应上面 明牌展示RSA/ECB/PKCS1PADDING加密

了解了password的加密过程 接着找sign的加密方法

先回到原先的方法 有点繁琐 我就省略一点

  • 进入biliPassportApi.d()
  • 进入(AuthKey) i(n().getKeyV2()) 中的 i
  • 进入 biliCall.execute()
  • 进入 this.h.intercept(request)
  • 找到 接口的实现 DefaultRequestInterceptor implements c
  • 找到 DefaultRequestInterceptor中的intercept
  • 进入 intercept中的addCommonParamToBody(request.url(), request.body(), newBuilder)
  • 进入 addCommonParamToBody中的signQuery(hashMap)

这里就是sign的加密处 往里找 最终定位到

static native SignedQuery s(SortedMap<String, String> sortedMap);

往上看可以看到bili字眼 可以猜测是加载了libbili.so 在apk中也能够找到该文件

0x3 加密分析

找到加密点后 先上Frida hook验证

Java.perform(function () {
    var Class = Java.use('com.bilibili.nativelibrary.LibBili');
    var Method = 'signQuery';
    Class[Method].overload('java.util.Map', 'int', 'int').implementation = function (a, b, c) {
        console.log('===args===');
        console.log(a.entrySet().toArray());
        console.log(b);
        console.log(c);
        var result = this[Method](a, b, c);
        console.log('===result===');
        console.log(result);
        console.log('---------------------------------------');
        return result;
    }
})

能够看到方法被调用 入参和返回结果都出来了

接下来 尝试一下主动调用一下这个方法

Java.perform(function () {
    var Class = Java.use('com.bilibili.nativelibrary.LibBili');
    var Method = 'signQuery';
    var TreeMap = Java.use('java.util.TreeMap');
    var map = TreeMap.$new();
    map.put('disable_rcmd', '0');
    map.put('build', '6620300');
    map.put('buvid', 'XY4A57646AAC62990A45476D19D573C81F192');
    map.put('mobi_app', 'android');
    map.put('channel', 'bili');
    map.put('appkey', '783bbb7264451d82');
    map.put('s_locale', 'zh-Hans_CN');
    map.put('c_locale', 'zh-Hans_CN');
    map.put('platform', 'android');
    map.put('statistics', '{"appId":1,"platform":3,"version":"6.62.0","abtest":""}');
    var result = Class[Method](map, 1, 0);
    console.log(result);
})

成功调用并且返回了包含tssign的字符串

接下来上IDA Pro大姐姐伺候这个so

加载完后看导出表

oh 上帝 我的天呐 这是什么 不会是OLLVM吧

尝试搜索是否是静态注册的方法

没有结果 搜索JNI_Onload 进来后看到了不想看到的画面

不过现在hook技术那么发达 还怕找不到吗

上万能的百度 找个RegisterNatives的hook

Github:

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

启动hook

太多了吧 所以还得改改代码做一次筛选

此处需要加上if来筛选我们需要的class类

筛选完后就可以看到SignedQuery的偏移了

回到IDA Pro跳转即可

跳转过来后 还是看到了令人恶心的OLLVM

因为从抓包来看sign的长度是32位 初步怀疑是MD5 所以本篇我使用IDA插件findhash来辅助分析

Github:

https://github.com/Pr0214/findhash

下载好后放入IDA目录下的plugins目录 在IDA里面启动插件即可

由于so被OLLVM混淆过 代码大量膨胀 所以需要时间处理 需要耐心等待

运行完代码自动生成一个Frida hook文件 Frida运行此文件就能hook住疑似哈希的方法

得到方法以及堆栈后直接跳转

跳转过来后发现真就MD5的运算部分

继续跳转0xe614堆栈

通过对比其他的MD5的代码 可以判断这里是MD5update

上Frida hook!

Java.perform(function () {
    var so_addr = Module.findBaseAddress("libbili.so");
    var method_addr = so_addr.add(0xDE8C);
    Interceptor.attach(method_addr, {
        onEnter: function (args) {
            console.log('==================', method_addr, '========================');
            console.log(hexdump(args[1], {
                length: args[2].toInt32()
            }))
            console.log('Length->', args[2])
        },
        onLeave: function (retval) {
            console.log('==================', 'out', '========================');
        }
    })
});

然后主动调用一下 结果就出来了

可以看到update方法调用了七次 但是后俩次并无增加内容

从第一次返回的内容可知

  • map中增加了ts和时间戳
  • 将map的内容拼接为字符串

后面又连续拼接了四次

  • 2653583c
  • 8873dea2
  • 68ab9386
  • 918b1d65

并且多次主动调用 这四个拼接的内容都为定值 那就不管啦

后续我们手动拼接一下测试

原文->appkey=783bbb7264451d82&build=6620300&buvid=XY4A57646AAC62990A45476D19D573C81F192&c_locale=zh-Hans_CN&channel=bili&disable_rcmd=0&mobi_app=android&platform=android&s_locale=zh-Hans_CN&statistics=%7B%22appId%22%3A1%2C%22platform%22%3A3%2C%22version%22%3A%226.62.0%22%2C%22abtest%22%3A%22%22%7D&ts=1647181143
盐->2653583c8873dea268ab9386918b1d65
拼接结果->appkey=783bbb7264451d82&build=6620300&buvid=XY4A57646AAC62990A45476D19D573C81F192&c_locale=zh-Hans_CN&channel=bili&disable_rcmd=0&mobi_app=android&platform=android&s_locale=zh-Hans_CN&statistics=%7B%22appId%22%3A1%2C%22platform%22%3A3%2C%22version%22%3A%226.62.0%22%2C%22abtest%22%3A%22%22%7D&ts=16471811432653583c8873dea268ab9386918b1d65

MD5加密结果

对比主动调用的结果

对比一致 基本确定为无魔改的MD5了

通过多次调用发现四次拼接并非定值 一段时间后又会变换回其他值 目前仅发现有俩组

  • 560c52ccd288fed045859ed18bffd973
  • 2653583c8873dea268ab9386918b1d65

至于是为啥会变动 什么条件下变动 有待考究了


感谢各位大佬观看

如有错误 还请海涵

共同进步


[完]

相关文章
|
4月前
|
JSON 监控 数据格式
1688 item_search_app 关键字搜索商品接口深度分析及 Python 实现
1688开放平台item_search_app接口专为移动端优化,支持关键词搜索、多维度筛选与排序,可获取商品详情及供应商信息,适用于货源采集、价格监控与竞品分析,助力采购决策。
|
4月前
|
缓存 监控 Android开发
京东 item_get_app 接口深度分析及 Python 实现
京东item_get_app接口可获取商品原始详情数据,包含更丰富的字段和细节,适用于电商分析、价格追踪等场景。需通过认证获取权限,支持字段筛选和区域化数据查询。
|
5月前
|
缓存 数据挖掘 API
淘宝 item_get_app 接口深度分析及 Python 实现
淘宝item_get_app接口是淘宝开放平台提供的移动端商品详情数据获取接口,相较PC端更贴近APP展示效果,支持获取APP专属价格、促销活动及详情页结构,适用于电商导购、比价工具、数据分析等场景。接口采用appkey+appsecret+session认证机制,需申请相应权限。本文提供Python调用示例及使用注意事项,帮助开发者高效对接移动端商品数据。
|
7月前
|
Java
照片一键生成眨眼视频app,手机照片一键生成眨眼动图,通过JAR代码实现效果
这是一个自动生成眨眼GIF动画的Java程序,包含主程序处理、图像变形和GIF生成三个模块。输入照片路径,自动识别人脸眼睛位置,生成闭眼、半闭眼等多帧图像,并合成为眨眼动效GIF文件。
|
7月前
|
JavaScript
TypeOrmModule 从 app.module.ts 抽离到 database.module.ts 后出现错误的原因分析
本文分析了TypeORM实体元数据错误的成因,主要涉及实体注册方式、路径解析差异及模块结构变化导致的关系解析问题,并提供了具体解决方案和最佳实践建议。
187 56
|
4月前
|
缓存 供应链 开发者
1688 item_get_app 接口深度分析及 Python 实现
1688平台item_get_app接口专为移动端设计,提供商品原始详情数据,包含批发价格、起订量、供应商信息等B2B特有字段,适用于采购决策、供应链分析等场景。接口需通过appkey+access_token认证,并支持字段筛选,返回结构化数据,助力企业实现智能采购与供应商评估。
|
5月前
|
数据采集 数据可视化 API
驱动业务决策:基于Python的App用户行为分析与可视化方案
驱动业务决策:基于Python的App用户行为分析与可视化方案
|
10月前
|
小程序
【04】微信支付商户申请下户到配置完整流程-微信开放平台移动APP应用通过-微信商户继续申请-微信开户函-视频声明-以及对公打款验证-申请+配置完整流程-优雅草卓伊凡
【04】微信支付商户申请下户到配置完整流程-微信开放平台移动APP应用通过-微信商户继续申请-微信开户函-视频声明-以及对公打款验证-申请+配置完整流程-优雅草卓伊凡
743 1
【04】微信支付商户申请下户到配置完整流程-微信开放平台移动APP应用通过-微信商户继续申请-微信开户函-视频声明-以及对公打款验证-申请+配置完整流程-优雅草卓伊凡
|
9月前
|
数据采集 数据可视化 数据挖掘
基于Python的App流量大数据分析与可视化方案
基于Python的App流量大数据分析与可视化方案

热门文章

最新文章