逆向JavaScript经验分享

最近心血来潮,想看个国漫。结果爱奇艺独播,还每集那么老长的广告,可是把我恶心的不要不要的。然后为了展现程序员的自我修养,我要分析下这个视频的源文件地址,直接观看,跳过广告!凭着我分析百度网盘的经验,花了三个晚上,总算搞定了。顺便分享下整个逆向分析过程,和大家学习。

# 查看请求

前端无论怎么样的操作,本质上都是向服务器发送请求,然后解析请求数据,展现在页面上。所以说逆向的切入点就是查看网络请求!因为我要分析视频的源 MP4 文件而不是 flash 文件,所以我把浏览器模拟成手机让爱奇艺载入手机版界面以便抓包获取 MP4 文件。切换成手机版很简单,只需要在 Chrome 上按 F12 打开开发人员工具,点击左上角的 Toggle device toolbar图标就可以切换成手机设备了,我选择模拟的设备是 Nexus 6P。这时候重新刷新页面,查看NetWork面板。里面会有这个页面载入发起的所有请求,我们重点找的是各种 JS 发起的请求和带参数的请求。最笨的办法就是一个请求一个请求看一遍,总有你需要的。

# 分析请求

通过一个个查找,我们找到了一个请求返回了一个 JSONP 格式的数据,这个数据里面包含了 MP4 源文件的地址。注意,很多人分析请求的时候经常喜欢找 MP4 文件的请求,这个可以算是一个切入点。但是一般网站不会把视频网址固定死的,所以找到 MP4 请求并没有什么实际意义,而是一定有一个请求去向服务器索取真实的 MP4 地址,一般这个数据都是 JSON 格式的。所以只要耐心找,一定找得到的。很多请求都只不过是资源文件,所以很容易过滤掉的。

接下来就请看我们找到的这个关键请求: Request 从这个请求的 Response 可以得知这是我们需要的请求,但这也只不过才是开始。我们知道了这个请求,就需要思考如何构造这个请求,来获取真实的 MP4 地址。一般请求的网址和路径都是固定的,所以我们的重点工作就是构造请求参数。 这个请求总共有 17 个请求参数,真是够多的。但是我们不知道所有请求参数是否是必须的。有可能服务器只校验其中的几个参数,所以我们没有必要对每个参数都分析一遍。

这时候就需要拷贝下来这些参数来进行分析,在界面的左侧面板,右键单击之后会出现 copy as cURL菜单。这样我们就可以在 Linux 的终端里调试这个请求,你可以先拷贝到记事本上,然后修改请求之后再终端里跑一遍看看能否返回正常的数据。有些服务器也会对Request Headers进行校验,所以可以试试去掉相关的headers例如 cookie,UA。最终调试出可以得到合法数据的最简单请求。爱奇艺这个例子对Request Headers没有进行任何校验,反而对请求参数很苛刻,少一个都不行,最后我们会解释为什么爱奇艺对请求参数检查这么苛刻。

# 逆向 JS 文件找到相关请求如何构造

从上面我们知道了,这个请求只对参数进行了校验,Request Headers并不需要。那重点就是逆向 JS 找到如何构造参数即可。

通过Sources面板可以看到这个页面加载的所有 JS,但是这个看起来也太多了吧。所以这个不是方法,重点就是查找关键的 JS 文件。Ctrl+Shift+F可以查找所有的文件,所以我们可以利用搜索大法来找到关键的 JS 文件。一般也可以通过Network查看请求的触发者,但是很多封装之后的 JS,是无法通过请求追溯到构造的 JS 文件的。但是无论这个 JS 文件怎么压缩混淆,网址是必须要有的。所以我们搜索cache.m.iqiyi.com/jp/tmts就找到了关键的 JS 文件了!找到 JS 文件之后,会跳转到Sources面板,点击右下角的{}Pretty print 会把压缩的 JS 自动进行换行和排版,方便分析。这时候通过分析这个 JS 文件,我们就知道如何构造这个请求了。

# 站在巨人的肩膀上

我们没有必要每个参数都自己用 JS 实现一遍,因为人家已经实现好了,我们只要调用就好。这个请求的关键是getTmtsVf函数。这个函数对请求进行了哈希,添加了一个 vf 参数,所以我对参数进行了任何的修改都会导致请求非法。无论怎么实现的 JS,有些参数只能通过全局变量来共享,所以对于那些参数,我们可以直接使用。例如爱奇艺有个全局的Q变量,通过这个变量可以获得很多需要的参数。

# 终极解决方案

对参数的构造完全取决于最后个人对 JS 文件的理解的功底,能看懂压缩的 JS 的逻辑才能成功提取需要的请求参数。但也有些变态的 JS 文件很难理解,不进行动态调试分析的话很难明白。这时候我们就不得不请出 Chrome 的大杀器:webRequest (opens new window),通过这个 API,我们可以拦截请求并进行替换。我就使用这个 API 拦截了app_movie.js,注入了我带调试信息的 JS。你就可以随意的调试了。关于这个 API 的使用 DEMO,可能后续会放在我的 Github 上。

# 写在最后

其实可以分析桌面版本的 flash 视频,然后使用 B 站的这个flv.js (opens new window)来解决播放问题。最终我写了一个油猴脚本来一键输出 MP4 文件。有兴趣的可以私信我。

Linux高并发系统参数优化

终于毕业证书到手,学生生涯也算是划上完美的句号了。不过工作强度还真的有点大,还经常加班。感觉自己懒散了许多,人果然是生于忧患,死于安乐。。。最近的项目里对业务处理的高并发要求比较高,因此也学习了相关的如何调整 Linux 内核参数让服务器可以处理非常高并发的业务。所以在博客上记录下相关的经验,以供参考。 修改的参数主要是 Linux 系统参数和网络协议栈参数。注意,以下命令都需要在 root 环境下运行。

# Linux 操作系统参数

系统全局允许分配的最大文件句柄数:

# sysctl -w fs.file-max=2097152
# sysctl -w fs.nr_open=2097152
1
2

允许当前会话/进程打开文件句柄数:

# ulimit -n 1048576
1

但是以上命令只是临时修改,重启系统便会失效,所以我们需要持久化这些参数。

持久化fs.file-max设置到/etc/sysctl.conf 文件:

fs.file-max = 1048576
1

/etc/security/limits.conf 持久化设置允许用户/进程打开文件句柄数:

*      soft   nofile      1048576
*      hard   nofile      1048576
1
2

# TCP 协议栈网络参数

并发连接 backlog(定义了网络连接的队列的最大长度)设置:

# sysctl -w net.core.somaxconn=32768
# sysctl -w net.ipv4.tcp_max_syn_backlog=16384
# sysctl -w net.core.netdev_max_backlog=16384
1
2
3

可用知名端口范围:

# sysctl -w net.ipv4.ip_local_port_range='1000 65535'
1

TCP Socket 读写 Buffer 设置:

# sysctl -w net.core.rmem_default=262144
# sysctl -w net.core.wmem_default=262144
# sysctl -w net.core.rmem_max=16777216
# sysctl -w net.core.wmem_max=16777216
# sysctl -w net.core.optmem_max=16777216

# sysctl -w net.ipv4.tcp_rmem='1024 4096 16777216'
# sysctl -w net.ipv4.tcp_wmem='1024 4096 16777216'
1
2
3
4
5
6
7
8

TCP 连接追踪设置:

# sysctl -w net.nf_conntrack_max=1000000
# sysctl -w net.netfilter.nf_conntrack_max=1000000
# sysctl -w net.netfilter.nf_conntrack_tcp_timeout_time_wait=30
1
2
3

TIME-WAIT Socket 最大数量、回收与重用设置:

# net.ipv4.tcp_max_tw_buckets=1048576
1

FIN-WAIT-2 Socket 超时设置:

# net.ipv4.tcp_fin_timeout = 15
1

# 参考

测试调优 (opens new window)

使用Latex书写论文

最近忙着写论文,博客都快要长草了。。。但是我还是要坚持写下去!因为早就知道写论文排版会很麻烦,所以就选择了使用 Latex 来写论文。看到后期同学们在 Word 上一句一句的调整格式,我只能说学会了 Latex 真是磨刀不误砍柴工,后期真是太省心了,接下来就向大家介绍下如何使用 Latex 写论文,免除排版之忧。

# Latex 安装

推荐使用 Tex Live 来编写论文,从国内中科大的镜像源 (opens new window)来下载每个平台对应的安装文件,Windows 平台下载 exe 程序,Linux 的各大发行版建议从官方镜像源下载。安装过程记住要首先选择国内的镜像源,根据网速来决定安装进度,基本上要安装很久,请耐心等待。

# 编辑器选择

Latex 的主要功能是把 tex 文件编译成 pdf 文件,所以自带的编辑功能很难用。在此我推荐使用Sublime Text 2 (opens new window)来编写论文,可以一键编译非常方便。安装好 Sublime Text 2 之后,我们还要安装相应的插件来配合 Latex 的使用,插件的启用请参考我之前的博文。在这里我们选择使用LaTeXTools (opens new window)来编译论文,虽然 Github 上有详细的配置说明,我还是简要介绍下,主要配置的就是 Latex 所对应的环境变量texpath。还可以配置默认的 PDF 阅读器进行反向搜索,Win 下使用 SumatraPDF,Linux 使用 Evince。配置完毕之后我们只需要在当前 tex 页面按下Ctrl+B 就可以一键编译成 pdf 文件。

# Latex 格式学习

网上有很多 Latex 的学习资料,不过我们也没必要详细学习,在此介绍一个简单的学习资料。一份不太简短的 LATEX 介绍 (opens new window)基本上看完这个文档就可以大致明白如何利用 Latex 书写论文。

# Latex 模板

当然,我们也没必要一定要系统的学习,如果别人有做好现成的模板,我们直接套用就好,非常方便,中科大也有热心的小伙伴制作了模板。地址是USTC Thesis (opens new window)。近期抽时间的话,我会制作一个软件学院专用的论文模板。

# 相关学习资料

如何使用 LaTeX 排版论文 (opens new window)

配置 LaTEXTools (opens new window)

中科大软件学院工程硕士论文模板 (opens new window)