背景:

首先我们需要一点点python基础,比如可以运行类似下面的代码

import requests

headers={
	"xxx":"xxx",
	"xxx":"xxx",
}
url="https://www.ooo.ooo"
r=requests.get(url,headers=headers)

开始!!!

先打开app搜索

​ ​

找到对应的接口,分析一下请求参数,这个工具叫http Debugger Pro

​ ​

有一个sig参数对链接做了签名,看起来像md5

我们需要生成sig参数来伪造请求

反编译apk,搜索"sig"

​ ​

显然是v3.sig,点点点。。。

在generatorSigWithFinal生成这个sig

点进去发现这是一个native方法,写在release_sig里

如果想知道这个方法怎么用,可以用frida hook generatorSigWithFinal看看参数是什么

很明显,arg0是路径,arg1是链接参数值,arg2是固定字符串,arg3是上下文

解压apk的librelease_sig.so看看nativeGeneratorSig

果然是md5,在update和return 打断点 看看参数和结果是什么

update:

显然参数是arg0+arg1+固定字符串+时间戳+固定字符串,其中arg1做了升序排序

复制出来字符串然后md5,对比就是这个~

之后又对md5结果做了处理,交换奇数位和偶数位的位置

生成sig参数:

1.取出链接里的路径和参数的值

2.参数值按升序排序拼接成的字符串

3.拼接加密字符串:路径+参数字符串+bdaefd747c7d594f+时间戳+Tw5AY783H@EU3#XC

4.对加密字符串md5,交换奇数位和偶数位的位值

python版本实现:

def gen_sig(url, sigtime):
    url = parse.unquote(url)
    v1 = [i.split("=")[1] for i in url.split("&") if "sig" not in i]
    v1.sort()
    v0 = url.split("?")[0].split("com/")[1]
    vr = v0 + "".join(v1).replace("+", " ") + "bdaefd747c7d594f" + str(sigtime) + "Tw5AY783H@EU3#XC"
    sig = encrypt(vr)
    return url + "&sig=" + sig + "&sigVersion=1.3" + "&&sigTime=" + str(sigtime)

def encrypt(v0):
    v1 = hashlib.new('md5', v0.encode()).hexdigest()
    v2 = v1[1::2]
    v3 = v1[::2]
    return "".join(i + j for i, j in zip(v2, v3))

有sig就可以伪造请求

提取里面的视频地址:

写一个save函数,输入链接下载视频

def save_video(url):
	print("save:"+url)
	r=requests.get(url)
	with open(url.split("?")[0].split("_")[-1],"wb")as f:
		f.write(r.content)

改成:

哈哈哈,全部代码放到github里,欢迎star

https://github.com/heyaug/sign-algorithms

某拍sig算法揭秘---50行代码下载5000万小姐姐自拍小视频的更多相关文章

  1. python爬虫实战:利用scrapy,短短50行代码下载整站短视频

    近日,有朋友向我求助一件小事儿,他在一个短视频app上看到一个好玩儿的段子,想下载下来,可死活找不到下载的方法.这忙我得帮,少不得就抓包分析了一下这个app,找到了视频的下载链接,帮他解决了这个小问题 ...

  2. 50行代码实现python计算器主要功能

    实现功能:计算带有括号和四则运算的式子   3*( 4+ 50 )-(( 100 + 40 )*5/2- 3*2* 2/4+9)*((( 3 + 4)-4)-4) 基本思路:使用正则表达式提取出每一层 ...

  3. 50行代码实现缓存,JAVA内存模型原理

    遇见这样的高人怎么办??下面是一个简单缓存的实现,相当牛叉!自己看吧,只有50行代码. 摘自:http://www.oschina.net/code/snippet_55577_3887 import ...

  4. HTML5游戏实战(1):50行代码实现正面跑酷游戏

    前段时间看到一个"熊来了"的HTML5跑酷游戏,它是一个典型的正面2D跑酷游戏,这里借用它来介绍一下用Gamebuilder+CanTK开发正面跑酷游戏的基本方法. CanTK(C ...

  5. 50行代码实现GAN | 干货演练

    2014年,Ian Goodfellow和他的同事发表了一篇论文,向世界介绍了生成对抗网络(GAN).通过对计算图和博弈论的创新性组合,他们表明如果有足够的建模能力,两个相互对抗的模型可以通过普通的反 ...

  6. 基于requirejs+bluebird,50行代码实现轻巧实用的前端CMD加载器

    首先是github地址,可以用git克隆命令也可以直接在git页面下载 https://github.com/kazetotori/js-requireAsync 下载下来后目录结构是这样的 -pac ...

  7. [Lua]50行代码的解释器,用来演示lambda calculus

    嗯,来写写经过: 在知乎上看见用Belleve牛用javascript写了一个精简的lisp解释器 => 我也想写一个,用lua写,能多简单呢? => 写了一个阉割的scheme解释器,包 ...

  8. OpenCV图像识别初探-50行代码教机器玩2D游戏【华为云技术分享】

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/devcloud/article/detai ...

  9. 算法专题 | 10行代码实现的最短路算法——Bellman-ford与SPFA

    今天是算法数据结构专题的第33篇文章,我们一起来聊聊最短路问题. 最短路问题也属于图论算法之一,解决的是在一张有向图当中点与点之间的最短距离问题.最短路算法有很多,比较常用的有bellman-ford ...

随机推荐

  1. 1047: 【入门】正整数N转换成一个二进制数

    1047: [入门]正整数N转换成一个二进制数 时间限制: 1 Sec 内存限制: 16 MB 提交: 9786 解决: 6447 [提交] [状态] [讨论版] [命题人:外部导入] 题目描述 输入 ...

  2. Java 中的递归

    递归 递归 一种通过调用某个方法来描述需要重复进行的操作.该方法的特点就是可以自己调用自己. 案例一 排队的问题 在生活中,我们经常需要排队.在排队中,我们怎么才能知道自己所排在第几位呢? 我们也许会 ...

  3. 国内 Java 开发者必备的两个装备,你配置上了么?

    虽然目前越来越多的国产优秀技术产品走出了国门,但是对于众领域的开发者来说,依然对于国外的各种基础资源依赖还是非常的强.所以,一些网络基本技能一直都是我们需要掌握的,但是速度与稳定性问题一直也都有困扰着 ...

  4. Three中的动画实现-[three.js]

    Table Of Content 动画原理 js中动画实现原理setInterval js中动画实现新方法requestAnimationFrame 一个示例 动画原理 动画的本质实际上就是快速地不断 ...

  5. Redis 笔记(五)—— HASH 常用命令

    添加和删除键值对的散列操作 命令 用例和描述 HMGET HMGET key-name key [key ...] —— 从散列里面获取一个或多个键的值 HMSET HMSET key-name ke ...

  6. MariaDB使用数据库查询《三》

                                                                 MariaDB使用数据库查询 案例5:使用数据库查询 5.1 问题 本例要求配 ...

  7. Android AndroidManifest.xml详解

    AndroidManifest.xml简述: AndroidManifest.xml 是每个android程序中必须的文件.它位于整个项目的根目录,描述了package中暴露的组件(activitie ...

  8. python 字节码死磕

    前言:  如果你跟我一样,对python的字节码感兴趣,想了解python的代码在内存中到底是怎么去运行的,那么你可以继续往下看,如果你是python新手,我建议你移步它处,本文适合有点基础的pyth ...

  9. synchronized 与 volatile 区别 还有 volatile 的含义

    熟悉并发的同学一定知道在java中处理并发主要有两种方式: 1,synchronized关键字,这个大家应当都各种面试和笔试中经常遇到. 2,volatile修饰符的使用,相信这个修饰符大家平时在项目 ...

  10. Java日志管理:Logger.getLogger()和LogFactory.getLog()的区别(详解Log4j)

    Java日志管理:Logger.getLogger()和LogFactory.getLog()的区别(详解Log4j) 博客分类: Java综合   第一.Logger.getLogger()和Log ...