CN102419730A - 一种51汇编语言软件安全性编码规则自动检查方法 - Google Patents
一种51汇编语言软件安全性编码规则自动检查方法 Download PDFInfo
- Publication number
- CN102419730A CN102419730A CN2011104124616A CN201110412461A CN102419730A CN 102419730 A CN102419730 A CN 102419730A CN 2011104124616 A CN2011104124616 A CN 2011104124616A CN 201110412461 A CN201110412461 A CN 201110412461A CN 102419730 A CN102419730 A CN 102419730A
- Authority
- CN
- China
- Prior art keywords
- rule
- instruction
- security
- assembly language
- interrupt
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Landscapes
- Debugging And Monitoring (AREA)
Abstract
一种51汇编语言软件安全性编码规则自动检查方法,首先确定针对51汇编语言的安全编码规则。然后将源代码按照统一格式重新排版,进行分离代码和注释、提取独立的单词助记符。随后在重新排版的源代码上增加子程序开始和结束标识,然后从得到的单词助记符中提取伪指令、指令、操作数、行号、标号并与51汇编语言语法规则进行匹配,识别出变量、相关指令、操作数、中断向量区、子程序、中断服务程序,由此提取各个子程序、中断服务程序的名称及起始行号和结束行号。最后根据提取结果以及结构分析结果,将制定的安全性编码规则作为标准,判断程序代码中是否存在错误并将判断结果输出。本方法具有分析准确率高、直接对应源程序、规则可扩展等特点。
Description
技术领域
本发明涉及一种软件编码规则自动检查方法,主要应用于针对51汇编语言软件的静态测试。
背景技术
编码规则自动检查技术是针对软件与所确定的编码规则符合性进行检查的技术,是软件静态测试技术的一个分支。
目前对于C语言的编码规则研究较多,常见的C语言安全编码规则集有MISRA(Motor Industry Software Reliability Association)C编码规则等。而针对C语言的常用软件测试工具大都包含针对MISRA等C语言软件编码规则的检查功能。
针对汇编语言的编码规则自动检查技术目前研究较少,首先是由于没有制定针对汇编语言的编程规则集;其次,软件的编码规则自动检查技术中最重要的是词法和语法分析和规则匹配技术,而目前针对51汇编语言程序的词法及语法分析、规则匹配技术很少被研究。
发明内容
本发明的技术解决问题是:克服现有技术的不足,提供了一种操作简便、准确率高、可扩展性强的51汇编语言软件安全性编码规则自动化检查方法,为针对51汇编语言软件进行安全性编码规则的自动检查提供了依据。
本发明的技术解决方案是:一种51汇编语言软件安全性编码规则自动检查方法,步骤如下:
(1)确定针对51汇编语言的安全编码规则,包括:堆栈处理安全性规则、中断处理安全性规则、指令匹配性检查规则、未用中断向量处理安全性规则、避免存在不可达代码安全性规则;所述的堆栈处理安全性规则用于检查程序中堆栈是否存在堆栈不平衡或者堆栈溢出;所述的中断处理安全性规则用于检查程序的中断处理是否存在安全性;所述的指令匹配性检查规则用于检查特定指令与所在子程序是否匹配以及指令与所用操作数之间是否匹配;所述的未用中断向量处理安全性规则用于检查所有未用中断的中断向量处理是否符合安全性要求;所述的避免存在不可达代码安全性规则用于检查程序中是否存在未被调用的子程序或者不可达代码;
(2)将源代码按照统一格式重新排版,进行分离代码和注释、提取独立的单词助记符;
(3)在重新排版的源代码上增加子程序开始和结束标识,然后从得到的单词助记符中提取伪指令、指令、操作数、行号、标号并与51汇编语言语法规则进行匹配,识别出变量、相关指令、操作数、中断向量区、子程序、中断服务程序,由此提取各个子程序、中断服务程序的名称及起始行号和结束行号,并记录与步骤(1)中制定的安全性编码规则匹配相关的指令所在的行号,以及子程序调用指令和无条件跳转指令的操作数信息;同时对软件代码进行结构分析,得到所有的被调用子程序集合和被跳转标号集合;
(4)根据步骤(3)的提取结果以及结构分析结果,依据步骤(1)中制定的安全性编码规则,判断程序代码中是否存在错误并将判断结果输出。
本发明与现有技术相比的优点在于:本发明提出了一种51汇编语言软件安全性编码规则自动化检查方法,该方法具有分析准确率高、直接对应到源程序、规则可扩展等特点,为针对51汇编语言软件进行安全性编码规则的自动检查提供了简便实用的方法。其中检查所依据的安全性编码规则根据以往51汇编语言编程的错误案例提取,涉及堆栈处理、中断处理、指令匹配检查等多方面,覆盖性强。通过软件编程,可以使该方法的检查完全自动进行,不需要与人的交互过程。通过对源代码进行的扫描和预处理过程可以使该方法适用于不同编程风格和书写格式的被测程序。通过对被测程序的词法分析、语法分析、结构分析,得到了进行规则匹配所需要的所有信息以及被测程序的其他信息,方便以后增加其他安全性编码规则。同时由于对程序进行了结构分析,大大提高了分析的准确性。最终的结果输出时能直接对应到源程序,方便用户对软件错误进行定位。
附图说明
图1为本发明方法的流程框图。
具体实施方式
如图1所示,本发明方法主要包括安全性编码规则制定、代码扫描和预处理、程序代码搜索、规则匹配、结果输出等步骤,下面分别进行详细说明。
一、安全性编码规则制定
本方法所针对的51汇编语言安全编码规则包括:
堆栈处理的安全性规则。堆栈处理的安全性规则包括保持堆栈平衡的安全性规则和防止堆栈溢出的安全性规则,这是最常见也是最关键安全性规则,一旦违反通常都将导致软件运行崩溃。如规则1:压栈和弹栈指令应匹配出现,规则2:要防止堆栈使用时的溢出。
中断处理安全性的规则是指针对一些特定中断的处理应符合特定的安全性要求,如果不符合该要求,将导致软件出现严重错误,如规则3:如果使用了串口中断,则在串口中断服务程序中必须清除RI或者TI(如果软件中没有清除指令会导致重复串口中断的重复触发)。规则4:如果使用了定时器2中断,则在其中断服务程序中必须清除定时器2中断标志;
指令匹配性检查规则包括指令与子程序的匹配性检查和指令与操作数的匹配性的检查。指令与子程序的匹配性检查是指某些指令只能用于某种类型的子程序如规则5:中断服务程序的返回指令应使用RETI,非中断服务程序子程序的返回指令应使用RET,不能混用;指令与操作数的匹配性检查是指某些指令只能针对特定类型的操作数,如规则6:指令MOVX的操作数必须包括1个外部地址。
未用中断向量处理安全性规则是指未用中断向量的处理应符合安全性要求,否则会导致一旦触发该未用中断就无法从中断中退出的错误或者导致存储器中存在未经处理的空白区,如规则7:针对未使用中断向量的处理必须保证能退出该中断并正常响应其他中断;
避免存在不可达代码的安全性规则是指软件中不能存在不可达代码,因为一旦跳入这些代码会导致程序无法继续正确执行如规则8:禁止存在不可达代码。
二、代码扫描及预处理
主要是对代码按照规定的格式进行重排版,进行分离代码和注释、提取独立的单词助记符。由于被检查软件的编程风格并不统一,为保证后续处理接口的一致性,需要把源代码按照统一格式进行重新排版,通常的方法是把每一行首字符前面的空格全部删除,从而得到统一格式的被检查软件源代码。然后是对排版后的程序进行扫描,首先是剔除注释,然后按顺序提取单词助记符,并把同一行内的各单词助记符之间均设置为1个空格。
三、词法分析、语法分析及结构分析
从得到的单词助记符中提取伪指令(ORG、END、EQU、BIT、DATA、DB、DW)、指令、操作数、行号、标号等信息;与51汇编语言语法规则进行匹配,识别出变量(使用EQU、BIT、DATA进行定义)、相关指令(RET、RETI、PUSH、POP、CLR、MOVX、AJMP、SJMP、LJMP、JZ、JNZ、CJNE、DJNZ、ACALL、LCALL)、操作数(只识别上述相关指令的操作数,其中PUSH、POP、CLR、AJMP、SJMP、LJMP、JZ、JNZ、ACALL、LCALL指令只有1个操作数,CJNE指令有3个操作数,DJNZ指令有2个操作数)、中断向量区(分别使用ORG 0003、ORG 000BH、ORG 0013H、ORG 001BH、ORG 0023H进行定义,对应外部中断0、定时器中断0、外部中断1、定时器中断1、串口中断的中断向量区)、子程序、中断服务程序标号(以“:”结束的单词助记符)等元素信息;由于51汇编语言程序本身没有子程序开始和结束的标识,因此在进行编码规则检查之前,需要对被检查程序手动增加子程序和中断服务程序的开始标识和结束标识。
其中51汇编语言的中断向量考虑的是针对8031(8051)处理器的情况。此处需要提取各个子程序和中断服务程序的名称及起始行号和结束行号,以及记录所有指令所在行号。
结构分析:记录所有ACALL、LCALL指令及其操作数的信息,所有ACALL指令和LCALL指令的操作数即为被调用的子程序,从而可以得到每个子程序调用的其他子程序集合及调用次数的情况。记录所有AJMP、SJMP、LJMP、JZ、JNZ、CJNE、DJNZ指令的操作数(针对CJNE、DJNZ指令只记录最后1个操作数),从而得到所有被跳转的标号集合。
四、安全性规则匹配
从提取的元素信息中查找相关的元素信息,判断是否符合规则;将规则匹配分解到3个阶段:扫描元素信息阶段、查询分析阶段、结构分析阶段。其中扫描元素信息阶段是指在进行词法及语法分析时就完成规则的匹配,这是指代码上下文关系方面的规则,如规则3、规则5;而查询分析阶段是指所要分析的规则涉及到多种信息,需要对多种信息进行综合分析后才能得到结果,这是规则匹配的主要阶段,适用于所有主要规则;结构分析阶段则指必须完成对程序结构的分析之后才能得到分析结果的,这是与软件结构相关的规则,如规则8。
下面分别以规则1、3、5、8为例说明如何在不同阶段完成安全性规则的匹配。
针对规则1的检查方法:
压栈和弹栈指令匹配出现是针对同一个子程序而言的,不考虑压栈指令在一个子程序,而弹栈指令在另一个子程序的情况。判断方法为:首先找到所有的压栈指令(PUSH)和弹栈指令(POP),判断压栈指令和弹栈指令的行号是否在某子程序的范围内,即找到每个子程序所有的压栈(PUSH)指令和弹栈(POP)指令。针对每个子程序的所有压栈(PUSH)指令和弹栈(POP)指令,确认其压栈(PUSH)指令的条数是否与弹栈(POP)指令的条数相对,然后确定是否满足在程序任一点压栈(PUSH)指令个数不少于弹栈(POP)指令个数。如果满足上述条件,则证明压栈指令和弹栈指令是匹配的,否则是不匹配的。
针对规则3的检查方法:
判断程序中是否使用了串口中断,其方法为根据串口中断向量入口是否存在无条件跳转指令(AJMP、LJMP、SJMP),如果存在无条件跳转指令,并且该跳转指令所跳转的标号为子程序名称的话,则可以确认程序中使用了串口中断。如果确认使用了串口中断,则需要判断在串口中断服务程序中是否存在清除RI(CLR RI)或者TI(CLR TI)的指令。判断方法为:扫描程序中是否存在清除RI(CLR RI)或者TI(CLR TI)的指令,判断该指令所在的行号是否在串口中断服务程序范围之内。
针对规则5的检查方法:
扫描所有的RET指令和RETI指令,判断所有RET指令所在的行号是否在子程序的起始行号和结束行号所在范围内,所有RETI指令是否是在中断服务子程序的起始行号和结束行号所在的范围内,如果发现不满足,则证明存在违反。
针对规则8的检查方法:
不可达代码包括2种情况,即未被调用的子程序(中断服务程序)和不可达代码。在针对被测程序进行结构分析(调用关系)后,可以找出是否存在未被调用的子程序,该子程序就是不可达子程序。
针对不可达代码的分析则可以在查询分析阶段进行。查询是否有未被跳转的标号,并且该标号所在行的前一条指令仍为无条件跳转指令(AJMP、LJMP、SJMP)。如果存在这种情况,则说明存在不可达代码。
五、结果输出
最终的检查结果以*.html网页形式输出,包含针对所有安全性编码规则的违反情况统计,针对每条规则的每一处违反均能链接到源代码,并且可以输出一份完整的安全性编码规则分析报告。
六、可扩展性说明
由于在代码扫描和预处理阶段及词法和语法分析阶段,已经获得了被测软件中所有的变量、指令、子程序、中断向量区、中断服务程序的行号信息,因此可以利用这些信息进行相应规则的扩展,如指令合理性检查、标号名被重用等规则。此外还可以通过结构分析得到的结果,进一步增加对与软件结构相关的规则进行分析,如软件扇出度(即子程序最大调用其他子程序的个数)。
本发明说明书中未作详细描述的内容属本领域技术人员的公知技术。
Claims (1)
1.一种51汇编语言软件安全性编码规则自动检查方法,其特征在于步骤如下:
(1)确定针对51汇编语言的安全编码规则,包括:堆栈处理安全性规则、中断处理安全性规则、指令匹配性检查规则、未用中断向量处理安全性规则、避免存在不可达代码安全性规则;所述的堆栈处理安全性规则用于检查程序中堆栈是否存在堆栈不平衡或者堆栈溢出;所述的中断处理安全性规则用于检查程序的中断处理是否存在安全性;所述的指令匹配性检查规则用于检查特定指令与所在子程序是否匹配以及指令与所用操作数之间是否匹配;所述的未用中断向量处理安全性规则用于检查所有未用中断的中断向量处理是否符合安全性要求;所述的避免存在不可达代码安全性规则用于检查程序中是否存在未被调用的子程序或者不可达代码;
(2)将源代码按照统一格式重新排版,进行分离代码和注释、提取独立的单词助记符;
(3)在重新排版的源代码上增加子程序开始和结束标识,然后从得到的单词助记符中提取伪指令、指令、操作数、行号、标号并与51汇编语言语法规则进行匹配,识别出变量、相关指令、操作数、中断向量区、子程序、中断服务程序,由此提取各个子程序、中断服务程序的名称及起始行号和结束行号,并记录与步骤(1)中制定的安全性编码规则匹配相关的指令所在的行号,以及子程序调用指令和无条件跳转指令的操作数信息;同时对软件代码进行结构分析,得到所有的被调用子程序集合和被跳转标号集合;
(4)根据步骤(3)的提取结果以及结构分析结果,依据步骤(1)中制定的安全性编码规则,判断程序代码中是否存在错误并将判断结果输出。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2011104124616A CN102419730A (zh) | 2011-12-08 | 2011-12-08 | 一种51汇编语言软件安全性编码规则自动检查方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2011104124616A CN102419730A (zh) | 2011-12-08 | 2011-12-08 | 一种51汇编语言软件安全性编码规则自动检查方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN102419730A true CN102419730A (zh) | 2012-04-18 |
Family
ID=45944149
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN2011104124616A Pending CN102419730A (zh) | 2011-12-08 | 2011-12-08 | 一种51汇编语言软件安全性编码规则自动检查方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN102419730A (zh) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107291622A (zh) * | 2017-07-18 | 2017-10-24 | 北京计算机技术及应用研究所 | C25汇编代码静态分析方法 |
CN110275451A (zh) * | 2018-03-15 | 2019-09-24 | 欧姆龙株式会社 | 开发支援装置、开发支援方法以及记录介质 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US4937740A (en) * | 1985-09-18 | 1990-06-26 | Cadre Technologies, Inc. | Real time software analyzing system for storing selective m-bit addresses based upon correspondingly generated n-bit tags |
WO2002012670A1 (es) * | 2000-07-27 | 2002-02-14 | Lear Automotive (Eeds) Spain, S.L. | Sistema y metodo de optimizacion del programa de control de un dispositivo eleva-lunas con proteccion anti-atrapamiento |
CN1632763A (zh) * | 2004-12-15 | 2005-06-29 | 时仁帅 | 用于嵌入式模块中汇编程序的自动查错改错方法和系统 |
CN101017458A (zh) * | 2007-03-02 | 2007-08-15 | 北京邮电大学 | 基于源代码静态分析的软件安全代码分析器及其检测方法 |
-
2011
- 2011-12-08 CN CN2011104124616A patent/CN102419730A/zh active Pending
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US4937740A (en) * | 1985-09-18 | 1990-06-26 | Cadre Technologies, Inc. | Real time software analyzing system for storing selective m-bit addresses based upon correspondingly generated n-bit tags |
WO2002012670A1 (es) * | 2000-07-27 | 2002-02-14 | Lear Automotive (Eeds) Spain, S.L. | Sistema y metodo de optimizacion del programa de control de un dispositivo eleva-lunas con proteccion anti-atrapamiento |
CN1632763A (zh) * | 2004-12-15 | 2005-06-29 | 时仁帅 | 用于嵌入式模块中汇编程序的自动查错改错方法和系统 |
CN101017458A (zh) * | 2007-03-02 | 2007-08-15 | 北京邮电大学 | 基于源代码静态分析的软件安全代码分析器及其检测方法 |
Non-Patent Citations (1)
Title |
---|
钱杰: "80x86汇编语言安全性编码规则检查工具的设计与实现", 《航天控制》 * |
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107291622A (zh) * | 2017-07-18 | 2017-10-24 | 北京计算机技术及应用研究所 | C25汇编代码静态分析方法 |
CN107291622B (zh) * | 2017-07-18 | 2020-03-31 | 北京计算机技术及应用研究所 | C25汇编代码静态分析方法 |
CN110275451A (zh) * | 2018-03-15 | 2019-09-24 | 欧姆龙株式会社 | 开发支援装置、开发支援方法以及记录介质 |
CN110275451B (zh) * | 2018-03-15 | 2022-06-14 | 欧姆龙株式会社 | 开发支援装置、开发支援方法以及记录介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN100483434C (zh) | 病毒识别方法及装置 | |
CN102054149B (zh) | 一种恶意代码行为特征提取方法 | |
CN101266550B (zh) | 一种恶意代码检测方法 | |
CN100461132C (zh) | 基于源代码静态分析的软件安全代码分析器及其检测方法 | |
CN102789419B (zh) | 一种使用多样本差异比对的软件故障分析方法 | |
CN102592080B (zh) | flash恶意文件检测方法及装置 | |
US20100024033A1 (en) | Apparatus and method for detecting obfuscated malicious web page | |
Nagy et al. | A static code smell detector for SQL queries embedded in Java code | |
CN112214399B (zh) | 基于序列模式匹配的api误用缺陷检测系统 | |
US6345322B1 (en) | Intelligently interpreting errors in build output log files | |
Chen | Finding ethereum smart contracts security issues by comparing history versions | |
CN108875375B (zh) | 一种面向安卓系统隐私泄漏检测的动态特性信息提取方法 | |
CN111177730A (zh) | 一种以太坊智能合约问题检测和预防方法与装置 | |
CN112115053A (zh) | 基于序列模式匹配的api误用缺陷检测方法 | |
CN117573142B (zh) | 基于模拟执行的java代码反混淆器 | |
CN102419730A (zh) | 一种51汇编语言软件安全性编码规则自动检查方法 | |
US20210141875A1 (en) | Device for automatically identifying anti-analysis techniques by using signature extraction and method therefor | |
KR101583932B1 (ko) | 프로그램의 시그니처를 생성하는 시그니처 생성 장치 및 방법, 시그니처의 악성 코드를 검출하는 악성 코드 검출 장치 및 방법 | |
CN114579972A (zh) | 嵌入式开发程序的漏洞识别方法及系统 | |
CN116305131B (zh) | 脚本静态去混淆方法及系统 | |
CN109101355B (zh) | 一种提取错误现场特征测试激励的处理器调试方法 | |
CN110928793A (zh) | 一种正则表达式检测方法、装置及计算机可读存储介质 | |
CN113901459A (zh) | 固件内部二进制程序脆弱性发现方法及装置 | |
CN111666216A (zh) | 一种智能合约分析方法及装置 | |
CN111931161A (zh) | 基于risc-v处理器的芯片验证方法、设备及存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C02 | Deemed withdrawal of patent application after publication (patent law 2001) | ||
WD01 | Invention patent application deemed withdrawn after publication |
Application publication date: 20120418 |