AS3 如何将数据从对象提取到剪贴板、rest、db、文件等?
Posted
技术标签:
【中文标题】AS3 如何将数据从对象提取到剪贴板、rest、db、文件等?【英文标题】:How to AS3 extract data from object to clipboard, rest, db, file, etc? 【发布时间】:2020-11-13 17:32:27 【问题描述】:基本上,我正在为游戏编写 UI 模组。
支持加载 swf 文件来操作 UI。
我已经创建了一个带有文本区域的带有 AS3 项目的 fla,它就像一个记录器并打印我需要的所有内容,问题是我无法从那里提取数据。
我试过了:
-
带有和不带有 MouseEvent 的剪贴板(如文档中所述) - 它不起作用。
Clipboard.generalClipboard.formats
返回一个空数组。
Clipboard.generalClipboard.setData(ClipboardFormats.TEXT_FORMAT, 'myData')
实际上什么都不做(有和没有序列化)。
写入文件抛出异常,错误代码不同,基于方法(1001、1006等,不记得具体了)
在 ioerrorevent 1006 上发送 HTTP 请求失败
尝试连接到本地数据库 - mysql 或 SQLite 也会失败
我认为游戏本身以某种方式阻止了所有这些问题,以防止模组开发者暴露重要数据。
问题还在于实际上没有文档,并且大多数 mod 作者不使用与文件系统和/或 http 请求的交互。
那些能够写入文件的修改者 - 要么忽略,要么离线数月。
所以,问题是: 有什么方法可以暴露游戏中的一些数据吗?从字面上看,任何可行的东西都会满足我的需求。
对于那些好奇的人 - 我想写一个销售游戏内物品的市场(仅用于游戏内 货币)并在完成后将我的工作开源。
以防万一 - 在 IDE 本身中使用这些方法中的任何一种都可以正常工作,所以我猜它以某种方式被游戏阻止了。
我有某种 dll 注入或其他的想法,但谷歌说这是不可能的。
SWF文件在游戏运行时加载..
UPD:
我对 ActionScript 和 Flash 本身还是很陌生,实际上这是我的第一个宠物项目。
没有 AIR 可用。 对于我的第一个测试,我已经反编译了已经创建的 mod 并进行了一些自定义修改(例如重命名文本,以确保它有效)。
通过 Adobe Flash CS6 执行编译,我打开 FLA 文件并使用 FlashPlayer 11.2 和 AS3 发布。
然后,编译的 swf 被捆绑在特殊的存档中(因为它是游戏需要的),就是这样。 Mod 正在运行,但我无法通过游戏本身提取数据。 任何能让我将数据抓取到文件、剪贴板、数据库、发送套接字请求等的东西都可以满足我的目的。
我也尝试使用仅访问本地和仅访问网络的选项进行编译 - 每次都是同样的事情,用于:
http 我得到一个 IOError,类似于 [IOErrorEvent type="ioError" bubbles=false cancelable=false eventPhase=2 text="Error #2031: Socket Error. URL: http://localhost:4567 /testEndpoint?test=myTestData"] - 如果使用 Adobe Flash 运行应用程序,它可以完美运行;如果作为 mod 的一部分运行,则加载到游戏中 - 不 文件无法使用,因为它是 AIR 的一部分 socket - 我能够sometimes
在后端获取文件警察请求并按照文档中提到的那样对其进行响应,然后 - 没有任何东西进入套接字
database 真的不工作,我使用的是相当旧的库,我在 github 上找到了
剪贴板 - Clipboard.generalClipboard.setData
- 什么都不做; System.setClipboard()
- 什么都不做,完全没有错误
fscommand('exec', 'sample.exe') - 根据文档,以防万一尝试过 - 不起作用(将 exe 文件放在可执行文件和 mod 本身附近的 fscommand
目录中,以防万一)
我也添加了这个:
Security.allowDomain("*");
Security.allowInsecureDomain("*");
cmets 中提到的dxgi.dll
方法非常痛苦,但这可能是游戏经常崩溃的原因,所以恐怕我无法在发布前通过 mod 检查。
所以基本上我没有想法。
不胜感激。
以防万一 - 完全没有关于如何修改游戏的文档...
【问题讨论】:
想一想。我认为你提到的那个游戏提供了一个自定义的 Flash Player 构建,他们在其中取消选择某些类和功能。您是游戏的官方文档,其中列出了所有(不)支持的功能。或者,如果您可以访问具有文件写入功能的 mod,您可以(我不敢相信我建议这样做)反编译他们的 SWF 并查找他们用来编写文件的类/代码。 这是你的问题 - 根本没有文档。官方宣布改装,它将在今年某个时候推出,但可能性本身已经存在于 o 文档中。我已经深入研究了所有的 swf 文件(主要是在它们之上构建的所有 UI)并且没有什么特别或任何限制,所以它可能在不同的地方受到限制,第一件事 - 我已经联系了作者在写入文件的 mod 中,它使用了一些修改过的 dxgi.dll 并且不知道如何使用它,因为编写部分是由另一个人完成的,现在他已经走了。太复杂了 @SerhiiDaskaliesku 不清楚...您是自己创建的(记录器)文本区域还是其他导入的 SWF 的一部分? (1) 如果创建,当它记录了您需要的所有数据时,为什么不将textArea.text
内容放入其他变量(如字符串)并根据需要使用? (eg: 保存到磁盘)。 (2) 如果导入,您可以尝试找出(可能通过反编译器?)文本区域的 var(或 instance)名称,然后使用类似的路径提取myString = myLoadedSWF.textArea.text;
...
@VC.One 这里是gist MyMod - 实际上是一个简单的mod,带有单个文本字段作为记录器,它工作得很好。第二个 - 它是主 SWF 文件的一部分,它加载自定义(用户的)swf 文件,它在任何情况下都适用于我,除了将数据设置到剪贴板,同时在游戏中加载我的 mod(我的 swf 的常规运行按我的预期工作) .这同样适用于我一直在使用的所有其他方法 - db、http、文件 - 当它加载到父 swf 中时没有任何作用。
澄清一下 - 我将父 SWF 反编译为 as 文件和 fla 文件,进行必要的更改并将其编译回 swf。我第一次使用已经创建的 mod 来检查它是否有效,是的,它有效,所以我认为问题不在这里......
【参考方案1】:
这是关于您的 shown example code 的扩展评论。
首先测试从mylogger
变量(不带剪贴板)获取文本的最简单方法。
在需要将myLogger
文本带入您的字符串时创建并运行一些函数extract_LoggerText();
。
尝试调整BasicModLoader.as
,如下例:
import flash.display.Loader;
...
public var __myModLoader :Loader;
public var loadedSWF :MovieClip;
public var myString :String = "";
public function ModLoaderCtr()
....
__myModLoader = new Loader();
__myModLoader.addEventListener(Event.COMPLETE, on_SWFLoadComplete);
__myModLoader.load(new URLRequest("MyAwesomeMod.swf"),new LoaderContext(false,ApplicationDomain.currentDomain));
//__myModLoader.load( new URLRequest("MyAwesomeMod.swf") ); //# or try basic without ApplicationDomain
public function on_SWFLoadComplete (evt:Event)
loadedSWF = MovieClip(evt.target.content);
addChild(loadedSWF);
//extract_LoggerText(); //# run this function later when logger has some text content...
public function extract_LoggerText() : void
myString = loadedSWF.myLogger.text;
trace ( " Extracted Text Check : \n" + myString ); //# should be logger text here
【讨论】:
感谢您的意见!是的,我能够在父母那里收到孩子的道具,但仍然没有一个提取数据选项不起作用。我找到了一个人,他为这些目的编写了带有套接字和文件写入的自定义dxdi.dll
文件,在运行时他的 dll 在加载时搜索所有根场景以查找特殊命名变量并在那里注入实际逻辑。目前它是唯一可行的选择..
不幸的是,这太复杂了。有大量的 swf 文件在运行时加载另一个文件,而一个又加载另一个文件,依此类推......从字面上看,我已经尝试了我能想到的一切——在 Adobe Flash 中启动一个简单的应用程序时,一切都运行良好,但一旦它被作为mod加载到游戏中-我猜没有任何效果:不知何故,所有http请求都被禁止;剪贴板禁用等等。如果这是真的 - 可以使用 swf 文件来完成吗?有什么解决方法吗?我还尝试了父 swf 中提到的所有操作 - 同样的事情,不起作用以上是关于AS3 如何将数据从对象提取到剪贴板、rest、db、文件等?的主要内容,如果未能解决你的问题,请参考以下文章