js逆向案例-某suanshu_jsvmp

admin 2024年10月18日22:52:48评论19 views字数 4334阅读14分26秒阅读模式
提示!本文章仅供学习交流,严禁用于非法用途,文章如有不当可联系本人删除!2022年2月写的!之前删了的现在重发出来

一、常用的js基础知识

① js各种运算符:比如位运算符:&、|、^、~、<<、>>、>>> ,算术运算符:+、-、*、/、%、++、--
js逆向案例-某suanshu_jsvmpjs逆向案例-某suanshu_jsvmp

② 三元运算符又称条件运算符?:表达式结果为true执行冒号前的:value = 表达式 ?为true执行:为false执行 ,比如a = 5 > 3 ? “true” : “false”
js逆向案例-某suanshu_jsvmp

js逆向案例-某suanshu_jsvmp

String.fromCharCode(num):可接受一个指定的 Unicode 值,然后返回一个字符串
js逆向案例-某suanshu_jsvmp

'str'.charCodeAt(num):返回字符串指定位置单个字符串的Unicode编码
js逆向案例-某suanshu_jsvmp

toString():把一个Number对象转换为一个指定进制的字符串
js逆向案例-某suanshu_jsvmp

parseInt():把一个字符串对象转换为一个指定进制的Number

js逆向案例-某suanshu_jsvmp

slice():截取指定位置范围的字符串
js逆向案例-某suanshu_jsvmp

二、常用的谷歌操作

① 谷歌开发者工具打断点,如鼠标选择行号右击,插桩断点Add logpoint可以打出日志,如条件断点Add conditional breakpoint可以根据输入的条件表达式为true的时候自动debugger住
js逆向案例-某suanshu_jsvmp

② xhr断点监控:根据url请求中的链接参数特征,指定监控
js逆向案例-某suanshu_jsvmp

三、jsvmp的特征

① jsvmp的特征:请求参数signature反爬,加密算法文件为acrawler.js以及文件里面典型的提示字符window)._$jsvmprt("
js逆向案例-某suanshu_jsvmp

关于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函数的传入参数,然后就可以通过补环境的方式生成signaturejs逆向案例-某suanshu_jsvmp

① 补环境和该篇文章的解决思路差不多,当然视频里举例的sign传入的参数可能不准确,具体的有兴趣的需要自己去插桩测试验证下,本篇文章重点在扣代码逻辑

js逆向案例-某suanshu_jsvmp

② 扣代码正式逻辑:如果你看完逆向简史公众号的文章你一定知道signature 是由 9 部分组成的,第一部分是固定参数,剩余的8部分都分别由相应的算法逻辑生成
js逆向案例-某suanshu_jsvmp

③ 接着重中之重的是打日志断点插桩的位置:分别在arcawler.js的184行和425行加入日志插桩断点,内容如下:

"索引j", j,"索引O", O, " 值:", JSON.stringify(S, function(key, value) {if (value == window) {return undefined} return value})

js逆向案例-某suanshu_jsvmp

④ 然后我们清除网页缓存,刷新网页,会发现大概有1.5w的插桩日志打印出来,而通过ctrl+f搜索,signature也在我们打印的日志里面输出了,也就是j ===24 && O === 40336这个位置有了signature以及其对应的值_02B4Z6wo00f010kDMrgAAIDCwkipWBmxc99JAzYAALBd35

js逆向案例-某suanshu_jsvmp

js逆向案例-某suanshu_jsvmp

⑤ 我们继续搜索值_02B4Z6wo00f010kDMrgAAIDCwkipWBmxc99JAzYAALBd35,会发现signature的最后两位也就是第⑨部分是35,生成逻辑是c468ee35`这个字符串的后两位截取生成的,第一部分是固定参数,所以我们先分别搜索其它②~⑧这几个部分生成的位置看看规律

① _02B4Z6wo00f01 ② 0kDMr ③ gAAID ④ Cwkip ⑤ W ⑥ Bmxc9 ⑦ 9JAzY ⑧ AALBd ⑨ 35

js逆向案例-某suanshu_jsvmp

⑥ signature的第8部分,AALBd
js逆向案例-某suanshu_jsvmp

⑦ signature的第7部分,9JAzY
js逆向案例-某suanshu_jsvmp

⑧ signature的第6部分,Bmxc9
js逆向案例-某suanshu_jsvmp

⑨ signature的第5部分,W
js逆向案例-某suanshu_jsvmp

⑩ signature的第4部分,Cwkip
js逆向案例-某suanshu_jsvmp

11、signature的第3部分,gAAID
js逆向案例-某suanshu_jsvmp

12、signature的第2部分,0kDMr
js逆向案例-某suanshu_jsvmp

13、通过前面②~⑧ 部分的图片逻辑,你应该已经发现了每部分都是由单个字母拼接而成,我们拿第2部分0kDMr再详细看下这个流程,可以发现第2部分的0kDMr确实一个字母一个字母拼接而成,而每个字母都是由后面的数字转换而成

js逆向案例-某suanshu_jsvmp

14、也就是2部分0kDMr的生成逻辑就是数字通过fromCharCode()转换成字母然后再拼接,那其实我们只要继续研究这个[48]、[107]、[68]、[77]、[114]这些数字是怎么生成的即可,这个你在逆向简史的公众号里面也可以找到原因

js逆向案例-某suanshu_jsvmp

15、先看下结果,[48]、[107]、[68]、[77]、[114]这些数字的生成方式如下,它们都共用了35394057981102这个14位长度的数字,并且按一定的运算方式顺序获得

js逆向案例-某suanshu_jsvmp

上面的9部分signature的每个字母拼接都有可能由长数字经过一定的运算转换而来,所以我们要研究35394057981102(长数字)是怎么生成的,以及对应的每个字母的运算方式,比如哪些数字是固定的,又该用哪种运算符,这里建议直接研究逆向简史的公众号的付费文章部分(真的超牛,无比敬佩),看完后如果还不会再选择是否看本付费区的进一步讲解

16、14位长度的35394057981102(长数字),先说结果,它其实是二进制转十进制得到的,而二进制又是怎么来的

js逆向案例-某suanshu_jsvmp

17、二进制数又是由两个二进制数拼接而成,其中一个二进制数10000000110000转成十进制就是8240,经过多次验证这个是固定的,所以我们只需要推理剩余的那个二进制是怎么生成的即可

js逆向案例-某suanshu_jsvmp

18、接下来我们先简单看下一个样例35393859502856(长数字) ,的整个推理逻辑结果,从上往下是逆向的思路,从下往上看就是正向的思路了,最终推理得要准备两个初始化变量,10位时间戳+url链接 即可

js逆向案例-某suanshu_jsvmp

19、在步骤18的图中,你可能会疑问上面那个推理逻辑是怎么得出来的,请看如下视频讲解带你单步调试,看完下面的视频你就明白了如何推理signature的第②部分vw6Eg单个字符如v的生成逻辑,而它的每个字符都是如下的生成逻辑,只有部分的数字有细微的差别;部分代码逻辑已整理好在文档末尾

js逆向案例-某suanshu_jsvmp

20、在步骤19的图中,你还可能会想SDBHash这个函数是怎么得出来的,这次我们直接从hash值操作那里开始看,由于刷新了网页,所以数字与前面步骤不一致,但是位置是一致的,请看如下视频带你单步调试,链接与时间戳的hash生成位置在索引j 31 索引O 17864  值

js逆向案例-某suanshu_jsvmp

js逆向案例-某suanshu_jsvmp

21、在步骤19的图中,你还可能会想我是怎么知道到数字中间用什么运算符的,一个是靠猜,另一个则是靠调试,请看如下视频讲解带你单步调试,比如我们是如何发现"1645450805"执行了charCodeAt(0),通过如下图你可能发现规律在索引j 49 索引O 17844  值:的位置生成,是其前一个步骤j===16 &O===17842 生成的,所以我们接下来采用条件断点的方式去找运算符是什么

js逆向案例-某suanshu_jsvmp

js逆向案例-某suanshu_jsvmp

js逆向案例-某suanshu_jsvmp

22、至此,通过前面的视频我们已经知道了长数字的生成方式,以及如何找到规律写成SDBhash代码,以及如何找到数字之间的运算符是什么,那再回到步骤19即signature第②部分vw6Eg,把生成逻辑封装成如下函数,可见signature的第②部分已经成功逆向出来

js逆向案例-某suanshu_jsvmp

23、避免大佬们踩坑,如下图是生成长数字,以及signature前⑤部分的生成逻辑,后面的⑥~⑨自己试试看,虽然部分有点难,细心点可以摸索出来的

js逆向案例-某suanshu_jsvmp

24、至此signature关键逻辑已讲解完,加油

js逆向案例-某suanshu_jsvmp

25、响应加密是aes-cfb-128加密,只要找到key和iv就行,key、iv的话可以从谷歌开发者工具右侧Scope里面猜测出;aes-cfb-128可参考这篇文章https://www.wslmf.com/post/592.html解决,测试运行结果正常

js逆向案例-某suanshu_jsvmp

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

js逆向案例-某suanshu_jsvmp

五、本案例类似好文章分享

① 某量算数jsvmp算法分析

② 某乎请求头签名算法分析

③ 某音新版本逻辑分析

④ 网洛者-反反爬练习平台第七题(JSVMPZL - 初体验)

⑤ 猿人学-反混淆刷题平台第十八题(jsvmp)

⑥ 某音web端的_signature参数破解

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

jsvmp虚拟机保护

https://www.cnblogs.com/luoxiaoer/p/11735768.html

⑨ 如果觉得文章还不错的话,记得关注支持一下哦~

原文始发于微信公众号(逆向OneByOne):js逆向案例-某suanshu_jsvmp

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年10月18日22:52:48
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   js逆向案例-某suanshu_jsvmphttps://cn-sec.com/archives/1881718.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息