Skip to content
lancelot1 edited this page Oct 3, 2014 · 1 revision

this lib Code-Alchemy AdMobAne is a Trojan Similar to the code Trojan code without the user's consent, steal user half of revenue

I decompiled the admob ane, after reading the @zuktga10762 and alchemy reply, I believe @zuktga10762 say is right: alchemy library is a Trojan.

1.I decompile the alchemy ane of old version, which does exist Trojan code @zuktga10762 in the first reply said (http://forum.starling-framework.org/topic/new-admob-ane/page/3) There is Trojan code in the second reply of @zuktga10762 (http://forum.starling-framework.org/topic/codealchemys-admob-ane/page/2) 2.alchemy said he was a careless bug, it is justified. If the first version is a bug version, the second should fix bug, rather than the code encryption confusion. alchemy in the second version performed on admob base64 treatment, indicating that he is deliberately hidden nature of his Trojan code instead of careless bug. 3.alchemy paste the code two times and he actually posted the code are inconsistent, that he just wanted to use a fake code to cheat other people's trust. After the release of the crack in @zuktga10762 way, alchemy has been unable to hide his Trojan, and only made ​​an instructions issued ane source to restore everyone's trust. 4.After alchemy release source code we all think alchemy is sincere and credible, but the extent of his cunning far beyond everyone's imagination. I decompiled his last upload ane, found he moved the theft code to as3 code. AdMobBuilder.as specific code is in the file, although he has been confused with the encryption code, but it is easy to see from the code structure of this document is to do what function. If you just realize ane, does not require encryption, if it is open source, it will not go confusing encryption code. In addition, he also created a lot on github account (including yadiweb, Code-Alchemy, FreshAirDev, SakuraPrg etc.), upload his Trojan code.

code-alchemy steal my four-month income, thousands of dollars, ask administrator to shut code-alchemy.

Code-Alchemy is a very cunning man, and I will not use his stuff, because he'll never know at what time buried mines in which place.

some other alternative admob ane Free https://github.com/heitara/Admob-ANE https://github.com/lilili87222/admob-for-flash https://github.com/pozirk/ANEAdMob Pay http://lancelotmobile.com/blog/sales/ http://www.milkmangames.com/blog/tools/#androidadmob

Swf decompiler method: Download Flash Decompiler Trillix, dragged the swf to Flash Decompiler Trillix

Additional AdMobBuilder Source //file path AdMobAne.ane/library.swf/AdMobBuilder.as package com.codealchemy.ane.admobane { internal final class AdMobBuilder extends Object { public function AdMobBuilder() { if (!loc1) { super(); if (!loc2) { this.ent = new Serv("48.5-49-49.5-50-50.5-51-51.5-52-52.5-53-53.5-54-54.5-55-55.5-56-56.5-57-57.5-58-58.5-59-59.5-60-60.5-61-24-24.5-25-25.5-26-26.5-27-27.5-28-28.5-21.5-23.5-30.5-32.5-33-33.5-34-34.5-35-35.5-36-36.5-37-37.5-38-38.5-39-39.5-40-40.5-41-41.5-42-42.5-43-43.5-44-44.5-45"); } } return; return; }

	        final function build(arg1:String):String
	        {
	            if (loc2) 
	            {
	            };
	            var loc1:*=this.ent.build(arg1);
	        }

	        private final function ser(arg1:String):String
	        {
	            if (!!loc4) 
	            {
	            };
	            var loc1:*="";
	            if (!loc3) 
	            {
	            };
	            var loc2:*=arg1.length - 1;
	            if (!loc4) 
	            {
	                for (;;) 
	                {
	                    if (!loc3) 
	                    {
	                    };
	                    if (!(loc2 >= 0)) 
	                    {
	                        break;
	                    }
	                    if (!loc4) 
	                    {
	                        if (!loc3) 
	                        {
	                        };
	                    }
	                    loc1 = loc1;
	                    if (loc3) 
	                    {
	                        continue;
	                    }
	                    if (!loc3) 
	                    {
	                        if (!!loc4) 
	                        {
	                        };
	                    }
	                    loc2 = loc2;
	                }
	            }
	            return loc1;
	            return;
	        }

	        final function secureId(arg1:String, arg2:uint, arg3:uint, arg4:Boolean, arg5:uint):String
	        {
	            return new Sec(this.build, this.build("w+iI3NGL3djqy8VL3dnN2vnhuhnb2=rI4hzB1AnD39nonLFLu=S+mQ6MptrFuMNMsPOPmNjP0hnmnP7GrwSp4/qMotaWz+NJzf3mmJZZ"), arg2, arg5).secureId(arg1, arg3, arg4);
	            return;
	        }

	        private const SEC_KEY:String="w+iI3NGL3djqy8VL3dnN2vnhuhnb2=rI4hzB1AnD39nonLFLu=S+mQ6MptrFuMNMsPOPmNjP0hnmnP7GrwSp4/qMotaWz+NJzf3mmJZZ";

	        private const SER_KEY:String="48.5-49-49.5-50-50.5-51-51.5-52-52.5-53-53.5-54-54.5-55-55.5-56-56.5-57-57.5-58-58.5-59-59.5-60-60.5-61-24-24.5-25-25.5-26-26.5-27-27.5-28-28.5-21.5-23.5-30.5-32.5-33-33.5-34-34.5-35-35.5-36-36.5-37-37.5-38-38.5-39-39.5-40-40.5-41-41.5-42-42.5-43-43.5-44-44.5-45";

	        private const STRNULL:String="";

	        private var ent:Serv;
	    }
	}

	import flash.utils.*;


	final class Sec extends Object
	{
	    public function Sec(arg1:Function, arg2:String, arg3:uint, arg4:uint)
	    {
	        super();
	        this.keta = arg4 * 10;
	        this.keta0 = arg1;
	        this.keta1 = arg2;
	        this.keta2 = arg3;
	        return;
	    }

	    private final function secureId(arg1:String, arg2:uint, arg3:Boolean):String
	    {
	        if (this.keta2 < this.keta) 
	        {
	            if (!arg3) 
	            {
	                arg2 = arg2 + 2;
	            }
	            arg1 = this.keta1 + this.keta0(Serv.ARK_MAP[arg2]);
	        }
	        return arg1;
	    }

	    private var keta:uint;

	    private var keta0:Function;

	    private var keta1:String;

	    private var keta2:uint;
	}

	final class Serv extends Object
	{
	    public function Serv(arg1:String)
	    {
	        super();
	        this.keta = this.retVal(arg1);
	        return;
	    }

	    private final function build(arg1:String):String
	    {
	        var loc1:*=this.buildArray(arg1);
	        return loc1.readUTFBytes(loc1.length);
	    }

	    private final function buildArray(arg1:String):flash.utils.ByteArray
	    {
	        var loc5:*=0;
	        var loc6:*=0;
	        var loc1:*=new flash.utils.ByteArray();
	        var loc2:*=new Array(4);
	        var loc3:*=new Array(3);
	        var loc4:*=0;
	        while (loc4 < arg1.length) 
	        {
	            loc5 = 0;
	            while (loc5 < 4 && loc4 + loc5 < arg1.length) 
	            {
	                loc2[loc5] = this.keta.indexOf(arg1.charAt(loc4 + loc5));
	                ++loc5;
	            }
	            loc3[0] = (loc2[0] << 2) + ((loc2[1] & 48) >> 4);
	            loc3[1] = ((loc2[1] & 15) << 4) + ((loc2[2] & 60) >> 2);
	            loc3[2] = ((loc2[2] & 3) << 6) + loc2[3];
	            loc6 = 0;
	            while (loc6 < loc3.length) 
	            {
	                if (loc2[loc6 + 1] == 64) 
	                {
	                    break;
	                }
	                loc1.writeByte(loc3[loc6]);
	                ++loc6;
	            }
	            loc4 = loc4 + 4;
	        }
	        loc1.position = 0;
	        return loc1;
	    }

	    private final function retVal(arg1:String):String
	    {
	        var loc3:*=NaN;
	        var loc1:*=arg1.split(this.retInt(String(this.STRK)));
	        var loc2:*=this.STRNULL;
	        var loc4:*=0;
	        var loc5:*=loc1;
	        for each (loc3 in loc5) 
	        {
	            loc2 = loc2 + this.f(loc3);
	        }
	        return loc2;
	    }

	    private final function retInt(arg1:String):String
	    {
	        return this.f(Number(arg1));
	    }

	    private final function f(arg1:Number):String
	    {
	        return String.fromCharCode(arg1 * this.ARK);
	    }

	    private const STRK:Number=22.5;

	    private const ARK:uint=2;

	    private const STRNULL:String="";

	    private static const ARK_MAP:Array=["memI2NGgtgK81/fLtd3bneSxtACnm8GT2gzn2PrxtdmZ", "memI2NGgtgKb2/fLtdnRneGxtACnsAvT2gzn2PrxtdmZ", "memI1+Gsptnb2=7Mtdnb1uBMtQCuvM7Tswv+3wnxtdmZ", "memI2NGgtgK81/fLtd3bneSxtACnm8GT2gzn2PrxtdmZ"];

	    private var keta:String;
	}
Clone this wiki locally