"Декомпилировать" функцию Javascript? - PullRequest
1 голос
/ 27 марта 2010

[1] Хорошо, я даже не знаю, как это назвать, если честно. Итак, позвольте мне получить некоторый полупсевдокод, чтобы показать, что я пытаюсь сделать. Я использую jQuery, чтобы получить уже существующий скрипт, объявленный внутри страницы, внутри элемента createDocument(), из вызова AJAX.

GM_xmlhttprequest({
  ...
  load:function(r){
    var doc = document_from_string(r.responseText);
    script_content = $('body script:regex(html, local_xw_sig)', doc).html();
    var scriptEl = document.createElement('script');
    scriptEl.type = 'text/javascript';
    scriptEl.innerHTML = script_content; // good till here
    (function(sc){
      eval(sc.innerHTML); // not exactly like this, but you get the idea, errors
      alert('wont get here ' + local_xw_sig); // local_xw_sig is a global "var" inside the source
    })(scriptEl);
  }
});

Пока все хорошо, скрипт действительно содержит источник из всего блока скрипта. Теперь, внутри этого «script_content», есть автоматически выполняемые функции, такие как $ (document) .ready (function () {...}), которые, все, что я «проверяю» на innerHTML, выполняет этот код, останавливая мой инкапсулированный скрипт , Как переменные, которые не существуют и т. Д.

Удаление некоторых частей скрипта с помощью регулярных выражений на самом деле не вариант ... что я действительно хотел, так это "пройтись" внутри функции. как сделать (полностью вымышленный):

script = eval("function(){" + script_content + "};");
alert(script['local_xw_sig']); // a03ucc34095cw3495

Есть ли способ «разобрать» функцию и быть в состоянии достичь «вар» внутри нее? как эта функция:

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

Возможно ли это вообще? Или мне придется взломать мой путь с помощью регулярных выражений? ; Р

[2] также, есть ли способ получить доступ к javascript внутри документа, созданного с помощью createDocument?

Ответы [ 4 ]

0 голосов
/ 10 сентября 2012

Вы хотите, чтобы оценил скрипт в глобальной области видимости . Вкратце это так,

// 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 );
        }
    }

Также проверьте caja Google для безопасной внешней проверки сценариев.

0 голосов
/ 27 марта 2010

Это невозможно. Вы можете анализировать свойства объекта (любая функция является объектом), но не ранее, чем вы создали экземпляр с оператором new.

Глядя на ваш пример кода, кажется, что ваш подход немного запутан - блоки сценариев eval () - это то, что не следует делать, если в этом нет крайней необходимости (ситуация, которую я не могу себе представить).

0 голосов
/ 12 января 2011

В вашем примере на

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

вы можете использовать hello.toString () для получения источника функции, например:

alert(hello.toString().match(/var message = \"(.*)\";/));
0 голосов
/ 27 марта 2010

Простая попытка доступа к локальной переменной внутри функции извне невозможна из-за области действия. Однако, используя замыкания, вы можете абсолютно выполнить это:

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

Обратите внимание, что именно здесь происходит. Вы вызываете функцию, которая возвращает функцию, в которой "yourMessage" теперь определено внутри своей области действия . Вызов этого внутреннего замыкания во второй раз приведет к той переменной, которую вы установили ранее.

Если вы не знакомы с замыканиями в JS, я предлагаю вам прочитать этот замечательный FAQ .

...