bilibili - unidbg

http://www.zhuoyue360.com/crack/87.html

老色批想抓哔哩哔哩的全站数据,通过人工智能自动找出美女 (:色

咱们想抓它一个个人信息.

抓包分析

1. android 7.0+ 证书配置

参考这篇文章.

http://www.zhuoyue360.com/crack/60.html

2.抓包.

证书设置好, postern配置好。胸弟们就可以愉快的进行抓包啦~

是它,是它,就是它! 我们的小哪吒,小ki! 轻轻松松的就抓包成功,没有任何的对抗。就很巴适!

3. Sign分析

jadx反编译

经过自己不断的搜搜搜下(网上文章的思路下),至于找到了关键的位置. s

想上找可以找到载入的so文件

static {c.c("bili");
}

4. IDA分析.

查看导出函数,那可是干干净净的~,那么我们就要看动态注册的函数了.

使用yang神的hook_RegisterNatives.js .即可拿到地址.

s的偏移是0x741d,过去看看~

简单的跟了一下,发现有轻微的混淆。 先不理。 祭神器,unidbg

Unidbg

从Part2已知, 我们的s大宝贝入口是0x741d.

Unidbg基础代码写好,运行一下,报错了。

@Override
public boolean callBooleanMethod(BaseVM vm, DvmObject<?> dvmObject, String signature, VarArg varArg) {switch (signature){case "java/util/Map->isEmpty()Z":TreeMap<String, String> treeMap = (TreeMap<String, String>)dvmObject.getValue();return treeMap.isEmpty();}return super.callBooleanMethod(vm, dvmObject, signature, varArg);
}

@Override
public DvmObject<?> callObjectMethod(BaseVM vm, DvmObject<?> dvmObject, String signature, VarArg varArg) {switch (signature){case "java/util/Map->get(Ljava/lang/Object;)Ljava/lang/Object;":StringObject keyObject = varArg.getObjectArg(0);String key = keyObject.getValue();TreeMap<String, String> treeMap = (TreeMap<String, String>)dvmObject.getValue();String value = treeMap.get(key);return new StringObject(vm,value);}return super.callObjectMethod(vm, dvmObject, signature, varArg);
}

这里把SignedQuery这个类都拿过来.稍稍修改一番~

package com.danmaku;import java.io.UnsupportedEncodingException;
import java.util.Map;
import java.util.SortedMap;
import java.util.TreeMap;/* compiled from: BL */
/* loaded from: classes2.dex */
public final class SignedQuery {public static final String KEY_VALUE_DELIMITER = "=";public static final String FIELD_DELIMITER = "&";private static final char[] a = "0123456789ABCDEF".toCharArray();public final String rawParams;public final String sign;public SignedQuery(String str, String str2) {this.rawParams = str;this.sign = str2;}private static boolean a(char c2, String str) {return (c2 >= 'A' && c2 <= 'Z') || (c2 >= 'a' && c2 <= 'z') || !((c2 < '0' || c2 > '9') && "-_.~".indexOf(c2) == -1 && (str == null || str.indexOf(c2) == -1));}static String b(String str) {return c(str, null);}static String c(String str, String str2) {StringBuilder sb = null;if (str == null) {return null;}int length = str.length();int i = 0;while (i < length) {int i2 = i;while (i2 < length && a(str.charAt(i2), str2)) {i2++;}if (i2 != length) {if (sb == null) {sb = new StringBuilder();}if (i2 > i) {sb.append((CharSequence) str, i, i2);}i = i2 + 1;while (i < length && !a(str.charAt(i), str2)) {i++;}try {byte[] bytes = str.substring(i2, i).getBytes("UTF-8");int length2 = bytes.length;for (int i3 = 0; i3 < length2; i3++) {sb.append('%');char[] cArr = a;sb.append(cArr[(bytes[i3] & 240) >> 4]);sb.append(cArr[bytes[i3] & 15]);}} catch (UnsupportedEncodingException e2) {throw new AssertionError(e2);}} else if (i == 0) {return str;} else {sb.append((CharSequence) str, i, length);return sb.toString();}}return sb == null ? str : sb.toString();}static String r(Map<String, String> map) {if (!(map instanceof SortedMap)) {map = new TreeMap(map);}StringBuilder sb = new StringBuilder(256);for (Map.Entry<String, String> entry : map.entrySet()) {String key = entry.getKey();if (!key.isEmpty()) {sb.append(b(key));sb.append(KEY_VALUE_DELIMITER);String value = entry.getValue();sb.append(value == null ? "" : b(value));sb.append(FIELD_DELIMITER);}}int length = sb.length();if (length > 0) {sb.deleteCharAt(length - 1);}if (length == 0) {return null;}return sb.toString();}public String toString() {String str = this.rawParams;if (str == null) {return "";}if (this.sign == null) {return str;}return this.rawParams + "&sign=" + this.sign;}
}

然后再补环境

@Override
public DvmObject<?> callStaticObjectMethod(BaseVM vm, DvmClass dvmClass, String signature, VarArg varArg) {switch (signature){case "com/bilibili/nativelibrary/SignedQuery->r(Ljava/util/Map;)Ljava/lang/String;":DvmObject<?> mapObject = varArg.getObjectArg(0);TreeMap<String, String> mymap = (TreeMap<String, String>) mapObject.getValue();String value = SignedQuery.r(mymap);return new StringObject(vm, value);}return super.callStaticObjectMethod(vm, dvmClass, signature, varArg);
}

@Override
public DvmObject<?> newObject(BaseVM vm, DvmClass dvmClass, String signature, VarArg varArg) {switch (signature){case "com/bilibili/nativelibrary/SignedQuery-><init>(Ljava/lang/String;Ljava/lang/String;)V":String arg0 = (String) varArg.getObjectArg(0).getValue();String arg1 = (String) varArg.getObjectArg(1).getValue();return vm.resolveClass("com/bilibili/nativelibrary/SignedQuery").newObject(new SignedQuery(arg0, arg1));}return super.newObject(vm, dvmClass, signature, varArg);
}

突然,unidbg不报错了,跑出来了hhhhh.

这就是我们要的东西.

诶,真香~

算法还原[待更新]

利用Unidbg辅助还原哔哩哔哩Sign算法.相关推荐

  1. 利用python批量合并手机哔哩哔哩下载的视频各分段

    从手机哔哩哔哩上下载的一个电视剧,分为很多P,每一P里面又被分成了如下几个段的blv文件(本质上是flv格式),利用Python+ffmpeg,将这个系列的视频每一P都合并成单个的文件,只要输入这个视 ...

  2. flv.js仿B站弹幕html,利用jQuery实现仿哔哩哔哩视频弹幕代码

    特效描述:利用jQuery实现 仿哔哩哔哩 视频弹幕代码.利用jQuery实现仿哔哩哔哩视频弹幕代码 代码结构 1. 引入CSS 2. 引入JS 3. HTML代码 24 人正在观看,100条弹幕 时 ...

  3. Bilibili Helper - 哔哩哔哩弹幕网辅助扩展插件

    哔哩哔哩助手Bilibili Helper是一款基于Chrome内核的浏览器插件.通过Bilibili Helper可以简单方便的修改B站Flash播放器为最新的HTML5网页播放器,同时还可以绕过B ...

  4. 利用Python进行破解哔哩哔哩登录

    前言 研究爬虫的各位小伙伴都知道,需要登录才能获取信息的网站,是比较难爬的,原因就是在于,现在各大网站为了反爬,都加入了图片验证码,滑动验证码之类的干扰, 本篇就针对视频门户网站的滑动验证码进行讲解和 ...

  5. 菜鸟弟弟从零开始的爬取Bilibili弹幕的Python爬虫教程-哔哩哔哩 - ( ゜- ゜)つロ 干杯~

    从零开始的爬取Bilibili弹幕的Python爬虫教程 或许可以作为一个爬虫小白的练手的demo? 还是先看看什么是爬虫吧!(还有Bilibili! ) 网络爬虫: 网络爬虫(又称为网页蜘蛛,网络机 ...

  6. 使用OBS双电脑直播(主副电脑)推流至哔哩哔哩

    本文图片上传异常,请访问:AlvinCR博客    https://alvincr.com/ 需知:最低要求OBS Studio v25.使用双电脑是为了减轻主PC的负担,从而不用购买专业显卡也可获得 ...

  7. 哔哩哔哩殷汶杰:合格的多媒体技术工程师有成为全栈架构师的潜质

    英雄会是CSDN旗下针对国内IT技术领域专家展示和交流的平台.通过线下线上的互动形式,为CSDN社区专家提供更多学习.合作.宣传的机会.英雄会后续将在北上广深等国内一二线城市建立分会,各个分会后期将组 ...

  8. b站 前端构架_技术干货:哔哩哔哩(B站)功能框架图 ——以B站为例分析面对秋招必须要掌握的前后端...

    本次夏令营知了堂项目经理以B站为原型,带着大家熟悉了软件的开发流程及还原了部分功能模块.现在就将B站功能架构图及前后端技术栈给大家.同时从以B站技术为例给大家分析作为应届毕业生,面对秋季校招时必须要掌 ...

  9. 哔哩哔哩注册--表单练习

    哔哩哔哩注册–表单练习 HTML代码 可能代码有些不足或者用词不当等 希望大家能够见谅 这是一次bilibili的注册表单练习 里面都有详细注释 当然一个网页有许多种 这只是其中一种 是为了相互交流 ...

最新文章

  1. PTA基础编程题目集-6-13 折半查找
  2. 实践微服务六年,我获得了这些心得体会
  3. 英伟达一大波硬件来袭:今日GTC发布专业GPU与DPU,为收购ARM将在英国建超算
  4. C++中的string 类型占几个字节
  5. tensorflow从入门到精通100讲(一)-如何申明一个tensor,Tensorflow中最重要的基本操作
  6. Ubuntu 下 Python自由切换
  7. fc协议有哪些数据传输服务器,FC协议详解
  8. Spring 自动装配 ‘byType’
  9. 运用数组,输出从小到大的10个数
  10. html5视频播放器隐藏控制,HTML5 video标签(播放器)学习笔记(二):播放控制
  11. java多张图片合成一张_一款国外有趣、简单、功能齐全的图片处理软件。
  12. mysql数据库密码修改
  13. 【leetcode】Wildcard Matching
  14. python类库31[命令行解析]
  15. MSM8960 // F200 引导装载程序 (Bootloader) 之研读
  16. python计算平均数、众数、中位数、极差、方差、标准差……
  17. matlab 表示希腊字母yita,常用希腊字母读法
  18. VSCode在打印输出sizeof()时的警告
  19. 长沙经开区工程机械跻身千亿产业集群
  20. 华为大队入职培训体会

热门文章

  1. 分布式架构-Redis 从入门到精通 完整案例 附源码
  2. 挖一个深坑在那里找寻宝藏
  3. 这些老外的开源技术养活了一票国产软件
  4. 解决代码的中文输出乱码问题
  5. PyTorch训练加速技巧
  6. python 破解字体反爬 (一)
  7. MySql常用指令总结
  8. MediaPlay播放音乐初级应用
  9. compilation terminated.
  10. 【SpringBoot】自定义启动Banner(附:使用生成艺术字体方法)