随着时间的推移,flash开始渐渐的淡出人们的视野,现在最新版本的chrome浏览器已经默认不开启flash了,但仍有大量的厂家在使用,也有大量的flash作品,比如DMM的舰队collection、一些国内的页游以及大部分还未更换成H5技术的视频网站,当年本篇文章并非考古,而是因为某些缘由,我想起了多年前的一款软件,相信年轻时经常玩flash小游戏的朋友们不会陌生。
这个软件可是当年为数不多可以对flash进行实时修改的神器,但当时并未考虑过其原理,而这个软件作者早已不再更新并无法联系了,已经无法在win7下使用。
通过查询了多方资料,以及一些分析,我大胆的对该软件做出了如下猜测:
1.软件本体是C++编写,调用ActiveX控件来加载flash
2.真实的flash并非直接通过控件加载,控件加载的是壳flash
3.壳flash通过与C++程序交互并修改目标flash达成目的
猜不如放点干货,首先是与flash控件通信
测试语言:C# (其他语言思路相同)
我们首先在项目中添加 AxInterop.ShockwaveFlashObjects.dll
并引用
using AxShockwaveFlashObjects;
然后这样加载一个影片
private AxShockwaveFlashObjects.AxShockwaveFlash player;
player.LoadMovie(0, Application.StartupPath + “\\Test.swf”); //第一个参数是所在层
player.Play(); //播放flash
调用flash的方式如下
player.CallFunction(“<invoke name=\”函数名\” returntype=\”xml\”><arguments><string>” + 传入参数 + “</string></arguments></invoke>”);
以上部分为外部exe程序调用
下面来看flash部分
首先你要有上面需要调用的函数的对应的名字
function 函数名(val:String):void
{
若干操作…
}
这样函数就会被顺利调用了
而flash反调exe也比较简单,只要调用
ExternalInterface.call(“命令“, 参数);
即可
我们在C#中首先注册flash的消息回调
this.player.FlashCall += new AxShockwaveFlashObjects._IShockwaveFlashEvents_FlashCallEventHandler(this.player_FlashCall);
在player_FlashCall函数中,我们即可从_IShockwaveFlashEvents_FlashCallEvent拿到flash传给我们的东西,格式为XML,自行解析处理即可
如有错误,请大家指正,谢谢