上篇 JS逆向:【硬干货】手把手实战某条_signature(上)——参数分析对某条的加密js分析,定位出了as、cp和_signature参数的代码,这篇我们来看看如何利用这些js代码生成我们需要的加密参数值。
一般我们定位出了js下一步就是剥离出相关代码进行利用,主流的利用方式大概有这几种:
-
依照相关的js加密逻辑,使用自己熟悉的语言(python)“翻译”成python代码。这种缺点也非常明显,我们需要读懂全部加密逻辑的细节,而且如果目标js代码量非常庞大或者逻辑非常复杂的时候,你懂的。。。
-
使用execjs等库执行剥离出的js代码。
-
聪明的你一定马上会想到使用selenium这类自动化工具驱动浏览器来执行js,但现在针对无头浏览器的检测已经非常成熟其隐蔽,比如某条,你会发现无头浏览器也获取不到关键数据了。
-
使用Node.js,由于Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,在这个环境下执行js,可以绕过浏览器检测。
所以,今天我们介绍如何使用node.js执行js代码获取加密值。
上一篇中我们已经知道as、cp参数是e对象下面的as和cp属性
而e对象其实是a函数
a函数就是as、cp参数的生成逻辑
其中的关键点是需要知道变量i,而变量i对应的是o.default,断点调试会知道o.default其实是C函数
现在我们剥离出C函数那一坨代码
从1285行
到1439行
然后接着剥离出调用C函数的相关代码,也就是a函数这部分
从1218行-1234行
这里由于o.default对应的是函数C,所以这里将 (0,o.default)修改为C
我们可以将这些代码放入到一个函数内,生成后,返回as和cp的值,如下
由于代码太长,我这里暂先截图部分代码
我们将剥离出的代码放入到webstorm运行一下
接下来我们开始抠_signature的这部分
上文我们知道,window.byted_acrawler.sign(a)就是生成_signature参数的值的地方
而window.byted_acrawler.sign是函数e
函数e是一段混淆后的代码
我们这里不需要继续分析了,直接将这部分全部抠下来调用就行
上文中我们知道了byted_acrawler下面有两个方法init和sign
全局搜索window.byted_acrawler,在index页面找到了init的代码
所以我们把这两部分代码全部抠下来放入一个函数来调用
然后定义调用函数
这时你以为运行一下代码就能开开心心地拿到加密值了
然而现实是这样的。。。
window is not defined ? 这是啥情况?
因为JavaScript 中有一个特殊的对象,称为全局对象(Global Object),它及其所有属性都可以在程序的任何地方访问,即全局变量。
在浏览器 JavaScript 中,通常 window 是全局对象, 而 Node.js 中的全局对象是 global,所有全局变量(除了 global 本身以外)都是 global 对象的属性。
这里说window没有定义,所以我们只需要将global赋值给window,然后window就成了全局对象了
定义后我们运行一下,然后又会出现这样的报错。。。
node.js只是使用了v8引擎,但跟实际的浏览器环境还是有所不同,到这里就需要耐心一步一步去调试了,原则是缺什么就补什么。。。
通过n*n次调试,终于补齐了全部需要的东西
这是我的运行结果
测试下能否拿到数据
终于,我们可以拿到正确的加密参数了,此处应该有红包,哦不,有掌声。。。
这时可以用node.js写一个接口,爬虫程序请求接口,接口生成参数值后返回,就能拿到对应的参数值,然后就可以开开心心地去干你们想干的事啦
比如这样子
客户端请求就能拿到加密值了
逆向不易,为了避免伸手党滥用,小伙伴们如果需要完整代码的,可以后台留言加我微信获取代码
某条的js分析过程比较简单,难点在于对方对浏览器环境做了检测,我们无法简单地使用execjs或selenium驱动浏览器执行js获取数据。
当然,如果你有足够的耐心和时间去调试分析他们到底对哪些参数进行检测,然后绕过检测,那也是可以的
在本文这个实战目标来说,相比而言使用node.js环境运行代码,还是能相对简单快速实现目标完成任务,前提是需要有一些node.js基础,不然这个环境搭建和调试过程也是相当心累的。。。
我相信肯定有许多小伙伴在调试node.js过程中,由于node环境和真实浏览器的不同导致的各种乱七八糟的报错,搞得蛋碎了又碎(比如我)
所以下一篇,我给大家介绍另一个不需要调试蛋疼的node.js的办法就能轻松执行js拿到结果,理论上可以通杀绕过所有的浏览器检测。