2012-04-23 16 views
0

にはeval関数へのフックを作成することができます。私の主な目的は、パラメータとしての文字列がevalとsetTimeoutに渡されていることです。これは、悪意のあるスクリプトがeval関数を使用して複雑なコードを動的に評価するのが一般的であるためです。これを見つける1つの方法は、eval関数の各呼び出しをトリガーできるように関数をフックすることです。しかし、私はこれを行う方法がわかりません。例を挙げてこれを説明してください。は、どのように私は動的に(例えば、<strong>evalの</strong>と<strong>のsetTimeout</strong>) JavaScriptコードを解釈するために使用されている関数呼び出しの回数をカウントするuserscript

私は通常setTimeoutに対して試しましたが、正しい結果が得られません。

// ==UserScript== 
// @encoding UTF-8 
// @name  Count_setTimeout 
// @run-at  document-start 
// ==/UserScript== 
addJS_Node("var count=0;"); 
function Log_StimeoutCreations() 
{ 
    var sto = setTimeout; 
    setTimeout = function(arg, time) 
    { 
    if(typeof arg == "string") 
     console.log("Insecure setTimeout: ", arg); 
    else 
     console.log("setTimeout:",arg); 
    count++; 
    sto(arg, time);  
    } 
} 
var waitForDomInterval = setInterval (
function() { 
    var domPresentNode; 
    if (typeof document.head == "undefined") 
     domPresentNode = document.querySelector ("head, body"); 
    else 
     domPresentNode = document.head; 
    if (domPresentNode) { 
     clearInterval (waitForDomInterval); 
     addJS_Node (null, null, Log_StimeoutCreations);   
    } 
}, 
1 
); 
function addJS_Node (text, s_URL, funcToRun) { 
var D         = document; 
var scriptNode       = D.createElement ('script'); 
scriptNode.type       = "text/javascript"; 
if (text)  scriptNode.textContent = text; 
if (s_URL)  scriptNode.src   = s_URL; 
if (funcToRun) scriptNode.textContent = '(' + funcToRun.toString() + ')()'; 
var targ = D.getElementsByTagName ('head')[0] || D.body || D.documentElement; 
targ.appendChild (scriptNode); 
} 
addJS_Node("document.onreadystatechange = function(){if (document.readyState == 'complete'){if(typeof(unsafeWindow)=='undefined') { unsafeWindow=window; } unsafeWindow.console.log('count--'+count);}}"); 

しかし、私はしても、ソースコードで表示のsetTimeout関数を得ていないのです。

var sto = setTimeout; setTimeout = function setTimeout(str){
console.log(str);
}

私の実際のuserscriptがあり、次のように

私のコードです。これをさらに達成するにはどうすれば内部評価関数を得ることができますか?つまり、eval(eval());

+0

リストにhttps://github.com/jterrace/js.jsを追加します – pomeh

+0

'setTimeout = function(str){console.log(str)} 'を設定したときにsetTimeoutを呼び出すと、コンソールに何かを出力しますか?そうであれば、あなたは決してそれを呼び出すことはないと思います(あるいは、再定義する前にsetTimeoutを呼び出す)。 – apsillers

答えて

1

あなたは基本的に正しいと思います。ここに私のコードは次のとおりです。

var sto = setTimeout; 

setTimeout = function(arg, time) { 
    if(typeof arg == "string") 
     console.warn("Insecure setTimeout: ", arg); 

    // call real setTimeout 
    sto(arg, time); 
} 

// ...now all future setTimeout calls will warn about string use... 
setTimeout("alert(1);", 1000); 

あなたはそれについての超正確ではなく、元のsetTimeoutへのアクセスを許可するグローバル名前空間にstoを残して、クロージャを使用する場合:

(function() { 
    var sto = setTimeout; 
    setTimeout = function(arg, time) { 
     if(typeof arg == "string") 
      console.warn("Insecure setTimeout!", arg); 

     sto(arg, time); 
    } 
})(); 

この方法では、新しいsetTimeoutラッパーを除いて、は完全にアクセスできません。stoにアクセスできないため、無名関数が終了します。

+0

この関数を私のuserscriptに追加したいのですが、関数が終了していないため出力が得られません。私は私のuserscriptを貼り付けて、それを見て、変更を提案してください。 – user1275375

+0

私はgoogle.co.inでこのuserscriptを試しましたが、私は終わりのない結果を得ています。 – user1275375

関連する問題

 関連する問題