反转使用 .loadBytes() 的 Flash 文件

逆向工程 动作脚本 闪光
2021-06-18 03:33:23

我一直更了解二进制反转——x86/x64 类型的东西——所以最近我决定尝试反转一些闪存。

使用 SoThink 从 SWF 获取 .AS,但 SWF 正在从服务器提取数据。然后对数据进行去混淆处理并对其进行 .loadBytes 处理。

我已经制作了一个去混淆数据的文件(通过 FileReference.save()),但它不是一个有效的、独立的闪存文件。

我如何去反编译这个动态加载的闪存字节数组,或者至少将它转换成我可以使用的东西?

为清楚起见编辑:

var foo = new Loader(); // 稍后被addChild'ed  
var bar:LoaderContext = new LoaderContext(false, ApplicationDomain.currentDomain);

foo.contentLoaderInfo.parameters.parent = this;
foo.contentLoaderInfo.addEventListener(Event.COMPLETE, fooFunc);
foo.contentLoaderInfo.addEventListener("securityError", this.onSecurityError);
foo.loadBytes(someByteArray, bar); // 'someByteArray' 是来自服务器的反混淆的东西

在上述情况下,永远不会调用 'fooFunc',但根据提供的评论/反馈,一旦 'fooFunc' 发生,文件似乎已经完全加载。

这让我相信“someByteArray”是动态加载到 swf 中的二进制数据,但“someByteArray”数据不是有效的 SWF,如果这是有道理的。

1个回答

原来这是我的问题。

对于那些好奇的人:事实证明我想要加载的文件一个纯 .SWF 文件。我对 Flash 没有足够的经验,无法立即知道数据类型为“data.BINARY”的 Loader().loadBytes() 必然是 Flash 文件(而不是某种形式的程序集)。

该文件被加密方案混淆。密钥是硬编码的。结果是我在去混淆文件时输入了密钥。绞尽脑汁 9 小时后,我从头开始,标记正确的密钥,瞧:我的去混淆文件是标准的 .SWF。我正常反编译。

感谢那些试图提供帮助的人。不幸的是,它原来是一个错误的领导。