1

オブジェクトの誤った機能を扱う Web サイトのバグを修正するために、Greasemonkey スクリプトまたは Userscript を作成しようとしています。関数プロトタイプを生成するコード行にブレークポイントを追加し、js コンソールを使用して関数プロトタイプを手動で上書きすることで、問題を手動で修正できます。ただし、コードでこれを行う方法はないと思います。外部スクリプトは html 本文の最後にロードされますが、問題のコードはその同じスクリプト内で実行されます。

この Ft.prototype.J が作成されたときにすぐに変更できるように、何らかの形で JavaScript コードをページに挿入する方法はありますか? 問題は、コードも難読化および縮小されているため、コードの半分が何をしているのかわかりません。

コードの基本的な概要は次のとおりです。

//What does this do?????
function A(a, b) {
    function c() {}
    c.prototype = b.prototype;
    a.f = b.prototype;
    a.prototype = new c;
    a.prototype.constructor = a
}

function Ft(a, b) {
    $.call(this, b);
    //some stuff
}
//doing something with jQuery?
A(Ft, $);
Ft.prototype.J = function (a) {
   //modifies the DOM content
};
//Code soon after that calls some object.J

コード行 を追加するとFt.prototype.J = function() {} //my own function、greasemonkey スクリプトに、予想どおり、エラーが返されますFt not defined。しかし、ロードの最後にその行を実行すると、壊れた関数は既に実行されており、DOM は既に感染しています。

ありがとう。

4

2 に答える 2

1

Object.defineProperty関数はグローバルに宣言されているため、getter/setter と を使用していくつかの魔法を実行できると思います。

(function() {
    var Ft;
    function myJ() {
        // do whatever YOU want to do
    }
    Object.defineProperty(window, "Ft", { // use unsafeWindow in GM?
        configurable: true,
        enumerable: true,
        get: function() { return Ft; },
        set: function(n) {
            // Hah, we've catched the function declaration!
            Ft = n;

            // just making it non-writable would lead to an exception
            Object.defineProperty(Ft.prototype, "J", {
                get: function() { return myJ; },
                set: function() { /* ignore it! */ }
            });
        }
    });
})();

質問に投稿したコードを誰かが実行すると、セッターが呼び出され、必要な値を使用できます。

于 2013-02-06T11:08:42.187 に答える
1

確かではありませんが、基本的には、Ft オブジェクトが使用可能かどうかを確認して関数を変更するタイマー コードを作成できます。

var interval = setInterval(function() {
    if (Ft) {
       Ft.prototype.J = function() {} //my own function
       clearInterval(interval)
    }
}, 0);
于 2013-02-06T11:13:09.910 に答える