AST反混淆实战|reese84_jsvmp反编译前的优化处理

关注它,不迷路。

本文章中所有内容仅供学习交流,不可用于任何商业用途和非法用途,否则后果自负,如有侵权,请联系作者立即删除!

1.样本DEMO**:**

javascript 复制代码
var aaa = function (A) {    return function (B) {      return function (A) {        return Q[function (A) {          return function (A) {            return function (B) {              return function (A) {                return +function (A) {                  return !function (A) {                    return null;                  }();                }();              }() << A();            };          }(function (A) {            return !function (A) {              return null;            }();          })();        }()];      }()[A()];    };}

2.代码分析**:**

最显眼的莫过于 return null 了,因为它是一个字面量,并且代码也比较单一,比如这段代码里:

javascript 复制代码
return !function (A) {   return null;}();

这里的形式参数A,其实是没有用的。可以直接还原成 return !null

其实也就是

javascript 复制代码
!function (A) {return null;}();

===>

javascript 复制代码
!null;

这样的拆解,大家更容易理解。

根据特征写还原插件,优化后的代码如下:

javascript 复制代码
var aaa = function (A) {  return function (B) {    return Q[function (A) {      return function (A) {        return function (B) {          return function (A) {            return +function (A) {              return !null;            }();          }() << A();        };      }(function (A) {        return !null;      })();    }()][A()];  };};

这里,又看到了 !null ,又可以进行处理,即:

!null ===> true;

这个使用 常量折叠插件 就可以了。优化后的代码如下:

javascript 复制代码
var aaa = function (A) {  return function (B) {    return Q[function (A) {      return function (A) {        return function (B) {          return function (A) {            return +function (A) {              return true;            }();          }() << A();        };      }(function (A) {        return true;      })();    }()][A()];  };};

这里的 return true 这第一步是类似的,因此又回到了第一步的处理。加个循环处理就好,优化后的代码:

javascript 复制代码
var aaa = function (A) {  return function (B) {    return Q[function (A) {      return function (A) {        return function (B) {          return 1 << A();        };      }(function (A) {        return true;      })();    }()][A()];  };};

处理后,发现,仍然有地方没有被处理,如

javascript 复制代码
(function (A) { return true;})()

拿去在线网站上进行解析,发现它被解析成了FunctionExpression,并不是我们以为的CallExpression,而且,它仅仅只是作为实参,因此没有被之前的插件处理。

这时,我们从其他地方入手,发现了这个:

javascript 复制代码
function (A) {  return function (A) {    return function (B) {      return 1 << A();    };  }(function (A) {    return true;  })();}()

它其实可以直接出值,虽然是个callexpression,但是直接eval的话会报错,你可以给它赋给另外一个变量,如:

javascript 复制代码
var aaa = function (A) {  return function (A) {    return function (B) {      return 1 << A();    };  }(function (A) {    return true;  })();}()

这个时候就可以进行处理了,还原后的效果如下:

javascript 复制代码
var aaa = function (A) {  return function (B) {    return Q[2][A()];  };};

这就是还原后的最终形态了,当然,它只一个例子,并不包含所有情况,如:

javascript 复制代码
function (A) {    return function (B) {      return function (A) {        return function (B) {          return false + A();        };      }(function (A) {        return window;      })()[A()];    };  }

因为window不是字面量,并且在node下面是未定义的,因此是没办法直接得出值的。

这个时候,我们可以根据形参的引用用实参来替换形参,它的还原效果:

javascript 复制代码
function (A) {    return function (B) {      return function () {        return function (B) {          return false + window;        };      }()()[A()];    };  }

还能继续简化:

javascript 复制代码
function (A) {  return function (B) {    return (false + window)[A()];  };};

继续简化:

javascript 复制代码
function (A) {  return function (B) {    return ('false[object Window]')[A()];  };};

这应该就是它简化后的最终形态了。

今天的分享就到这里,感谢阅读。

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

相关推荐
程序员萌萌1 分钟前
Java之mysql实战讲解(三):聚簇索引与非聚簇索引
java·mysql·聚簇索引
tankeven7 分钟前
动态规划专题(03):区间动态规划从原理到实践(未完待续)
c++·算法·动态规划
天若有情67311 分钟前
【C++原创开源】formort.h:一行头文件,实现比JS模板字符串更爽的链式拼接+响应式变量
开发语言·javascript·c++·git·github·开源项目·模版字符串
天***885215 分钟前
Edge 浏览器离线绿色增强版+官方安装包,支持win7等系统
前端·edge
好家伙VCC15 分钟前
**发散创新:基于Python与ROS的机器人运动控制实战解析**在现代机器人系统开发中,**运动控制**是实现智能行为的核心
java·开发语言·python·机器人
漫游的渔夫23 分钟前
别再直接 `json.loads` 了!AI 返回的 JSON 坑位指南
前端·人工智能
软件工程师文艺35 分钟前
从0到1:Claude Code如何用React构建CLI应用
前端·react.js·前端框架
程序员萌萌37 分钟前
Redis的缓存机制和淘汰策略详解
数据库·redis·缓存机制·淘汰策略
M ? A1 小时前
Vue 迁移 React 实战:VuReact 一键自动化转换方案
前端·vue.js·经验分享·react.js·开源·自动化·vureact
yuki_uix1 小时前
重排、重绘与合成——浏览器渲染性能的底层逻辑
前端·javascript·面试