【问题标题】:"Decompile" Javascript function?“反编译”Javascript函数?
【发布时间】:2011-02-01 11:52:05
【问题描述】:

[1] 好吧,老实说,我什至不知道如何称呼它。所以让我得到一些半伪代码,以展示我正在尝试做的事情。我正在使用 jQuery 从 AJAX 调用中获取页面内声明的现有脚本,在 createDocument() 元素内。

GM_xmlhttprequest({ ... 加载:函数(r){ var doc = document_from_string(r.responseText); script_content = $('正文脚本:正则表达式(html, local_xw_sig)', doc).html(); var scriptEl = document.createElement('script'); scriptEl.type = '文本/javascript'; scriptEl.innerHTML = script_content; // 到这里为止 (函数(sc){ 评估(sc.innerHTML); // 不完全像这样,但你明白了,错误 alert('不会到这里' + local_xw_sig); // local_xw_sig 是源内部的全局“var” })(scriptEl); } });

到目前为止一切顺利,脚本确实包含整个脚本块的源代码。现在,在这个“script_content”里面,有自动执行的函数,比如 $(document).ready(function(){...}) ,我“评估”innerHTML的所有东西,它执行这段代码,停止我封装的脚本.比如不存在的变量等等。

使用正则表达式删除脚本的某些部分并不是一个真正的选择......我真正想要的是在函数内部“行走”。喜欢做一个(完全虚构的):

script = eval("function(){" + script_content + "};"); 警报(脚本['local_xw_sig']); // a03ucc34095cw3495

有没有办法“反汇编”函数,并能够访问其中的“var”? 喜欢这个功能:

函数你好(){ var message = "你好"; } 警报(你好。消息); // 函数内部的 message = var

有可能吗?或者我将不得不使用正则表达式破解我的方式? ;P

[2] 还有,有什么方法可以访问使用“createDocument”创建的文档中的 javascript?

【问题讨论】:

  • 你为什么要这样做?它可能有助于提供答案。
  • 这是一个greasemonkey脚本,与页面交互,但不加载图像、脚本等。
  • 根据 W3,“createDocument”调用的结果是一个 Document 元素,但它声明它是一个“无 cookie”环境,因为它没有“document.location”。我怎么能访问它是 doc.window ?有没有办法做到这一点?如果可以,这将解决我的问题,因为窗口在页面中具有所有全局声明的变量
  • 我真的认为你应该为这样的任务使用一个成熟的浏览器扩展。

标签: javascript dom eval reverse-engineering anonymous-function


【解决方案1】:

由于作用域的原因,仅仅尝试从函数外部访问函数内部的局部变量是不可能的。然而,使用闭包你绝对可以做到这一点:

function hello(msg){
  return function message(){
    return msg;
  }
}
alert(hello("yourMessage")()); // will alert "yourMessage"

注意这里发生了什么。您正在调用一个返回函数的函数,其中"yourMessage" 现在在其范围内定义。第二次调用该内部闭包将产生您之前设置的变量。

如果你不熟悉 JS 中的闭包,我建议你阅读this wonderful FAQ

【讨论】:

  • 我无权访问原始脚本。这是来自 Greasemonkey 脚本的调用。并且由于我将它作为“createDocument”中的文本接收(它不执行javascript),我可以遍历脚本标签,但没有办法在不执行正则表达式的情况下获取变量......
  • 是的,我熟悉闭包。我只是有一个想法,不确定它是否会奏效。因为我基本上是在 Firefox 上工作,所以我会尝试封装一个匿名函数,然后调用 .toSource()/uneval 我也许可以使用它来获取成员(例如再次使用 JSON 解析)
【解决方案2】:

这是不可能的。您可以自省对象的属性(任何函数都是对象),但不能在使用 new 运算符创建实例之前。

查看您的代码示例,您的方法似乎有点混乱 - eval()'ing 脚本块是不应该做的事情,除非绝对必要(我无法想象的情况)。

【讨论】:

  • 除非脚本函数或变量可以通过document.implementation.createDocument()创建的文档来访问,否则我需要使用eval,别无他法
【解决方案3】:

在你的例子中

function hello(){
  var message = "hello";
}
alert(hello.message); // message = var inside the function

其实你可以使用 hello.toString() 来获取函数源,像这样:

alert(hello.toString().match(/var message = \"(.*)\";/));

【讨论】:

    【解决方案4】:

    你想要to eval the script in global scope。简而言之,

    // Evalulates a script in a global context
    globalEval: function( data ) {
            data = jQuery.trim( data );
            if ( data ) {
                    if ( window.execScript )
                            window.execScript( data );
                    else if ( jQuery.browser.safari )
                            // safari doesn't provide a synchronous global eval
                            window.setTimeout( data, 0 );
                    else
                            eval.call( window, data );
            }
        }
    

    还可以查看Google's caja 以获取安全的外部脚本评估。

    【讨论】:

      猜你喜欢
      • 2017-11-04
      • 2021-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-23
      • 1970-01-01
      • 1970-01-01
      • 2014-05-08
      相关资源
      最近更新 更多