什么是“循环代码”
表面意思,就是代码中使用了for/while等循环体的代码。
循环代码相关的问题
对程序分析的影响[1]
- 存在路径爆炸问题,影响程序分析的效率。
- 容易引起内存泄露,因为程序分析时为了避免在恢复进程快照时出现已分配资源被释放引起句柄无效的情况 , 不允许代码释放已经分配的资源 ,例如动态分配的内存等 ,因此多次重复执行含有分配资源操作行为的程序路径 , 分配的资源会占用大量的内存 ,容易引起内存泄漏。
- 不能保证代码覆盖率。常用的处理循环代码的方法中,会引入阈值timeout,当单个执行路径的分析过程耗费 的时间超过timeout时 , 分析系统会在此路径中的某处终止此路径的遍历 ,继续分析其他的未遍历路径 ,因此会忽略此路径中的其他未被执行的部分 , 造成大量的代码模块未能覆盖。
循环代码的终止性分析([2]-1.2)
程序的种类是多种多样的,当程序中涉及到函数的递归调用、循环等语句时,就需要对程序的终止性做出判断。尽管有些时候,我们也会需要人为的设置死循环来达到预设的目标,但是这样的死循环应当是可以预知的,也就是人们应当知晓,它在什么情况下会出现死循环和它即将带来的后果。
通常对于大多数的循环,人们比较容易判断它是否是一个死循环,但是情况并非每次都如此,特别是当程序中出现比较复杂的while语句、嵌套循环、程序的流程比较复杂时,开发或者维护人员就不太容易能够发现其中的故障。这时候就需要通过特定的终止性判别方法来解决。终止性问题是不可判定的指的是不存在某种通用的算法对任意的循环程序进行终止性判定。
分析方法
静态:
采用反汇编等非实际执行恶意代码的分析方法对恶意代码进行分析[1]。
优点是可以覆盖整个代码 ,因此可以较为全面地分析代码的功能。
缺点是对于一些经过变形和混淆等技术处理的代码 ,静态分析方法往往无法对其进行准确的反编译等操作,进而无法对其进行深入的分析。
动态:
主要是在可控 环境中(比如调试器等)执行恶意代码 ,分析其行为[1]。
动态分析方法存在分析系统所处环境容易被识别 、分析的全面性难以保证等问题。
参考
- 王祥根,司端锋,冯登国,苏璞睿.基于代码覆盖的恶意代码多路径分析方法[J].电子学报,2009,37(04):701-705.
- 蔡天训. 线性C循环代码的终止性分析及其工具开发[D].重庆邮电大学,2018.
- 赵迎钊. 基于静态分析的代码安全缺陷检测系统[D].电子科技大学,2012.