我想制作一个非开源的JavaScript应用程序,因此我想学习如何混淆我的JS代码?这可能吗?
我想制作一个非开源的JavaScript应用程序,因此我想学习如何混淆我的JS代码?这可能吗?
Answers:
混淆:
尝试使用YUI Compressor。这是一个非常流行的工具,由Yahoo UI团队构建,增强和维护。
您还可以使用:
更新:这个问题最初是在10多年前提出的,并且不再维护YUI。Google Closure编译器仍在使用,并且UglifyJS可以通过节点包管理器在本地运行:npm install -g uglify-js
私有字符串数据:
将字符串值设为私有是另一个问题,而混淆并不会带来太大好处。当然,通过将源打包成乱码,最小的混乱,您可以通过模糊性获得轻便的安全性。大多数情况下,查看源的是您的用户,客户端上的字符串值是供他们使用的,因此通常不需要这种私有字符串值。
如果您确实拥有一个您从未希望用户看到的价值,那么您将有两个选择。首先,您可以进行某种加密,该加密在页面加载时解密。那可能是最安全的选择之一,但也可能是很多不必要的工作。您可能可以对一些字符串值进行base64编码,这会更容易..但是真正想要这些字符串值的人可以轻松地对其进行解码。加密是真正阻止任何人访问您的数据的唯一方法,大多数人发现加密比他们需要的安全性更高。
边注:
众所周知,JavaScript中的混淆会导致一些错误。混淆器对此有所改善,但是许多公司认为他们可以从压缩和压缩中获得足够的好处,而增加混淆所带来的节省并不总是值得的。如果您想保护自己的源代码,也许您会认为值得这样做,只是使您的代码更难阅读。JSMin是一个很好的选择。
--preserve-semi
。将私有变量重写为a,b,c等通常是安全的。我要做的另一件事是让Minifier在代码中的每个分号之后放置一个换行符--line-break 0
。然后在生产中,如果出现错误,我至少需要一个有效的参考线来工作,并且可以在我的开发副本中找到该代码。否则,您将最终在大量代码上出现错误,并且不知道错误在哪里。
我很惊讶没有人提到Google的Closure Compiler。它不仅会缩小/压缩,还会进行分析以查找和删除未使用的代码,并进行重写以实现最大程度的缩小。它还可以进行类型检查并警告语法错误。
JQuery最近从YUI Compresser切换到Closure Compiler,并且看到了“ 坚实的进步 ”
混淆永远无法真正起作用。对于任何真正想要获取您的代码的人来说,这只是一个减速。更糟糕的是,它使您的用户无法修复错误(并将修复发送回给您),并使您更难于在现场诊断问题。浪费您的时间和金钱。
与律师讨论知识产权法以及您的法律选择是什么。“开放源代码”并不意味着“人们可以阅读源代码”。相反,开放源代码是一种特定的许可模型,它授予自由使用和修改代码的权限。如果您不授予此类许可,那么复制您的代码的人将受到侵犯,并且(在世界大多数地方)您可以通过法律选择予以阻止。
真正保护代码的唯一方法是不发布代码。将重要的代码移到服务器端,并让您的公共Javascript代码对它进行Ajax调用。
您可以混淆所有想要的javascript源,但是仅由于要求所有源代码实际在客户端计算机上运行,它始终可以反向工程...我能想到的最佳选择是完成所有处理使用服务器端代码,而javascript所做的所有客户端代码就是将处理请求发送到服务器本身。否则,任何人都将始终能够跟踪代码正在执行的所有操作。
有人提到base64是为了保护字符串安全。这是一个可怕的主意。想要对代码进行反向工程的人员类型可以立即识别Base64。他们要做的第一件事是将其取消编码并查看其内容。
有许多免费的JavaScript模糊处理工具;但是,我认为必须注意,很难混淆JavaScript到无法进行反向工程的程度。
为此,我在一定程度上加班了一些选择:
YUI压缩机。Yahoo!的JavaScript压缩器在压缩代码方面做得很好,可以缩短加载时间。有少量混淆会比较有效。本质上,Compressor将更改函数名称,删除空格并修改局部变量。这是我最常使用的。这是一个基于Java的开源工具。
JSMin是由Douglas Crockford编写的工具,旨在最小化您的JavaScript源。用克罗克福德的话来说,“ JSMin不会混淆,但是会丑化。” 它的主要目标是缩小源的大小,以便在浏览器中更快地加载。
免费的JavaScript混淆器。这是一个基于Web的工具,它试图通过对代码进行实际编码来使其模糊。我认为,其编码形式(或模糊处理)的权衡可能以文件大小为代价。但是,这是个人喜好问题。
[ZER0O00OIFY, ZER0000OIFY, ZEROO00OIFY, ZEROOO0OIFY]
至少[var1, var2,..]
在一分钟内无法找到/替换一堆var 。我可以在两分钟内从字面上消除丑陋,重新缩进和搜索/替换var名称。不,我比一般的Jr. Dev更聪明。一个简单的事实是,没有办法掩盖客户端JS。您最多可以在5分钟内购买自己的商品,但这没用。这些东西实际上只是为了卖给不知道添加“安全性”上的代码的人。从来没有写过JS系列的人会买这种垃圾。
我会做什么:
A.欺骗黑客!
这将是第二部分我伪造的/模糊的秘密javascript代码启动器。您在源代码中看到的那个。
这是什么代码?
var ajax=function(a,b,d,c,e,f){
e=new FormData();
for(f in d){e.append(f,d[f]);};
c=new XMLHttpRequest();
c.open('POST',a);
c.setRequestHeader("Troll1","lol");
c.onload=b;
c.send(e);
};
window.onload=function(){
ajax('Troll.php',function(){
(new Function(atob(this.response)))()
},{'Troll2':'lol'});
}
B.稍微混淆一下代码
那是什么?
(new Function(atob('dmFyIGFqYXg9ZnVuY3Rpb24oYSxiLGQsYyxlLGYpe2U9bmV3IEZvcm1EYXRhKCk7Zm9yKGYgaW4gZCl7ZS5hcHBlbmQoZixkW2ZdKTt9O2M9bmV3IFhNTEh0dHBSZXF1ZXN0KCk7Yy5vcGVuKCdQT1NUJyxhKTtjLnNldFJlcXVlc3RIZWFkZXIoIlRyb2xsMSIsImxvbCIpO2Mub25sb2FkPWI7Yy5zZW5kKGUpO307d2luZG93Lm9ubG9hZD1mdW5jdGlvbigpe2FqYXgoJ1Ryb2xsLnBocCcsZnVuY3Rpb24oKXsgKG5ldyBGdW5jdGlvbihhdG9iKHRoaXMucmVzcG9uc2UpKSkoKX0seydUcm9sbDInOidsb2wnfSk7fQ==')))()
C创建一个难以显示的php文件,其中包含真实代码
这是什么php代码?
如果一切正常,它将显示正确的代码,否则为假代码或ban ip,请关闭页面。
<?php
$t1=apache_request_headers();
if(base64_encode($_SERVER['HTTP_REFERER'])=='aHR0cDovL2hlcmUuaXMvbXkvbGF1bmNoZXIuaHRtbA=='&&$_POST['Troll2']=='lol'&&$t1['Troll1']='lol'){
echo 'ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSkuaW5uZXJUZXh0PSdBd2Vzb21lJzsNCg==';//here is the SECRET javascript code
}else{
echo 'd2luZG93Lm9wZW4oJycsICdfc2VsZicsICcnKTt3aW5kb3cuY2xvc2UoKTs=';
};
?>
base64引荐来源网址= http://here.is/my/launcher.html
秘密javascript = document.body.appendChild(document.createElement('div')).innerText='Awesome';
假= window.open('', '_self', '');window.close();
现在..如果您在SECRET javascript中定义事件处理程序,则可能可以访问..您需要在外部用launchcode定义它们,并指向嵌套的SECRET函数。
所以...有一种简单的方法来获取代码吗?
document.body.appendChild(document.createElement('div')).innerText='Awesome';
我不确定这是否有效,但是我正在使用chrome并检查了Elements,Resources,Network,Sources,Timeline,Profiles,Audits,但我没有找到上面的行。
注意1:如果您从Chrome中的Inspect element-> network打开Troll.php网址,则会得到假代码。
注意2:整个代码是为现代浏览器编写的。polyfill需要更多代码。
编辑
launcher.html
<!doctype html><html><head><meta charset="utf-8"><title></title><script src="data:application/javascript;base64,KG5ldyBGdW5jdGlvbihhdG9iKCdkbUZ5SUdGcVlYZzlablZ1WTNScGIyNG9ZU3hpTEdRc1l5eGxMR1lwZTJVOWJtVjNJRVp2Y20xRVlYUmhLQ2s3Wm05eUtHWWdhVzRnWkNsN1pTNWhjSEJsYm1Rb1ppeGtXMlpkS1R0OU8yTTlibVYzSUZoTlRFaDBkSEJTWlhGMVpYTjBLQ2s3WXk1dmNHVnVLQ2RRVDFOVUp5eGhLVHRqTG5ObGRGSmxjWFZsYzNSSVpXRmtaWElvSWxSeWIyeHNNU0lzSW14dmJDSXBPMk11YjI1c2IyRmtQV0k3WXk1elpXNWtLR1VwTzMwN2QybHVaRzkzTG05dWJHOWhaRDFtZFc1amRHbHZiaWdwZTJGcVlYZ29KMVJ5YjJ4c0xuQm9jQ2NzWm5WdVkzUnBiMjRvS1hzZ0tHNWxkeUJHZFc1amRHbHZiaWhoZEc5aUtIUm9hWE11Y21WemNHOXVjMlVwS1Nrb0tYMHNleWRVY205c2JESW5PaWRzYjJ3bmZTazdmUT09JykpKSgp"></script></head><body></body></html>
Troll.php
<?php $t1=apache_request_headers();if(/*base64_encode($_SERVER['HTTP_REFERER'])=='PUT THE LAUNCHER REFERER HERE'&&*/$_POST['Troll2']=='lol'&&$t1['Troll1']='lol'){echo 'ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSkuaW5uZXJUZXh0PSdBd2Vzb21lJzsNCg==';}else{echo 'd2luZG93Lm9wZW4oJycsICdfc2VsZicsICcnKTt3aW5kb3cuY2xvc2UoKTs=';}; ?>
尝试JScrambler。我最近试了一下,对此印象深刻。它为那些不太关心细节而只想快速完成的人提供了一组带有预定义设置的模糊处理模板。您还可以通过选择所需的任何转换/技术来创建自定义混淆。
与我针对YUI Compressor建议的大多数其他答案相反;您应该使用Google Closure。
并不是因为它压缩得更多,而是因为它会捕获javascript错误,例如a = [1,2,3,];
使IE陷入困境的主要原因。
您无法保护客户端代码:只需在Google Chrome上按F12键,暂停javascript执行,您将获得所有字符串,即使是加密的字符串。美化它并重命名变量,您将获得几乎原始的代码。
如果您正在编写服务器端javascript(即NodeJS),则担心有人入侵您的服务器,并希望使黑客工作更加困难,给您更多的时间来恢复访问权限,那么请使用javacript编译器:
您需要在Advanced Compilation上使用Closure Compiler,因为它是重命名所有变量的唯一工具,即使这些变量在多个文件/模块中使用也是如此。但这有一个问题:仅当您以编码风格进行编写时,它才有效。
我可以推荐Patrick J. O'Neil的JavaScript Utility。它可以混淆/压缩和压缩,在这些方面似乎还不错。也就是说,我从未尝试将其集成到任何类型的构建脚本中。
至于混淆与缩小-我不是前者的忠实拥护者。这使得调试变得不可能(在第1行出现错误...“等待,只有一行”),并且它们总是需要时间来解压缩。但是,如果您需要...很好。
我建议先使用诸如YUI Compressor之类的东西进行压缩,然后再使用诸如http://www.javascriptobfuscator.com/之类的所有字符串和数字转换为十六进制值。
这样,代码将几乎变得难以理解,我认为在此阶段,黑客重新制定代码的时间要比他从头开始重写的时间更长。重写和克隆实际上是您无法停止的。毕竟我们是自由人!
院长爱德华(Dean Edward's Packer)是一个出色的混淆器,尽管它主要混淆代码,而不是代码中可能包含的任何字符串元素。
请参阅:Online Javascript Compression Tool, 然后从下拉列表中选择Packer(Dean Edwards)
试试这个工具Javascript Obfuscator
我在HTML5游戏中使用了它,不仅使它的大小从950KB减小到150KB,而且使源代码变得不可读,关闭了编译器和缩小器,这些都是可逆的,我个人也不知道如何逆转这种混淆。
我已经使用Jasob多年了,它是最好的混淆器。
它具有高级UI,但仍然直观且易于使用。
它还将处理HTML和CSS文件。
使用它的最好办法是前缀所有的私人的东西,如下划线变量,然后使用sort
功能组它们放在一起,并检查它们关闭作为模糊的目标。
用户仍然可以查看源,但它更难以破解当你的私有变量是由类似转换_sUserPreferredNickName
到a
。
引擎将自动计算目标变量的数量,并对它们进行优先排序,以获取最大压缩率。
我不为Jasob工作,而从推广他们方面我一无所获,只是提供一些友善的建议。
缺点是它不是免费的,有点贵,但是当与其他替代品堆叠在一起时仍然值得-“免费”选项甚至还差得很远。
您尝试过Bananascript吗?它产生高度压缩且完全不可读的代码。
eval()
将最后一行更改为console.log()
,您的控制台就会吐出所有内容
我正在对Java脚本混淆使用Closure-Compiler实用程序。它使代码最小化,并且具有更多的混淆选项。可通过以下网址的Google代码获得此实用程序:
关闭工具
但是现在有几天我听到了很多UglifyJS的信息。您可以在Closure Compiler和UglifyJS之间找到各种比较,其中Uglify似乎是赢家。
UglifyJS:一种适用于Node.js的快速新型JavaScript压缩器,与封闭版本相当
很快我会给UglifyJS一个机会。
作为JavaScript / HTML / CSS混淆器/压缩器,您还可以尝试Patu Digua。
这缩小但不会混淆。如果您不想使用命令行Java,则可以将javascript粘贴到网络表单中。
您绝对应该考虑看看Obfuscriptor。
我超越了从其他工具(例如YUI Compressor或Google Closure)中看到的典型Javascript缩小技巧。
混淆的代码看起来更像是加密的。不像我以前见过的。
如果您使用JavaScript库,请考虑与Closure Compiler的Advanced模式编译兼容(经过少量修改)的Dojo Toolkit。
Dojo –唯一与Closure编译器兼容的JavaScript库
使用Closure Advanced模式编译的代码几乎不可能进行反向工程,甚至无法通过美化程序进行处理,因为整个代码库(包括库)都被混淆了。平均而言,它也小25%。
经过精简的JavaScript代码(YUI Compressor,Uglify等)在经过美化后很容易进行逆向工程。
我过去曾经使用过,而且做得很好。它不是免费的,但您绝对应该看看。
JavaScript混淆器和编码器