如何调用 Javascript 数组的项目?

逆向工程 去混淆 javascript
2021-06-12 00:24:04

假设我有以下 Javascript 数组:

var _0xe984=[ '\x61\x70\x70\x6c\x79',
  '\x72\x65\x74\x75\x72\x6e\x20\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x28\x29\x20',
  '\x7b\x7d\x2e\x63\x6f\x6e\x73\x74\x72\x75\x63\x74\x6f\x72\x28\x22\x72\x65\x74\x75\x72\x6e\x20\x74\x68\x69\x73\x22\x29\x28\x29',
  '\x69\x74\x65\x6d', '\x65\x76\x61\x6c', 
  '\x77\x68\x69\x6c\x65\x28\x74\x72\x75\x65\x29\x7b\x7d',
  '\x5b\x62\x62\x4e\x6a\x6b\x59\x56\x63\x6e\x64\x76\x75\x53\x67\x4a\x67\x50\x55\x65\x6d\x51\x5d',
  '\x77\x61\x62\x62\x4e\x6a\x6b\x59\x56\x63\x69\x72\x2e\x69\x6e\x64\x6f\x76\x75\x53\x67\x4a\x67\x50\x55\x65\x6d\x51',
  '\x72\x65\x70\x6c\x61\x63\x65', '\x66\x6f\x72\x45\x61\x63\x68',
  '\x63\x6f\x6e\x73\x74\x72\x75\x63\x74\x6f\x72',
  ...<TRUNCATED FOR READABILITY>...,
  '\x64\x65\x62\x75\x67\x67\x65\x72'];

我使用jsnice.org对这段代码进行反混淆处理,结果得到:

_0xe984("0xa")

我的问题是是否_0xe984("0xa")相当于_0xe984.10?

2个回答

_0xe984您示例中的变量是一个字符串数组,因此,调用它_0xe984("0xa")实际上就像调用一个以字符串“0xa”作为参数的函数一样。因此,解释器将抛出异常,因为_0xe984它不是函数。

但是,调用_0xe984[0xa]将输出数组索引 0xa(即索引 10)中的项_0xe984因此,如果解码后的数组如下所示:

var _0xe984 =["apply", "return (function () ", "{}.constructor("return this")()", "item", "eval", "while(true){}", "[bbNjkYVcndvuSgJgPUemQ]", "wabbNjkYVcir.indovuSgJgPUemQ", "replace", "forEach", "constructor", "return this", "length", "charCodeAt", "indexOf", "ws://gameserver.wair.uk.to:888",...]

数组的第十项是constructor

混淆的 Javascript 代码可能会遇到的另一种情况是,对象的属性被调用,就好像对象是数组一样。例如,document.createElement(...)可以编写document['createElement'](...). 因此,您可能会看到类似_0xe984[_0xe984[0xc]]调用length数组对象属性的内容_0xe984('length' 是数组中的第 12/0xc 项),这将导致数组的长度 (124)。

您可以使用 powershell 像这样获取数组中的第 i 个元素

:\>([regex]::Unescape((Get-Content .\copypaste.txt))).Split(",")[10]
'constructor'