1

下面这个脚本:#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)。不完全我想知道如何发展,如果不是,我该怎么做?如果我必须使用另一种编程语言或某种方法来做到这一点?

回答

1

这是很容易做到。下面的所有代码都是模板代码,这意味着所有插件的通用复制粘贴,并稍作调整。这里是一个关于如何编写firefox bootstrap插件的小教程。它基本上是因为在这里,但个性化你的工作同样的事情:https://gist.github.com/Noitidart/9025999(我没有包括像图标和本地化的细节虽然)

  1. 计算机
  2. 上创建一个空文件夹,它使这些空白的新文件: bootstrap.js和install.rdf的和chrome.manifest用于和inject.js
  3. 进入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>[email protected]</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> 
    
  4. 现在我们可以粘贴更换的0123内容与[email protected]

  5. 让更新<em:name>我们想要的插件的名字,让我们将其命名为Dragonbound Cheater
  6. 现在保存并去到bootstrap.js
  7. 在bootstrap.js粘贴此模板:

    function startup(aData, aReason) {} 
    
    function shutdown(aData, aReason) { 
        if (aReason == APP_SHUTDOWN) return; 
    } 
    
    function install() {} 
    
    function uninstall() {} 
    
  8. 现在有了这个更新内容:

    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://[email protected]/content/inject.js'); 
        } else { 
         recentBrowserWindow.addEventListener('load', function() { 
          recentBrowserWindow.removeEventListener('load', arguments.callee, false); 
          recentBrowserWindow.messageManager.loadFrameScript('chrome://[email protected]/content/inject.js'); 
         }, false); 
        } 
    } 
    
    function shutdown(aData, aReason) { 
        if (aReason == APP_SHUTDOWN) return; 
        browserWinAddedTo.messageManager.removeDelayedFrameScript('chrome://[email protected]/content/inject.js'); 
    } 
    
    function install() {} 
    
    function uninstall() {} 
    
  9. 在chrome.manifest用于补充一点:content dragonboundcheater ./

  10. 在inject.js现在我们可以做任何JS想,还是让我们首先确保主机相匹配,同时也看到https://developer.mozilla.org/en-US/Firefox/Multiprocess_Firefox/Frame_script_environment这告诉我们,窗口对象refered通过全局变量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] }' } 
    })(); 
    
  11. 然后压缩所有的东西在文件夹时,它从.zip文件进行重命名。XPI并拖动到Firefox瞧:)

+0

注意我有一个错误:在新打开的标签它不是运行脚本,我不得不考虑的是,将在位 – Noitidart

+0

做我现在会检查它 –

+0

@wZVanG这个简单的插件如果你在龙站点打开的时候启用/安装它,它将不会出现问题,并且你只有一个带有选项卡的Firefox窗口,如果你有多个你必须使用迭代器来遍历所有窗口并附加。 – Noitidart