1、一种基于语义的恶意行为分析方法李佳静 1,梁知音 1,韦韬 1 ,毛剑 1北京大学计算机科学技术研究所,北京,100871通信作者,E-mail: 摘要 多态和变形恶意代码的出现给传统的基于语法的恶意代码分析方法带来了挑战。基于语义的恶意代码分析方法试图解决这些问题,但是现有的方法对基于函数调用的攻击的研究存在不足。本文提出了一种基于语义的恶意行为分析方法,可以对基于函数调用的攻击进行完整刻划,支持流敏感、上下文敏感且路径敏感的函数间分析。与现有方法相比可以更加准确地描述全局状态中的基于函数调用的攻击行为。针对多个恶意程序和应用程序的分析表明,该方法可以有效地识别代码中的恶意行为。关键词 恶意
2、代码分析,代码混淆,模型检验, 信息安全中图分类号:TP314A Malicious Behavior Analysis Method Based on Program SemanticLi Jiajing1, Liang Zhiyin1, Wei Tao1, Mao Jian1, Zou Wei11. Institute of Computer Science & Technology of Peking University, Beijing, 100871Corresponding Author, E-mail: Abstract Polymorphic and metamorphic
3、malware defeat traditional malware analysis methods. Methods based on program semantic were provided to resolve this problem, but currently few researches were focused on function call based attacks. This paper presents a semantic based method to analysis malicious behavior in software, with more pr
4、ecise description of function call based attacks, and flow sensitive, context sensitive and path sensitive inter-procedure analysis ability. Experiments on malicious and benign programs show it is effective to find malicious behavior in software.Keywords malware analysis, code obfuscation, model che
5、cking, information security恶意代码已经成为威胁互联网安全的重要因素,对恶意代码的分析和检测是任何安全策略中的重要环节。传统的恶意代码检测技术根据恶意代码的形态特征,提取恶意代码的指纹,通过模式匹配方式对目标系统检测和防护,典型的指纹提取方法包括Rabin指纹等。实验表明这种方法不能识别特征未知的恶意代码,以及同一个恶意代码的多态或变形 1。为了解决基于语法检测的方法的这些问题,基于语义的恶意代码分析被提出来 1-6。基于语义的方法使用抽象语义刻画程序的行为,以对抗对语法层次代码的修改和检测未知的恶意软件,其出发点为(1)不同的语法表达可能有相同的语义,例如攻击者可以
6、使用拟态基金资助:国家高技术研究发展(863)计划,项目编号 2006AA01Z402;电子发展基金项目,批准文号信部运2006634 号。作者简介:李佳静,女,博士研究生;研究方向,网络与信息安全攻击(Mimicry Attacks)来模糊程序的语义;(2)恶意代码的大部分与攻击目标无关,例如有些代码只是进行内存分配和初始化等;(3)恶意代码可能通过代码重用实现相似的功能,例如扫描、攻击和隐藏,基于语义的方法通过分析已知恶意行为可以识别未知恶意程序。根据恶意程序使用的主要策略,安全攻击将粗略分为基于内存的攻击(例如缓冲区溢出或者格式化字符攻击)和基于函数调用的攻击。大多数使用 C/C+等高级
7、语言编写的病毒、蠕虫、木马、后门等,在受害系统中进行的恶意行为,例如打开 TCP 端口将自身的拷贝发送到远程的机器、安装后门、删除或者截取敏感信息、修改受害系统的配置等,都使用基于函数的攻击。目前语义分析方法对基于函数调用攻击的研究存在不足,主要包括以下三个方面:(1)无法描述函数调用的复杂上下文关系。现有的方法或者使用单个的可疑函数,或者使用基于语法的函数序列的统计信息,忽略了函数调用的语义与上下文之间的关系。(2)无法描述函数调用的语义与控制结构的关系。例如在 while()中出现的没有成对recv()出现的 send(),可能产生拒绝服务攻击,不在循环结构中的相同函数则没有这样的语义。现
8、有的方法无法描述这种关系。(3)分析精度低。现有方法只能在单个函数内部进行分析。而程序的某些行为,例如网络行为往往是在多个函数间的,需要在全局状态空间内进行分析。针对以上问题,本文提出了一种基于语义的静态恶意代码分析方法。该方法具有以下特点:(1)首次采用有效的基于函数调用的恶意行为描述规则,能够描述恶意行为的复杂上下文关系和控制流信息;(2)分析精度高:支持对恶意代码的流敏感、上下文敏感且路径敏感的函数间分析;(3)根据对现有恶意代码的分析依据相应规则在系统和网络两个方面给出了 4 种基于函数调用的恶意行为模型。以上方法已在自研制的时序安全属性分析系统 BinMc 中使用,对真实的恶意软件和
9、应用的试验结果表明,该方法可以有效地识别程序中的恶意行为。1. 相关研究工作基于函数调用的恶意代码分析在入侵检测系统中有大量的应用。SAVE 从恶意代码中提取 API 序列作为特征,将每个 API 映射为一个整数,对 API 序列进行编码,使用序列对齐算法来计算恶意代码的不同变形间的相似度 7。苏璞睿等人通过对应用程序可执行文件静态分析,建立应用程序所有可能执行的定长系统调用集合,通过实时监控进程执行的系统调用序列是否在该集合中实施检测 8。API 序列的结果只是一些语法信息,可以通过产生不同的 API 序列但是相同的语义的变形恶意代码来绕过检测。为了解决基于语法特征分析方法的问题,提出了很多
10、基于语义的恶意代码分析方 法。目前基于语义的方法主要集中在基于内存的攻击。例如 SAFE 使用模型检验的方法来识别程序中是否包含了模版描述的恶意行为 2。改进的方法中提出如果代码段在运行后对内存的影响与模板描述的相同,则认为程序中包含了模板描述的恶意行为 1。Scheirer 等人开发了使用相似方法的网络入侵检测系统来检测缓冲区溢出攻击 3。这些方法无法对抗等价指令替换以及指令乱序等混淆方法。Kruegel 等人使用符号执行模拟数据在程序中的传播8, 如果一个可加载的内核模块访问 rootkit 通常使用的内核地址则它可能是 rootkit4。Stinson 等人对选取的 bot 命令的参数进
11、行动态污染分析,若污染数据作为关键函数(称为gate functions)的参数,则可能存在远程控制 5。基于污染传播的方法适合与对数据的非法访问和使用的分析。基于函数调用的分析方面,Kirda 等人首先使用动态分析技术找到软件中需要分析组件的入口,然后使用静态分析提取这些组件的控制流图,若控制流图中存在已知可疑函数,则可能是间谍软件(spyware) 6。该方法对于恶意行为的描述过于简单,因此在最好的情况下也会对善意软件产生误报。Kinder 等人用计算树谓词逻辑描述程序安全属性,将程序的控制流图转换为 Kripke 结构,使用模型检查方法验证程序中是否存在安全漏洞 7。该方法只能分析单个函
12、数内的系统状态,无法检查全局的状态空间。从以上分析可知,目前对基于函数调用攻击的研究中存在不足,主要包括缺乏对函数调用的复杂上下文以及控制结构的完整描述,同时分析精度低,无法在全局状态下分析程序调用的行为语义。针对以上问题,本文提出了一种新的恶意行为分析方法并进行了相关实验。2. 基于语义的恶意行为分析方法本文采用行为序列的时序关系刻画恶意行为,使用模型检验方法验证程序中是否包含恶意行为。基于语义的恶意行为分析方法主要包括三个环节。1)恶意行为描述。分析已知的恶意代码,将其按照功能例如文件访问、网络传输等划分为不同的功能构件,在构件中分析恶意行为的关键步骤和它们之间的时序关系,使用有穷状态机描
13、述这些恶意行为。2)全局状态模型建立。对于可疑的程序,首先对其反汇编和反编译,将其转换为中间语言,根据中间语言生成程序的下推自动机,以描述全局状态空间。3)恶意行为存在性验证。使用模型检验方法,如果程序中存在恶意行为,则输出疑似恶意行为路径。本章首先介绍恶意行为分析模型,然后就三个关键环节进行详细分析。 恶 意 行 为 状 态 机 图 1 基 于 行 为 语 义 的 恶 意 代 码 分 析 方 法 模 型 反汇编 反编译 中 间 语 言 生成 下推自动机 检测器 可 疑 程 序 汇 编 程 序 疑 似 恶 意 行 为 路 径 全 局 状 态 模 型 建 立 恶 意 兴 为 检 验 已 知 恶
14、意 软 件 自动机描述 人工分析 行 为 时 序 序 列 恶 意 行 为 描 述 功 能 组 件 关键行为提取 下 推 自 动 机 Fig. 1Model fthe Bavior Based Malwre Analysi Method 2.1 恶意行为分析抽象模型本文的恶意行为分析模型将 Christodorescu 的人提出的恶意代码分析模型 2扩展到函数间分析 9。该模型使用有穷状态机(Finite States Automata, FSA)描述恶意行为,下推自动机(Pushdown Automata, PDA)描述程序的全局状态空间(即程序的执行路径空间) ,然后使用模型检验方法检查程序
15、中是否存在某些恶意行为。恶意行为的 FSA 使用 6 元组 表示,其中 是自由变量0(,)AVSF1,.kVv集合; 是以自由变量为参数的抽象语法树(函数调用或控制结构等)集合;1,.n是状态的有穷集合; 为转换函数; 是初始状态的非空集合;S2S0S是结束状态的非空集合,所有恶意行为序列使得 到达结束状态。对于F A的一个绑定 ,使用 替换 中所有的 ( )得到有穷状态机称作1,.kVv()iviv1ik。每个自由变量在程序中的所有出现存在一致的取值。()A为了表示程序的全局状态空间,即包含函数调用的程序执行路径集合,需要一个栈来记录函数调用的返回地址,由栈产生的语言是上下文无关语言,则存在
16、一个下推自动机接受 。令 ,其中 为程序的控制点的有穷集合; 为程序的栈符号集合,T(,)P即栈指针的值域; 是一个有穷的转换集合,表示 接收一个输入符(*)P号,从一个配置到达另一个配置。分析器以程序的 PDA 和恶意行为 FSA 作为输入,并判定P0(,)AVSF语言是否为空。 是 对应的语言, 是所有对 中变量绑定的()()BAlLP()LPAlV集合。即检测器决定是否存在一个绑定 使得语言 和 的交集非空。根据自动机理论,()B有算法能够计算一个 PDA 和 FSA 交集生成的 PDA 接受的语言是否为空 13。若算法返回了一个非空集合,则在 中存在恶意行为,检测器报告恶意行为对应的执
17、行路径。P2.2 恶意行为模型通过对 RBot 程序的分析提出了几个恶意行为模型。Rbot 是目前最活跃的 bot 程序之一,集 IRC 后门、蠕虫功能于一体,通过网络共享和操作系统漏洞进行传播。本文将 Rbot程序中包含的恶意行为将其分为系统行为和网络行为。2.2.1 系统行为模型系统行为是指恶意软件为了达到传播自身,掩饰自己不被发现等目的,对系统进行修改的行为。这个给出杀死反病毒软件进程模型和自启动模型两种恶意的系统行为刻画。杀死反病毒软件进程模型一些恶意软件为了提高自身存活率,通过实时监视系统进程,及时杀死某些著名反病毒软件或者监控软件的进程,从而达到保护自己的目的。图 2 中为使用 T
18、oolHelp API 系列函数实现杀死反病毒软件进程的有限状态机。程序初始状态为 a0,调用 x=CreateToolhelp32Snapshot()取得快照句柄,程序状态从 a0 到达 a1,然后使用 Process32First()和 Process32Next()枚举当前的进程,程序状态分别从 a1 到达 a2和从 a2 到达 a3。恶意软件通常维护一个反病毒软件进程名称的列表,枚举过程中逐一判断进程名是否存在该列表中,若存在则调用 y=OpenProcess()函数取得目标进程的句柄,程序状态从 a3 到达 a4,然后调用函数 TerminateProcess(y,0)终止该进程,程
19、序状态从 a4 到达a5。最后 CloseHandle(x)关闭快照句柄程序状态从 a5 到达终止状态 a6。若程序使得该状态机到达结束状态 a6,则程序中存在杀死反病毒软件进程行为。 (其中 x,y 为自由变量,每个自由变量在程序中的每次出现有一致的取值) 。a 0 a 1x = C r e a t e T o o l h e l p 3 2 S n a p s h o t ( )o t h e ro t h e ra 2 o t h e rC l o s e H a n d l e ( x )a 6a 3a 4P r o c e s s 3 2 N e x t ( x )y = O p e
20、 n P r o c e s s ( )a 5T e r m i n a t e P r o c e s s ( y , 0 )o t h e ro t h e ro t h e rP r o c e s s 3 2 F i r s t ( x )图 2 描 述 杀 死 反 病 毒 软 件 进 程 的 有 限 状 态 机 Fig. 2FSA for Kil AV Behavior 自启动模型恶意软件除了要进行传播外,还要将自身加载到目标系统当中,以实现对植入木马的计算机进行远程控制的目的,因此通常要能够实现自启动。图 3 中为描述通过修改注册表实现自启动的有限状态机。程序的初始状态为 b0;调
21、用RegOpenKeyEx(x,*)或 RegCreateKeyEx(x,*)函数打开或创建一个键,程序状态从 b0 到达b1;调用 RegSetValueEx(x,*)或 RegDeleteKey(x,*)设置键值或删除一个键,程序状态从 b1到达 b2;调用 RegCloseKey(x)关闭键,程序状态从 b2 到达终止状态 b3。若程序使得状态机到达终止状态 b3,则程序中存在自启动行为。 (其中 x 为自由变量,在程序中的每次出现有一致的取值;*表示任意多个参数) 。b 0 b 1 b 3R e g O p e n K e y E x A ( x , * ) |R e g C r e
22、a t e K e y E x A ( x , * )o t h e r o t h e rb 2o t h e rR e g D e l e t e V a l u e A ( x , * ) |R e g S e t V a l u e E x A ( x , * ) R e g C l o s e K e y ( x ) 图 3 描 述 修 改 注 册 表 的 有 限 状 态 机 Fig. SA for Mdify Registr Table Bhavior 2.2.2 网络行为模型网络行为是指恶意软件为了窃取信息及破坏等功能在网络上表现的行为。这里给出击键记录模型和分布式拒绝服务攻击模
23、型刻画。击键记录模型恶意软件通过击键监控对被控计算机交互过程中的用户键盘输入和计算机的反应数据进行检查或记录,识别软件系统的登录操作从而获取帐号信息等。图 4 中为描述击键记录的有限状态机。程序初始状态为 c0,调用 GetAsyncKeyState()函数根据虚拟键表判断按键类型,程序状态从 c0 到达 c1;调用 send()或者 fsend()等将按键信息发送给控制端,程序状态从 c1 到达终止状态 c2。若程序使得该状态机到达状态 c2,则程序存在记录击键信息的行为。图 5 为描述窗口记录行为的有限状态机。程序初始状态为 d0,调用x=GetForegroundWindow()函数得到
24、程序当前窗口的句柄,程序状态从 d0 到达 d1;调用GetWindowText(x,*)函数得到该窗口的标题,程序状态从 d1 到达 d2;调用 send()或者fsend()等将按键信息发送给控制端,程序状态从 d2 到达终止状态 d3。若程序使得该状态机到达状态 c2,则程序存在记录击键信息的行为。 (其中 x 为自由变量,在程序中的每次出现有一致的取值;*表示任意多个参数) 。这两种行为可以结合起来,比如记录在某个窗口(例如网上银行等)中所有的击键记录,包括密码及帐号等信息。c 0 c 1 c 2G e t A s y n c K e y S t a t e ( )o t h e ro
25、 t h e rs e n d ( ) |f s e n d ( ) | 图 3 描 述 击 键 记 录 的 有 限 状 态 机 Fig. SA for Key Loger Bhavior d 0 d 1d 3x = G e t F o r e g r o u n d W i n d o w ( ) G e t W i n d o w T e x t A ( x , * )o t h e ro t h e rd 2o t h e rs e n d ( ) |f s e n d ( ) | 图 5 描 述 记 录 当 前 窗 口 的 有 限 状 态 机 Fig. SA for ctive Win
26、dow Record Behavior 分布式拒绝服务(DDoS)攻击模型攻击者可以使用被恶意代码入侵的机器的进行协同攻击,例如分布式拒绝服务攻击(DDos), 将大量数据发送到特定的宿主或网站,使其停止对合法通信的响应(或者无法响应)。如图 6 为描述 DDoS 攻击的有限状态机。程序初始状态为 e0,进入循环体(loop_entry,通常是无条件循环)使得程序状态由 e0 到达 e1;若在状态 e1 时循环结束(loop_exit),则程序回到初始状态 e0;在 e1 状态调用函数 send()、sendto()等函数向目标机器发送数据,程序状态从 e1 到达 e2;在 e2 状态,若调用
27、了 recv 等函数接收数据,则为正常的网络通信,程序回到状态 e1;若循环结束(loop_exit )使得 e2 到达结束状态 e3。若程序使得状态机到达结束状态 e3,则程序中存在拒绝服务攻击。e 0 e 1 e 3l o o p _ e n t r yo t h e ro t h e rs e n d ( ) |f s e n d ( ) |e 2o t h e rl o o p _ e x i tl o o p _ e x i t r e c v ( ) |r e v e f r o m ( ) | 图 6 描 述 DOS攻 击 的 有 限 状 态 机 Fig. 6A for DS A
28、tack 2.3 全局状态模型建立首先将可执行程序进行反汇编,然后提取汇编语言中的控制流和数据流义,将标准化的程序生成面向安全分析的中间语言,最后生成程序的PDA。在实验缓解使用IDA pro 4.9完成反汇编工作。IDA pro可以解析包括ELF和PE 等多种可执行程序的格式,得到其中的汇编指令、数据说明、函数引入说明等信息。在实验阶段对关键控制流结构(包括分支识别结构和循环结构)识别算法进行了改进,实验证明这些算法比现有的识别算法更加准确和高效 1011。数据流分析完成了对动态API调用的识别。在控制流分析和数据流分析的基础上,将汇编程序转换为自定义的面向安全分析的中间语言程序。将每个中间
29、转换为抽象语法树和抽象语法树的流图,使用现有的算法建立可执行程序的PDA 9,以表示程序的全局状态空间。2.4 模型检验在模型检验环节,使用 MOPS 的 model checker(以下简称 MC) 9。MC 可以遍历程序的每条路径(包括任意次循环) ,因此是流敏感且路经敏感的;还可以匹配函数的返回地址和它的调用地址,因此是上下文敏感的。如果程序在相同的程序点 从相同的状态 到ps达了一个相同的错误状态 ,MC 认为两条错误路径是由同一个错误产生的。对于每个e,只报告最短的错误路径。(,)esp3. 实验与分析本文提出的恶意行为刻画以及分析方法已在自研制恶意行为检测工具 BinMc 中实现应
30、用。本节给出使用 BinMc 对 Rbot 的变形程序和应用程序进行实验与分析结果。测试环境为 2.6GHz AMD Opteron Server,双核,8GB RAM。3.1 实验结果在实验中使用了 48 个测试程序。其中包括 38 个 Matrix 分布式蜜网试验系统 2007 年5 月捕捉的 Rbot 程序(即 Rbot 程序的 38 个变种),10 个应用程序(包括IE,msmsgs,Rtvscan,Skype,OUTLOOK,5 个 IRC 工具等)。表 1 中给出对测试程序的信息和代码标准化的分析时间。表 2 给出对 Rbot 和应用程序进行验证的结果。图 7 给出了 38 个 R
31、bot 程序中发现恶意行为个数的分布图,其中横轴表示在程序中发现恶意行为的个数,纵轴表示程序的个数。 程 序 最 大 (KB) 最 小 (KB) 平 均 大 小 (KB) 平 均 时 间 ( 分 : 秒 ) Rbot程 序 ( 38个 ) 应 用 程 序 ( 10个 ) 5185 325 51 51 418 187 14:2 20:59 表 1 实 验 程 序 和 代 码 标 准 化 时 间 Tab. 1 Experiment Samples and Normalization Time 状 态 机 检 测 程 序( 个 ) 平 均 时 间( 分 :秒 ) 状 态 机 1 状 态 机 2 状
32、态 机 3 状 态 机 4 状 态 机 5 34 30 28 1:50 :47 5:2 :3 0:29 表 2 对 Rbot程 序 分 析 结 果 Tab. esult fr Rbot Samples 状 态 机 检 测 程 序( 个 ) 平 均 时 间( 分 :秒 ) 状 态 机 1 状 态 机 2 状 态 机 3 状 态 机 4 状 态 机 5 0 0 0 3:06 1:58 2:0 :3 4:1 表 3 对 应 用 程 序 分 析 结 果 Tab. Result for Normal Samples 图 7 Rbot程 序 发 现 恶 意 行 为 个 数 分 布 Fig. 7Malicu
33、s Behaviors Ditribution iRbot Samples 3.2 讨论从实验结果中可以得到如下结论(1)同一恶意代码的不同变形程序的文本差异可能很大,在表 1 中可以看到 Rbot 的 37 个不同变形程序大小从 51KB 到 5185KB;(2)同一恶意代码的不同变形之间的行为具有很高的一致性:在分析的 Rbot 的 38 个变体中,包含 3个以上恶意行为的占 87%;对于没有检测出恶意行为模型的 3 个程序,经过分析是其中 2个由于 IDA 反编译错误使得程序中不包含 API 函数调用,另 1 个是由于反病毒软件将sdBot 误报为 Rbot 程序。(3)基于恶意行为的分
34、析方法具有低误报率。从表 3 看到在分析的 5 个 IRC 程序和其它 5 个应用程序中,均没有发现误报。与传统的杀毒软件采用的检测方法相比,本方法使用的行为描述特征适用于变形恶意代码分析,并且能够检查杀毒软件的误报。与基于函数的语法序列的方法 7,8相比,描述了函数序列的语义,不仅可以区分恶意代码和正常程序,还可以给出程序中包含的恶意行为,辅助安全专家进行自动化分析。与对基于内存的攻击的语义分析方法 1-4相比,能够分析基于函数调用的攻击,例如文中的两个基于系统的攻击模型和两个基于网络的攻击模型等。与 Kirda 等人的检查单个可疑 API 调用的方法 5相比,刻画了函数调用序列的上下文关系
35、(如文中的杀死反病毒软件进程模型)和控制结构关系(如文中的 DDos 攻击模型) ,具有低误报率。与 kinder 等人使用计算树谓词逻辑描述恶意行为的方法 6相比,本方法对恶意行为的描述更加直观,易于对恶意行为库进行扩展。4. 结论本文首次提出在全局状态空间中对基于函数调用的攻击的完整刻画,并给出在系统和网络两个方面的 4 个恶意行为模型。该方法可以对恶意代码进行流敏感、上下文敏感且路径敏感的分析。通过对多个恶意和正常程序的分析,证明该方法可以有效地辅助分析恶意代码的行为。基于语意的恶意代码分析仍有以下几点值得进一步研究:1)路径可行性分析。在符号执行的过程中,加入对分支语句的条件分析,提高
36、标准化结果的准确性。2)建立和完善恶意行为模式库,更完整地分析恶意软件的行为。参考文献1 Christodorescu M, Jha S, Seshia S. A, et al. Semantics-aware malware detection. IEEE Symposium on Security and Privacy (S&P05), 2005: 32-46. 2 Christodorescu M, Jha S. Static analysis of executables to detect malicious patterns. In: Proceedings of the 12t
37、h USENIX Security Symposium, USENIX Association, Berkeley, CA, USA, 2003: 169-186 3 Scheirer W and Chuah M. Network intrusion detection with semantics-aware capability. In: Proceedings of the Second International Conference on Security and Systems in Networks. IEEE Computer Society, 2006.4 Kruegel C
38、, Robertson W, and Vigna G. Detecting Kernel-Level Rootkits Through Binary Analysis. In: Proceedings of the Annual Computer Security Applications Conference, 2004: 91100.5 Kirda E, Kruegel C, Banks G, et al, Behavior-Based Spyware Detection, In: Proceedings of the 15th USENIX Security Symposium, Aug
39、ust 2006.6 Kinder J, Katzenbeisser S, Schallhart C, et al. Detecting Malicious Code by Model Checking. In: Proceedings of the GI SIG SIDAR Conference on Detection of Intrusions and Malware & Vulnerability Assessment, Springer Lecture Notes in Computer Science, 2005: 174187. 7 A. Sung, J. Xu, P. Chav
40、ez, and S. Mukkamala. Static analyzer of vicious executables (save). In: Proceedings of the 20th Annual Computer Security Applications Conference, 2004: 326334.8苏璞睿,杨轶。基于可执行文件静态分析的入侵检测模型。计算机学报,2006, 29(9):1572-1578。9 Schwarz B, Chen H, and Wagner D. Model Checking an Entire Linux Distribution for Se
41、curity Violations. In: Proc. Annual. Computer Security Applications Conference, Los Alamitos, CA: IEEE Computer Society, 2005: 1322.10 Wei T, Mao J, Zou W, et al. Structuring 2-way Branches in Binary Executables. To appear in: 31st Annual IEEE International Computer Software and Applications Conference, 2007.11 Wei T, Mao J, Zou W, et al. A New Algorithm for Identifying Loops in Decompilation. To appear in: the 14th International Static Analysis Symposium, 2007.