关于混淆:如何混淆(保护)JavaScript?

How can I obfuscate (protect) JavaScript?

我想制作一个不是开源的javascript应用程序,因此我想学习如何模糊我的JS代码?这有可能吗?


obfuscation:

YUI压缩器的尝试。这是一个非常流行的工具,内置的增强和维护,由雅虎UI团队。

你也可以使用:

  • 谷歌关闭编译器
  • uglifyjs

私人字符串数据。

私人字符串值的效果是不同的关怀,和obfuscation才真的是非常有益的。当然,通过包装上你对garbled源混乱,缩小版的,你有一个安全的通光obscurity。大部分的时间,它的用户是谁看你的源代码和字符串值,在他们的客户端是用于私人使用,这样的排序是不是经常必要的字符串值。

如果你真的有价值,你不希望用户看到的,你会有几选项。第一,你可以将类的加密,这是decrypted在页面加载。这将可能是一个最安全的选择,但也有很多的工作,这可能是不必要的。Base64编码的字符串,你可能会和一些价值,这将是更容易的。但这些人谁真的可以很容易地解码字串值通缉他们。加密是唯一的方式访问您的数据从任何真正的预防,发现,和大多数人比,他们更需要的是安全的。

sidenote:

在其中的obfuscation JavaScript已造成一些错误。该程序的工作是获得更好的关于它的小,但他们有足够的outfits决定国有企业从中受益,这是削减和gzipping储蓄),和由obfuscation总是不值得的麻烦。如果你想保护你的源代码,也许你会决定它的价值,而只是为了你,使你难读的代码。jsmin是很好的选择。


我很惊讶没有人提到谷歌的闭包编译器。它不仅缩小/压缩,它还分析以查找和删除未使用的代码,并重写以实现最大的缩小。它还可以进行类型检查,并对语法错误发出警告。

jquery最近从yui compresser切换到closure compiler,并看到了"实质性的改进"


模糊永远不会真正起作用。对于任何真正想了解你的代码的人来说,这只是一个减速带。更糟糕的是,它使您的用户无法修复错误(并将修复结果发送给您),使您更难在现场诊断问题。这是浪费你的时间和金钱。

与律师讨论知识产权法以及您的法律选择。""开放源码"并不意味着"人们可以阅读源码"。相反,开放源码是一种特殊的许可模式,它授予自由使用和修改代码的权限。如果您不授予这样的许可证,那么复制您的代码的人就违反了法律,而且(在大多数情况下)您有合法的选择来阻止他们。

唯一能真正保护你的代码的方法就是不发布它。移动服务器端的重要代码,让您的公共JavaScript代码对其进行Ajax调用。

请看我关于模糊器的完整答案。


您可以根据自己的需要对JavaScript源代码进行模糊处理,但是它总是可以反向工程,这仅仅是因为需要所有源代码在客户机上实际运行…我能想到的最好的选择是使用服务器端代码完成所有的处理,而JavaScript所做的所有客户端代码都是向服务器本身发送处理请求。否则,任何人都将始终能够跟踪代码正在执行的所有操作。

有人提到base64是为了保证字符串的安全。这是个糟糕的主意。base64可以立即被想要对代码进行反向工程的人识别出来。他们要做的第一件事就是把它解锁,看看它是什么。


有一些可用的工具,是obfuscation JavaScript的自由;但是,我认为这是重要的,它是很难注意到在它的JavaScript obfuscate点不能被逆向工程。

到那端,有几个选项,我曾经有次加班:

  • YUI压缩器。雅虎!压缩机不工作的很好的JavaScript代码(这将提高它的凝结时间的负载。有一个小的水平,这obfuscation厂比较好。基本上,压缩机将变化的函数名称,删除和修改的白色空间,局部变量。这是我最经常使用的。这是一个基于java的开放源代码工具。

  • jsmin(Douglas Crockford写的是一个工具,旨在缩小您的JavaScript源代码。在单词"Crockford的jsmin自己,但它并没有obfuscate,丑化。"它的主要目标是减少的大小,你在浏览器中加载速度更快的源。

  • obfuscator免费的JavaScript。这是一个基于Web的工具,这是你的代码真的obfuscate诸因素对它进行编码。我认为它的权衡的编码形式(或obfuscation)可以吃在成本的大小;然而,这是一个个人偏好的问题。


我会怎么做:

A.黑客巨魔!

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

这个代码是什么?

  • 加载真正的代码
  • 设置自定义标题
  • 发布自定义变量
  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    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.稍微混淆代码

    那是什么?

  • 这与base64中的上述代码相同
  • 这不是秘密的javascript代码
  • 1
    (new Function(atob('dmFyIGFqYXg9ZnVuY3Rpb24oYSxiLGQsYyxlLGYpe2U9bmV3IEZvcm1EYXRhKCk7Zm9yKGYgaW4gZCl7ZS5hcHBlbmQoZixkW2ZdKTt9O2M9bmV3IFhNTEh0dHBSZXF1ZXN0KCk7Yy5vcGVuKCdQT1NUJyxhKTtjLnNldFJlcXVlc3RIZWFkZXIoIlRyb2xsMSIsImxvbCIpO2Mub25sb2FkPWI7Yy5zZW5kKGUpO307d2luZG93Lm9ubG9hZD1mdW5jdGlvbigpe2FqYXgoJ1Ryb2xsLnBocCcsZnVuY3Rpb24oKXsgKG5ldyBGdW5jdGlvbihhdG9iKHRoaXMucmVzcG9uc2UpKSkoKX0seydUcm9sbDInOidsb2wnfSk7fQ==')))()

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

    这个PHP代码是什么?

  • 检查是否有正确的引用(域/dir/code of your launcher)
  • 检查自定义标题
  • 检查自定义post变量
  • 如果一切正常,它将向您显示正确的代码,否则将显示假代码或禁止IP,关闭页面。无论什么。

    1
    2
    3
    4
    5
    6
    7
    8
    <?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();

    现在。。如果您在秘密的javascript中定义事件处理程序,它可能是可访问的。您需要使用启动代码在外部定义它们,并指向嵌套的秘密函数。

    所以…有没有一个简单的方法来获取代码?document.body.appendChild(document.createElement('div')).innerText='Awesome';

    我不确定这是否有效,但我正在使用chrome,并检查元素、资源、网络、源、时间线、配置文件、审计,但我没有找到上面的行。

    注1:如果在chrome中打开inspect element->network中的troll.php url,就会得到假代码。

    注2:整个代码是为现代浏览器编写的。PolyFill需要更多的代码。

    编辑

    洗衣店

    1
    <!doctype html><html><head><meta charset="utf-8"><script src="data:application/javascript;base64,KG5ldyBGdW5jdGlvbihhdG9iKCdkbUZ5SUdGcVlYZzlablZ1WTNScGIyNG9ZU3hpTEdRc1l5eGxMR1lwZTJVOWJtVjNJRVp2Y20xRVlYUmhLQ2s3Wm05eUtHWWdhVzRnWkNsN1pTNWhjSEJsYm1Rb1ppeGtXMlpkS1R0OU8yTTlibVYzSUZoTlRFaDBkSEJTWlhGMVpYTjBLQ2s3WXk1dmNHVnVLQ2RRVDFOVUp5eGhLVHRqTG5ObGRGSmxjWFZsYzNSSVpXRmtaWElvSWxSeWIyeHNNU0lzSW14dmJDSXBPMk11YjI1c2IyRmtQV0k3WXk1elpXNWtLR1VwTzMwN2QybHVaRzkzTG05dWJHOWhaRDFtZFc1amRHbHZiaWdwZTJGcVlYZ29KMVJ5YjJ4c0xuQm9jQ2NzWm5WdVkzUnBiMjRvS1hzZ0tHNWxkeUJHZFc1amRHbHZiaWhoZEc5aUtIUm9hWE11Y21WemNHOXVjMlVwS1Nrb0tYMHNleWRVY205c2JESW5PaWRzYjJ3bmZTazdmUT09JykpKSgp"></head><body></body></html>

    PHP

    1
    <?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。我最近给它旋转了一下,它给我留下了深刻的印象。它为那些不太关心细节,只想快速完成的人提供了一组模板,这些模板带有预先定义的设置。您还可以通过选择您想要的任何转换/技术来创建自定义模糊。


    语言与interpreted的问题,是你让他们的发送源的工作(除非你有编译的字节码),然后再是很琐碎的,它对反编译)。

    所以,如果你不想牺牲的表现,你可以只使用变量和函数法,例如,他们replacing与A、B…………………AA,AB…A101 A102或,等,以及,当然,删除换行符号的多空间,你可以(这就是所谓的JS压缩机)。将一个字符串obfuscating性能命中,如果你要加密和解密他们,他们在实时。调试器可以显示加js的最终值。


    与我建议反对yui压缩器的大多数其他答案相反,您应该使用Google Closing。

    这并不是因为它压缩得更多,而是因为它会捕获诸如a = [1,2,3,];这样的javascript错误,这会让IE陷入混乱。


    一个非开源的基于javascript的应用程序是相当愚蠢的。javascript是一种客户端解释语言。模糊并不能起到很好的保护作用。

    JS模糊通常是为了减少脚本的大小,而不是"保护"它。如果您不希望代码公开,则javascript不是正确的语言。

    周围有很多工具,但大多数都有"压缩器"(或"微型化器")这个词,这是有原因的。


    你不能保证客户端代码的安全:只需在Google Chrome上按F12,暂停JavaScript的执行,你就可以得到所有的字符串,甚至是那些加密的字符串。美化它并重命名变量,您将得到几乎原始的代码。

    如果您正在编写服务器端的javascript(即nodejs),担心有人入侵您的服务器,并希望使黑客工作更困难,从而给您更多的时间重新访问,那么请使用javascript编译器:

    在高级编译中需要使用闭包编译器,因为它是重命名所有变量的唯一工具,即使这些变量在多个文件/模块中使用。但它只是有一个问题:只有用它的编码风格来写,它才有效。


    我可以建议由JavaScript实用帕特里克奥尼尔。它可以obfuscate /压缩和压缩和它在这些似乎是很好的。我不想这样说,将它编译脚本中的任何一种。

    是的。我不obfuscating削减前的大风扇。让不可能的(误差在1线的调试………………"等等,有一个只有一个线"),他们总是把时间到解包。如果你需要……好的。


    DeanEdward的packer是一个非常好的模糊器,尽管它主要是模糊代码,而不是代码中的任何字符串元素。

    请参见:在线javascript压缩工具,并从下拉列表中选择packer(dean edwards)


    我建议首先使用类似于yui compressor的工具缩小,然后使用类似http://www.javascriptobusfuscator.com的工具将所有字符串和数字转换为十六进制值。/

    有了这一点,代码将变得几乎不可能理解,我认为在这个阶段,黑客重新制定代码要比从头开始重新编写要花更多的时间。重写和克隆实际上是无法停止的。毕竟我们是自由人!


    我使用关闭编译器实用程序来进行Java脚本混淆。它缩小了代码,并有更多的模糊选项。此实用程序在以下网址的谷歌代码中提供:闭合工具

    但现在有一天我听到了很多关于乌格利夫的话。您可以在闭包编译器和uglifyjs之间找到各种比较,其中uglify似乎是赢家。uglifyjs:node.js的一个新的快速javascript压缩器,与闭包不相上下

    很快我就会给你机会。


    你尝过香蕉汁吗?它产生高度压缩和完全不可读的代码。


    我用Jasob已经很多年了,它是目前最好的模糊器。它有一个高级的用户界面,但仍然是直观的,易于使用。它还将处理HTML和CSS文件。

    使用它的最佳方法是在所有私有变量前面加上下划线之类的前缀,然后使用sort功能将它们组合在一起,并将它们作为模糊目标进行检查。

    用户仍然可以查看您的源代码,但是当您的私有变量从_sUserPreferredNickName转换为a时,很难破译。

    引擎将自动统计目标变量的数量,并对其进行优先级排序,以获得最大的压缩。

    我不为Jasob工作,我也没有从提升他们中得到什么,只是提供一些友好的建议。缺点是它不是免费的,而且有点贵,但是与其他选择相比,它仍然值得——免费的选择甚至不会接近。


    作为一个javascript/html/css模糊器/压缩器,你也可以试试patu digua。


    你一定要考虑看看模糊文字。

    我超越了我们从其他工具(如yui compressor或google closure)中看到的典型的javascript缩小技巧。

    模糊的代码看起来更像是加密的。不像我以前看到的。


    我觉得有些企业(例如:jackbe)将加密的javascript代码放在*.gif文件中,而不是JS文件中,作为一种额外的模糊度量。


    尝试此工具javascript模糊

    我在我的HTML5游戏中使用了它,不仅把它的大小从950kb减少到了150,而且使源代码不可读的闭包编译器和微型处理器是可逆的,我个人不知道如何逆转这种混乱。


    这个缩小了,但没有混淆。如果不想使用命令行Java,可以将JavaScript粘贴到Web窗体中。


    我以前用过这个,它做得很好。这不是免费的,但你一定要看看。javascript模糊编码器


    如果使用JavaScript库,请考虑Dojo工具包,它与闭包编译器的高级模式编译兼容(经过细微修改)。

    Dojo–唯一的javascript库与闭包编译器兼容

    使用闭包高级模式编译的代码几乎不可能进行逆向工程,甚至通过美化程序,因为整个代码库(包括库)都是模糊的。平均也只有25%。

    Javascript代码仅仅是小型化的(yui压缩器、uglify等),通过美化后很容易进行逆向工程。