如何UnObfuscate,混淆Javascript?

时间:2014-12-12 04:07:13

标签: javascript jquery

我使用这个http://www.javascriptobfuscator.com/Default.aspx对我的javascript代码进行了模糊处理,但似乎我可以'找到将其备份到原始代码的方法..有什么办法吗?

1 个答案:

答案 0 :(得分:1)

你可以找回一些代码,但几乎所有的函数名都会丢失,局部变量会被替换掉。

the link you provided上的默认代码为例:

<强> ORIGINAL

function NewObject(prefix)
{
    var count=0;
    this.SayHello=function(msg)
    {
          count++;
          alert(prefix+msg);
    }
    this.GetCount=function()
    {
          return count;
    }
}
var obj=new NewObject("Message : ");
obj.SayHello("You are welcome.");

<强>混淆

var _0x5601=["\x53\x61\x79\x48\x65\x6C\x6C\x6F","\x47\x65\x74\x43\x6F\x75\x6E\x74","\x4D\x65\x73\x73\x61\x67\x65\x20\x3A\x20","\x59\x6F\x75\x20\x61\x72\x65\x20\x77\x65\x6C\x63\x6F\x6D\x65\x2E"];function NewObject(_0xa158x2){var _0xa158x3=0;this[_0x5601[0]]=function (_0xa158x4){_0xa158x3++;alert(_0xa158x2+_0xa158x4);} ;this[_0x5601[1]]=function (){return _0xa158x3;} ;} ;var obj= new NewObject(_0x5601[2]);obj.SayHello(_0x5601[3]);

第1步 - 解码变量数组

首先,我们需要解码变量数组(开始var _0x5601=的部分,并在第一个function之前结束)。我发现最简单的方法是将数组复制并粘贴到Chromes开发人员控制台中。只需粘贴整行并按Enter键,然后在控制台中键入变量名称,您将得到如下内容:

["SayHello", "GetCount", "Message : ", "You are welcome."]

第2步 - 字符串替换变量数组项的代码

接下来,我们使用您想要将这个新数组解析回js的编程语言的帮助。实质上,采用新解码的数组,并执行字符串替换其余代码。我有PHP方便,所以我这样做了:

<?php
// decoded array
$_0x5601 = array("SayHello", "GetCount", "Message : ", "You are welcome.");
// rest of the obfuscated code
$code = "function NewObject(_0xa158x2){var _0xa158x3=0;this[_0x5601[0]]=function (_0xa158x4){_0xa158x3++;alert(_0xa158x2+_0xa158x4);} ;this[_0x5601[1]]=function (){return _0xa158x3;} ;} ;var obj= new NewObject(_0x5601[2]);obj.SayHello(_0x5601[3]);";
// loop over array
for($x = 0; $x < count($_0x5601); $x++){
  // string replace on the code
  $code = str_replace('_0x5601['.$x.']', '"'.$_0x5601[$x].'"', $code);
}
// output result
echo $code;
?>

第3步 - 美丽

现在,让我们使用类似http://jsbeautifier.org/

的内容“美化”代码
function NewObject(_0xa158x2) {
    var _0xa158x3 = 0;
    this["SayHello"] = function(_0xa158x4) {
        _0xa158x3++;
        alert(_0xa158x2 + _0xa158x4);
    };
    this["GetCount"] = function() {
        return _0xa158x3;
    };
};
var obj = new NewObject("Message : ");
obj.SayHello("You are welcome.");

第4步 - 正则表达式用对象表示法替换数组项

最后一步是执行最后一次替换,但这次我们需要使用正则表达式的帮助。我使用一个名为Sublime Text 2的IDE,它能够查找和替换正则表达式(我确定大多数IDE都有这个)。

我使用的正则表达式模式看起来像\[\"([a-zA-Z0-9\-\_]+)\"\]来解释:

\[\"                    // code must start with ["
(                       // open capturing group
    [a-zA-Z0-9]+        // match all characters a-zA-Z0-9  you may need to adjust this to include -, _ etc as needed
)                       // capture everything in this group
\"\]                    // code must end with "]

您想要使用.$1替换与此模式匹配的任何内容。导致:

function NewObject(_0xa158x2) {
    var _0xa158x3 = 0;
    this.SayHello = function(_0xa158x4) {
        _0xa158x3++;
        alert(_0xa158x2 + _0xa158x4);
    };
    this.GetCount = function() {
        return _0xa158x3;
    };
};
var obj = new NewObject("Message : ");
obj.SayHello("You are welcome.");

它不是那么漂亮,正如我所提到的,局部变量已被替换。但是如果你知道你的代码,那么理解他们正在做什么并不是很难。