我需要注入这种脚本
! function(e) {
function doSomething()
{
}
}
基本上我得到了doSomething的引用,当我的代码通过Function对象调用时,但是我需要挂钩doSomething,所以我需要一个id的原始引用。由于doSomething在匿名函数内声明,我无法实现。问题是,我可以以某种方式将代码注入匿名函数,Greesemonkey或任何其他工具的范围。
答案 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 让我知道是否可以解决您的问题。