- 博客(88)
- 资源 (1)
- 收藏
- 关注
原创 安卓逆向-KG音乐2021最新版下载接口分析
安卓逆向-KG音乐2021最新版下载API分析安卓逆向-KG音乐最新版APIJava代码实现后记安卓逆向-KG音乐最新版API吐槽一下,相对于其他几个大型音乐平台讲,KG音乐的API设计非常糟糕。。。。网上已经有很多KG音乐下载接口的分析,但KG音乐近来对原有的方式做了更改,增加了一个请求参数signature,导致之前的获取方式失效了。经过逆向分析后发现,signature也是使用了MD5加密,是将除了signature外所有的请求参数与APPKEY拼接后的MD5值。除了KG概念版可以免费听的VI
2021-02-07 21:30:33
2095
4
原创 算法-N进制加法
N进制加法1、N进制加法1、N进制加法最近遇到了一个问题,如何实现36进制加法?这个问题挺有意思。对于常见的10进制和二进制,我们往往都是一加了之,相加之后进位,进位再与前面的一位相加,再重复上述步骤,就得到了我们想要的值,对于10进制内的数我们这样相加没啥问题,但是对于N进制,则需要考虑下其中的本质问题。在10进制以内,我们通过取余得到了新的值,本质上是对0-9这十个数字进行了取余查字典,那么对于N进制,我们同样可以取余查字典,只不过字典需要我们自己构造。对于36进制来讲,我们可以把0-9,A-Z作
2021-01-29 22:35:15
2515
原创 算法-找出数组中所有重复元素
算法-找出数组冲所有重复元素算法-找出数组冲所有重复元素算法-找出数组冲所有重复元素本题目源于 Leetcode 422 是一道技巧类型的题目442. 数组中重复的数据给定一个整数数组 a,其中1 ≤ a[i] ≤ n (n为数组长度), 其中有些元素出现两次而其他元素出现一次。找到所有出现两次的元素。你可以不用到任何额外空间并在O(n)时间复杂度内解决这个问题吗?示例:输入:[4,3,2,7,8,2,3,1]输出:[2,3]如果按照普通的方法看,本题可以用hashma
2021-01-28 20:35:08
3472
原创 安卓Native逆向之MOO音乐解密( .bkcflac,bkcmp3文件解密)
安卓Native逆向之MOO音乐解密( .bkcflac,bkcmp3文件解密)1、背景2、Java层逆向3、Native层逆向4、Java实现1、背景本文写于2021年1月5日,解密算法适用于目前最新版的MOO加密。之前加密方式和母线加密方式并不完全相同2018年鹅厂推出了一款名为MOO的音乐APP,设计风格独特,采用QQ音乐曲库,可以看作是QQ音乐的轻奢款。可以是因为设计风格太过独特,MOO音乐只在一些小圈子里流行,一直不温不火。不过从2019年末开始,MOO音乐就开始免费送VIP,到现在持续了
2021-01-05 15:23:03
6933
5
原创 QQ音乐API分析之-加密参数分析(sign计算)
QQ音乐API加密参数分析1、背景2、QQ音乐sign计算3、Java代码实现4、总结1、背景不知道什么时候开始,各家音乐APP都开始对API进行加密,最近一段时间对六大音乐平台的加密算法进行了研究,逆向了网页端、安卓端等等,已经掌握了各家的加密算法。平台加密算法非加密接口专属资源海外IP支持QQMD5存在,可完全替代加密接口需要绿钻Cookie不支持,需要国内IP代理KWDES存在,可完全替代加密接口不需要额外信息支持KGMD5存在,不能完全
2020-12-21 17:28:42
17350
10
原创 安卓逆向-豆瓣app签名算法分析与解密(下)
文章目录1、反汇编豆瓣APP2、定位签名计算位置3、获取豆瓣APP的签名4、HMAC Hash加密逻辑分析5、代码实现6、项目地址完整工程上传到了GitHub上,仅限于研究使用,欢迎star项目地址:https://github.com/bestyize/DoubanAPI1、反汇编豆瓣APP我们用强大的jadx来反汇编豆瓣app选择文件-打开。然后找到豆瓣app的安装包后打开。2、定位签名计算位置点击搜索图标,我们搜索一下在上一节找的_sig是在哪里组装的双击进去,可以看到一个叫做
2020-09-07 14:45:21
2731
12
原创 安卓逆向-豆瓣app签名算法分析与解密(上)
文章目录1、背景介绍2、工具准备3、Fildder抓包3.1 配置fildder代理3.2 配置安卓模拟器的代理3.3 为安卓模拟器安装证书4、抓取豆瓣APP的网络请求1、背景介绍豆瓣上有很多精品的图片资源,但是豆瓣的网页端写的不咋地,在下发图片链接直接随着html一起下发了,造成了很大的资源浪费,对我们解析数据也带来了不必要的麻烦。好的解决方式是数据通过json下发,豆瓣的移动端app就是通过下发json数据实现的通信,看到下面的图,是我抓包后得到的json数据,是不是更加清晰和好解析呢。但是
2020-09-07 13:32:17
2259
原创 杂记-有关Ubuntu快捷方式不能正常打开的问题
把Ubuntu当做主力操作系统已经有大半年了,但之前没有需要在桌面放快捷方式的需求,因此也一直没管这一点。最近在尝试把图标放在桌面时遇到了问题,放在桌面的快捷方式,不能正常启动,而是双击直接被编辑器打开了。后面百度到需要在右键,选择允许启动才可以,但是,问题来了,我的右键没有允许启动这个选项解决方式:修改快捷方式的权限为744,可以用命令行sudo chmod 744 *.desktopsudo chmod +x *.desktop也可以右键-属性-权限,将权限改为如下图所示的状态。另外一
2020-08-24 20:16:18
6449
原创 算法-寻找数组中承上启下的元素
文章目录1、寻找数组中承上启下的元素1、寻找数组中承上启下的元素题目来源:https://www.nowcoder.com/discuss/478118 (上海抖音客户端开发面经)众所周知,字节跳动非常注重算法题,算法往往成为一张否决票,暑期实习面字节,我就在三面的最后一道算法题栽了跟头,导致一开始没有拿到实习的offer。。。。先看一下题目描述:寻找k:在无序数组中,k的所有左值比它更小,所有右值比他更大。限定o(n)。本题其实比较简单,存在一种O(N^2)的算法(挨个遍历每个元素,看一下
2020-08-16 17:06:27
307
原创 源码-EventBus粘性事件的实现原理浅析
文章目录1、EventBus粘性事件的实现原理浅析1.1 EventBus的简介和架构1.2 什么是EventBus粘性事件1.3 粘性事件实现原理1.4 关于粘性事件其他的小问题1、EventBus粘性事件的实现原理浅析1.1 EventBus的简介和架构提到EventBus,相信大多数安卓开发者都用过,它是一个为Android 设计的一个基于观察者模式的发布/订阅事件总线框架,将事件的接收者和发送者分开,简化了组件之间的通信操作,使用非常简单,源码实现只有一两千行,也很适合学习。EventBu
2020-08-15 22:33:08
1101
2
原创 设计-表驱动法降低代码的圈复杂度
设计-表驱动法降低代码的圈复杂度1、设计-表驱动法降低代码的圈复杂度1、设计-表驱动法降低代码的圈复杂度先来看一个问题设计一个根据不同scheme判断应用内打开还是外部打开的程序。/** * 优化一段代码,降低代码的圈复杂度 * * scheme 打开 * weixin:// true * mqq:// true * baidu:// true * https:// false * */很自然的,我们可以想到这样的方法
2020-08-15 21:28:25
740
原创 设计-设计一段处理错误码的代码
设计一段处理错误码的代码不得不说,考察的这道题对我的编程观念有很大的帮助。这个题目其实是我在面试的时候遇到的题目,主要考察的是工程能力,但当时心里只想着用表驱动优化了,结果无法记录错误代码的范围,也没想出来。不过面试官给了点提示,说时间复杂度也可以不是O(N),那我们就用配置文件解决这个问题吧。请补全这个函数String getInfo(int errCode),输入错误码返回错误信息,比如:错误代码1,用户名错误;错误代码2,密码错误;错误代码10-100,数据库错误;错误代码200-100
2020-08-14 20:09:08
1410
原创 算法-买票问题
题目描述:现在有n个人排队买票,已知是早上八点开始卖票,这n个人买票有两种方式,第一种是每个人都可以单独去买自己的票,第i个人花费i秒,第二种是每个人都可以选择和后面的人一起买票,第i个人和第i+1个人一共花费b[i]秒。最后一个人只能和前一个...
2020-08-08 21:39:47
2855
原创 算法-再探无序数组中位数问题
算法-再探无序数组中位数问题算法-再探无序数组中位数问题算法-再探无序数组中位数问题给定一个无序数组,求无序数组的中位数本问题在前面写的博客里面提到过算法-TopK相关的问题
2020-07-26 16:15:59
390
原创 设计-LruCache的实现
设计类-LruCache的设计与实现设计类-LruCache的设计与实现设计类-LruCache的设计与实现LruCache的运用相当广泛,在加载图片等大文件时,难以离开LruCache和软引用,例如Android著名的图片加载库Glide以及网络请求库OkHttp就使用到了LruCache。在集合框架中,LinkedHashMap也可以原生的支持LruCache功能。先看一下题目描述运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制。它应该支持以下操作: 获取数据 get
2020-07-12 16:11:07
359
原创 算法-最小覆盖子串
算法-最小覆盖子串1、算法-最小覆盖子串1、算法-最小覆盖子串本题来源于:LeetCode-76 难度hard。给你一个字符串 S、一个字符串 T,请在字符串 S 里面找出:包含 T 所有字符的最小子串。示例:输入: S = "ADOBECODEBANC", T = "ABC"输出: "BANC"说明:如果 S 中不存这样的子串,则返回空字符串 ""。如果 S 中存在这样的子串,我们保证它是唯一的答案。题目很好理解,翻译成大白话就是在字符串S中,找出一段包含字符串T中所有元素的,
2020-07-12 15:06:11
386
原创 算法-判断链表是否为回文链表
算法-判断链表是否为回文链表1、判断链表是否为回文链表1、判断链表是否为回文链表题目来源:Leetcode234,是一道easy题。请判断一个链表是否为回文链表。示例 1:输入: 1->2输出: false示例 2:输入: 1->2->2->1输出: true进阶:你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/palindrome-
2020-06-27 22:37:40
521
原创 2020 vivo春招笔试题解析
2020 vivo春招笔试第三题解析统计第N天手机产量统计第N天手机产量看一下题目描述/** * 在vivo产线上,每位职工随着对手机加工流程认识的熟悉和经验的增加,日产量也会不断攀升。 * 假设第一天量产1台,接下来2天(即第二、三天)每天量产2件,接下来3天(即第四、五、六天)每天量产3件 ... ... * 以此类推,请编程计算出第n天总共可以量产的手机数量。 * 输入例子1: * 11 * * 输出例子1: * 35 * * 例子说明1: * 第11天工人总共可以量产的手
2020-06-07 17:16:16
1491
2
原创 2021 vivo校招提前批笔试解析
2021 vivo校招提前批笔试解析1、种花情况1:排除端点情况2:考虑端点2、质量测试3、合并流水线题目不能完整的记下来,目测后面vivo会把题目放到牛客上,这里先给一些解析1、种花题目大意:输入一个数字n代表花园长度,花园可以看作是一个数组,相邻的两个不能同时为1,问最多能种几棵花。例子:输入:51 0 0 0 0输出:2因为最多的情况是这样的:1 0 1 0 1即能种两棵花刚开始我以为是动态规划问题,浪费了很多时间,后来发现是一个找规律的问题。解题思路:情况1:排除
2020-06-07 17:00:40
2230
原创 算法-Z字形变换
算法-Z字形变换1、Z字形变换1、Z字形变换6. Z 字形变换 将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。 比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下: L C I R E T O E S I I G E D H N 之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"LCIRETOESIIGEDHN"。 请你实现这个将字符串进行指定行数变换的函数: string c
2020-05-16 00:16:09
1808
原创 设计-多文件多线程下载器的设计与实现(线程池)
Java-多文件多线程下载器的设计与实现1、多线程下载的原因和我们的目标2、下载派发器设计3、下载接口的设计4、单文件多线程下载的实现5、断点续传的实现6、如何使用7、总结1、多线程下载的原因和我们的目标多线程多文件下载是一个常见的需求,一些服务器为了负载均衡,往往会给每个请求线程设置最大的带宽,因此线程数量有时候也成为制约我们下载网络的原因之一。这类限制我们其实经常遇到,比如说百度网盘就是通过限制单线程下载速度来实现限速。我们知道,现成的创建是比较消耗系统资源的操作,频繁的,无限制的创建线程可能会导
2020-05-09 17:15:10
1679
原创 算法-和为K的子数组
算法-和为K的子数组1、和为K的子数组1、和为K的子数组560. 和为K的子数组给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数。示例 1 :输入:nums = [1,1,1], k = 2输出: 2 , [1,1] 与 [1,1] 为两种不同的情况。说明 :数组的长度为 [1, 20,000]。数组中元素的范围是 [-1000, 1000] ,且整数 k 的范围是 [-1e7, 1e7]。这个题是字节面试题,也是L...
2020-05-08 20:57:26
2170
原创 算法-验证栈序列
算法-验证栈序列1、验证栈序列1、验证栈序列946. 验证栈序列给定 pushed 和 popped 两个序列,每个序列中的 值都不重复,只有当它们可能是在最初空栈上进行的推入 push 和弹出 pop 操作序列的结果时,返回 true;否则,返回 false 。 示例 1:输入:pushed = [1,2,3,4,5], popped = [4,5,3,2,1]输出:true解释:我们可以按以下顺序执行:push(1), push(2), push(3), push(4), pop
2020-05-08 19:28:07
852
原创 算法-三个数的最大乘积(K很小时的TopK问题)
三个数的最大乘积1、三个数的最大乘积2、求最大的三个数1、三个数的最大乘积本题来源于:628. 三个数的最大乘积难度easy。给定一个整型数组,在数组中找出由三个数组成的最大乘积,并输出这个乘积。示例 1:输入: [1,2,3]输出: 6示例 2:输入: [1,2,3,4]输出: 24注意:给定的整型数组长度范围是[3,104],数组中所有的元素范围是[-1000,...
2020-05-05 21:10:16
1036
原创 算法-根据二叉树创建字符串
算法-根据二叉树创建字符串1、根据二叉树创建字符串1、根据二叉树创建字符串本题来源于:606. 根据二叉树创建字符串。是一个easy类型的题,但是却对我们掌握递归思想有很大的帮助。有人说,理解递归,首先要理解递归。。。可见递归思想并不是那么直白,需要我们自己去理解。递归就是一个不断调用自身的一个过程,并且随着递归深度增加,锁解决的问题越来越小,当满足递归终止条件之后,解决的小问题拼合成最终...
2020-05-05 20:06:22
378
原创 算法-摆动序列
算法-摆动序列1、摆动序列1、摆动序列376. 摆动序列如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为摆动序列。第一个差(如果存在的话)可能是正数或负数。少于两个元素的序列也是摆动序列。例如, [1,7,4,9,2,5] 是一个摆动序列,因为差值 (6,-3,5,-7,3) 是正负交替出现的。相反, [1,4,7,2,5] 和 [1,7,4,5,5] 不是摆动序列,第一个...
2020-05-04 12:04:09
429
原创 算法-根据字符出现频率排序
算法-根据字符出现频率排序1、根据字符出现频率排序1、根据字符出现频率排序451. 根据字符出现频率排序给定一个字符串,请将字符串里的字符按照出现的频率降序排列。示例 1:输入:"tree"输出:"eert"解释:'e'出现两次,'r'和't'都只出现一次。因此'e'必须出现在'r'和't'之前。此外,"eetr"也是一个有效的答案。示例 2:输入:"ccca...
2020-04-30 22:45:42
2308
原创 算法-单调栈问题合集
算法-单调栈问题合集1、移掉K位数字,使剩下的数字保持最小2、移掉K位数字,使剩下的数字保持最大单调栈顾名思义是一种单调递增或者单调递减的栈,虽然很简单,但是的确是一种高级数据结构。之前我写的文章 算法-摩天大楼问题 就是采用单调栈进行优化的。这里再给出几个单调栈问题借助于单调栈的特点,我们可以优化一些算法的时间复杂度1、移掉K位数字,使剩下的数字保持最小本题也是华为2020-04-2...
2020-04-30 19:17:19
438
原创 算法-无重复字符的最长字串
算法-无重复字符的最长字串无重复字符的最长字串无重复字符的最长字串3. 无重复字符的最长子串 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。 示例 2: 输入: "bbbbb" 输出: 1 解释: 因为无重复字符的最长子串是 "b",所...
2020-04-27 22:02:14
211
原创 算法-环形链表问题
这里写目录标题1、环形链表2、环形链表II1、环形链表141. 环形链表给定一个链表,判断链表中是否有环。为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。示例 1:输入:head = [3,2,0,-4], pos = 1输出:true解释:链表中有一个环,其尾部连接到第二个节点。...
2020-04-20 12:12:51
254
原创 算法-二叉树的最近公共祖先
算法-二叉树的最近公共祖先二叉树的最近公共祖先二叉树的最近公共祖先236. 二叉树的最近公共祖先给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”例如,给定如下二叉树: root = [3...
2020-04-20 11:38:33
655
原创 算法-岛屿问题专辑
算法-岛屿问题专辑1、岛屿数量2、被围绕的区域3、岛屿最大面积4、岛屿周长遇到岛屿问题,基本上就是一种算法:深搜+记忆化搜索。1、岛屿数量List item200. 岛屿数量给定一个由 '1'(陆地)和 '0'(水)组成的的二维网格,计算岛屿的数量。一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的。你可以假设网格的四个边均被水包围。示例 1:输入:111...
2020-04-19 22:05:17
2132
原创 算法-矩阵遍历问题专辑
算法-矩阵遍历问题专辑1、螺旋矩阵2、旋转图像3、搜索二维矩阵 II4、搜索二维矩阵1、螺旋矩阵54. 螺旋矩阵给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。示例 1:输入:[ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ]]输出: [1,2,3,6,9,8,7,4,5]示例 2:...
2020-04-19 21:29:51
918
原创 设计-设计模式之观察者模式
设计模式-手写观察者模式1、观察者模式的概念2、Java代码实现1、观察者模式的概念观察者模式的概念在这里讲的挺好当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。主要解决...
2020-04-14 17:53:51
216
原创 算法-栈和队列的相互转换
栈和队列的相互转换1、两个栈实现一个队列2、队列实现栈由于两种方法都很简单,这里就不多说了1、两个栈实现一个队列 class MyQueue{ private Stack<Integer> input; private Stack<Integer> output; public MyQueue() { ...
2020-04-13 17:23:59
165
原创 安卓-OkHttp3的责任链模式详解,基于OkHttp3.14.7
安卓-OkHttp3的责任链模式详解1、OkHttp的责任链模式1.1 什么是责任链模式1.2 OkHttp的网络请求示例1.3 OkHttp的责任链分类及作用2、OkHttp责任链代码解读2.1 RetryAndFollowUpInterceptor(重试和重定向拦截器)2.2 BridgeInterceptor(桥接连接器)2.3 CacheInterceptor(缓存拦截器)2.4 Conn...
2020-04-12 23:52:53
833
原创 算法-快排思想之 反转字符串中的元音字母
算法-快排思路之 反转字符串中的元音字母快排思想之 反转字符串中的元音字母快排思想之 反转字符串中的元音字母345. 反转字符串中的元音字母编写一个函数,以字符串作为输入,反转该字符串中的元音字母。示例 1:输入: "hello"输出: "holle"示例 2:输入: "leetcode"输出: "leotcede"说明:元音字母不包含字母"y"。快排大家都知道了,...
2020-04-12 00:24:28
203
原创 算法-单词规律
算法-单词规律单词规律单词规律290. 单词规律给定一种规律 pattern 和一个字符串 str ,判断 str 是否遵循相同的规律。这里的 遵循 指完全匹配,例如, pattern 里的每个字母和字符串 str 中的每个非空单词之间存在着双向连接的对应规律。示例1:输入: pattern = "abba", str = "dog cat cat dog"输出: true示...
2020-04-11 23:48:40
364
原创 算法-二叉树的恢复
算法-二叉树的恢复1、二叉树的性质2、根据前序和中序遍历结果恢复二叉树2.1 手动推理2.2 Java实现3、根据中序和后序遍历结果恢复二叉树1、二叉树的性质二叉树是一个极为重要的数据结构,对它的掌握程度反映了反映了我们数据结构的掌握程度,尤其是一些大公司在面试非科班出身的程序员的时候就会出一些类似于二叉树恢复的题目来试探我们。先来看一下这棵二叉树,我们以他为例 1 ...
2020-04-11 18:20:10
1365
原创 算法-不同路径问题
不同路径问题1、不同路径(I)1.1 初步解1.2 时间优化2、不同路径(II)1、不同路径(I)62. 不同路径本问题是动态规划的一个比较经典的题目,和跳台阶问题本质上是一样的,只是跳的位置不一样而已。 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish...
2020-04-09 23:37:42
1940
PDF密码去除工具
2018-11-25
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人