`
wgcode
  • 浏览: 593488 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

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)即为字符串赋值操作,根据该操作码后的字符串索引即可在字符串池中找到该字符串,将此字符串加入到排除列表即可。

分享到:
评论

相关推荐

    禁用鼠标左键 vb源码

    Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) If Button = vbLeftButton Then ' 检查是否是左键被按下 Exit Sub ' 忽略左键按下事件 End If ' 其他鼠标处理...

    visual basic

    这是因为“+”运算符在不同上下文中可能有不同的含义,例如用于数字加法和字符串连接时可能会引起混淆。“&”则专门用于字符串连接,避免了这种歧义。例如: **不正确的做法:** ```vb Dim sMessage As String ...

    T-SQL应该注意的几点.doc

    例如,下面的代码演示了如何使用CTE插入10万行数据,该方法相比逐行插入的方式更为高效。 ```sql WITH cte AS ( SELECT TOP (100000) rn = ROW_NUMBER() OVER(ORDER BY c1.[object_id]) FROM sys.columns AS c1 ...

    如何编写批处理文件批处理文件批处理文件

    ”因为网上好像并没有一个比较完整的教材,所以抽一点时间写了这片《简明批处理教程》给新手朋友们.也献给所有为实现网络的自由与共享而努力的朋友们. 批处理文件是无格式的文本文件,它包含一条或多条命令。它的...

    用于学习测试的神经网络ea.mq4

    这一点是非常必要的,因为一个基于趋势的交易系统是不能成功交易在盘整(sideways trends),也不能识别市场的回调(setbacks)和逆转(reversals.,反向走势)!当然,你可以采用两个ATS,一个基于“趋势”,一个基于“反...

    C++MFC教程

    后面几条是我个人的一点意见,你可以根据需要和自身的情况选用适用于自己的方法。 此外我将一些我在选择参考书时的原则: 对于初学者:应该选择一些内容比较全面的书籍,并且书籍中的内容应该以合理的方式安排,...

    关于laravel 数据库迁移中integer类型是无法指定长度的问题

    在 Laravel 框架中,数据库迁移是管理数据库结构变化的一种高效方式。它允许开发者以编程的方式定义数据库表结构,并且可以在多个...了解这一点对于在 Laravel 中进行数据库迁移非常重要,可以避免不必要的错误和混淆。

    jquery对象和javascript对象即DOM对象相互转换

    在JavaScript的世界里,jQuery库为开发者提供了更便捷的DOM操作方式。jQuery对象和JavaScript对象(DOM对象)虽然在...在编写jQuery代码时,一定要注意选择合适的方法,避免混淆两者,这样才能编写出高效且无误的代码。

    Dos命令大全

    比较易读,而且避免与不分大小写的组合键混淆。 以上是MS的官方帮助,下面我们举几个例子来具体说明一下For命令在入侵中的用途。 sample2: 利用For命令来实现对一台目标Win2k主机的暴力密码破解。 我们用...

    Android蓝牙库FastBle的基础入门使用

    前言 最近在做物联网课设,过程中需要用到Android的蓝牙API,奈何原生的蓝牙API使用有点麻烦。于是上网搜索看有没有好用的Android蓝牙...市面上的蓝牙库也是少之又少,先看了看BleLib,感觉还是换汤不换药,用起来一点

    javascript中的new使用

    所以javascript中没有类的概念。... 这段代码,我们会经常用到,其中new关键字最容易引起混淆的一处。这里的new和.NET中的所做的工作不同。 我们可以这样理解javascript中用new操作创建实例的过程,ne

    计算机应用技术(实用手册)

    让默认的就可以了,但是超频玩者是肯定不会放过任何可以提高性能的东西的,所以如果你想在这里让你的电脑提升一点性能的话,就必须慢慢试验,选择一个适当的参数才能让你的计算机达到性能和稳定的最佳状态!...

    帮助避免错误的Javascript陷阱清单

    了解这一点对于避免意外的类型转换至关重要。 3. **行尾自动插入分号**: JavaScript引擎会在某些情况下自动在行尾添加分号,这可能导致意料之外的代码执行。例如,在上面的例子中,`returnSame(a)`函数中的空行被...

Global site tag (gtag.js) - Google Analytics