as3代码混淆的一点方法

注:发现许多人说看不懂,加个说明,看不懂的先去看下swf文件格式和abc文件格式,然后再看这个就能明白了。

在abc文件(参考“abc文件”)中,所有的字符串值都会保存到常量池的字符常量string_info string[string_count] 段中,因此要混淆代码,只要把该段中的字符串值进行混淆就可以了。

flash中的api中的类和方法以及代码中使用的字符串常量,还有导出类(SymbolClass标签中的)等是不能混淆的。实际上,需要混淆的只是自己定义的类和类的属性、方法。用户自己定义的类及属性方法可以在

u30 class_count
instance_info instance[class_count]

class_info class[class_count]

段中找到。class_count 是所有用户定义的类的总数。段的定义结构如下:

instance_info 
{
u30 name
u30 super_name
u8  flags
u30 protectedNs 
u30 intrf_count
u30 interface[intrf_count]
u30 iinit
u30 trait_count
traits_info trait[trait_count]
}

class_info 
{
u30 cinit
u30 trait_count
traits_info traits[trait_count]
}



另一个问题,在abc文件中,所有相同的字符串都会保存为同一个字符串值常量,当类或方法名根代码中的字符串相同时,则不能混淆。如下例子:

       class Test {

             public function Test() {

                   var str:String = "Test";   

                   trace(str);

             } 

       }

这时候,如果将Test类名混淆为a,那么str的值也会变为a,这样会改变str的值,因此混淆时还需要排出跟代码中字符串相同的类、方法或属性。

想要找出代码中使用的字符串,需要分析方法体内容,即

u30 method_body_count
method_body_info method_body[method_body_count]
段内容。方法体定义如下:

method_body_info
{
u30 method
u30 max_stack
u30 local_count
u30 init_scope_depth 
u30 max_scope_depth
u30 code_length
u8  code[code_length]
u30 exception_count
exception_info exception[exception_count]
u30 trait_count
traits_info trait[trait_count]
}

方法体的

u30 code_length
u8  code[code_length]

段记录了方法中的所有操作,只要找到其中的OP_pushstring(操作码0x2C)即为字符串赋值操作,根据该操作码后的字符串索引即可在字符串池中找到该字符串,将此字符串加入到排除列表即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值