提示!本文章仅供学习交流,严禁用于非法用途,文章如有不当可联系本人删除!2022年2月写的!之前删了的现在重发出来
一、常用的js基础知识
① js各种运算符:比如位运算符:&、|、^、~、<<、>>、>>>
,算术运算符:+、-、*、/、%、++、--
② 三元运算符又称条件运算符?
:表达式结果为true
执行冒号前的
:value = 表达式 ?为true执行:为false执行 ,比如a = 5 > 3 ? “true” : “false”
③ String.fromCharCode(num)
:可接受一个指定的 Unicode 值,然后返回一个字符串
④ 'str'.charCodeAt(num)
:返回字符串指定位置单个字符串的Unicode编码
⑤toString()
:把一个Number对象转换为一个指定进制的字符串
⑥ parseInt()
:把一个字符串对象转换为一个指定进制的Number
⑦slice()
:截取指定位置范围的字符串
二、常用的谷歌操作
① 谷歌开发者工具打断点,如鼠标选择行号右击,插桩断点Add logpoint
可以打出日志,如条件断点Add conditional breakpoint
可以根据输入的条件表达式为true的时候自动debugger住
② xhr断点监控:根据url请求中的链接参数特征,指定监控
三、jsvmp的特征
① jsvmp的特征:请求参数signature反爬,加密算法文件为acrawler.js
以及文件里面典型的提示字符window)._$jsvmprt("
② 关于jsvmp的一些了解可以看这3篇文章:https://bbs.pediy.com/thread-261414.htm , jsvmp虚拟机保护 ,https://www.cnblogs.com/luoxiaoer/p/11735768.html
③ 关于jsvmp的解法一般有3种,插桩补环境,插桩扣逻辑,jsrpc
,当然可能还有其它的自动化等方式可自行研究试试
④ 插桩补环境
的可以看 逆向OneByOne的公众号 或者是 爬虫术与道的公众号有相关思路,网上也有很多,可随意查找
⑤ 插桩扣逻辑
的可以看这篇文章:逆向简史的公众号,文章前半部分讲了补环境的关键点,文章后半部分讲了如何扣代码的关键点,以及关键的算法函数,强烈推荐,看完实际操作一遍,你会豁然开朗;以及这篇文章:Python爬虫 js逆向的公众号
⑥ jsrpc的逻辑
的可以看这篇文章:时光python之旅的公众号
四、jsvmp扣逻辑
① 定位入口:目标参数signature,采用xhr断点定位,发现是由acrawler.js
这个文件生成的,然后我们插桩日志输出,找出window.byted_acrawler.sign
函数的传入参数,然后就可以通过补环境的方式生成signature
① 补环境和该篇文章的解决思路差不多,当然视频里举例的sign传入的参数可能不准确,具体的有兴趣的需要自己去插桩测试验证下,本篇文章重点在扣代码逻辑
② 扣代码正式逻辑:如果你看完逆向简史公众号的文章你一定知道signature 是由 9 部分组成的,第一部分是固定参数,剩余的8部分都分别由相应的算法逻辑生成
③ 接着重中之重的是打日志断点插桩的位置:分别在arcawler.js的184行和425行加入日志插桩断点,内容如下:
"索引j", j,"索引O", O, " 值:", JSON.stringify(S, function(key, value) {if (value == window) {return undefined} return value})
④ 然后我们清除网页缓存,刷新网页,会发现大概有1.5w的插桩日志
打印出来,而通过ctrl+f搜索,signature也在我们打印的日志里面输出了,也就是j ===24 && O === 40336
这个位置有了signature以及其对应的值_02B4Z6wo00f010kDMrgAAIDCwkipWBmxc99JAzYAALBd35
⑤ 我们继续搜索值_02B4Z6wo00f010kDMrgAAIDCwkipWBmxc99JAzYAALBd35
,会发现signature的最后两位也就是第⑨部分是35,生成逻辑是
c468ee35`这个字符串的后两位截取生成的,第一部分是固定参数,所以我们先分别搜索其它②~⑧这几个部分生成的位置看看规律
① _02B4Z6wo00f01 ② 0kDMr ③ gAAID ④ Cwkip ⑤ W ⑥ Bmxc9 ⑦ 9JAzY ⑧ AALBd ⑨ 35
⑥ signature的第8部分,AALBd
⑦ signature的第7部分,9JAzY
⑧ signature的第6部分,Bmxc9
⑨ signature的第5部分,W
⑩ signature的第4部分,Cwkip
11、signature的第3部分,gAAID
12、signature的第2部分,0kDMr
13、通过前面②~⑧ 部分的图片逻辑,你应该已经发现了每部分都是由单个字母拼接而成,我们拿第2部分0kDMr
再详细看下这个流程,可以发现第2部分的0kDMr确实一个字母一个字母拼接而成,而每个字母都是由后面的数字转换而成
14、也就是2部分0kDMr
的生成逻辑就是数字通过fromCharCode()
转换成字母然后再拼接,那其实我们只要继续研究这个[48]、[107]、[68]、[77]、[114]这些数字是怎么生成的即可,这个你在逆向简史的公众号里面也可以找到原因
15、先看下结果,[48]、[107]、[68]、[77]、[114]这些数字的生成方式如下,它们都共用了35394057981102这个14位长度的数字,并且按一定的运算方式顺序获得
上面的9部分signature的每个字母拼接都有可能由长数字经过一定的运算转换而来,所以我们要研究35394057981102(长数字)
是怎么生成的,以及对应的每个字母的运算方式,比如哪些数字是固定的,又该用哪种运算符,这里建议直接研究逆向简史的公众号的付费文章部分(真的超牛,无比敬佩
),看完后如果还不会再选择是否看本付费区的进一步讲解
16、14位长度的35394057981102(长数字),先说结果,它其实是二进制转十进制得到的,而二进制又是怎么来的
17、二进制数又是由两个二进制数拼接而成,其中一个二进制数10000000110000
转成十进制就是8240,经过多次验证这个是固定的,所以我们只需要推理剩余的那个二进制是怎么生成的即可
18、接下来我们先简单看下一个样例35393859502856(长数字) ,的整个推理逻辑结果,从上往下是逆向的思路,从下往上看就是正向的思路了,最终推理得要准备两个初始化变量,10位时间戳+url链接 即可
19、在步骤18的图中,你可能会疑问上面那个推理逻辑是怎么得出来的,请看如下视频讲解带你单步调试,看完下面的视频你就明白了如何推理signature的第②部分vw6Eg单个字符如v的生成逻辑,而它的每个字符都是如下的生成逻辑,只有部分的数字有细微的差别;部分代码逻辑已整理好在文档末尾
20、在步骤19的图中,你还可能会想SDBHash这个函数是怎么得出来的,这次我们直接从hash值操作那里开始看,由于刷新了网页,所以数字与前面步骤不一致,但是位置是一致的,请看如下视频带你单步调试,链接与时间戳的hash生成位置在索引j 31 索引O 17864 值
21、在步骤19的图中,你还可能会想我是怎么知道到数字中间用什么运算符的,一个是靠猜,另一个则是靠调试,请看如下视频讲解带你单步调试,比如我们是如何发现"1645450805"执行了charCodeAt(0),通过如下图你可能发现规律在索引j 49 索引O 17844 值:的位置生成,是其前一个步骤j===16 &O===17842 生成的,所以我们接下来采用条件断点的方式去找运算符是什么
22、至此,通过前面的视频我们已经知道了长数字的生成方式,以及如何找到规律写成SDBhash代码,以及如何找到数字之间的运算符是什么,那再回到步骤19即signature第②部分vw6Eg,把生成逻辑封装成如下函数,可见signature的第②部分已经成功逆向出来
23、避免大佬们踩坑,如下图是生成长数字,以及signature前⑤部分的生成逻辑,后面的⑥~⑨自己试试看,虽然部分有点难,细心点可以摸索出来的
24、至此signature关键逻辑已讲解完,加油
25、响应加密是aes-cfb-128加密,只要找到key和iv就行,key、iv的话可以从谷歌开发者工具右侧Scope里面猜测出;aes-cfb-128可参考这篇文章https://www.wslmf.com/post/592.html解决,测试运行结果正常
from Crypto.Cipher import AES
def aes_128_cfb_decrypt(enc_str, key, iv):
"""
解密
:param enc_str: 被加密的字符串
:param key: 二进制
:param iv: 二进制
:return: 解密后的text
"""
decode = base64.b64decode(enc_str)
aes = AES.new(key, AES.MODE_CFB, iv, segment_size=128)
_text = aes.decrypt(decode)
return _text
五、本案例类似好文章分享
④ 网洛者-反反爬练习平台第七题(JSVMPZL - 初体验)
⑦jsvmp里常用的加密算法:
https://github.com/StriveMario/jsvm/blob/master/%E7%94%A8%E4%BA%8E%E6%B5%8B%E8%AF%95%E5%8A%A0%E5%AF%86%E7%9A%84%E7%AE%97%E6%B3%95/reverse.js
⑧ jsvmp了解:
https://bbs.pediy.com/thread-261414.htm
https://www.cnblogs.com/luoxiaoer/p/11735768.html
⑨ 如果觉得文章还不错的话,记得关注支持一下哦~
原文始发于微信公众号(逆向OneByOne):js逆向案例-某suanshu_jsvmp
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论