Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[软技能] 第119天 你对jsfuck有了解吗?它的原理是什么?请举例说明 #1060

Open
haizhilin2013 opened this issue Aug 12, 2019 · 5 comments
Labels
软技能 软技能

Comments

@haizhilin2013
Copy link
Collaborator

第119天 你对jsfuck有了解吗?它的原理是什么?请举例说明

@haizhilin2013 haizhilin2013 added the 软技能 软技能 label Aug 12, 2019
@ghost
Copy link

ghost commented Aug 13, 2019

真要解释我也解释不来,大概是这么个思路:

[] 这是数组字面量

逻辑非(取反)操作符会将所有东西转成 boolean

  • ![] false
  • !![] true

+X 正号将所有东西转成 number

X+[] 这个实际上执行了 X.toString() + [].toString(),相当于直接给 X toString 了;

[][+[]] 要获得 undefined 可以访问数组里不存在的元素,这里访问 0 就行;

然后就可以获得 truefalseundefined 字符形式里的字符了:

![]+[] // 'false'
!![]+[] // 'true'
[][+[]]+[] // 'undefined'

然后随便选一个可以访问的函数(注意这里说“可以访问“,因为我们得到的字符还不完全),我们就可以获得更多字符,这里选用 Array.prototype.find

[][... undefined 中拆出来 'find']+[]
// => 'function find() { [ native code ] }'

并且可以获得 Function 构造器,这使得我们可以执行任何字符串形式的代码:

[][... undefined 中拆出来 'find'][...从各处拆出来 'constructor']
// => function Function() { [ native code ] }

[]
[... undefined 中拆出来 'find']
[...从各处拆出来 'constructor']
(...字符串形式的代码)
()
// 这可以执行这段字符串形式的代码

还有一堆依赖废弃方法等等的 hack,我看着有点恶心,就不讲了

@mwangshuxin
Copy link

能不能用一句话说下 到底是干嘛用的

@xxf1996
Copy link

xxf1996 commented Aug 13, 2019

之前好像看过一点,反正这种代码可读性很差;简言之,JSFuck就是用[]()!+这六个字符完成JS代码。

@EmiyaYang
Copy link

EmiyaYang commented Aug 13, 2019

这个东西转换出来就不是为了给人直接读的,算是一种js代码的混淆加密方法。但是转换出来代码量太大,真要应用也只能挑一些核心代码进行加密。

@jamsehua
Copy link

之前好像看过一点,反正这种代码可读性很差;简言之,JSFuck就是用[]()!+这六个字符完成JS代码。

大佬们是不是都这么写的

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
软技能 软技能
Projects
None yet
Development

No branches or pull requests

5 participants