Laan's steps..

Feed Rss

swf混淆研究到…

01.12.2009, flash, by .

swf的abc结构还算比较容易理解。由大到小,就是scripe,class,instance,然后就是方法及变量了。个人理解是一个类,编译后在abc中体现就是一个class和一个instance。而一个as文件就是一个scripte。有什么区别呢?如果一个as文件中写了两个class,这时候就可以看出区别了。这个as文件会对应两个class和两个instance,而只对应一个scripte。

script有初始化方法,在该方法内,会初始化存在于该script中所有的类。这个方法只执行一次。于是可以想到,可是使用prototype来注入方法。在所有类初始化后,将类对应的instance方法注入到该类的prototype中去;然后删除instance的所有方法。这样的话,效果是一样,但是代码就隐藏起来了(听说asv目前的版本可以看到script中的代码了)。

当然这个时候会产生一些问题。最为明显的就是方法调用。swf中指令findpropstrict(0x5d)是其实是不会搜索prototype中的方法——除非使用with控制scope数据。于是还需要在所有指令findpropstrict前注入指:令:

getlocal0(0xd0),pushwith(0x1c),popscope(0x1d)

可以看下效果》》》

air代码:
swfBytes = new ByteArray();
var file:File = new File("app:/test.swf");
var stream:FileStream = new FileStream();
stream.open(file, FileMode.READ);
stream.readBytes(swfBytes, 0, stream.bytesAvailable)
stream.close();

var i:uint = 0;
var j:uint = 0;
var k:uint = 0;

var abc:ABC;

for (i = 0; i < swf.tags.length; i++) {
if (swf.tags[i] is DoABC || swf.tags[i].tagId == 72) {
if (swf.tags[i] is DoABC) {
var doabc:DoABC = swf.tags[i] as DoABC;
} else {
var abcBytes:SwfBytes = new SwfBytes();
abcBytes.writeUnsignedInt(1);
abcBytes.writeString(“www.laan.so”);
abcBytes.writeBytes(Tag(tags[i]).data);

doabc = new DoABC(abcBytes);
}

abc = new ABC(doabc.abcCode);

//添加 prototype multiname
var ptMN:MultiName = new MultiName();
ptMN.kind = MultiNameKind.QName;
ptMN.data.name = abc.constantPool.addStringInfo(“prototype”);
ptMN.data.ns = abc.constantPool.addNameSpaceInfo(NamespaceKind.PackageNamespace, “”);
abc.constantPool.multiNames.push(ptMN);

//添加全局访问namespace set
var globalNS:NamespaceSetInfo = new NamespaceSetInfo();
for (k = 1; k < abc.constantPool.namespaces.length; k++) {
globalNS.ns.push(k);
}
abc.constantPool.nsSets.push(globalNS);

//==============================================================================================

for (k = 0; k < abc.scripts.length; k++) {
//InstanceInfo(abc.instances[k]).iinit = abc.scripts[k].init;

var code:Array = abc.scripts[k].readableData.init.body.codes;
code.pop();

for (var kk:uint = 0; kk < abc.scripts[k].traits.length; kk++) {
var traitInfo:TraitInfo = abc.scripts[k].traits[kk];
if (traitInfo.kind != TraitKind.Class) continue;

var traits:Array = abc.instances[ClassTraitData(traitInfo.data).clazz].traits;

for (j = 0; j < traits.length; j++) {
if (TraitInfo(traits[j]).kind == TraitKind.Method) {
//getlocal0
code.push(0xd0);

//pushwith
//code.push(0x1c);

//getproperty
code.push(0×66);
code.push(traitInfo.name);

//getproperty prototype
code.push(0×66);
code.push(abc.constantPool.multiNames.length – 1);

//newfunction
code.push(0×40);
code.push(MethodTraitData(traits[j].data).method);

//setproperty
code.push(0×61);
var methodName:uint = traits[j].name;
code.push(methodName);

var mn:MultiName = abc.constantPool.multiNames[methodName];
mn.kind = MultiNameKind.Multiname;
delete mn.data.ns;
mn.data.nsSet = abc.constantPool.nsSets.length – 1;

traits.splice(j, 1);
j–;
//break;
}
}

//removevoide
code.push(0×47);
}
}

for (k = 0; k < abc.methods.length; k++) {
//code = abc.methods[i].readableData.body.codes;

var methodBody:MethodBodyInfo = MethodBodyInfo.getMethodBodyByMethod(abc.methods[k]);
methodBody.maxScopeDepth += 1;

code = methodBody.codes;

var indent:uint = 0;

trace(k);
var codeInfo:Array = InstructionManager.doCodes(code) as Array;
for (j = 0; j < codeInfo.length; j++) {
if (codeInfo[j] == “_$_%_findpropstrict”) {

//getlocal0
code.splice(j + indent, 0, 0xd0);

//pushwith
code.splice(j + indent+1, 0, 0x1c);

//popscope
code.splice(j + indent+4, 0, 0x1d);

indent += 3;
}
}
}

doabc.abcCode = abc.byteArray;

swf.tags.splice(i, 1, doabc);
break;
}
}

var confuseBytes:ByteArray = new ByteArray();
confuseBytes.writeObject(confuseMap);
swf.tags.push(TagFactory.createTag(201, confuseBytes));

var newSWF:ByteArray = swf.createSWF();

file = new File(“c:/test.swf”);
stream = new FileStream();
stream.open(file, FileMode.WRITE);
stream.writeBytes(newSWF, 0, newSWF.bytesAvailable)
stream.close();

swf混淆研究到… 有 2 条回应

  1. Gute Arbeit hier! Gute Inhalte.

    回复
  2. 文件沒有全部放上來呀?怎麼回事?

    回复

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>