首页 > 解决方案 > 来自浏览器源选项卡的 JavaScript 代码 - 美化

问题描述

我试图解决 HackTheBox 邀请挑战,在那里我被定向到https://www.hackthebox.eu/invite中的inviteapi.min.js 文件。

代码以 开头eval(function(...,因为我使用的是 Google Chrome,所以我方便地按下了“{}”按钮,它将代码格式化为可读的形式(Chrome 称之为漂亮打印)。然而,尽管如此,我仍然无法从缩进的代码中获得任何有用的信息。

我发现的解决方案之一是使用 JavaScript 美化器,我使用的其中之一是https://beautifier.io/

令我惊讶的是,在将inviteapi.min.js 文件中的所有原始内容复制之后,我能够看到verifyInviteCode 和makeInviteCode 函数分别是如何工作的。

我的问题是:

1)我是否正确地说,inviteapi.min.js 文件中的 JavaScript 代码以某种方式“编码”,只有 JavaScript 美化器才能“解码”它,以便可以读取其背后的“真实内容” ?

2)如果1)的答案是肯定的,为什么会发生这种“编码”?我知道可能存在一些设计考虑 - 我认为其中之一是缩短代码量?

3)有趣的是,我在.js文件上使用了Chrome的漂亮打印功能后,我将它复制到美化网站,它无法显示与没有漂亮打印功能的.js文件内容相同的结果. 我想漂亮的打印功能引入了打破“编码”的换行符和空格字符,因此美化网站未能成功美化代码?

标签: javascript

解决方案


如果您查看 beautifier.io 发出的请求,您会看到一个请求是

https://beautifier.io/js/lib/unpackers/p_a_c_k_e_r_unpacker.js

hackthebox 上的 JS 以

eval(function(p,a,c,k,e,d){e=function(c){

因此,如果您检查 p_a_c_k_e_r_unpacker 代码,您可以看到它如何准确地尝试检测传递的代码是否使用“打包”方法进行了缩小。它使用以下正则表达式:

eval\(\(?function\(.*?(,0,\{\}\)\)|split\('\|'\)\)\))($|\n)

就我们的目的而言,可以简化为:

eval\( <some matching logic> \))($|\n)

哪个将 match eval(,然后是一些匹配逻辑,然后)是一行的结尾(或字符串的结尾)。原始缩小代码与此模式匹配;缩小和美化的代码与此模式不匹配。

此正则表达式确实取决于实际缩小的原始代码- 它不希望代码缩进,或多行或类似的东西,因为该代码实际上不会被缩小。打包程序解包程序希望传递的代码已使用 Packer 进行了缩小,之后不会被任何其他内容更改。特别是,正则表达式希望每个 eval 块在行尾结束 - 但是如果您传入的代码eval行跨越多行,则所述代码将不匹配。

美化代码并不会完全破坏您解码它的能力 - 重新缩小它然后使用重新缩小的代码调用 p_a_c_k_e_r_unpacker 非常简单。

调整正则表达式模式和解码器以正确解码甚至美化的打包程序缩小代码可能并不难,但这不是解包器作者期望它用于的目的,因此我想没有内置功能.


推荐阅读