注:发现许多人说看不懂,加个说明,看不懂的先去看下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)即为字符串赋值操作,根据该操作码后的字符串索引即可在字符串池中找到该字符串,将此字符串加入到排除列表即可。
分享到:
相关推荐
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) If Button = vbLeftButton Then ' 检查是否是左键被按下 Exit Sub ' 忽略左键按下事件 End If ' 其他鼠标处理...
这是因为“+”运算符在不同上下文中可能有不同的含义,例如用于数字加法和字符串连接时可能会引起混淆。“&”则专门用于字符串连接,避免了这种歧义。例如: **不正确的做法:** ```vb Dim sMessage As String ...
例如,下面的代码演示了如何使用CTE插入10万行数据,该方法相比逐行插入的方式更为高效。 ```sql WITH cte AS ( SELECT TOP (100000) rn = ROW_NUMBER() OVER(ORDER BY c1.[object_id]) FROM sys.columns AS c1 ...
”因为网上好像并没有一个比较完整的教材,所以抽一点时间写了这片《简明批处理教程》给新手朋友们.也献给所有为实现网络的自由与共享而努力的朋友们. 批处理文件是无格式的文本文件,它包含一条或多条命令。它的...
这一点是非常必要的,因为一个基于趋势的交易系统是不能成功交易在盘整(sideways trends),也不能识别市场的回调(setbacks)和逆转(reversals.,反向走势)!当然,你可以采用两个ATS,一个基于“趋势”,一个基于“反...
后面几条是我个人的一点意见,你可以根据需要和自身的情况选用适用于自己的方法。 此外我将一些我在选择参考书时的原则: 对于初学者:应该选择一些内容比较全面的书籍,并且书籍中的内容应该以合理的方式安排,...
在 Laravel 框架中,数据库迁移是管理数据库结构变化的一种高效方式。它允许开发者以编程的方式定义数据库表结构,并且可以在多个...了解这一点对于在 Laravel 中进行数据库迁移非常重要,可以避免不必要的错误和混淆。
在JavaScript的世界里,jQuery库为开发者提供了更便捷的DOM操作方式。jQuery对象和JavaScript对象(DOM对象)虽然在...在编写jQuery代码时,一定要注意选择合适的方法,避免混淆两者,这样才能编写出高效且无误的代码。
比较易读,而且避免与不分大小写的组合键混淆。 以上是MS的官方帮助,下面我们举几个例子来具体说明一下For命令在入侵中的用途。 sample2: 利用For命令来实现对一台目标Win2k主机的暴力密码破解。 我们用...
前言 最近在做物联网课设,过程中需要用到Android的蓝牙API,奈何原生的蓝牙API使用有点麻烦。于是上网搜索看有没有好用的Android蓝牙...市面上的蓝牙库也是少之又少,先看了看BleLib,感觉还是换汤不换药,用起来一点
所以javascript中没有类的概念。... 这段代码,我们会经常用到,其中new关键字最容易引起混淆的一处。这里的new和.NET中的所做的工作不同。 我们可以这样理解javascript中用new操作创建实例的过程,ne
让默认的就可以了,但是超频玩者是肯定不会放过任何可以提高性能的东西的,所以如果你想在这里让你的电脑提升一点性能的话,就必须慢慢试验,选择一个适当的参数才能让你的计算机达到性能和稳定的最佳状态!...
了解这一点对于避免意外的类型转换至关重要。 3. **行尾自动插入分号**: JavaScript引擎会在某些情况下自动在行尾添加分号,这可能导致意料之外的代码执行。例如,在上面的例子中,`returnSame(a)`函数中的空行被...