我正在尝试解决HackTheBox邀请挑战,在这里我被定向到https://www.hackthebox.eu/invite中的Invitationapi.min.js文件。
代码以eval(function(...
开头,并且因为我使用的是Google Chrome,所以我方便地按下了“ {}”按钮,该按钮将代码格式化为可读形式(Chrome称之为漂亮字体)。但是,尽管如此,我仍然无法从缩进的代码中获得任何有用的信息。
我发现的一种解决方案是使用JavaScript美化器,其中一种是https://beautifier.io/。
令我惊讶的是,将所有原始内容复制到vitalapi.min.js文件中之后,我能够看到verifyInviteCode和makeInviteCode函数分别如何工作。
我的问题是:
1)我是否可以正确地说,invitapi.min.js文件中的JavaScript代码是以某种方式“编码”的,因此只有JavaScript美化者才能对其进行“解码”,使其背后的“真实内容”可以阅读吗?
2)如果对1)的回答为是,为什么会发生这种“编码”?我了解可能有一些设计注意事项-我认为其中之一是缩短代码量?
3)有趣的是,在.js文件上使用Chrome的漂亮打印功能后,我将其复制到美化站点,并且在没有漂亮内容的情况下,它无法显示与复制.js文件内容相同的结果打印功能。我想漂亮打印功能会引入换行符和空格字符,从而破坏了“编码”,因此美化站点无法成功美化代码?
答案 0 :(得分:0)
如果查看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)
将匹配eval(
,然后匹配一些匹配逻辑,然后匹配)
和一行的末尾(或字符串的末尾)。原始的最小化代码与此模式匹配;最小化的和美化的代码与此模式不匹配。
此正则表达式确实取决于原始代码实际上是缩小了-它不希望代码缩进或缩进多行或类似内容,因为该代码实际上不会被缩小。打包程序解压缩程序希望使用打包程序压缩传给的代码 ,之后再不进行任何其他更改。尤其是,正则表达式期望每个eval块都在行的结尾处结束-但是,如果您传入eval
行跨越多行的代码,则该代码将不匹配。
修饰代码并不能完全破坏您解码它的能力-重新最小化代码,然后使用重新最小化的代码调用p_a_c_k_e_r_unpacker很简单。
调整正则表达式模式和解码器以正确解码甚至简化了压缩程序的压缩程序可能并不难,但这并不是解压缩程序作者所期望的,因此没有内置功能,我会想象的。