程序员

[js反混淆]用压缩的方式优化混淆代码

2019-10-09  本文已影响0人  Wayne维基

压缩

提高网络传输性能的方法之一是把js文件减小,减少传输量(其实现在带宽已经比10年前好很多,1M代码压缩到400KB,用户感觉没有那么明显)

压缩怎么反混淆,听起来有点不可思议,诚然,压缩去掉空格和注释,是混淆手段才对,实际上压缩在很多方面能帮助我们优化混淆后的代码(注意,不能直接反混淆代码,反混淆没有这么简单)

举例:比如压缩可以优化代码的if条件,让代码变得更精简,减少冗余的代码量。

压缩常用工具有

uglifyjs 安装和使用

npm install uglify-js -g
uglifyjs input.js -o input.min.js

uglifyjs2压缩部分详解

官网原文

基于AST对代码大小进行优化的树型变换器。主要优化的方式有:

调用方式

ast = UglifyJS.parse(code);
ast.figure_out_scope();
compressor = UglifyJS.Compressor({ ...compressor_options... });
ast = ast.transform(compressor);
code = ast.print_to_string(); // 获取压缩结果

默认参数在大多数情况下获得最好的压缩效果,推荐的参数如下:

sequences     : true,  // 逗号表达式连接短句 
properties    : true,  // 优化属性获取方式 a["foo"] → a.foo
dead_code     : true,  // 删除不可达代码
drop_debugger : true,  // 丢弃调试代码
unsafe        : false, // 部分不安全的优化 (see below)
conditionals  : true,  // 优化条件表达式
comparisons   : true,  // 优化比较
evaluate      : true,  // 计算常量表达式
booleans      : true,  // 优化二进制表达式
loops         : true,  // 优化循环
unused        : true,  // 丢弃无用的代码
hoist_funs    : true,  // hoist function declarations
hoist_vars    : false, // hoist variable declarations
if_return     : true,  // optimize if-s followed by return/continue
join_vars     : true,  // join var declarations
cascade       : true,  // try to cascade `right` into `left` in sequences
side_effects  : true,  // drop side-effect-free statements
warnings      : true,  // warn about potentially dangerous optimizations/code
global_defs   : {}     // 全局定义

全局声明
这个功能可以用于按条件丢弃代码,例如,如果你这样传入:

global_defs: {
    DEBUG: false
}

压缩器会认定这是一个常量,并且丢弃如下不可达的代码:

if (DEBUG) {
    ...
}

这个可以用于丢弃一些只有开发版本使用的代码,使之在发布环境中不可见。

在早期的UglifyJS版本中,你要做类似的定义需要传入一个AST树,但是在版本2中,不再需要如此,仅仅在全局定义中传入JS的常量。

举例在反混淆中的实战举例

压缩去掉一些冗余的符号.png 压缩可以做到一些进制的转化.png 括号的压缩.png

其他例子

image.png image.png image.png image.png image.png

补充资料

上一篇 下一篇

猜你喜欢

热点阅读