SpiderCrawl|js逆向案例-jsvmp纯扣逻辑


目录

        • 一、常用的js基础知识
        • 二、常用的谷歌操作
        • 三、jsvmp的特征
        • 四、jsvmp扣逻辑

一、常用的js基础知识
  • js各种运算符:比如位运算符:&、|、^、~、<<、>>、>>> ,算术运算符:+、-、*、/、%、++、--
    SpiderCrawl|js逆向案例-jsvmp纯扣逻辑
    文章图片

    SpiderCrawl|js逆向案例-jsvmp纯扣逻辑
    文章图片

  • 三元运算符又称条件运算符?:表达式结果为true执行冒号前的:value = https://www.it610.com/article/表达式 ?为true执行:为false执行 ,比如a = 5> 3 ? “true” : “false”
    SpiderCrawl|js逆向案例-jsvmp纯扣逻辑
    文章图片

    SpiderCrawl|js逆向案例-jsvmp纯扣逻辑
    文章图片

    SpiderCrawl|js逆向案例-jsvmp纯扣逻辑
    文章图片

  • String.fromCharCode(num):可接受一个指定的 Unicode 值,然后返回一个字符串
    SpiderCrawl|js逆向案例-jsvmp纯扣逻辑
    文章图片

  • 'str'.charCodeAt(num):返回字符串指定位置单个字符串的Unicode编码
    SpiderCrawl|js逆向案例-jsvmp纯扣逻辑
    文章图片

  • parseInt():把一个字符串对象转换为一个指定进制的Number
    SpiderCrawl|js逆向案例-jsvmp纯扣逻辑
    文章图片

  • toString():把一个Number对象转换为一个指定进制的字符串
    SpiderCrawl|js逆向案例-jsvmp纯扣逻辑
    文章图片

  • 【SpiderCrawl|js逆向案例-jsvmp纯扣逻辑】slice():截取指定位置范围的字符串
    SpiderCrawl|js逆向案例-jsvmp纯扣逻辑
    文章图片

二、常用的谷歌操作
  • 谷歌开发者工具打断点,如鼠标选择行号右击,插桩断点Add logpoint可以打出日志,如条件断点Add conditional breakpoint可以根据输入的条件表达式为true的时候自动debugger住
    SpiderCrawl|js逆向案例-jsvmp纯扣逻辑
    文章图片
  • xhr断点监控:根据url请求中的链接参数特征,指定监控
    SpiderCrawl|js逆向案例-jsvmp纯扣逻辑
    文章图片
三、jsvmp的特征
  • jsvmp的特征:请求参数signature反爬,加密算法文件为acrawler.js以及文件里面典型的提示字符window)._$jsvmprt("
    SpiderCrawl|js逆向案例-jsvmp纯扣逻辑
    文章图片
  • 关于jsvmp的代码逻辑有点类似生成器执行,可以看这篇文章简单了解下
  • 关于jsvmp生成的逻辑思路看这篇文章,简单了解下
  • 关于jsvmp虚拟机保护方案
  • 关于jsvmp的解法一般有3种,补环境,和插桩扣逻辑,jsrpc,当然还有自动化等方式可自行研究试试
  • 补环境的可以看这篇文章有相关介绍 ,网上有很多,可随意查找
  • 插桩扣逻辑的可以看这两篇文章:逆向简史的公众号,文章前半部分讲了补环境的关键点,文章后半部分讲了如何扣代码的关键点,以及关键的算法函数,强烈推荐,看完实际操作一遍,你会豁然开朗;当你学会了逆向简史的文章,然后再看小小白的公众号,跟着他的思路介绍再巩固一遍
四、jsvmp扣逻辑
  • 定位入口:目标参数signature,采用xhr断点定位,发现是由acrawler.js这个文件生成的,然后我们插桩日志输出,找出window.byted_acrawler.sign函数的传入参数,然后就可以通过补环境的方式生成signature,补环境和该篇文章的解决思路差不多,此处视频讲解在公众号:逆向OneByOne有
    SpiderCrawl|js逆向案例-jsvmp纯扣逻辑
    文章图片

    SpiderCrawl|js逆向案例-jsvmp纯扣逻辑
    文章图片

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

  • 接着重中之重的是打日志断点插桩的位置:分别在arcawler.js的184行和425行加入日志插桩断点,内容如下
    "索引j", j,"索引O", O, " 值:", JSON.stringify(S, function(key, value) {if (value =https://www.it610.com/article/= window) {return undefined} return value})

    SpiderCrawl|js逆向案例-jsvmp纯扣逻辑
    文章图片

    SpiderCrawl|js逆向案例-jsvmp纯扣逻辑
    文章图片

  • 然后我们清除网页缓存,刷新网页,会发现大概有1.5w的插桩日志打印出来,而通过ctrl+f搜索,signature也在我们打印的日志里面输出了,也就是j ===24 && O === 40336这个位置有了signature以及其对应的值_02B4Z6wo00f010kDMrgAAIDCwkipWBmxc99JAzYAALBd35
    SpiderCrawl|js逆向案例-jsvmp纯扣逻辑
    文章图片

  • 我们继续搜索值_02B4Z6wo00f010kDMrgAAIDCwkipWBmxc99JAzYAALBd35,会发现signature的最后两位也就是第9部分135,生成逻辑是c468ee35`这个字符串的后两位截取生成的,然后我们分别搜索其它②~⑧这几个部分生成的位置
    ① _02B4Z6wo00f01 ② 0kDMr ③ gAAID ④ Cwkip ⑤ W ⑥ Bmxc9 ⑦ 9JAzY ⑧ AALBd ⑨ 35

    SpiderCrawl|js逆向案例-jsvmp纯扣逻辑
    文章图片

  • 每部分都是由单个字母拼接而成,我们拿第2部分0kDMr再详细看下这个流程
    SpiderCrawl|js逆向案例-jsvmp纯扣逻辑
    文章图片

    SpiderCrawl|js逆向案例-jsvmp纯扣逻辑
    文章图片

    SpiderCrawl|js逆向案例-jsvmp纯扣逻辑
    文章图片

    SpiderCrawl|js逆向案例-jsvmp纯扣逻辑
    文章图片

    SpiderCrawl|js逆向案例-jsvmp纯扣逻辑
    文章图片

  • 最终第2部分0kDMr的生成逻辑就是这个,那其实我们只要继续研究这个[48]、[107]、[68]、[77]、[114]这些数字是怎么生成的即可;这个你在逆向简史的文章里面也可以找到答案,或者在我公众号里面的视频里也能知道如何去逆出这个结果
    SpiderCrawl|js逆向案例-jsvmp纯扣逻辑
    文章图片

  • 比如48是(35394057981102>>2>>24)&63-4得到的,35394057981102其实是由二进制转换而来,由于细节太多,讲不清楚,可以到逆向简史的文章继续看分析逻辑
    SpiderCrawl|js逆向案例-jsvmp纯扣逻辑
    文章图片

  • 对啦,我开了微信公众号:逆向OneByOne,后面有些我以前发的比较好的文章会逐步迁移到公众号下

    推荐阅读