如何混淆(保护)JavaScript? [关闭]

古畅
2023-12-01
已关闭 。 这个问题需要更加 集中 。 它当前不接受答案。

想改善这个问题吗? 更新问题,使其仅通过编辑此帖子来关注一个问题。

5年前关闭。

我想制作一个非开源的JavaScript应用程序,因此我想学习如何混淆我的JS代码? 这可能吗?


#1楼

您尝试过Bananascript吗? 它产生高度压缩且完全不可读的代码。


#2楼

我会怎么做:

A.欺骗黑客!

这将是第二部分我伪造的/模糊的秘密javascript代码启动器。 您在源代码中看到的那个。

这是什么代码?

  1. 加载真实代码
  2. 设置自定义标题
  3. 发布自定义变量

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.稍微混淆一下代码

那是什么?

  1. 多数民众赞成在相同的代码与上面在base64
  2. 这不是SECRET javascript代码

(new Function(atob('dmFyIGFqYXg9ZnVuY3Rpb24oYSxiLGQsYyxlLGYpe2U9bmV3IEZvcm1EYXRhKCk7Zm9yKGYgaW4gZCl7ZS5hcHBlbmQoZixkW2ZdKTt9O2M9bmV3IFhNTEh0dHBSZXF1ZXN0KCk7Yy5vcGVuKCdQT1NUJyxhKTtjLnNldFJlcXVlc3RIZWFkZXIoIlRyb2xsMSIsImxvbCIpO2Mub25sb2FkPWI7Yy5zZW5kKGUpO307d2luZG93Lm9ubG9hZD1mdW5jdGlvbigpe2FqYXgoJ1Ryb2xsLnBocCcsZnVuY3Rpb24oKXsgKG5ldyBGdW5jdGlvbihhdG9iKHRoaXMucmVzcG9uc2UpKSkoKX0seydUcm9sbDInOidsb2wnfSk7fQ==')))()

C创建一个难以显示的php文件,其中包含真实代码

这是什么php代码?

  1. 检查正确的引荐来源网址(启动器的域/目录/代码)
  2. 检查自定义HEADER
  3. 检查自定义POST变量

如果一切正常,它将显示正确的代码,否则为假代码或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';

FAKE = 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中的“检查元素”->“网络”中打开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=';}; ?>

#3楼

混淆:

尝试使用YUI Compressor 。 这是一个非常流行的工具,由Yahoo UI团队构建,增强和维护。

您还可以使用:

私有字符串数据:

将字符串值设为私有是另一个问题,而混淆并不会带来太大好处。 当然,通过将源打包成乱码,最小的乱七八糟,可以通过模糊 获得轻便的安全性 。 在大多数情况下,查看源的是您的用户,客户端上的字符串值是供他们使用的,因此通常不需要这种私有字符串值。

如果您确实拥有一个您从未希望用户看到的价值,那么您将有两个选择。 首先,您可以进行某种加密,该加密在页面加载时解密。 那可能是最安全的选择之一,但也可能是很多不必要的工作。 您可能可以对一些字符串值进行base64编码,这会更容易..但是真正想要这些字符串值的人可以轻松地对其进行解码 。 加密是真正阻止任何人访问您的数据的唯一方法,大多数人发现加密比他们需要的安全性更高。

边注:

众所周知,JavaScript中的混淆会导致一些错误。 混淆器对此有所改善,但是许多公司认为他们发现缩小gzipping带来了足够的好处,而增加混淆所带来的节省并不总是值得的 。 如果您想保护自己的源代码,也许您会认为值得这样做,只是使您的代码更难阅读。 JSMin是一个很好的选择。


#4楼

解释语言的问题是,您发送源代码以使它们正常工作(除非您有要编译的字节码编译器,但同样,反编译起来很琐碎)。

因此,如果您不想牺牲性能,则只能对变量和函数名进行操作。 用a,b ... aa,ab ...或a101,a102等替换它们。当然,请尽可能多地删除空间/换行符(这就是所谓的JS压缩器所做的事情)。
如果您必须对字符串进行加密和实时解密,则混淆字符串会影响性能。 再加上JS调试器可以显示最终值...


#5楼

有许多免费的JavaScript模糊处理工具; 但是,我认为必须注意,很难混淆JavaScript到无法进行反向工程的程度。

为此,我在一定程度上加班了一些选择:

  • YUI压缩机 。 Yahoo!的JavaScript压缩器在压缩代码方面做得很好,可以缩短加载时间。 有少量混淆会比较有效。 本质上,Compressor将更改函数名称,删除空格并修改局部变量。 这是我最常使用的。 这是一个基于Java的开源工具。

  • JSMin是由Douglas Crockford编写的工具,旨在最小化您的JavaScript源。 用克罗克福德的话来说,“ JSMin不会混淆,但是会丑化。” 它的主要目标是缩小源的大小,以便在浏览器中更快地加载。

  • 免费的JavaScript混淆器 。 这是一个基于Web的工具,它试图通过对代码进行实际编码来使其模糊。 我认为,其编码形式(或模糊处理)的权衡可能以文件大小为代价。 但是,这是个人喜好问题。


#6楼

我可以推荐Patrick J. O'Neil的JavaScript Utility 。 它可以混淆/压缩和压缩,在这些方面似乎还不错。 也就是说,我从未尝试将其集成到任何类型的构建脚本中。

至于混淆与缩小-我不是前者的忠实拥护者。 这使得调试变得不可能(在第1行出现错误...“等待,只有一行”),并且它们总是需要时间来解压缩。 但是,如果您需要...很好。


#7楼

您可以混淆所有想要的javascript源,但由于要求所有源代码都在客户端计算机上实际运行,因此它始终可以反向工程...我能想到的最好选择是完成所有处理使用服务器端代码,而javascript所做的所有客户端代码就是将处理请求发送到服务器本身。 否则,任何人都将始终能够跟踪代码正在执行的所有操作。

有人提到base64是为了保护字符串安全。 这是一个可怕的主意。 想要对代码进行反向工程的人员类型可以立即识别Base64。 他们要做的第一件事是将其取消编码并查看其内容。


#8楼

基于Javascript的非开源应用程序非常愚蠢。 Javascript是一种客户端解释型语言。

JS模糊处理通常是为了减小脚本的大小,而不是“保护”脚本。 如果您不希望公开代码,则Java语言不是正确的语言。

周围有很多工具,但是大多数都有其名称中的“ compressor”(或“ minifier”)一词。


#9楼

您无法保护客户端代码:只需在Google Chrome浏览器上按F12键, 暂停javascript执行 ,您将获得所有字符串,即使是加密的字符串。 美化并重命名变量 ,您将获得几乎原始的代码。

如果您正在编写服务器端javascript(即NodeJS),则担心有人入侵您的服务器,并希望使黑客工作更加困难,给您更多的时间来恢复访问权限,然后使用javacript编译器

您需要在Advanced Compilation上使用Closure Compiler,因为它是重命名所有变量的唯一工具,即使这些变量在多个文件/模块中使用也是如此。 但这有一个问题:仅当您以编码风格进行编写时,它才有效。


#10楼

混淆永远无法真正起作用。 对于任何真正想要获取您的代码的人来说,这只是一个减速。 更糟糕的是,它使您的用户无法修复错误(并将修复发送回给您),并使您更难于在现场诊断问题。 浪费您的时间和金钱。

与律师讨论知识产权法以及您的法律选择是什么。 “开放源代码”并不意味着“人们可以阅读源代码”。 相反,开放源代码是一种特定的许可模型,它授予自由使用和修改代码的权限。 如果您不授予此类许可,那么复制您的代码的人将受到侵犯,并且(在世界大多数地方)您可以通过法律选择予以阻止。

真正保护代码的唯一方法是不发布代码。 将重要的代码移到服务器端,并让您的公共Javascript代码对它进行Ajax调用。

在这里查看有关混淆器的完整答案。


#11楼

作为JavaScript / HTML / CSS混淆器/压缩器,您还可以尝试Patu Digua


#12楼

我很惊讶没有人提到Google的Closure Compiler 。 它不仅会缩小/压缩,还会进行分析以查找和删除未使用的代码,并进行重写以实现最大程度的缩小。 它还可以进行类型检查并警告语法错误。

JQuery最近从YUI Compresser切换到Closure Compiler,并且看到了“ 坚实的进步


#13楼

尝试JScrambler 。 我最近试了一下,并对此印象深刻。 它为那些不太关心细节而只想快速完成的人提供了一组带有预定义设置的模糊处理模板。 您还可以通过选择所需的任何转换/技术来创建自定义混淆。


#14楼

与我针对YUI Compressor建议的大多数其他答案相反; 您应该使用Google Closure

压缩的原因不多,主要是因为它将捕获javascript错误,例如a = [1,2,3,]; 这使IE陷入困境。


#15楼

这缩小但不会混淆。 如果您不想使用命令行Java,则可以将javascript粘贴到网络表单中。


#16楼

我的印象是,一些企业(例如:JackBe)将加密的JavaScript代码放在* .gif文件而不是JS文件中,作为对混淆的一种附加措施。


#17楼

如果您使用JavaScript库,请考虑与Closure Compiler的Advanced模式编译兼容(经过少量修改)的Dojo Toolkit。

Dojo –唯一与Closure编译器兼容的JavaScript库

使用Closure Advanced模式编译的代码几乎不可能进行反向工程,甚至无法通过美化程序进行处理,因为整个代码库(包括库)都被混淆了。 平均而言,它也小25%。

经过精简的JavaScript代码(YUI Compressor,Uglify等)在经过美化之后很容易进行反向工程。


#18楼

我建议先使用诸如YUI Compressor之类的东西进行压缩,然后再使用诸如http://www.javascriptobfuscator.com/之类的所有字符串和数字转换为十六进制值

这样,代码将几乎变得难以理解,并且我认为在此阶段,黑客重新制定您的代码要比他从头重新编写代码花费更多的时间。 重写和克隆实际上是您无法停止的。 毕竟我们是自由人!


#19楼

院长爱德华的Packer是出色的混淆器,尽管它主要混淆代码,而不是代码中可能包含的任何字符串元素。

请参阅: Online Javascript Compression Tool,然后从下拉列表中选择Packer(Dean Edwards)


#20楼

我过去曾经使用过,而且做得很好。 它不是免费的,但您绝对应该看看。
JavaScript混淆器和编码器


#21楼

我正在对Java脚本混淆使用Closure-Compiler实用程序。 它使代码最小化,并且具有更多的混淆选项。 可通过以下网址的Google代码获得此实用程序:
封闭工具

但是现在有几天我听到了很多UglifyJS的信息。 您可以在Closure Compiler和UglifyJS之间找到各种比较,其中Uglify似乎是赢家。
UglifyJS:一种适用于Node.js的快速新型JavaScript压缩器,与封闭版本相当

很快我会给UglifyJS一个机会。


#22楼

试试这个工具Javascript Obfuscator

我在HTML5游戏中使用了它,不仅使它的大小从950KB减小到150KB,而且使源代码不可读,关闭了编译器和缩小器,这些都是可逆的,我个人也不知道如何逆转这种混淆。


#23楼

我已经使用Jasob多年了,它是最好的混淆器。
它具有高级UI,但仍然直观且易于使用。
它还将处理HTML和CSS文件。

使用它,最好的办法是前缀的所有的东西,如下划线你的私有变量,然后使用sort功能将它们分组一起, 检查它们关闭作为模糊的目标。

用户仍然可以查看源,但它更难以破解当你的私有变量是由类似转换_sUserPreferredNickNamea

引擎将自动计算目标变量的数量,并对它们进行优先排序,以获取最大压缩率。

我不为Jasob工作,而提倡一些友善的建议也无济于事。
缺点是它不是免费的,有点贵,但是当与其他替代品堆叠在一起时仍然值得-“免费”选项甚至还差得很远。


#24楼

您绝对应该考虑看看Obfuscriptor

我超越了从其他工具(例如YUI CompressorGoogle Closure)中看到的典型Javascript缩小技巧。

混淆的代码看起来更像是加密的。 不像我以前见过的。

 类似资料: