获取模拟器错误
P粉447495069
2023-09-01 20:53:31
<p>我一直在尝试对我在网上找到的 GBA 模拟器 (https://gba.44670.org/) 进行逆向工程,并使用 HTML 提取器来尝试复制它。我希望它能够离线工作,所以我将所有脚本下载到我的计算机上,并在那里运行。但是,此后,“选择文件”按钮不再出现,取而代之的是“正在加载,请稍候...”文本行。深入研究代码,我发现它与 WASM 有关。代码如下:</p>
<pre class="brush:php;toolbar:false;"><div id="wasm-loading">
Loading, please wait...
</div>
<div id="select-rom" hidden>
<input type="file" id="romFile" onchange="onFileSelected()" hidden /></p>
<button onclick="$id('romFile').click()" id="btn-choose">Choose File...</button>
</div></pre>
<p>代码中对 WASM 的其他提及位于 .js 文件 app.js 中:</p>
<pre class="brush:php;toolbar:false;">function wasmReady() {
romBuffer = Module._emuGetSymbol(1)
var ptr = Module._emuGetSymbol(2)
wasmSaveBuf = Module.HEAPU8.subarray(ptr, ptr + wasmSaveBufLen)
ptr = Module._emuGetSymbol(3)
imgFrameBuffer = new Uint8ClampedArray(Module.HEAPU8.buffer).subarray(ptr, ptr + 240 * 160 * 4)
idata = new ImageData(imgFrameBuffer, 240, 160)
isWasmReady = true
document.getElementById('wasm-loading').hidden = true
document.getElementById('select-rom').hidden = false
}</pre>
<p>我期望一旦我下载了脚本,它就会像平常一样工作。我的意思是,它仍然可以访问它需要的脚本,对吧?我尝试通过更改 <code>document.getElementById('select-rom').hidden = false</code> 中的 true/false 语句来隐藏文本,反之亦然,但似乎没有任何效果。有任何想法吗?提前致谢。</p>
<p>(顺便说一句,我正在 vscode.dev 中查找文件路径。它看起来像这样: <code><script src="/Scripts/44gba.js"></script> <script src="/Scripts /app.js"></script> <script src="/Scripts/localforage.js"></script> <script src=/Scripts/pako.min.js></script></code>
)</p>
要使用脚本将应用程序保留在本地,请记住两件事:
也就是说,复制您在响应中得到的相同 HTML (https://gba.44670.org/ ),这将保留文件结构。这是我得到的内容(
index.html
):然后您可以看到脚本路径,您将按照该路径创建文件:
此外,您还需要下载 WASM 文件(压缩后 651KB,未压缩 7.7MB)。您可以在此处下载压缩包(您可以在开发工具的“网络”选项卡中找到它):https ://gba.44670.org/build/44gba.wasm
最后,下载所有必要的文件(如果需要,还可以下载图标和图片,但不是必需的):
您将得到如下所示的结构:
现在,如果您可以从浏览器中停用 CORS,那就太好了。但如果没有,您必须从本地 HTTP 服务器提供服务。一种选择是安装 NPM 包: https://www.npmjs.com/package/http-服务器,运行
npm install --global http-server
。之后,只需导航到终端中的项目目录并启动服务器:您将看到正确的屏幕并加载 ROM,然后就完成了。
编辑:通过简单的 Hack 解决本地 CORS 问题
由于我知道您现在使用的是 ChromeOS,并且从技术上讲还不知道如何使用 Node、NPM 和 HTTP-Server 来处理它,因此我为您做了一些修改,并将 WASM 二进制内容直接放入 build/44gba.js,并在函数 readBinary 上返回该二进制内容,以便绕过 CORS 问题。您可以直接启动index.html。以下是新
build/44gba.js
文件的链接,只需将其内容替换为以下文件:https://sendeyo.com/en/b02f94b524,你们都很好。以下是更改内容: