如何在Python中使用jsbeautifier解包JavaScript?

4

我有一段JavaScript代码需要解包并美化,它看起来类似于这样:

eval(function(p,a,c,k,e,r){e=String;if('0'.replace(0,e)==0){while(c--)r[e(c)]=k[c];k=[function(e){return r[e]||e}];e=function(){return'^$'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('document.body.innerHTML="<iframe width=\'100%\' scrolling=\'no\' height=\'2500\' frameborder=\'0\' src=\'http://www.exmaple.com\'>";',[],1,''.split('|'),0,{}))

当我将此放入jsbeautifier.org中时,我得到以下结果:
document.body.innerHTML = "<iframe width='100%' scrolling='no' height='2500' frameborder='0' src='http://www.example.com'>";

但是当我尝试使用Python库(使用jsbeautifier.beautify)时,似乎无法正确解压:

print al(function (p, a, c, k, e, r) {
    e = String;
    if ('0'.replace(0, e) == 0) {
        while (c--) r[e(c)] = k[c];
        k = [
            function (e) {
                return r[e] || e
            }
        ];
        e = function () {
            return '^$'
        };
        c = 1
    };
    while (c--) if (k[c]) p = p.replace(new RegExp('\\b' + e(c) + '\\b', 'g'), k[c]);
    return p
}('document.body.innerHTML="<iframe width=\'100%\' scrolling=\'no\' height=\'2500\' frameborder=\'0\' src=\'http://www.example.com\'>";', [], 1, ''.split('|'), 0, {}));

我做错了什么?

编辑:Python代码如下:

import jsbeautifier
#script needs to have '\n' at the beginning otherwise jsbeautifier throws an error
script = """\neval(function(p,a,c,k,e,r){e=String;if('0'.replace(0,e)==0){while(c--)r[e(c)]=k[c];k=[function(e){return r[e]||e}];e=function(){return'^$'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('document.body.innerHTML="<iframe width=\'100%\' scrolling=\'no\' height=\'2500\' frameborder=\'0\' src=\'http://www.example.com\'>";',[],1,''.split('|'),0,{}))"""
jsbeautifier.beautify(script)

你的Python代码是什么? - Blender
看起来这是 Python 端口的问题。 - Blender
啊,好的,那很烦人。我得向他们提交我的问题。 - ChrisD
在JavaScript中解压它的方法是:eval(“String” + packed_string.substr(4)) - w35l3y
3个回答

1

你应该导入这个模块:

import jsbeautifier.unpackers.packer as packer
unpack = packer.unpack(some_packed_code)

我已经在 Windows 32 位系统中测试过,使用的是 jsbeautifier 1.54 版本。


0

jsbeautifier 已经失效。请改用 node-js(或phantomJS)。以下是示例代码:

import subprocess
import StringIO

data = r"""eval(function(p,a,c,k,e,r){e=String;if('0'.replace(0,e)==0){while(c--)r[e(c)]=k[c];k=[function(e){return r[e]||e}];e=function(){return'^$'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('document.body.innerHTML="<iframe width=\'100%\' scrolling=\'no\' height=\'2500\' frameborder=\'0\' src=\'http://www.exmaple.com\'>";',[],1,''.split('|'),0,{}))"""

data = 'console.log' + data[4:]
p = subprocess.Popen(['node'], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
stdout, stderr = p.communicate(data)
print stdout

0

我认为字符串开头的/n会避免解包程序检测到Js已经被压缩。 尝试使用jsbeautifier.beautify(script.strip())。


你的回答不够清晰,请详细说明你的建议以及它是如何解决问题的? - SuperBiasedMan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接