浏览器本机注入
Browser Native Injection
遵循这个脚本:#content_script.js,这是一种注入代码以获取参数中传递的值的方法。
或者更清楚(可以是任何JavaScript的函数):
(function() {
var parse = JSON.parse;
JSON.parse = function(){
console.log('Getting params: ', arguments);
return parse.apply(JSON, arguments)
};
JSON.parse.toString = function(){ return 'function parse() { [native code] }' };
var wss = WebSocket.prototype.send;
WebSocket.prototype.send = function(){
console.log('Getting params', arguments);
return wss.apply(this, arguments)
}
WebSocket.prototype.send.toString = function(){ return 'function send() { [native code] }' }
})();
但是,在网络游戏中,我不应该使用该方法,而是想将其注入 JavaScript 引擎 (Native Code
)。不完全是我想知道如何开发,如果没有,我该怎么办?。如果我必须使用另一种编程语言或某种方法来做到这一点?
这很容易做到。下面的所有代码都是模板代码,这意味着所有插件的通用复制粘贴,略有调整。这是一个关于如何编写 firefox bootstrap 插件的小教程。它与此处基本相同,但针对您的工作进行了个性化设置:https://gist.github.com/Noitidart/9025999(不过我没有包括图标和本地化等详细信息)
- 在您的计算机上创建一个空文件夹
- 在其中创建这些空白的新文件:bootstrap.js 和 install.rdf 以及 chrome.manifest 和 inject.js
进入install.rdf粘贴此模板:
<?xml version="1.0" encoding="utf-8"?>
<!-- This Source Code Form is subject to the terms of the Mozilla Public
- License, v. 2.0. If a copy of the MPL was not distributed with this
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:em="http://www.mozilla.org/2004/em-rdf#">
<Description about="urn:mozilla:install-manifest">
<em:id>Bootstrap-Skeleton@jetpack</em:id>
<em:version>initial</em:version>
<em:type>2</em:type>
<em:bootstrap>true</em:bootstrap>
<em:unpack>false</em:unpack>
<!-- Firefox -->
<em:targetApplication>
<Description>
<em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
<em:minVersion>7.0</em:minVersion>
<em:maxVersion>27.0</em:maxVersion>
</Description>
</em:targetApplication>
<!-- Front End MetaData -->
<em:name>Bootstrap Skeleton</em:name>
<em:description>How all bootstrap addons start.</em:description>
<em:creator>Noitidart</em:creator>
<em:contributor>Pat for Icon</em:contributor>
<em:optionsType>2</em:optionsType>
</Description>
</RDF>
现在在我们粘贴的内容中,让我们将 <em:id>
的内容替换为 DragonboundCheater@wZVanG
- 让我们将
<em:name>
更新为我们想要的插件名称,让我们将其命名为 Dragonbound Cheater
- 现在保存并转到 bootstrap.js
在bootstrap.js中粘贴此模板:
function startup(aData, aReason) {}
function shutdown(aData, aReason) {
if (aReason == APP_SHUTDOWN) return;
}
function install() {}
function uninstall() {}
现在用这个更新它的内容:
const {classes: Cc, interfaces: Ci, utils: Cu, results: Cr} = Components;
Cu.import('resource://gre/modules/Services.jsm');
var browserWinAddedTo;
function startup(aData, aReason) {
var recentBrowserWindow = Services.wm.getMostRecentWindow('navigator:browser');
browserWinAddedTo = recentBrowserWindow;
if (recentBrowserWindow.document.readyState == 'complete') { //on startup `aDOMWindow.document.readyState` is `uninitialized`
recentBrowserWindow.messageManager.loadFrameScript('chrome://dragonboundcheater@wzvang/content/inject.js');
} else {
recentBrowserWindow.addEventListener('load', function () {
recentBrowserWindow.removeEventListener('load', arguments.callee, false);
recentBrowserWindow.messageManager.loadFrameScript('chrome://dragonboundcheater@wzvang/content/inject.js');
}, false);
}
}
function shutdown(aData, aReason) {
if (aReason == APP_SHUTDOWN) return;
browserWinAddedTo.messageManager.removeDelayedFrameScript('chrome://dragonboundcheater@wzvang/content/inject.js');
}
function install() {}
function uninstall() {}
在chrome.manifest中添加:content dragonboundcheater ./
在inject.js中,现在我们可以做任何js想做的事,但首先要确保主机匹配,还要看https://developer.mozilla.org/en-US/Firefox/Multiprocess_Firefox/Frame_script_environment这告诉我们window 对象由全局变量 content
引用,所以无论我们想访问什么地方,我们都使用 content
,如果你想访问 js 环境,我们通过 content.wrappedJSObject
来访问。所以让 inject.js 变成这样:
(function() {
var window = content;
var js = window.wrappedJSObject;
if (window.location.host.indexOf('dragonbound.net') == -1) {
return;
}
var parse = js.JSON.parse;
js.JSON.parse = function(){
console.log('Getting params: ', arguments);
return parse.apply(js.JSON, arguments)
};
js.JSON.parse.toString = function(){ return 'function parse() { [native code] }' };
var wss = js.WebSocket.prototype.send;
js.WebSocket.prototype.send = function(){
console.log('Getting params', arguments);
return wss.apply(this, arguments)
}
js.WebSocket.prototype.send.toString = function(){ return 'function send() { [native code] }' }
})();
然后压缩文件夹中的所有内容,将其从 .zip 重命名为 .xpi 并拖入 firefox 和 voila :)
遵循这个脚本:#content_script.js,这是一种注入代码以获取参数中传递的值的方法。
或者更清楚(可以是任何JavaScript的函数):
(function() {
var parse = JSON.parse;
JSON.parse = function(){
console.log('Getting params: ', arguments);
return parse.apply(JSON, arguments)
};
JSON.parse.toString = function(){ return 'function parse() { [native code] }' };
var wss = WebSocket.prototype.send;
WebSocket.prototype.send = function(){
console.log('Getting params', arguments);
return wss.apply(this, arguments)
}
WebSocket.prototype.send.toString = function(){ return 'function send() { [native code] }' }
})();
但是,在网络游戏中,我不应该使用该方法,而是想将其注入 JavaScript 引擎 (Native Code
)。不完全是我想知道如何开发,如果没有,我该怎么办?。如果我必须使用另一种编程语言或某种方法来做到这一点?
这很容易做到。下面的所有代码都是模板代码,这意味着所有插件的通用复制粘贴,略有调整。这是一个关于如何编写 firefox bootstrap 插件的小教程。它与此处基本相同,但针对您的工作进行了个性化设置:https://gist.github.com/Noitidart/9025999(不过我没有包括图标和本地化等详细信息)
- 在您的计算机上创建一个空文件夹
- 在其中创建这些空白的新文件:bootstrap.js 和 install.rdf 以及 chrome.manifest 和 inject.js
进入install.rdf粘贴此模板:
<?xml version="1.0" encoding="utf-8"?> <!-- This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> <RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:em="http://www.mozilla.org/2004/em-rdf#"> <Description about="urn:mozilla:install-manifest"> <em:id>Bootstrap-Skeleton@jetpack</em:id> <em:version>initial</em:version> <em:type>2</em:type> <em:bootstrap>true</em:bootstrap> <em:unpack>false</em:unpack> <!-- Firefox --> <em:targetApplication> <Description> <em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id> <em:minVersion>7.0</em:minVersion> <em:maxVersion>27.0</em:maxVersion> </Description> </em:targetApplication> <!-- Front End MetaData --> <em:name>Bootstrap Skeleton</em:name> <em:description>How all bootstrap addons start.</em:description> <em:creator>Noitidart</em:creator> <em:contributor>Pat for Icon</em:contributor> <em:optionsType>2</em:optionsType> </Description> </RDF>
现在在我们粘贴的内容中,让我们将
<em:id>
的内容替换为DragonboundCheater@wZVanG
- 让我们将
<em:name>
更新为我们想要的插件名称,让我们将其命名为Dragonbound Cheater
- 现在保存并转到 bootstrap.js
在bootstrap.js中粘贴此模板:
function startup(aData, aReason) {} function shutdown(aData, aReason) { if (aReason == APP_SHUTDOWN) return; } function install() {} function uninstall() {}
现在用这个更新它的内容:
const {classes: Cc, interfaces: Ci, utils: Cu, results: Cr} = Components; Cu.import('resource://gre/modules/Services.jsm'); var browserWinAddedTo; function startup(aData, aReason) { var recentBrowserWindow = Services.wm.getMostRecentWindow('navigator:browser'); browserWinAddedTo = recentBrowserWindow; if (recentBrowserWindow.document.readyState == 'complete') { //on startup `aDOMWindow.document.readyState` is `uninitialized` recentBrowserWindow.messageManager.loadFrameScript('chrome://dragonboundcheater@wzvang/content/inject.js'); } else { recentBrowserWindow.addEventListener('load', function () { recentBrowserWindow.removeEventListener('load', arguments.callee, false); recentBrowserWindow.messageManager.loadFrameScript('chrome://dragonboundcheater@wzvang/content/inject.js'); }, false); } } function shutdown(aData, aReason) { if (aReason == APP_SHUTDOWN) return; browserWinAddedTo.messageManager.removeDelayedFrameScript('chrome://dragonboundcheater@wzvang/content/inject.js'); } function install() {} function uninstall() {}
在chrome.manifest中添加:
content dragonboundcheater ./
在inject.js中,现在我们可以做任何js想做的事,但首先要确保主机匹配,还要看https://developer.mozilla.org/en-US/Firefox/Multiprocess_Firefox/Frame_script_environment这告诉我们window 对象由全局变量
content
引用,所以无论我们想访问什么地方,我们都使用content
,如果你想访问 js 环境,我们通过content.wrappedJSObject
来访问。所以让 inject.js 变成这样:(function() { var window = content; var js = window.wrappedJSObject; if (window.location.host.indexOf('dragonbound.net') == -1) { return; } var parse = js.JSON.parse; js.JSON.parse = function(){ console.log('Getting params: ', arguments); return parse.apply(js.JSON, arguments) }; js.JSON.parse.toString = function(){ return 'function parse() { [native code] }' }; var wss = js.WebSocket.prototype.send; js.WebSocket.prototype.send = function(){ console.log('Getting params', arguments); return wss.apply(this, arguments) } js.WebSocket.prototype.send.toString = function(){ return 'function send() { [native code] }' } })();
然后压缩文件夹中的所有内容,将其从 .zip 重命名为 .xpi 并拖入 firefox 和 voila :)