我是李君子 发表于 2024-2-4 14:04:50

JsFuck 部分运作原理

Jsfuck官网: https://jsfuck.com/
Jsfuck呢作为一种很有意思的js编码方式,经常被用来加密或者整活

这是官方的介绍
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.

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

Use the form below to convert your own script. Uncheck "eval source" to get back a plain string.

这是官方的描述
Basics
false       =>![]
true      =>!![]
undefined   =>[][[]]
NaN         =>+[![]]
0         =>+[]
1         =>+!+[]
2         =>!+[]+!+[]
10          =>[+!+[]]+[+[]]
Array       =>[]
Number      =>+[]
String      =>[]+[]
Boolean   =>![]
Function    =>[]["filter"]
eval      =>[]["filter"]["constructor"]( CODE )()
window      =>[]["filter"]["constructor"]("return this")()


讲解
想要理解jsfuck需要对js有足够的基础,接下来我来对内容进行详细的讲解
false >![]
[]代表数组类型,我们要把他转换成原始类型
我们先试着用valueof方法还原 然后发现他会报错
既然valueof不行 那么我们就换一种方法
[].toString()
我们试着将[]转换为字符串
这样我们就得到了一个空字符串
此时他是有值的 值是一个空字符串 所以他就代表true
那么![] = !true就能得出false

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

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

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

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

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

function我没理解还 等我研究透了我再讲

我是李君子 发表于 2024-2-4 14:09:17

冒昧问一句,都看明白了么[贴吧_滑稽]

我是Pinkstone 发表于 2024-2-4 14:14:05

jsfuck的原理类似brainfuck,其实都差不多。

我是李君子 发表于 2024-2-4 14:16:40

lihl 发表于 2024-2-4 14:14
jsfuck的原理类似brainfuck,其实都差不多。

挺有意思的

无机观察者 发表于 2024-9-22 16:13:16

输出helloworld都要6132个字符。。。
页: [1]
查看完整版本: JsFuck 部分运作原理