将javascript代码注入匿名函数范围

时间:2017-10-10 23:40:21

标签: javascript anonymous-function javascript-injection

我需要注入这种脚本

! function(e) {
    function doSomething()
    {
    }
}

基本上我得到了doSomething的引用,当我的代码通过Function对象调用时,但是我需要挂钩doSomething,所以我需要一个id的原始引用。由于doSomething在匿名函数内声明,我无法实现。问题是,我可以以某种方式将代码注入匿名函数,Greesemonkey或任何其他工具的范围。

2 个答案:

答案 0 :(得分:0)

Javascript不容易从范围内获取值。

您可以在更广泛的范围内声明doSomething

function doSomething() {
    // ...
}
function func(e) {
    doSomething(); // This works! `func` has a reference to `doSomething`
}

doSomething(); // This also works! `doSomething` is declared in this scope.

您还可以从内部范围返回值!例如:

function func(e) {
    function doSomething() {
        // ...
    }

    // Note that we are not invoking `doSomething`, we are only returning a reference to it.
    return doSomething; 
}

var doSomething = func(/* some value */);

// Now you got the reference!
doSomething();

有时候你需要外部函数来返回另一个值:

function func(e) {
    function doSomething() { /* ... */ }
    return 'important value!!';
}

在这种情况下,我们仍然可以返回doSomething以及原始值:

function func(e) {
    function doSomething() { /* ... */ }
    return {
        value: 'important value',
        doSomething: doSomething
    };
}

var funcResult = func(/* some value */);
var originalValue = funcResult.value;
var doSomething = funcResult.doSomething;

// Now we have the original value, AND we have access to `doSomething`:
doSomething(); // This works

答案 1 :(得分:0)

嘿,在执行Google搜索后,我看到您在问您问题,因为我对同一主题感兴趣,而我对其他人似乎不理解您的要求感到有些沮丧...但是一想到,我实际上提出了解决方案!

首先,我将向您展示如何编写chrome扩展名,这是保证我们截获脚本源的最简单方法,但是还有一种无需扩展的方法,请参阅下文。

基本上,假设您有一个要为其编写插件的网站,其中包含一些HTML内容,例如:

<script src="http://www.someURL.com/someFile.js"></script>

和文件someFile.js的内容如下:

(function() {
    function cantGetMeMethod() {

    }
})();

因此,在执行HTML的主页上,用户无法获取函数“ cantGetMeMethod”。

问题是,如果我们能够简单地更改JavaScript文件的源代码,则可以轻松地删除匿名函数换行,或在底部插入某种全局变量引用。

但是我们怎么可能从客户端更改JavaScript源代码?

这就是chrome扩展程序的用武之地。有了扩展程序,就可以将在站点甚至页面加载之前在站点任何地方发出的HTTP请求重定向到另一个网站。因此,例如,如果页面上的图像如下:

<img src="http://example.com/somePic.png"></img>

该扩展程序可以将所有来自example.com的请求重定向到另一个网站,因此显示的真实图像(带有扩展名的客户端)实际上可以来自其他网站,并且是完全不同的图像! / p>

这与JavaScript有什么关系?

因为JavaScript来源也可以使用相同的原理。我们要做的就是找到对其他文件的JavaScript引用,并使用扩展名将src URL重定向到我们自己的服务器,并将原始src URL作为获取参数。假设我们有一些nodeJS网站或托管在http://www.myAwesomeNodeJSserverOrSomething.com上的东西,因此我们将对http://www.someURL.com/someFile.js的所有调用(或至少是相关脚本调用)重定向到http://www.myAwesomeNodeJSserverOrSomething.com/http://www.someURL.com/someFile.js

,然后在nodeJS端执行以下操作:

require("http")
.createServer((q,r) => {
    http.get(q.url.slice(1), req => {
        let str = "";
        req.on("data", d => str += d.toString())
        req.on("end", () => {
            let newCode = someFunctionThatModifiesCode(str);
            r.end(newCode);
        });
    }); //pseudocode obviously, check for errors etc. for real
}).listen(8080);

现在页面已在其中修改了JavaScript代码!那么我们如何进行快速扩展以重定向标头呢?首先,创建一个新目录,并在其中创建一个名为manifest.json的文件,如下所示:

{
    "name":"JavaScript cracking the codes",
    "version":"1.0",
    "description":"hi",
    "manifest_version":2,
    "permissions": [
        "webRequest",
        "webRequestBlocking",
        "<all_urls>"
    ],
    "background": {
        "scripts":["lol.js"],
        "persistent": true
    }
}

现在在同一目录中创建一个新文件“ lol.js”,并将其放置如下:

let otherServer = "http://www.myAwesomeNodeJSserverOrSomething.com",
    urlsToRedirect = [ //list of javascript files that need fine tuning
        "http://www.someURL.com/someFile.js",
        "http://www.someURL.com/someFile2.js",
        "http://www.someURL.com/someFile3.js",
    ];
chrome.webRequest.onBeforeRequest.addListener(
    details => {
        if(
            urlsToRedirect.includes(
                details
                .url
            )
        ) {
            {
                redirectUrl: (
                    otherServer 
                    + "/"
                    + details.url
                )
            }
        }
    },
    {urls: ["<all_urls>"]},
    ["blocking"]
);

(警告:未经测试的代码)

转到chrome设置,进入开发人员模式,然后加载新的扩展程序,然后选择该文件夹。

此外,如果您自己只是做扩展,无需扩展即可进行操作,那就是在页面加载之前注入一个mutationobserver脚本,并添加一些东西,例如篡改猴子。有关更多信息,请参见https://github.com/CertainPerformance/Stack-Exchange-Userscripts/blob/master/obsolete/Experiment-Off/StackExperimentOff.user.js https://stackoverflow.com/a/59424277/2016831 让我知道是否可以解决您的问题。