JS代码混淆了,怎么反混淆回去?
这不是混淆,只是使用16进制表示的ASCII码~
单独提取出字符串,在后面加上.toString()进行调试即可看到原本字符串。
你的这句转码后如下:
window["document"]["write"]('<sc')
相当于:window.document.write('<sc')
很有可能是输出一个script标签的代码段的开始。
如果你是全局安装的,可以直接在需要混淆文件的目录下,
按住shift键右击鼠标选择在此处打开命令窗口如图
2.打开窗口后直接在窗口执行
uglifyjs main.js demo.js -o foo.min.js --source-map foo.min.js.map --source-map-root http://onbook.me -p 5 -c -m --wrap --export-all混淆文件main.js和demo.js生成foo.min.js和foo.min.js.map并指定map的来源网站
3.另一种使用方式是,把UglifyJS2包放到程序中,通过API对JS文件或JS代码进行压缩。首先,新建一个NPM项目文件package.json,然后在是下载UglifyJS2依赖包。
新建文件package.json{
"name": "nodejs-uglifyjs2",
"version": "0.0.1",
"description": "uglifyjs2",
"author": "Conan Zhang ",
"dependencies": {
}
}
4.执行npm install uglify-js --save下载UglifyJS2依赖包
5.安装完成后
新建test.js开始测试var UglifyJS = require('uglify-js')
//代码压缩
var result = UglifyJS.minify("var b = function () {}", {fromString: true})
console.log("\n===========================")
console.log(result)
//文件压缩
result = UglifyJS.minify(["demo.js"])
console.log("\n===========================")
console.log(result.code)
//多文件压缩,指定source map和网站来源
result = UglifyJS.minify(["main.js","demo.js"],{
outSourceMap: "out.js.map",
sourceRoot: "http://onbook.me",
mangle:true
})
console.log("\n===========================")
console.log(result.code)
console.log(result.map)
1:利用IE开发人员工具(IE8开始已经自带,IE7以前需要下载安装IE Developer Toolbar)进行反混淆,
2:代码实现
混淆后的测试代码
eval(function(p,a,c,k,e,d){e=function(c){return(c<a?"":e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))}if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c)k=[function(e){return d[e]}]e=function(){return'\\w+'}c=1}while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])return p}('1("0-6")2 4(){1("0-5")}8 3=2(){1("0-7")}4()3()',9,9,'忧郁的匹格|alert|function|b|a|反混淆测试2|反混淆测试1|反混淆测试3|var'.split('|'),0,{}))
开始实施:
1.新建一个网页xxx.html
2.加入一个div容器 id="divTest"
3.最关键的一步--赋值执行:(在上面混淆的代码中,将eval()中的内容提取出来赋值(或直接打印)给document.getElementById('divTest').innerText )
document.getElementById('divTest').innerText=function(p,a,c,k,e,d){e=function(c){return(c<a?"":e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))}if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c)k=[function(e){return d[e]}]e=function(){return'\\w+'}c=1}while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])return p}('1("0-6")2 4(){1("0-5")}8 3=2(){1("0-7")}4()3()',9,9,'忧郁的匹格|alert|function|b|a|反混淆测试2|反混淆测试1|反混淆测试3|var'.split('|'),0,{})
打开xxx.html 显示结果:(反混淆后的代码已经被压缩了,去掉了换行等字符)
alert("忧郁的匹格-反混淆测试1")
function a(){alert("忧郁的匹格-反混淆测试2")}
var b=function(){alert("忧郁的匹格-反混淆测试3")}
a()
b()
PS:使用packed这个混淆过的js都可以使用这个方法还原,找了几个项目里面混淆过的js都可以还原,只是去掉了换行符,
连续解码两次,这解码解码结果,看着是不是愉快多了?链接如下
https://www.w3cschool.cn/tools/index?name=evalencode
还有为什么会这样啊?有大佬给萌新解释下嘛,如果能不用网址工具之类做到就在好不过了
混淆可以用来隐藏来自外部世界的业务逻辑,它将大大减少文件的大小,因此服务器和客户机之间的数据传输速度会很快。
缩小化也是一种混淆,在这里清空空空间,并重新命名变量。
在JavaScript中,浏览器不能执行加密的代码,而浏览器会执行混淆代码。
加密的代码总是需要解密才能被执行。
混淆的代码不需要去混淆来执行。
总之,混淆JavaScript代码很好。
1. 压缩
这一操作的目的,是让最终代码传输量 (不代表代码量, 也不代表文件体积)尽可能小。压缩js的工具,常见的有:YUI Compressor、UglifyJS、Google Closure Compiler 等。
通常在代码压缩的过程中,只改变代码的语法,代码的语义和控制流不会有太大改变。
常见做法是把局部变量缩短化,把一些运算进行等价替换等。代码压缩对于代码保护有一些帮助,但由于语义和控制流基本没变,起不了太大作用。
在压缩层面上,代码不可读只是一种附带伤害,不是最终目的。
2. 混淆
这一操作的目的,是让代码尽可能地不可读,主要用作代码保护。
让代码不可读,增加分析的难度,这是唯一目的。混淆过后文件体积变大一倍也没关系,代码量变多也没关系,运算慢50% 也没关系。
常见的做法有:分离常量、打乱控制流、增加无义代码、检查运行环境如果不对就罢工,等等。
在混淆层面上,代码不可读是最终目的。
值得一提的是,Google Closure Compiler 的 Advance Level Compression 会压缩类和对象的成员,其压缩结果很难分析,也可以认为是一种混淆,但兼容性不太好。
3. 加密
有加密就有解密,意味着加密操作可逆,密文可以明文化。
在Web界,可以称之为加密的东西包括:HTTPS传输、JavaScript实现对称加密或者不对称加密等等。
1. uglifyjs混肴貌似只能针对局域成员,一旦跨引用就不能了。
2. 我还研究了node的vm模块,缺点是,沙盒配置很复杂,跨require引用时尤其
3. 还有类似eval的执行(也就是字符串注入执行),缺点是,一旦eval的加密后解密的明文,任何人可以console.log输出。
4. 一个台湾人写的叫做npk的模块,跨目录require时会有问题
其实就是输出这么一个script标签而已, 用途应该是引用了一个外网的js脚本, 你可以直接打开这个链接去查看其中的js代码
混淆不同于加密解密,因为原来有意义的字符已经被替换了,不存在算法上的反推,任何的技术不可能再得出原来的那些有意义的字符。
所以理论上,混淆后的代码无法解密。但因为它的整个运算逻辑关系链是完整的,与混淆前的代码关系链是完全一致的,所以非要“破解”,只能说摸清它的逻辑关系链,人为去做的话,烧脑又复杂。技术上需要一定的运算能力来做这个工作,比如云计算甚至超级计算机,但即便“破解”,它也是只能分析出一个函数大致是干什么用的,原来的关键字符名称还是不可能得出。
然后替换开头的eval为alert,然后保存为*.htm
最后打开制作的网页,弹出窗内的内容就是解密后的内容 ,如果你解密后复制上面代码的话,就要用火狐浏览器打开才行,IE不能复制弹出窗口的内容.