我正在分析一个恶意的 javascript。代码的编码和混淆方式我什至还没有设法进行部分去混淆,并且它充满了长字符串。为了简化任务,我将代码放到JShint 中。根据该工具,有 82 个变量未使用:
鉴于上下文,假设这些变量存在的原因最有可能增加混淆但不执行任何操作是否安全?删除这些变量的声明并使用更短的代码是否合理?
我正在分析一个恶意的 javascript。代码的编码和混淆方式我什至还没有设法进行部分去混淆,并且它充满了长字符串。为了简化任务,我将代码放到JShint 中。根据该工具,有 82 个变量未使用:
鉴于上下文,假设这些变量存在的原因最有可能增加混淆但不执行任何操作是否安全?删除这些变量的声明并使用更短的代码是否合理?
添加这些变量只是为了混淆分析,这可能是真的,但请记住,在 Javascript 中有很多方法可以访问变量,因此我会从自动化工具中获取此类信息,并稍加保留。
这可能是真的,但也可能是这段代码使用了对这 82 个变量的非直接访问。
有这样的代码:
re = 'testing a variable';
alert(window['re']);
JSHint 会告诉你变量没有被使用,但它被使用了。eval
将是 linter 可能错过的间接使用的另一个示例。
通常,只有在您进行第一个反混淆步骤之前,未使用的变量才会被使用。
首次运行后,您可以看到某些代码使用这些变量,例如使用 eval。这是因为前面的混淆步骤使 vars 看起来像是未使用的,只是因为它们在代码中的使用在(再次)前面的步骤中被混淆了。
例如。您可以使用 eval 和 base64 编码来隐藏一段代码的使用。
在像您这样的情况下,我倾向于使用 IDE 工具删除明显未使用的代码,然后,如果代码仍在工作,我可以确定我从代码中删除了无用的迷雾。
个人意见:JsHint 只能在 JavaScript 编码混乱时检测二手车……使用 window 对象访问变量的警报使 JsHint 失明。对于这个特定目的不是一个很好的帮助。
显然,当您尝试恶意代码时,您需要运行各种沙箱、软件和硬件隔离和模拟。
这有点离题,但如果您将分析恶意软件作为您的日常工作,您会发现自己没有时间对偶然发现的每个脚本进行反混淆处理。
我强烈建议您熟悉 - 例如 - SpiderMonkey ( https://blog.didierstevens.com/programs/spidermonkey/ )。
另请参阅如何对这样的混淆 javascript 文件进行反混淆处理?这可能会引导您走向正确的方向。