首页
社区
课程
招聘
[原创]剖析某人的AS3加壳器的Trick
发表于: 2009-1-15 08:34 5648

[原创]剖析某人的AS3加壳器的Trick

2009-1-15 08:34
5648

下面纯粹出于一点兴趣,没有任何目的,希望不要惹来事非,源件:http://space.flash8.net/bbs/viewthread.php?tid=370332&extra=page%3D1。

我们比较熟悉的SWF文件的反编译器是SWFDecompiler和Action Script Viewer

它们现在公布已知的版本分别是4.5 和6.0 Alpha 4,前面的反编译(冗余)还是有问题的,后面的(简约)就是不能识别某类DoAbcTag(可参考AbcDump.as)

不要过分相信反编译器,毕竟有心人还是可以找出相对的策略...

从SWFDecompiler,我们可以得到反编译后唯一的Loader(Packer)的AS文件,如下:

package CYPL.utils
{
    import flash.display.*;
    import flash.events.*;
    import flash.net.*;
    import flash.system.*;
    import flash.utils.*;

    public class DisturbSWF extends Sprite
    {
        private var _c:Object;
        private var _l:Object;
        private var _p:Object;
        private var _y:Object;

        public function DisturbSWF()
        {
            this.addEventListener(Event.ADDED_TO_STAGE, initClass);
            return;
        }
        private function initClass(param1:Event) : void
        {
            this.removeEventListener(Event.ADDED_TO_STAGE, initClass); // 暗事干好了,还留你就碍事
            _c = new URLStream();
            _c.addEventListener(Event.COMPLETE, completeHandler);
            _c.load(new URLRequest(loaderInfo.url));
            return;
        }
        private function completeHandler(param1:Event) : void
        {
            var _loc_2:int;
            _p = new ByteArray();
            _c.readBytes(_p);
            _l = new ByteArray();
            _p.readBytes(_l, 0, 4);
            _p.position = _p[_p.length--] << 24 | _p[_p.length - 2] << 16 | _p[_p.length - 3] << 8 | _p[_p.length - 4];
            _loc_2 = _p[_p.length - 4]; // Key
            _p.readBytes(_l, 4);  // Packed data
            if (_loc_2 != 0)
            {
                _c = 4;
                while (_c < _p.length)
                {
                    if (_c % _loc_2 != 0)
                    {
                        _l[_c] = _l[_c] + _loc_2 & 255;
                    }
                    _c = _c + 1;
                }
            }
            _y = new Loader();
            _c = new LoaderContext();
            _c.applicationDomain = ApplicationDomain.currentDomain;
            addChild(Loader(_y));
            _l.length = _l.length - 4; // 解码完毕,应该还可以精简,留给有心人做。
            _y.loadBytes(_l, _c);
            _l = null;
            _p = null;
            _c = null;
            _y = null;
            return;
        }
    }
}

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 7
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//