CN117370988A - 一种工业控制程序自动化逆向分析方法与流程 - Google Patents
一种工业控制程序自动化逆向分析方法与流程 Download PDFInfo
- Publication number
- CN117370988A CN117370988A CN202311329186.0A CN202311329186A CN117370988A CN 117370988 A CN117370988 A CN 117370988A CN 202311329186 A CN202311329186 A CN 202311329186A CN 117370988 A CN117370988 A CN 117370988A
- Authority
- CN
- China
- Prior art keywords
- industrial control
- control program
- function
- file
- subroutine
- 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
- 238000000034 method Methods 0.000 title claims abstract description 37
- 238000004458 analytical method Methods 0.000 title claims abstract description 30
- 230000006870 function Effects 0.000 claims abstract description 142
- 238000010586 diagram Methods 0.000 claims abstract description 16
- 230000003068 static effect Effects 0.000 claims abstract description 16
- 238000013515 script Methods 0.000 claims abstract description 13
- 238000012800 visualization Methods 0.000 claims description 9
- 238000004422 calculation algorithm Methods 0.000 claims description 3
- 238000004364 calculation method Methods 0.000 claims description 3
- JXSJBGJIGXNWCI-UHFFFAOYSA-N diethyl 2-[(dimethoxyphosphorothioyl)thio]succinate Chemical compound CCOC(=O)CC(SP(=S)(OC)OC)C(=O)OCC JXSJBGJIGXNWCI-UHFFFAOYSA-N 0.000 claims description 3
- 238000012545 processing Methods 0.000 claims description 3
- 230000009193 crawling Effects 0.000 claims 1
- 230000000007 visual effect Effects 0.000 abstract 1
- 239000000243 solution Substances 0.000 description 8
- 238000005516 engineering process Methods 0.000 description 3
- 230000009286 beneficial effect Effects 0.000 description 1
- 238000001514 detection method Methods 0.000 description 1
- 238000011161 development Methods 0.000 description 1
- 238000002347 injection Methods 0.000 description 1
- 239000007924 injection Substances 0.000 description 1
- 238000004519 manufacturing process Methods 0.000 description 1
- 238000005065 mining Methods 0.000 description 1
- 238000012544 monitoring process Methods 0.000 description 1
- 230000004044 response Effects 0.000 description 1
- 238000012360 testing method Methods 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/50—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
- G06F21/57—Certifying or maintaining trusted computer platforms, e.g. secure boots or power-downs, version controls, system software checks, secure updates or assessing vulnerabilities
- G06F21/577—Assessing vulnerabilities and evaluating computer system security
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/50—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
- G06F21/55—Detecting local intrusion or implementing counter-measures
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/42—Syntactic analysis
- G06F8/427—Parsing
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/53—Decompilation; Disassembly
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2221/00—Indexing scheme relating to security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F2221/03—Indexing scheme relating to G06F21/50, monitoring users, programs or devices to maintain the integrity of platforms
- G06F2221/033—Test or assess software
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Computer Security & Cryptography (AREA)
- Computer Hardware Design (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Computing Systems (AREA)
- Stored Programmes (AREA)
Abstract
本发明公开了一种工业控制程序自动化逆向分析方法与流程。首先,从互联网上收集的格式相同的工业控制程序文件并存储在同源格式文件目录下,对同源格式文件目录下的工业程序文件进行递归式手工分析,归纳文件头长度和内部字段信息,确定子程序段分隔符;其次,根据分隔符划分子程序段,确定全局变量初始化程序段和一般程序段,确定静态链接库函数、用户自定义函数、动态链接库函数、设备I/O操作函数,确定函数调用关系并建立函数指纹数据库;最后,编写自动化分析脚本,实现对不同格式的工业控制程序文件的自动化逆向,基于程序反汇编以及函数识别的结果,使用文本图形描述语言DOT及Graphviz工具包构建函数调用关系图,以实现逆向结果的可视化展示。
Description
技术领域
本发明涉及工业控制系统安全领域,更具体地,本发明属于工业控制程序文件逆向分析领域,提出一种基于反汇编技术的工业控制程序文件自动化逆向分析方法与流程。
背景技术
随着“工业4.0”等战略的提出,以及物联网、云计算、大数据和5G等新技术的融通发展,为实现高效的工业过程的自动化控制与监测,工业控制系统(Industrial ControlSystem,ICS)也逐渐与办公网、互联网以及第三方网络进行互联互通,原本封闭的工业控制环境被打破,工业控制系统也成为敌对势力的主要攻击对象。因此,保障工业控制系统安全对保障网络安全和国家安全具有重要的现实意义。
一般而言,可通过漏洞挖掘技术提前发现工控系统漏洞,以提高系统的安全性。常见的工控系统漏洞挖掘方法包括:基于协议模糊测试的漏洞挖掘方法、基于固件逆向分析的漏洞挖掘方法、基于软件ActiveX控件的漏洞挖掘方法、基于VxWorks操作系统的漏洞挖掘方法等。但缺乏对控制设备中运行的工业控制程序文件的逆向分析,无法挖掘程序中函数调用关系,不能深层次地剖析工业程序的安全性。
发明内容
本发明提出了一种工业控制程序自动化逆向分析方法与流程,一方面可以加速工业数字化取证和安全事件响应;另一方面,可动态分析工业控制程序中的函数调用关系,从逆向工程角度梳理函数调用关系,提前挖掘程序漏洞。本发明提出的工业控制程序文件自动化逆向分析结构化方法可适用于不同类型的工业控制程序文件。
为实现上述目的,本发明是根据以下技术方案实现的:
一种工业控制程序自动化逆向分析方法与流程,包括如下步骤:
步骤S1:所述的程序收集步骤:收集不同品牌控制器中的工业控制程序文件,将格式相同的工业控制程序文件存储在同源格式文件目录下;
步骤S2:所述的程序解析步骤:对同源格式文件目录下的工业程序文件进行递归式手工分析,归纳文件头长度和内部字段信息,确定子程序段的分隔符;
步骤S3:所述的子程序反汇编步骤:根据分隔符划分子程序段,确定全局变量初始化程序段和一般程序段;
步骤S4:根据子程序反汇编结果,确定静态链接库函数、用户自定义函数、动态链接库函数、设备I/O操作函数,确定函数调用关系并建立函数指纹数据库;
步骤S5:所述的自动化逆向步骤:根据上述步骤流程,编写针对其他格式工业控制程序文件的分析脚本,对格式相同的待分析工业控制程序文件执行步骤S2-S4;
步骤S6:根据子程序反汇编以及函数识别的结果,创建具有节点、边和权重的函数调用关系图,使用文本图形描述语言实现逆向结果可视化;
上述技术方案中,在步骤S1中,工业控制程序文件收集的具体步骤为:
步骤S11:创建同源项目文件目录,用于存放基于同品牌同型号控制器开发的项目文件;
步骤S12:创建同源格式工业控制程序文件目录,用于存放格式相同的工业控制程序文件;
步骤S13:使用PySpider爬虫从开源项目网站Github、CSDN中爬取基于不同控制器开发的项目,按控制器的品牌和型号将项目文件存储于同源项目文件目录;
步骤S14:在Linux系统中使用file命令,递归识别出同源项目文件目录中项目文件中的主文件类型,若主文件为工程文件,执行步骤S15和步骤S16;若主文件为可执行的工业控制程序文件,将其存于同源格式工业控制程序文件目录;
步骤S15:使用工业编程软件对该项目文件中的主文件执行打开和编译操作,生成可执行的工业控制程序文件;
步骤S16:导出编译后的可执行工业控制程序文件,将其存于同源格式工业控制程序文件目录;重复步骤S13-S16至项目文件目录内容为空,收集所有可执行工业控制程序文件;
上述技术方案中,在步骤S2中进行工业控制程序解析,归纳文件头长度和内部字段信息,确定子程序段的分隔符,具体步骤为:
步骤S21:打开同源格式工业控制程序文件目录,使用HEX Editor工具递归打开目录中同格式的工业控制程序文件,并将其对应的16进制字符串导出;
步骤S22:编写正则表达式脚本,对导出的16进制字符串进行匹配,找出字符串中包含的固定字段和固定结构,并统计固定字段的长度;
步骤S23:使用工业编程软件编写梯形图程序并编译,生成格式相同的工业控制程序文件,结合步骤S21和S22,对编译后的工业控制程序文件进行比较,确定文件头信息和文件中其他固定的信息;
步骤S24:在Linux系统中使用Radare2工具对格式相同的工业控制程序文件进行反汇编,生成汇编指令集,并确定该格式工业控制程序文件的汇编指令体系架构;
步骤S25:结合汇编指令体系架构,根据汇编指令集确定工业控制程序文件中子程序段的入口指令和出口指令,形成子程序分隔符;例如,通过以下指令确定.PRG格式的工业控制程序文件中子程序的入口:
MOV R12,SP
上述指令表示将当前栈指针SP的值复制到寄存器R12中;
STMFD SP!,{R11,R12,LR}
上述指令表示将当前栈指针的值减去12字节(每个寄存器占4字节,需要存储3个寄存器)并将结果存储回SP,接着将R11、R12和LR寄存器的值存储到SP所指向的内存地址;
MOV R11,R12
上述指令表示将寄存器R12中的值复制到寄存器R11中;
通过以下指令可确定.PRG格式的工业控制程序文件中子程序的出口:
LDMDB R11,{R11,SP,PC}
上述指令表示将寄存器R11所指向的内存地址中的3个字(每个字4个字节)加载到R11、SP和PC寄存器中;
上述技术方案中,在步骤S3中进行子程序反汇编,具体步骤为:
步骤S31:使用工业编程软件加载工业控制程序文件,记录程序中定义的全局变量;
步骤S32:在工业控制程序文件对应的汇编指令中搜索全局变量名称,结合子程序分隔符确定全局变量初始化子程序段;
步骤S33:使用符号执行工具angr解析子程序执行结束时的内存信息,结合子程序段分隔符确定内存初始化子程序段;
步骤S34:使用angr解析内存初始化子程序段,提取该子程序段在整个工业控制程序文件中的偏移,并重建函数调用表;在函数调用表中检索调用的目标关键字“DCB"SysDebugHandler"”,确定工业编程软件动态调试处理子程序段;
上述技术方案中,在步骤S4中进行函数识别,并构造函数指纹数据库,具体步骤为:
步骤S41:使用IDAPro自带的flair工具加载工业控制程序文件,生成.pat文件,结合sigmake工具从.pat文件中得到.sig文件,分析.sig文件以识别工业控制程序文件中的库函数,从而识别静态链接函数的签名并记录动态链接库中的函数信息;
步骤S42:根据步骤S31-S34和S41,可得到执行静态链接函数F/FB的关键子程序:执行主要功能的StaticLib子程序、初始化本地内存的StaticLibINIT子程序,以及用户自定义的功能执行子程序(FBi)与初始化功能执行子程序(FBiINIT),其中i为用户自定义的功能执行子程序编号;
步骤S43:根据工业控制程序文件中的函数类型确定调用表:函数若以动态链接形式存在,则根据动态库中的空结尾字符串后的两字节的数据值计算跳转偏移值以确定调用表位置,继而确定函数调用关系;若函数以静态链接形式(二进制程序)存在,基于步骤S34中angr解析的信息,提取所有分配给函数的偏移量的索引确定调用表位置,继而确定函数调用关系;
步骤S44:利用工业编程软件载入工业控制程序以获取PLC设备的硬件结构信息;
步骤S45:基于步骤S44中获取的硬件结构信息,提取工业控制设备的I/O函数内存映射图并进行存储,创建设备I/O函数数据库;
步骤S46:将函数的操作码进行连接形成字符连接序列,使用SHA-256算法计算字符连接序列的哈希值以生成能够唯一标识函数的指纹签名,构造函数指纹数据库;
上述技术方案中,在步骤S5中进行工业控制程序文件的自动化逆向,具体步骤为:
步骤S51:根据步骤S2、S3、S4,编写针对不同格式工业控制程序文件的自动化分析脚本;
步骤S52:使用步骤S51中生成的自动化分析脚本,对相同格式的工业控制程序文件进行自动化逆向分析,将计算得到的函数签名与已知函数指纹数据库中的内容进行匹配,若匹配成功,则将函数名称改为函数指纹数据库中函数的名称;
步骤S53:基于以上步骤,使用Python中的angrutils库对函数调用关系进行绘制,从而构建工业控制程序文件的控制流图;
上述技术方案中,在步骤S6将逆向结果进行可视化,具体步骤为:
步骤S61:基于步骤S53产生的工业控制文件控制流图,将子程序中的静态链接库函数和动态链接库函数名作为节点、函数间的调用关系作为边、调用次数作为边的权重;
步骤S62:使用文本图形描述语言DOT及Graphviz工具包构建函数调用关系图;
步骤S63:对于非动态链接库函数,即包含在工业控制程序文件中的节点,在最终的函数调用关系图中创建从节点链接到其相应的反汇编列表的超链接,以方便遍历。
本发明与现有技术相比,具有如下有益效果:
本发明针对工业控制程序文件进行自动化逆向分析,实现了工业控制程序收集、程序解析、子程序反汇编、函数识别、自动化逆向和逆向结果可视化等操作。从整个技术方案来看,本发明首次在工控系统安全领域中建立了针对工业控制程序的反汇编方法和流程;
本发明不受工业控制器品牌和工业控制程序格式的限制,即针对不同品牌工业控制器运行的工业控制程序器含多节点系统,所设计的检测方法仍可有效检测虚假数据注入攻击。
附图说明
图1为本发明方法流程示意图;
图2为本发明中工业控制程序收集的流程示意图;
图3为本发明中程序解析流程示意图;
图4为本发明中子程序反汇编的流程示意图;
图5为本发明中函数识别的流程示意图;
图6为本发明中工业控制程序文件自动化逆向流程示意图;
图7为本发明中逆向结果可视化流程示意图。
具体实施方式
为更好说明本发明实施例的目的、技术方案和优点,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。
本发明提出的一种工业控制程序自动化逆向分析方法与流程,通过收集工业控制程序,解析工业控制程序并对解析后的子程序进行反汇编,进而识别函数,构造函数指纹数据库,最终实现自动化逆向和逆向结果的可视化,其流程示意图如图1所示,包括如下步骤:
步骤S1:收集不同品牌控制器中的工业控制程序文件,将格式相同的工业控制程序文件存储在同源格式文件目录下,其流程示意图如图2所示,包括如下步骤:
步骤S11:创建同源项目文件目录,用于存放基于同品牌同型号控制器开发的项目文件;
步骤S12:创建同源格式工业控制程序文件目录,用于存放格式相同的工业控制程序文件;
步骤S13:使用PySpider爬虫从开源项目网站Github、CSDN中爬取基于不同控制器开发的项目,按控制器的品牌和型号将项目文件存储于同源项目文件目录;
步骤S14:在Linux系统中使用file命令,递归识别出同源项目文件目录中项目文件中的主文件类型,若主文件为工程文件,执行步骤S15和步骤S16;若主文件为可执行的工业控制程序文件,将其存于同源格式工业控制程序文件目录;
步骤S15:使用工业编程软件对该项目文件中的主文件执行打开和编译操作,生成可执行的工业控制程序文件;
步骤S16:导出编译后的可执行工业控制程序文件,将其存于同源格式工业控制程序文件目录;重复步骤S13-S16至项目文件目录内容为空,收集所有可执行工业控制程序文件;
步骤S2:对同源格式文件目录下的工业控制程序文件进行递归式手工分析,归纳文件头长度和内部字段信息,确定子程序段的分隔符,其流程示意图如图3所示,包括如下步骤:
步骤S21:打开同源格式工业控制程序文件目录,使用HEX Editor工具递归打开目录中同格式的工业控制程序文件,并将其对应的16进制字符串导出;
步骤S22:编写正则表达式脚本,对导出的16进制字符串进行匹配,找出字符串中包含的固定字段和固定结构,并统计固定字段的长度;
步骤S23:使用工业编程软件编写梯形图程序并编译,生成格式相同的工业控制程序文件,结合步骤S21和S22,对编译后的工业控制程序文件进行比较,确定文件头信息和文件中其他固定的信息;
步骤S24:在Linux系统中使用Radare2工具对格式相同的工业控制程序文件进行反汇编,生成汇编指令集,并确定该格式工业控制程序文件的汇编指令体系架构;
步骤S25:结合汇编指令体系架构,根据汇编指令集确定工业控制程序文件中子程序段的入口指令和出口指令,形成子程序分隔符;例如,通过指令(1)-(3)确定.PRG格式的工业控制程序文件中子程序的入口:
(1)MOV R12,SP
(2)STMFD SP!,{R11,R12,LR}
(3)MOV R11,R12
通过指令(4)确定.PRG格式的工业控制程序文件中子程序的出口:
(4)LDMDB R11,{R11,SP,PC}
其中指令(1)表示将当前栈指针SP的值复制到寄存器R12中;指令(2)表示将当前栈指针的值减去12字节(每个寄存器占4字节,需要存储3个寄存器)并将结果存储回SP,接着将R11、R12和LR寄存器的值存储到SP所指向的内存地址;指令(3)表示将寄存器R12中的值复制到寄存器R11中;指令(4)表示将寄存器R11所指向的内存地址中的3个字(每个字4个字节)加载到R11、SP和PC寄存器中;
步骤S3:根据分隔符划分子程序段,确定全局变量初始化程序段和一般程序段,进行程序解析,其流程示意图如图4所示,包括如下步骤:
步骤S31:使用工业编程软件加载工业控制程序文件,记录程序中定义的全局变量;
步骤S32:在工业控制程序文件对应的汇编指令中搜索全局变量名称,结合子程序分隔符确定全局变量初始化子程序段;
步骤S33:使用符号执行工具angr解析子程序执行结束时的内存信息,结合子程序段分隔符确定内存初始化子程序段;
步骤S34:使用angr解析内存初始化子程序段,提取该子程序段在整个工业控制程序文件中的偏移,并重建函数调用表;在函数调用表中检索调用的目标关键字“DCB"SysDebugHandler"”,确定工业编程软件动态调试处理子程序段;
步骤S4:所述的函数识别步骤:根据子程序反汇编结果,确定静态链接库函数、用户自定义函数、动态链接库函数、设备I/O操作函数,确定函数调用关系并建立函数指纹数据库,其流程示意图如图5所示,包括如下步骤:
步骤S41:使用IDAPro自带的flair工具加载工业控制程序文件,生成.pat文件,结合sigmake工具从.pat文件中得到.sig文件。分析.sig文件以识别工业控制程序文件中的库函数,从而识别静态链接函数的签名并记录动态链接库中的函数信息;
步骤S42:根据步骤S31-S34和S41,可得到执行静态链接函数F/FB的关键子程序:执行主要功能的StaticLib子程序、初始化本地内存的StaticLibINIT子程序,以及用户自定义的功能执行子程序(FBi)与初始化功能执行子程序(FBiINIT)。其中,i为用户自定义的功能执行子程序编号;
步骤S43:根据工业控制程序文件中的函数类型确定调用表:函数若以动态链接形式存在,则根据动态库中的空结尾字符串后的两字节的数据值计算跳转偏移值以确定调用表位置,继而确定函数调用关系;若函数以静态链接形式(二进制程序)存在,基于步骤S34中angr解析的信息,提取所有分配给函数的偏移量的索引确定调用表位置,继而确定函数调用关系;
步骤S44:利用工业编程软件载入工业控制程序以获取工业控制设备的硬件结构信息;
步骤S45:基于步骤S44中获取的硬件结构信息,提取工业控制设备的I/O函数内存映射图并进行存储,创建设备I/O函数数据库;
步骤S46:将函数的操作码进行连接形成字符连接序列,使用SHA-256算法计算字符连接序列的哈希值以生成能够唯一标识函数的指纹签名,构造函数指纹数据库;
步骤S5:所述的自动化逆向步骤:根据上述步骤流程,编写针对其他格式工业控制程序文件的分析脚本,对格式相同的待分析工业控制程序文件执行步骤S2-S4,其流程示意图如图6所示,包括如下步骤:
步骤S51:根据步骤S2、S3、S4,编写针对不同格式工业控制程序文件的自动化分析脚本;
步骤S52:使用步骤S51中生成的自动化分析脚本,对相同格式的工业控制程序文件进行自动化逆向分析,将计算得到的函数签名与已知函数指纹数据库中的内容进行匹配,若匹配成功,则将函数名称改为函数指纹数据库中函数的名称;
步骤S53:基于以上步骤,使用Python中的angrutils库对函数调用关系进行绘制,从而构建工业控制程序文件的控制流图;
步骤S6:根据子程序反汇编以及函数识别的结果,创建具有节点、边和权重的函数调用关系图,使用文本图形描述语言实现逆向结果可视化,其流程示意图如图7所示,包括如下步骤:
步骤S61:基于步骤S53产生的工业控制文件控制流图,将子程序中的静态链接库函数和动态链接库函数作为节点、函数间的调用关系作为边、调用次数作为边的权重;
步骤S62:结合步骤S61使用文本图形描述语言DOT及Graphviz工具包构建函数调用关系图;
步骤S63:对于非动态链接库函数,即包含在工业控制程序文件中的节点,在最终的函数调用关系图中创建从节点链接到其相应的反汇编列表的超链接,以方便遍历。
Claims (7)
1.一种工业控制程序自动化逆向分析方法与流程,其特征在于包括如下六个步骤:程序收集、程序解析、子程序反汇编、函数识别、自动化逆向、结果可视化:
S1、所述的程序收集步骤:收集不同品牌控制器中的工业控制程序文件,将格式相同的工业控制程序文件存储在同源格式文件目录下;
S2、所述的程序解析步骤:对同源格式文件目录下的工业程序文件进行递归式手工分析,归纳文件头长度和内部字段信息,确定子程序段的分隔符;
S3、所述的子程序反汇编步骤:根据分隔符划分子程序段,确定全局变量初始化程序段和一般程序段;
S4、所述的函数识别步骤:根据子程序反汇编结果,确定静态链接库函数、用户自定义函数、动态链接库函数、设备I/O操作函数,确定函数调用关系并建立函数指纹数据库;
S5、所述的自动化逆向步骤:根据上述步骤流程,编写针对其他格式工业控制程序文件的分析脚本,对格式相同的待分析工业控制程序文件执行步骤S2-S4;
S6、所述的结果可视化步骤:根据子程序反汇编以及函数识别的结果,创建具有节点、边和权重的函数调用关系图,使用文本图形描述语言实现逆向结果可视化。
2.根据权利要求1中所述的工业控制程序自动化逆向分析方法与流程,其特征在于,在步骤S1中,所述的程序收集步骤包括以下操作:
S11、创建同源项目文件目录,用于存放基于同品牌同型号控制器开发的项目文件;
S12、创建同源格式工业控制程序文件目录,用于存放格式相同的工业控制程序文件;
S13、使用PySpider爬虫从开源项目网站Github、CSDN中爬取基于不同控制器开发的项目,按控制器的品牌和型号将项目文件存储于同源项目文件目录;
S14、在Linux系统中使用file命令,递归识别出同源项目文件目录中项目文件中的主文件类型,若主文件为工程文件,执行步骤S15和步骤S16;若主文件为可执行的工业控制程序文件,将其存于同源格式工业控制程序文件目录;
S15、使用工业编程软件对该项目文件中的主文件执行打开和编译操作,生成可执行的工业控制程序文件;
S16、导出编译后的可执行工业控制程序文件,将其存于同源格式工业控制程序文件目录;重复步骤S13-S16至项目文件目录内容为空,收集所有可执行工业控制程序文件。
3.根据权利要求1中所述的一种工业控制程序自动化逆向分析方法与流程,其特征在于,在步骤S2中,所述的程序解析步骤包括以下操作:
S21、打开同源格式工业控制程序文件目录,使用HEX Editor工具递归打开目录中同格式的工业控制程序文件,并将其对应的16进制字符串导出;
S22、编写正则表达式脚本,对导出的16进制字符串进行匹配,找出字符串中包含的固定字段和固定结构,并统计固定字段的长度;
S23、使用工业编程软件编写梯形图程序并编译,生成格式相同的工业控制程序文件,结合步骤S21和S22,对编译后的工业控制程序文件进行比较,确定文件头信息和文件中其他固定的信息;
S24、在Linux系统中使用Radare2工具对格式相同的工业控制程序文件进行反汇编,生成汇编指令集,并确定该格式工业控制程序文件的汇编指令体系架构;
S25、结合汇编指令体系架构,根据汇编指令集确定工业控制程序文件中子程序段的入口指令和出口指令,形成子程序分隔符;例如,可通过指令(1)-(3)确定.PRG格式的工业控制程序文件中子程序的入口:
(1)MOV R12,SP
(2)STMFD SP!,{R11,R12,LR}
(3)MOV R11,R12
可通过指令(4)来确定.PRG格式的工业控制程序文件中子程序的出口:
(4)LDMDB R11,{R11,SP,PC}
其中指令(1)表示将当前栈指针SP的值复制到寄存器R12中;指令(2)表示将当前栈指针的值减去12字节(每个寄存器占4字节,需要存储3个寄存器)并将结果存储回SP,接着将R11、R12和LR寄存器的值存储到SP所指向的内存地址;指令(3)表示将寄存器R12中的值复制到寄存器R11中;指令(4)表示将寄存器R11所指向的内存地址中的3个字(每个字4个字节)加载到R11、SP和PC寄存器中。
4.根据权利要求1中所述的一种工业控制程序自动化逆向分析方法与流程,其特征在于,在步骤S3中,所述的子程序反汇编步骤包括以下操作:
S31、使用工业编程软件加载工业控制程序文件,记录程序中定义的全局变量;
S32、在工业控制程序文件对应的汇编指令中搜索全局变量名称,结合子程序分隔符确定全局变量初始化子程序段;
S33、使用符号执行工具angr解析子程序执行结束时的内存信息,结合子程序段分隔符确定内存初始化子程序段;
S34、使用angr解析内存初始化子程序段,提取该子程序段在整个工业控制程序文件中的偏移,并重建调用表;在调用表中检索调用的目标关键字“DCB"SysDebugHandler"”,确定工业编程软件动态调试处理子程序段。
5.根据权利要求1中所述的一种工业控制程序自动化逆向分析方法与流程,其特征在于,在步骤S4中,所述的函数识别步骤包括以下操作:
S41、使用IDAPro自带的flair工具加载工业控制程序文件,生成.pat文件,结合sigmake工具从.pat文件中得到.sig文件,分析.sig文件以识别工业控制程序文件中的库函数,从而识别静态链接库函数和动态链接库中的函数信息;
S42、根据步骤S31-S34和S41,可得到执行静态链接函数F/FB的关键子程序:执行主要功能的StaticLib子程序、初始化本地内存的StaticLibINIT子程序,以及用户自定义的功能执行子程序(FBi)与初始化功能执行子程序(FBiINIT),其中i为用户自定义的功能执行子程序编号;
S43、根据工业控制程序文件中的函数类型确定调用表:函数若以动态链接形式存在,则根据动态库中的空结尾字符串后的两字节的数据值计算跳转偏移值以确定调用表位置,继而确定函数调用关系;若函数以静态链接形式(二进制程序)存在,基于步骤S34中angr解析的信息,提取所有分配给函数的偏移量的索引确定调用表位置,继而确定函数调用关系;
S44、利用工业编程软件载入工业控制程序以获取工业控制设备的硬件结构信息;
S45、基于步骤S44中获取的硬件结构信息,提取工业控制设备的I/O函数内存映射图并进行存储,创建设备I/O函数数据库;
S46、将函数的操作码进行连接形成字符连接序列,使用SHA-256算法计算字符连接序列的哈希值以生成能够唯一标识函数的指纹签名,构造函数指纹数据库。
6.根据权利要求1中所述的一种工业控制程序自动化逆向分析方法与流程,其特征在于,在步骤S5中,所述的自动化逆向步骤包括以下操作:
S51、根据步骤S2、S3、S4,编写针对不同格式工业控制程序文件的自动化分析脚本;
S52、使用步骤S51中生成的自动化分析脚本,对相同格式的工业控制程序文件进行自动化逆向分析,将计算得到的函数签名与已知函数指纹数据库中的内容进行匹配,若匹配成功,则将函数名称改为函数指纹数据库中函数的名称;
S53、基于以上步骤,使用Python中的angrutils库对函数调用关系进行绘制,从而构建工业控制程序文件的控制流图。
7.根据权利要求1中所述的一种工业控制程序自动化逆向分析方法与流程,其特征在于,在步骤S6中,所述的结果可视化步骤包括以下操作:
S61、基于步骤S53产生的工业控制文件控制流图,将子程序中的静态链接库函数和动态链接库函数作为节点、函数间的调用关系作为边、调用次数作为边的权重;
S62、结合步骤S61使用文本图形描述语言DOT及Graphviz工具包构建函数调用关系图;
S63、对于非动态链接库函数,即包含在工业控制程序文件中的节点,在最终的函数调用关系图中创建从节点链接到其相应的反汇编列表的超链接,以方便遍历。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202311329186.0A CN117370988A (zh) | 2023-10-13 | 2023-10-13 | 一种工业控制程序自动化逆向分析方法与流程 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202311329186.0A CN117370988A (zh) | 2023-10-13 | 2023-10-13 | 一种工业控制程序自动化逆向分析方法与流程 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN117370988A true CN117370988A (zh) | 2024-01-09 |
Family
ID=89395876
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202311329186.0A Pending CN117370988A (zh) | 2023-10-13 | 2023-10-13 | 一种工业控制程序自动化逆向分析方法与流程 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN117370988A (zh) |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20190095183A1 (en) * | 2017-09-27 | 2019-03-28 | Jayant Shukla | Methods and systems of disassembling executable code |
CN110213243A (zh) * | 2019-05-15 | 2019-09-06 | 浙江大学 | 一种基于动态污点分析的工业通信协议逆向分析方法 |
CN115525331A (zh) * | 2022-01-14 | 2022-12-27 | 国网辽宁省电力有限公司电力科学研究院 | 一种电网感知层智能终端固件逆向分析方法 |
CN116501378A (zh) * | 2023-06-27 | 2023-07-28 | 武汉大数据产业发展有限公司 | 一种逆向工程还原源代码的实现方法、装置和电子设备 |
-
2023
- 2023-10-13 CN CN202311329186.0A patent/CN117370988A/zh active Pending
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20190095183A1 (en) * | 2017-09-27 | 2019-03-28 | Jayant Shukla | Methods and systems of disassembling executable code |
CN110213243A (zh) * | 2019-05-15 | 2019-09-06 | 浙江大学 | 一种基于动态污点分析的工业通信协议逆向分析方法 |
CN115525331A (zh) * | 2022-01-14 | 2022-12-27 | 国网辽宁省电力有限公司电力科学研究院 | 一种电网感知层智能终端固件逆向分析方法 |
CN116501378A (zh) * | 2023-06-27 | 2023-07-28 | 武汉大数据产业发展有限公司 | 一种逆向工程还原源代码的实现方法、装置和电子设备 |
Non-Patent Citations (1)
Title |
---|
梅瑞 等: "二进制代码切片技术在恶意代码检测中的应用研究", 《信息安全学报》, 31 May 2021 (2021-05-31) * |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN112733137B (zh) | 一种面向漏洞检测的二进制代码相似性分析方法 | |
CN111459799B (zh) | 一种基于Github的软件缺陷检测模型建立、检测方法及系统 | |
CN108027748A (zh) | 指令集模拟器及其模拟器生成方法 | |
CN115017516A (zh) | 一种基于符号执行的模糊测试方法 | |
Roehm et al. | Automatically detecting developer activities and problems in software development work | |
CN114416481A (zh) | 日志分析方法、装置、设备及存储介质 | |
CN107579944B (zh) | 基于人工智能和MapReduce安全攻击预测方法 | |
Saied et al. | Towards the automated recovery of complex temporal api-usage patterns | |
CN117555720A (zh) | 代码修复方法、装置、设备及介质 | |
CN112948828A (zh) | 一种二进制程序恶意代码检测方法、终端设备及存储介质 | |
CN117370988A (zh) | 一种工业控制程序自动化逆向分析方法与流程 | |
Hassan et al. | C-REX: An evolutionary code extractor for C | |
Barabanova et al. | Modeling and Investigating a Race Condition Detection Algorithm for Multithread Computational Systems | |
CN113377962B (zh) | 一种基于图像识别和自然语言处理的智能过程模拟方法 | |
EP3942404B1 (en) | Code completion for overloaded methods | |
CN113051161A (zh) | 基于历史代码变更信息的api误用检测方法 | |
CN113392016A (zh) | 对程序异常情况处理的规约生成方法、装置、设备及介质 | |
Ouyang et al. | Binary vulnerability mining based on long short-term memory network | |
Duarte et al. | Extraction of probabilistic behaviour models based on contexts | |
Liu et al. | Dynamic learning of automata from the call stack log for anomaly detection | |
CN116305131B (zh) | 脚本静态去混淆方法及系统 | |
CN117708813B (zh) | 一种软件开发环境的安全性检测方法及系统 | |
CN114579183B (zh) | 一种用于分布式计算的作业分解处理方法 | |
CN117614681A (zh) | 智能合约的重入漏洞检测方法、系统、设备和存储介质 | |
CN116796324A (zh) | 一种代码漏洞检测方法、装置、设备及介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |