JSfuck原理解析三——源码解析

本文深入解析JSFuck的实现原理,从MAPPING补全到字符替换,详细阐述了如何将普通JS代码转化为JSFuck编码的过程,包括fillMissingDigits和replaceMap等关键步骤,展示了JSFuck如何使用[]()!+构建任意JavaScript代码。
摘要由CSDN通过智能技术生成

  通过前两章我们已经了解了jsfuck的基本原理与实现,现在不妨先设想一下,假设我们要自己实现这么一个加密代码,应该如何去做。

  首先,我们拿到了一段明文代码“alert(1)”,为了把他变成jsf的模式,我们要按照第二章的描述对各个字符挨个加密,最后拼接成想要的代码。那么如果我们想把这个过程工程化,我们就需要一个map,里面有每个字符对应的jsf代码,这样我们加密一串代码只需要拼接就行了,事实上jsf的原作者也是这么做的。

  打开github:https://github.com/aemkei/jsfuck,根目录下有一个叫做jsfuck.js的文件,里面部分代码如下:

const SIMPLE = {
    'false':      '![]',
    'true':       '!![]',
    'undefined':  '[][[]]',
    'NaN':        '+[![]]',
    'Infinity':   '+(+!+[]+(!+[]+[])[!+[]+!+[]+!+[]]+[+!+[]]+[+[]]+[+[]]+[+[]])' // +"1e1000"
  };

  const CONSTRUCTORS = {
    'Array':    '[]',
    'Number':   '(+[])',
    'String':   '([]+[])',
    'Boolean':  '(![])',
    'Function': '[]["fill"]',
    'RegExp':   'Function("return/"+false+"/")()',
    'Object':	'[]["entries"]()'
  };

  const MAPPING = {
    'a':   '(false+"")[1]',
    'b':   '([]["entries"]()+"")[2]',
    'c':   '([]["fill"]+"")[3]',
    'd':   '(undefined+"")[2]',
    'e':   '(true+"")[3]',
    'f':   '(false+"")[0]',
    'g':   '(false+[0]+String)[20]',
    'h':   '(+(101))["to"+String["name"]](21)[1]',
    ……
    ……

  在这里我们可以看到三个常量,其中的MAPPING确实如我们所想的一样,是一个字符与代码的对应,不过对应的值看起来并不是jsf的代码,并且有些甚至是缺失的,比如:'P': USE_CHAR_CODE。这些字符我们不能如a、b、c那样轻易的在现有的字符串中找到,需要特殊的处理。

  那么jsf的源码到底是怎么工作的呢,接下来我们就来整体分析一下jsfuck.js文件的代码。

  我们可以把代码折叠一下,得到下图:

  由上图可看出,代码分为三个部分,常量、方法、执行。

MAPPING补全:

  我们直接来看第三部分,方法的执行,第一个方法fillMissingDigits,字面意思可以看出是填补缺失的数字,代码如下:

  function fillMissingDigits(){
    var output, number, i;

    for (number = 0; number < 10; number++){

      output = "+[]";

      if (number > 0){ output = "+!" + output; }
      for (i = 1; i < number; i++){ output = "+!+[]" + output; }
      if (number > 1){ output = output.substr(1); }

      MAPPING[number] = "[" + output + "]";
    }
  }

  这段代码很简单,从中可以看出,这个方法的功能是填补MAPPING中数字(0 - 9)的键值对,如:0: '[+[]

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值