关注它,不迷路。
本文章中所有内容仅供学习交流,不可用于任何商业用途和非法用途,否则后果自负,如有侵权,请联系作者立即删除!
在阿卡迈2.0还原后的混淆代码中,可以看到类似的代码:
- for (mU = ",",
- CU = true,
- LU = 0; LU < window["Math"]["floor"](3 * window["Math"]["random"]()) + 3; ++LU) {
- for (lU = 0; lU < window["Math"]["floor"](3 * window["Math"]["random"]()) + 3; ++lU)
- mU += VU[window["Math"]["floor"](window["Math"]["random"]() * VU["length"])];
-
-
- mU += ",";
- }
代码中有 很多的 window 标识,它是可以进一步进行处理的:
- for (mU = ",", CU = true, LU = 0; LU < Math["floor"](3 * Math["random"]()) + 3; ++LU) {
- for (lU = 0; lU < Math["floor"](3 * Math["random"]()) + 3; ++lU) mU += VU[Math["floor"](Math["random"]() * VU["length"])];
-
-
- mU += ",";
- }
因为window它是浏览器的一个全局对象,而一些另外的全局对象,默认是绑定window,因此,去掉不会影响它的运行逻辑和结果。
还原前:
- for (mU = ",",
- CU = true,
- LU = 0; LU < window["Math"]["floor"](3 * window["Math"]["random"]()) + 3; ++LU) {
- for (lU = 0; lU < window["Math"]["floor"](3 * window["Math"]["random"]()) + 3; ++lU)
- mU += VU[window["Math"]["floor"](window["Math"]["random"]() * VU["length"])];
-
-
- mU += ",";
- }
还原后:
- for (mU = ",", CU = true, LU = 0; LU < Math["floor"](3 * Math["random"]()) + 3; ++LU) {
- for (lU = 0; lU < Math["floor"](3 * Math["random"]()) + 3; ++lU) mU += VU[Math["floor"](Math["random"]() * VU["length"])];
-
-
- mU += ",";
- }
提前将 MemberExpression 类型统一成 a[b] 格式,方便处理;
直接遍历 MemberExpression 表达式,判断其object是否为 Identifier 类型,并且其值必须是 "window";
利用浏览器上的window对象,判断 typeof window[property.value] 的结果;
如果上述判断不是 undefined,说明它是 浏览器上的全局对象,直接替换即可。
- const MemberExpressionToIdentifier = {
- MemberExpression(path) {
- let {object, property} = path.node;
-
-
- if (!types.isIdentifier(object, {
- name: "window"
- }) || !types.isStringLiteral(property) || typeof window[property.value] == 'undefined') {
- return;
- }
- let IdentifierNode = types.Identifier(property.value);
- path.replaceWith(IdentifierNode);
- }
- }
注意,该插件需要在浏览器上运行。运行方法请参考这篇文章:
今天的文章就分享到这里,后续分享更多的技巧,敬请期待。

欢迎加入知识星球,学习更多AST和爬虫技巧。