MOD开发讨论

JsFuck 部分运作原理

我是***Lv.3 中级会员 发表于 2024-2-4 · 最后回复 2024-9-22 IP:河北省 1,951 4
Jsfuck官网: https://jsfuck.com/
Jsfuck呢作为一种很有意思的js编码方式,经常被用来加密或者整活

这是官方的介绍
  1. JSFuck is an esoteric and educational programming style based on the atomic parts of JavaScript. It uses only six different characters to write and execute code.

  2. It does not depend on a browser, so you can even run it on Node.js.

  3. Use the form below to convert your own script. Uncheck "eval source" to get back a plain string.
复制代码


这是官方的描述
Basics

  1. false       =>  ![]
  2. true        =>  !![]
  3. undefined   =>  [][[]]
  4. NaN         =>  +[![]]
  5. 0           =>  +[]
  6. 1           =>  +!+[]
  7. 2           =>  !+[]+!+[]
  8. 10          =>  [+!+[]]+[+[]]
  9. Array       =>  []
  10. Number      =>  +[]
  11. String      =>  []+[]
  12. Boolean     =>  ![]
  13. Function    =>  []["filter"]
  14. eval        =>  []["filter"]["constructor"]( CODE )()
  15. window      =>  []["filter"]["constructor"]("return this")()
复制代码


讲解
想要理解jsfuck需要对js有足够的基础,接下来我来对内容进行详细的讲解
  1. false >![]
复制代码

[]代表数组类型,我们要把他转换成原始类型
我们先试着用valueof方法还原 然后发现他会报错
既然valueof不行 那么我们就换一种方法
  1. [].toString()
复制代码

我们试着将[]转换为字符串
这样我们就得到了一个空字符串
此时他是有值的 值是一个空字符串 所以他就代表true
那么![] = !true就能得出false

然后再讲一下true
为什么true前面要加上两个!呢
因为[]就代表[]
!!代表!false也就是true

undefined同理
[]表示数组[][[]]就表示数组[]里的第[]个
然后我们可以把他理解为[][1]
拿 true == 1 举例 他返回true
true会转换为1
[]的第一位没有声明值
所以返回undefined

NaN代表非数字(not a number)
我们来分析一下
[![]] 的意思我们可以理解为false
( 为啥看前面 我就不老讲了 )
false是一个布尔值
所以就会返回NaN
不是一个数字

+[]很好理解
[]代表空字符串
+运算符遇到数组时会先调用toString()来将数组转换为字符串,然后转换为数字相加
那不就是0么

然后讲一下类型
Array表示数组 这个很基础 都知道应该
+[] 把空字符串转换为数字类型也就是Number
String 运用了+号的特性 []代表""
那字符串之间用+代表拼接 所以[]+[]不是数字类型
而是字符串类型
因为值可以代表布尔类 所以[]加上逻辑运算符!就可以得到布尔变量 这个一般用来判断是否存在值 而不需要typeof返回类型

function我没理解还 等我研究透了我再讲
回复 4 最早 最新 只看楼主
您需要登录后才可以回帖 登录 | 立即注册
本版积分规则