CN105095304A - 日志模板生成方法及设备 - Google Patents
日志模板生成方法及设备 Download PDFInfo
- Publication number
- CN105095304A CN105095304A CN201410212252.0A CN201410212252A CN105095304A CN 105095304 A CN105095304 A CN 105095304A CN 201410212252 A CN201410212252 A CN 201410212252A CN 105095304 A CN105095304 A CN 105095304A
- Authority
- CN
- China
- Prior art keywords
- function
- character string
- code
- log
- address
- 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 43
- 238000010276 construction Methods 0.000 claims description 2
- 230000001419 dependent effect Effects 0.000 claims 1
- 238000010586 diagram Methods 0.000 description 6
- 230000007547 defect Effects 0.000 description 2
- 230000000694 effects Effects 0.000 description 2
- 101100108191 Vibrio parahaemolyticus serotype O3:K6 (strain RIMD 2210633) add gene Proteins 0.000 description 1
- 101150060298 add2 gene Proteins 0.000 description 1
- 238000005516 engineering process Methods 0.000 description 1
- 239000000284 extract Substances 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 230000003287 optical effect Effects 0.000 description 1
- 230000003068 static effect Effects 0.000 description 1
- 238000006467 substitution reaction Methods 0.000 description 1
Landscapes
- Stored Programmes (AREA)
Abstract
本发明提供一种日志模板生成方法及设备,所述方法包括:对***二进制代码反汇编获得第一代码;从所述第一代码中定位日志生成核心函数、字符串常量及字符串常量地址;根据所述日志生成核心函数对所述第一代码进行切片,获得第二代码;根据所述第二代码构建虚拟日志生成相关函数的调用堆栈;解析所述调用堆栈的末端函数的参数地址是否与所述字符串常量地址匹配;若匹配,则解析出输出字符串并根据设定的格式生成日志模板。通过该方法,解决了现有技术中许多***、应用软件无法提供源代码从而导致无法根据源代码生成日志模板进行***故障解析的问题。
Description
技术领域
本发明涉及一种日志生成技术,尤其涉及一种从二进制代码中抽取的日志模板生成方法及设备。
背景技术
***日志分析为集群***故障分析检测的主要方法,当前用来作为分析对象的***日志主要来源于3种渠道:调用日志生成应用接口、记录控制台日志信息和查看日志生成文本,通过以上渠道得到的***生成日志文本,数量庞大,信息冗余且结构化特征不明显,需要进一步对***生成日志文本进行结构化处理,即从***生成日志文本中抽取日志模板,目前主流的日志模板生成一般采用从***生成日志文件的单条日志中用统一符号代替变量信息(如时间戳、机器节点号、IP地址和文件路径等),建立初始模板,并对所有日志条目通过字符串相似度运算、索引运算或者聚类等算法,最终确定由主干信息和统一符号组成的日志模板,然而由于***配置不同、运行环境多变、运行任务多样以及***升级补丁等因素,使得***生成日志会因不同的运行环境、不同的***软件配置、不同的任务输入等因素产生差别很大的输出文本,若直接以***日志输出文本提取日志模板进行分析具有不确定性和不完整性的缺陷。
目前,为了解决因***配置不同、运行环境多变、运行任务多样以及***升级补丁等造成的从***日志文件中提取日志模板的不完整和不准确的缺陷,现有技术中采用直接从***源代码中提取日志模板,得到日志的原生结构化信息,并且覆盖所有可能的日志模板,其主要方法是从编译前的高级语言***源代码入手,在源代码文本中通过字符解析的形式解析出日志主干信息的字符串常量,再根据代码逻辑列出字符串常量所有可能的组合方式,最终将主干信息拼装到一起,得到日志模板。
然而,很多商业软件、***补丁升级、大型***软件的很多静态链接库和动态链接库不提供源代码,所以无法根据源代码生成日志模板进行***故障分析。
发明内容
本发明提供一种日志模板生成方法及设备,解决了现有技术中许多***、应用软件无法提供源代码从而导致无法根据源代码生成日志模板进行***故障解析的问题。
第一方面,本发明提供一种日志模板生成方法,包括:
对***二进制代码反汇编获得第一代码;
从所述第一代码中定位日志生成核心函数、字符串常量及字符串常量地址;
根据所述日志生成核心函数对所述第一代码进行切片,获得第二代码;
根据所述第二代码构建虚拟日志生成相关函数的调用堆栈;
解析所述调用堆栈的末端函数的参数地址是否与所述字符串常量地址匹配;
若匹配,则解析出输出字符串并根据设定的格式生成日志模板。
在第一方面的第一种可能的实现方式中,从所述第一代码中定位字符串常量及字符串常量地址,包括:
如果***二进制文件中存在符号表或单独的字符串数据段,则直接从所述第一代码的只读数据段中解析,定位所述字符串常量及所述字符串常量地址,并建立字符串常量首地址表;
如果***二进制文件中不存在符号表或单独的字符串数据段,则根据***生成的日志文本,建立日志语料库,从所述日志语料库的只读数据段通过解析‘/0’之间的数据,定位字符串常量,并与所述语料库相匹配,建立所述字符串常量首地址表。
在第一方面的第二种可能的实现方式中,所述从所述第一代码中定位日志生成核心函数,包括:
如果***二进制文件中存在符号表,则根据函数名和字符串常量参数引用特征从所述第一代码中定位所述日志生成核心函数;
如果所述***二进制文件中不存在符号表,则根据所述日志生成核心函数的模式特征进行解析,定位所述日志生成核心函数。
根据第一方面的第二种可能的实现方式,在第一方面的第三种可能的实现方式中,所述根据所述日志生成核心函数的模式特征进行解析,定位所述日志生成核心函数,包括:
判断所述第一代码中的函数是否含有字符串常量参数,若含有,则记录所述函数的引用地址;
判断所述函数的调用次数是否超过预设阈值,若超过,则根据依赖关系遍历所述函数的引用函数链;
判断所述函数的引用函数链末端是否为***内核写文件函数或动态链接库函数,若是,则将所述函数定义为所述日志生成核心函数。
根据第一方面、第一方面的第一种至第三种可能的实现方式的任意一种,在第一方面第四种可能的实现方式中,所述根据所述日志生成核心函数对所述第一代码进行切片,获得第二代码,包括:
将所述第一代码中最顶端的所述日志生成核心函数定位为起始入口;
将所述日志生成核心函数所调用的写文件函数或动态链接库函数定位为终点出口;
从所述第一代码中提取所述起始入口到所述终点出口之间的代码,并将提取的所述代码作为第二代码。
根据第一方面的第四种可能的实现方式,在第一方面的第五种可能的实现方式中,所述将所述日志生成核心函数所调用的写文件函数定位为终点出口,包括:
在所述第一代码中定位软中断指令,在所述软中断指令处查找对应寄存器中的赋值;
将查到的所述赋值与***调用号比对,得到函数名称,标记所述软中断指令的位置为终点出口;
或者,
将所述日志生成核心函数所调用的动态链接库函数定位为终点出口,包括:
解析所述第一代码的文件头结构,确定动态符号表段;
通过解析所述动态符号表段,导入函数名;
确定导入所述函数在所述第一代码中的位置,标记所述函数在所述第一代码中的位置为终点出口。
根据第一方面、第一方面的第一种至第五种可能的实现方式的任意一种,在第六种可能的实现方式中,所述根据所述第二代码构建虚拟日志生成相关函数的调用堆栈,包括:
根据所述第二代码中程序的调用关系,建立局部控制流程图,将条件跳转指令解析为无条件跳转指令,构建所述虚拟日志生成相关函数的调用堆栈。
根据第一方面第一种可能的实现方式中,在第七种可能的实现方式中,解析所述调用堆栈的末端函数的参数地址是否与所述字符串常量地址匹配,包括:
将所述调用堆栈的末端函数的参数地址与所述字符串常量首地址表进行匹配。
根据第一方面、第一方面的第一种至第七种可能的实现方式的任意一种,在第八种可能的实现方式中,还包括:
若解析所述调用堆栈的末端函数的参数地址与所述字符串常量地址不匹配时,则包括:
在所述虚拟日志生成相关函数的调用堆栈中,跟踪字符串地址寄存器数据流,获得所述调用堆栈函数的所有中间字符串;
解析所述所有中间字符串的生成地址,并建立中间字符串生成表,所述中间字符串生成表包括所述中间字符串与所述中间字符串地址寄存器的对应关系;
当所述调用堆栈的末端函数的所有参数地址与所述中间字符串生成表中的中间字符串地址寄存器均匹配,则根据所述中间字符串生成表中的中间字符串生成完整的输出字符串;
根据所述输出字符串生成日志模板。
第二方面,本发明提供一种日志模板生成设备,包括:
第一获取模块,用于对***二进制代码反汇编获得第一代码;
定位模块,用于从所述第一代码中定位日志生成核心函数、字符串常量及字符串常量地址;
第二获取模块,用于根据所述日志生成核心函数对所述第一代码进行切片,获得第二代码;
构建模块,用于根据所述第二代码构建虚拟日志生成相关函数的调用堆栈;
解析模块,用于解析所述调用堆栈的末端函数的参数地址是否与所述字符串常量地址匹配,若匹配,则解析出输出字符串;
生成模块,用于将所述解析模块解析出的输出字符串根据设定的格式生成日志模板。
在第二方面的第一种可能的实现方式中,所述定位模块具体用于:
从所述第一代码中定位字符串常量及字符串常量地址,包括:
如果***二进制文件中存在符号表或单独的字符串数据段,则直接从所述第一代码的只读数据段中解析,定位所述字符串常量及所述字符串常量地址,并建立字符串常量首地址表;
如果***二进制文件中不存在符号表或单独的字符串数据段,则根据***生成的日志文本,建立日志语料库,从所述日志语料库的只读数据段通过解析‘/0’之间的数据,定位字符串常量,并与所述语料库相匹配,建立所述字符串常量首地址表。
在第二方面的第二种可能的实现方式中,所述定位模块具体用于:
所述从所述第一代码中定位日志生成核心函数,包括:
如果***二进制文件中存在符号表,则根据函数名和字符串常量参数引用特征从所述第一代码中定位所述日志生成核心函数;
如果所述***二进制文件中不存在符号表,则根据所述日志生成核心函数的模式特征进行解析,定位所述日志生成核心函数。
根据第二方面的第二种可能的实现方式,在第二方面的第三种可能的实现方式中,所述定位模块具体用于:根据所述日志生成核心函数的模式特征进行解析,定位所述日志生成核心函数,包括:
判断所述第一代码中的函数是否含有字符串常量参数,若含有,则记录所述函数的引用地址;
判断所述函数的调用次数是否超过预设阈值,若超过,则根据依赖关系遍历所述函数的引用函数链;
判断所述函数的引用函数链末端是否为***内核写文件函数或动态链接库函数,若是,则将所述函数定义为所述日志生成核心函数。
根据第二方面、第二方面的第一种至第三种可能的实现方式的任意一种,在第二方面第四种可能的实现方式中,所述第二获取模块包括:
第一处理单元,用于将所述第一代码中最顶端的所述日志生成核心函数定位为起始入口;
第二处理单元,用于将所述日志生成核心函数所调用的写文件函数或动态链接库函数定位为终点出口;
提取单元,用于从所述第一代码中提取所述起始入口到所述终点出口之间的代码,提取的所述代码作为第二代码。
根据第二方面的第四种可能的实现方式,在第二方面的第五种可能的实现方式中,所述第二处理单元具体用于:当所述日志生成核心函数所调用的写文件函数定位为终点出口时,在所述第一代码中定位软中断指令,在所述软中断指令处查找对应寄存器中的赋值;
将查到的所述赋值与***调用号比对,得到函数名称,标记所述软中断指令的位置为终点出口;
或者,所述第二处理单元具体用于:当所述日志生成核心函数所调用的动态链接库函数定位为终点出口时,解析所述第一代码的文件头结构,确定动态符号表段;
通过解析所述动态符号表段,导入函数名;
确定导入所述函数在所述第一代码中的位置,标记所述函数在所述第一代码中的位置为终点出口。
根据第二方面、第二方面的第一种至第五种可能的实现方式的任意一种,在第二方面的第六种可能的实现方式中,所述构建模块具体用于:根据所述第二代码中程序的调用关系,建立局部控制流程图,将条件跳转指令解析为无条件跳转指令,构建所述虚拟日志生成相关函数的调用堆栈。
根据第二方面的第一种可能的实现方式,在第二方面的第七种可能的实现方式中,所述解析模块具体用于:将所述调用堆栈的末端函数的参数地址与所述字符串常量首地址表进行匹配。
根据第二方面、第二方面的第一种至第七种可能的实现方式的任意一种,在第二方面的第八种可能的实现方式中,还包括:
第三获取模块,用于当若解析所述调用堆栈的末端函数的参数地址与所述字符串常量地址不匹配时,在所述虚拟日志生成相关函数的调用堆栈中,跟踪字符串地址寄存器数据流,获得所述调用堆栈函数的所有中间字符串;
处理模块,用于解析所述所有中间字符串的生成地址,并建立中间字符串生成表,所述中间字符串生成表包括所述中间字符串与所述中间字符串地址寄存器的对应关系;
所述生成模块,还用于当所述调用堆栈的末端函数的所有参数地址与所述中间字符串生成表中的中间字符串地址寄存器均匹配,则根据所述中间字符串生成表中的中间字符串生成完整的输出字符串;
根据所述输出字符串生成日志模板。
本发明实施例提供的日志模板生成方法及设备,通过该方法实现了从***二进制代码中解析生成日志模板,而且通过对代码进行切片以及构建调用堆栈,有效地减少了分析二进制代码的工作量,提高了分析效率。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1为本发明日志模板生成方法实施例一的流程示意图;
图2为本发明日志模板生成方法实施例二的流程示意图;
图3为本发明日志模板生成方法的方框示意图;
图4为本发明日志模板生成设备实施例的结构示意图。
具体实施方式
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
图1为本发明日志模板生成方法实施例一的流程示意图,本实施例中,主要对***或服务器的二进制代码进行静态分析,从中生成日志模板,其中二进制代码中的字符串常量组成日志模板的主干部分,日志模板的其他信息在生成过程中添加进去,如图1所示,该方法包括:
步骤101、对***二进制代码反汇编获得第一代码。
本实施例中,基于相应平台,如应用二进制接口(ApplicationBinaryInterface,简称:ABI)规范,解析二进制代码的文件头结构,定位代码段和数据段,并对二进制代码进行反汇编,获得第一代码,即所述第一代码是将***的二进制代码反编译得到的代码。
步骤102、从所述第一代码中定位日志生成核心函数、字符串常量及字符串常量地址。
本实施例中,需要从所述第一代码中定位出日志生成核心函数、字符串常量及字符串常量地址,其中日志生成核心函数为***二进制代码中与日志生成功能直接相关的函数,从所述第一代码中定位出日志生成核心函数可以通过***二进制文件中存在的符号表,根据函数名和字符串常量参数引用特征从所述第一代码中定位所述日志生成核心函数,还可以根据所述日志生成核心函数的模式特征进行解析,定位所述日志生成核心函数,其中,所述日志生成核心函数的模式特征为:a)函数压栈参数中含有字符串常量;b)函数本省被多次调用;c)函数最终会调用***内核写文件函数或动态链接库函数,如果函数符合上述三个特征,则将该函数标定为日志生成核心函数,其中写文件函数可以如Linux中的write、syslog等函数,需要说明的是,从所述第一代码中定位的日志生成核心函数可以为多个,所以可以将定位出的所有日志生成核心函数加入到一个日志生成核心函数列表中,另外,本实施例中,可以从所述第一代码的只读数据段中直接解析源程序中字符串常量及地址,还可以根据***生成的日志文本,建立日志语料库,在只读数据段中通过解析“/0”之间的数据,定位字符串常量,并将所述字符串常量与日志语料库相匹配,建立字符串首地址表,其中字符串首地址表包含字符串常量以及字符串常量对应的地址。
步骤103、根据所述日志生成核心函数对所述第一代码进行切片,获得第二代码。
具体地,根据所述第一代码中日志生成核心函数的依赖关系,选取处于调用链最顶端的日志生成核心函数为解析的起始入口,选取所述日志生成核心函数所调用的写文件函数或动态链接库函数为终点出口,从所述第一代码中提取所述起始入口到所述终点出口之间的代码,并将提取的所述代码作为第二代码,即所述第二代码为切片后的代码,在本实施例中,需要说明的是,一个日志生成核心函数可能被多次调用,所以需选取调用链最顶端的日志生成核心函数为解析的起始入口。
步骤104、根据所述第二代码构建虚拟日志生成相关函数的调用堆栈。
本实施例中,在所述第二代码片段中,建立日志生成相关代码的局部控制流程图,将条件跳转指令解析为无条件跳转指令,即将所有可能的日志产生路径都解析出来,构建所述虚拟日志生成相关函数的调用堆栈,即在所述构建的调用堆栈中覆盖了所有的日志产生路径。
步骤105、解析所述调用堆栈的末端函数的参数地址是否与所述字符串常量地址匹配,若是,执行步骤106。
在本实施例中,将所述调用堆栈的末端函数的参数地址与步骤102的定位出的所述字符串常量地址进行匹配,如果匹配成功,则解析出输出字符串,将所述输出字符串作为生成日志模板的主干部分。
步骤106、解析出输出字符串并根据设定的格式生成日志模板。
在本实施例中,根据解析出的输出字符串,通过设定的格式,生成日志模板。
本发明实施例提供的日志模板生成方法,通过从二进制代码中抽取生成日志模板,解决了现有技术中许多***、应用软件无法提供源代码从而导致无法根据源代码生成日志模板进行***故障解析的问题,而且通过对代码进行切片以及构建调用堆栈,有效地减少了分析二进制代码的工作量,提高了分析效率。
图2为本发明日志模板生成方法实施例二的流程示意图,图3为本发明日志模板生成方法的方框示意图,在上述实施例中的基础上,本实施例中,如图2-图3所示,包括:
步骤201、对***二进制代码反汇编获得第一代码。
步骤202、所述第一代码中定位字符串常量及字符串常量地址,并建立字符串常量首地址表。
本实施例中,从所述第一代码中定位字符串常量及字符串常量地址,并建立字符串常量首地址表,步骤202包括:
步骤2021、判断***二进制文件中是否存在符号表或单独的字符串数据段,若存在,则执行步骤2022,若不存在,则执行步骤2023。
步骤2022、直接从所述第一代码的只读数据段中解析,定位所述字符串常量及所述字符串常量地址。
如3所示,从只读数据段中定位出字符串1(s1)和字符串2(s2),并记录字符串1和字符串2分别存放的位置为地址1和地址2。
步骤2023、根据***生成的日志文本,定位字符串常量。
具体地,如果***二进制文件中不存在符号表或单独的字符串数据段,则根据***生成的日志文本,建立日志语料库,从所述日志语料库的只读数据段通过解析‘/0’之间的数据,定位字符串常量,并与所述语料库相匹配。
步骤2024、根据定位出的字符串常量与字符串常量地址,建立所述字符串常量首地址表。
步骤203、从第一代码中定位所述日志生成核心函数。
本实施例中,根据步骤2021判断出***二进制文件中存在符号表时,则根据函数名和字符串常量参数引用特征从所述第一代码中定位所述日志生成核心函数;根据步骤2021判断出***二进制文件中不存在符号表时,则根据所述日志生成核心函数的模式特征进行解析,定位所述日志生成核心函数,在本实施例根据所述日志生成核心函数的模式特征进行解析,定位所述日志生成核心函数,具体包括:
1)判断所述第一代码中的函数是否含有字符串常量参数,若含有,则记录所述函数的引用地址;
举例来说,第一代码可以为如下的一段指令:
Pushadd1
Pushadd2
Callflog
……
Callvprintf
……
Pushadd3
Callwrite
……
其中,add1为地址1,add2为地址2,add3为地址3,flog为函数,Call为调用指令,Push为入栈指令,write为写文件函数,如图3所示,地址1存放字符串1,地址2存放字符串2,对Call指令前的压栈参数地址(add1和add2)与字符串常量地址进行匹配,若匹配,则函数含有字符串常量。
2)判断所述函数的调用次数是否超过预设阈值,若超过,则根据依赖关系遍历所述函数的引用函数链;
预设阈值可以具体根据实际应用情况来设定,本实施例中不加以限制。
3)判断所述函数的引用函数链末端是否为***内核写文件函数或动态链接库函数,若是,则将所述函数定义为所述日志生成核心函数。
若函数满足上述三个条件则定义为日志生成核心函数。
步骤204、根据所述日志生成核心函数对所述第一代码进行切片,获得第二代码。
本实施例中,根据所述日志生成核心函数对所述第一代码进行切片,包括如下步骤:
步骤2041、将所述第一代码中最顶端的所述日志生成核心函数定位为起始入口;
举例来说,如图3中,将所述第一代码中的日志生成核心函数(如上述指令中的flog函数)所在的位置定义为起始入口S。
步骤2042、将所述日志生成核心函数所调用的写文件函数或动态链接库函数定位为终点出口。
在本实施例种,所述日志生成核心函数所调用的函数可以为写文件函数,还可以为动态链接库函数,当所述日志生成核心函数所调用的函数为写文件函数,则包括:
在所述第一代码中定位软中断指令,在所述软中断指令处查找对应寄存器中的赋值,其中软中断指令可以为linux中的int80;
将查到的所述赋值与***调用号比对,得到函数名称,标记所述软中断指令的位置为终点出口,其中,linux***中写文件函数write的***调用号为4,syslog的***调用号为103,当查找得到赋值为4,则得到的函数名称为wtite函数,如图3中,将所述第一代码中函数调用的写文件函数write所在的位置标定为终点出口F。
进一步的,当所述日志生成核心函数所调用的函数为动态链接库函数,则解析所述第一代码的文件头结构,确定动态符号表段,其中,ELF格式二进制文件的动态符号表段名为.symtab,解析所述动态符号表段,导入函数名,确定导入所述函数在所述第一代码中的位置,标记该位置为终点出口。
步骤2043、从所述第一代码中提取所述起始入口到所述终点出口之间的代码,并将提取的所述代码作为第二代码。
如图3所示,提取从起始入口S到终点出口F之间的代码,即完成对第一代码的切片,通过切片,可以快速对日志生成相关代码进行定位,不需要构建全局调用关系图,极大地减小了二进制代码的分析工作量,提高了分析准确度。
步骤205、根据所述第二代码构建虚拟日志生成相关函数的调用堆栈;
本实施例种,根据所述第二代码中程序的调用关系,建立局部控制流程图,将条件跳转指令解析为无条件跳转指令,构建所述虚拟日志生成相关函数的调用堆栈,如图3所示的虚拟日志生成相关函数的调用堆栈301。
步骤206、解析所述调用堆栈的末端函数的参数地址是否与所述字符串常量首地址表中的地址匹配,若不匹配,则执行步骤207,若匹配,则执行步骤2010。
在本实施例种,虚拟日志生成相关函数的调用堆栈301中包括了各种日志生成路径,所以会出现一些中间字符串,如图3所示,所述调用堆栈的末端函数出现参数地址(地址3),地址3与所述字符串常量首地址表中的地址1和地址2不匹配。
步骤207、在所述虚拟日志生成相关函数的调用堆栈中,跟踪字符串地址寄存器数据流,获得所述调用堆栈函数的所有中间字符串。
根据字符串常量地址跟踪字符串地址寄存器数据流,获得堆栈中函数生成、修改以及返回的所有中间字符串,如图3中,根据地址1和地址2得到中间字符串s3,且s3:s1+s2,中间字符串s3存放在地址3中。
步骤208、解析所述所有中间字符串的生成地址,并建立中间字符串生成表,所述中间字符串生成表包括所述中间字符串与所述中间字符串地址寄存器的对应关系。
本实施例中,解析所述所有中间字符串的生成地址,举例来说,如图3所示,将中间字符串s3与地址3对应,生成中间字符串生成表302。
步骤209、判断所述调用堆栈的末端函数的所有参数地址是否与所述中间字符串生成表中的中间字符串地址寄存器均匹配,若否,重复步骤207和208,直到所述调用堆栈的末端函数的所有参数地址与所述中间字符串生成表中的中间字符串地址寄存器均匹配,则执行步骤2010。
步骤2010、解析生成输出字符串。
步骤2011、根据所述输出字符串生成日志模板。
本实施例种,解析输出字符串,即获得生成日志模板的主干部分,根据设定的格式,生成日志模板。
本发明实施例提供的日志模板生成方法,通过从二进制代码中抽取生成日志模板,解决了现有技术中许多***、应用软件无法提供源代码从而导致无法根据源代码生成日志模板进行***故障解析的问题,而且通过对代码进行切片以及构建调用堆栈,有效地减少了分析二进制代码的工作量,提高了分析效率。
图4为本发明日志模板生成设备实施例的结构示意图,如图4所示,所述日志模板生成设备40包括:第一获取模块401、定位模块402、第二获取模块403、构建模块404、解析模块405和生成模块406。
其中,所述第一获取模块401,用于对***二进制代码反汇编获得第一代码。
定位模块402,用于从所述第一代码中定位日志生成核心函数、字符串常量及字符串常量地址。
第二获取模块403,用于根据所述日志生成核心函数对所述第一代码进行切片,获得第二代码;
构建模块404,用于根据所述第二代码构建虚拟日志生成相关函数的调用堆栈。
解析模块405,用于解析所述调用堆栈的末端函数的参数地址是否与所述字符串常量地址匹配,若匹配,则解析出输出字符串。
生成模块406,用于将所述解析模块解析出的输出字符串根据设定的格式生成日志模板。
上述实施例的设备,用于执行图1所示方法实施例一的技术方案,其实现原理和技术效果类似,此处不再赘述。
本实施例提供的日志模板生成设备,通过日志模板生成设备从二进制代码中抽取生成日志模板,解决了现有技术中许多***、应用软件无法提供源代码从而导致无法根据源代码生成日志模板进行***故障解析的问题,而且通过对代码进行切片以及构建调用堆栈,有效地减少了分析二进制代码的工作量,提高了分析效率。
进一步地,在本实施例的基础上,所述定位模块402具体用于:从所述第一代码中定位字符串常量及字符串常量地址,包括:
如果***二进制文件中存在符号表或单独的字符串数据段,则直接从所述第一代码的只读数据段中解析,定位所述字符串常量及所述字符串常量地址,并建立字符串常量首地址表;
如果***二进制文件中不存在符号表或单独的字符串数据段,则根据***生成的日志文本,建立日志语料库,从所述日志语料库的只读数据段通过解析‘/0’之间的数据,定位字符串常量,并与所述语料库相匹配,建立所述字符串常量首地址表。
进一步地,在本实施例的基础上,所述定位模块402具体用于:
所述从所述第一代码中定位日志生成核心函数,包括:
如果***二进制文件中存在符号表,则根据函数名和字符串常量参数引用特征从所述第一代码中定位所述日志生成核心函数;
如果所述***二进制文件中不存在符号表,则根据所述日志生成核心函数的模式特征进行解析,定位所述日志生成核心函数。
进一步地,在本实施例的基础上,所述定位模块402具体用于:根据所述日志生成核心函数的模式特征进行解析,定位所述日志生成核心函数,包括:
判断所述第一代码中的函数是否含有字符串常量参数,若含有,则记录所述函数的引用地址;
判断所述函数的调用次数是否超过预设阈值,若超过,则根据依赖关系遍历所述函数的引用函数链;
判断所述函数的引用函数链末端是否为***内核写文件函数或动态链接库函数,若是,则将所述函数定义为所述日志生成核心函数。
进一步地,在本实施例的基础上,所述第二获取模块403包括:
第一处理单元,用于将所述第一代码中最顶端的所述日志生成核心函数定位为起始入口;
第二处理单元,用于将所述日志生成核心函数所调用的写文件函数或动态链接库函数定位为终点出口;
提取单元,用于从所述第一代码中提取所述起始入口到所述终点出口之间的代码,提取的所述代码作为第二代码。
进一步地,在本实施例的基础上,所述第二处理单元具体用于:当所述日志生成核心函数所调用的写文件函数定位为终点出口时,在所述第一代码中定位软中断指令,在所述软中断指令处查找对应寄存器中的赋值;
将查到的所述赋值与***调用号比对,得到函数名称,标记所述软中断指令的位置为终点出口;
或者,所述第二处理单元具体用于:当所述日志生成核心函数所调用的动态链接库函数定位为终点出口时,解析所述第一代码的文件头结构,确定动态符号表段;
通过解析所述动态符号表段,导入函数名;
确定导入所述函数在所述第一代码中的位置,标记所述函数在所述第一代码中的位置为终点出口。
进一步地,在本实施例的基础上,所述构建模块404具体用于:根据所述第二代码中程序的调用关系,建立局部控制流程图,将条件跳转指令解析为无条件跳转指令,构建所述虚拟日志生成相关函数的调用堆栈。
进一步地,在本实施例的基础上,所述解析模块405具体用于:将所述调用堆栈的末端函数的参数地址与所述字符串常量首地址表进行匹配。
进一步地,在本实施例的基础上,所述日志模板生成设备40还包括:
第三获取模块,用于当若解析所述调用堆栈的末端函数的参数地址与所述字符串常量地址不匹配时,在所述虚拟日志生成相关函数的调用堆栈中,跟踪字符串地址寄存器数据流,获得所述调用堆栈函数的所有中间字符串;
处理模块,用于解析所述所有中间字符串的生成地址,并建立中间字符串生成表,所述中间字符串生成表包括所述中间字符串与所述中间字符串地址寄存器的对应关系;
所述生成模块,还用于当所述调用堆栈的末端函数的所有参数地址与所述中间字符串生成表中的中间字符串地址寄存器均匹配,则根据所述中间字符串生成表中的中间字符串生成完整的输出字符串;
根据所述输出字符串生成日志模板。
本实施例的日志模板生成设备,可以用于执行本发明方法实施例一或二所提供的技术方案,其实现原理和技术效果类似,此处不再赘述。
本领域普通技术人员可以理解:实现上述各方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成。前述的程序可以存储于一计算机可读取存储介质中。该程序在执行时,执行包括上述各方法实施例的步骤;而前述的存储介质包括:ROM、RAM、磁碟或者光盘等各种可以存储程序代码的介质。
最后应说明的是:以上各实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述各实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的范围。
Claims (18)
1.一种日志模板生成方法,其特征在于,所述方法包括:
对***二进制代码反汇编获得第一代码;
从所述第一代码中定位日志生成核心函数、字符串常量及字符串常量地址;
根据所述日志生成核心函数对所述第一代码进行切片,获得第二代码;
根据所述第二代码构建虚拟日志生成相关函数的调用堆栈;
解析所述调用堆栈的末端函数的参数地址是否与所述字符串常量地址匹配;
若匹配,则解析出输出字符串并根据设定的格式生成日志模板。
2.根据权利要求1所述的方法,其特征在于,从所述第一代码中定位字符串常量及字符串常量地址,包括:
如果***二进制文件中存在符号表或单独的字符串数据段,则直接从所述第一代码的只读数据段中解析,定位所述字符串常量及所述字符串常量地址,并建立字符串常量首地址表;
如果***二进制文件中不存在符号表或单独的字符串数据段,则根据***生成的日志文本,建立日志语料库,从所述日志语料库的只读数据段通过解析‘/0’之间的数据,定位字符串常量,并与所述语料库相匹配,建立所述字符串常量首地址表。
3.根据权利要求1所述的方法,其特征在于,所述从所述第一代码中定位日志生成核心函数,包括:
如果***二进制文件中存在符号表,则根据函数名和字符串常量参数引用特征从所述第一代码中定位所述日志生成核心函数;
如果所述***二进制文件中不存在符号表,则根据所述日志生成核心函数的模式特征进行解析,定位所述日志生成核心函数。
4.根据权利要求3所述的方法,其特征在于,所述根据所述日志生成核心函数的模式特征进行解析,定位所述日志生成核心函数,包括:
判断所述第一代码中的函数是否含有字符串常量参数,若含有,则记录所述函数的引用地址;
判断所述函数的调用次数是否超过预设阈值,若超过,则根据依赖关系遍历所述函数的引用函数链;
判断所述函数的引用函数链末端是否为***内核写文件函数或动态链接库函数,若是,则将所述函数定义为所述日志生成核心函数。
5.根据权利要求1-4任一所述的方法,其特征在于,所述根据所述日志生成核心函数对所述第一代码进行切片,获得第二代码,包括:
将所述第一代码中最顶端的所述日志生成核心函数定位为起始入口;
将所述日志生成核心函数所调用的写文件函数或动态链接库函数定位为终点出口;
从所述第一代码中提取所述起始入口到所述终点出口之间的代码,并将提取的所述代码作为第二代码。
6.根据权利要求5所述的方法,其特征在于,所述将所述日志生成核心函数所调用的写文件函数定位为终点出口,包括:
在所述第一代码中定位软中断指令,在所述软中断指令处查找对应寄存器中的赋值;
将查到的所述赋值与***调用号比对,得到函数名称,标记所述软中断指令的位置为终点出口;
或者,
将所述日志生成核心函数所调用的动态链接库函数定位为终点出口,包括:
解析所述第一代码的文件头结构,确定动态符号表段;
通过解析所述动态符号表段,导入函数名;
确定导入所述函数在所述第一代码中的位置,标记所述函数在所述第一代码中的位置为终点出口。
7.根据权利要求1-6任一所述的方法,其特征在于,所述根据所述第二代码构建虚拟日志生成相关函数的调用堆栈,包括:
根据所述第二代码中程序的调用关系,建立局部控制流程图,将条件跳转指令解析为无条件跳转指令,构建所述虚拟日志生成相关函数的调用堆栈。
8.根据权利要求2所述的方法,其特征在于,解析所述调用堆栈的末端函数的参数地址是否与所述字符串常量地址匹配,包括:
将所述调用堆栈的末端函数的参数地址与所述字符串常量首地址表进行匹配。
9.根据权利要求1-8任一所述的方法,其特征在于,还包括:
若解析所述调用堆栈的末端函数的参数地址与所述字符串常量地址不匹配时,则包括:
在所述虚拟日志生成相关函数的调用堆栈中,跟踪字符串地址寄存器数据流,获得所述调用堆栈函数的所有中间字符串;
解析所述所有中间字符串的生成地址,并建立中间字符串生成表,所述中间字符串生成表包括所述中间字符串与所述中间字符串地址寄存器的对应关系;
当所述调用堆栈的末端函数的所有参数地址与所述中间字符串生成表中的中间字符串地址寄存器均匹配,则根据所述中间字符串生成表中的中间字符串生成完整的输出字符串;
根据所述输出字符串生成日志模板。
10.一种日志模板生成设备,其特征在于,包括:
第一获取模块,用于对***二进制代码反汇编获得第一代码;
定位模块,用于从所述第一代码中定位日志生成核心函数、字符串常量及字符串常量地址;
第二获取模块,用于根据所述日志生成核心函数对所述第一代码进行切片,获得第二代码;
构建模块,用于根据所述第二代码构建虚拟日志生成相关函数的调用堆栈;
解析模块,用于解析所述调用堆栈的末端函数的参数地址是否与所述字符串常量地址匹配,若匹配,则解析出输出字符串;
生成模块,用于将所述解析模块解析出的输出字符串根据设定的格式生成日志模板。
11.根据权利要求10所述的设备,其特征在于,所述定位模块具体用于:
从所述第一代码中定位字符串常量及字符串常量地址,包括:
如果***二进制文件中存在符号表或单独的字符串数据段,则直接从所述第一代码的只读数据段中解析,定位所述字符串常量及所述字符串常量地址,并建立字符串常量首地址表;
如果***二进制文件中不存在符号表或单独的字符串数据段,则根据***生成的日志文本,建立日志语料库,从所述日志语料库的只读数据段通过解析‘/0’之间的数据,定位字符串常量,并与所述语料库相匹配,建立所述字符串常量首地址表。
12.根据权利要求10所述的设备,其特征在于,所述定位模块具体用于:
所述从所述第一代码中定位日志生成核心函数,包括:
如果***二进制文件中存在符号表,则根据函数名和字符串常量参数引用特征从所述第一代码中定位所述日志生成核心函数;
如果所述***二进制文件中不存在符号表,则根据所述日志生成核心函数的模式特征进行解析,定位所述日志生成核心函数。
13.根据权利要求12所述的设备,其特征在于,所述定位模块具体用于:根据所述日志生成核心函数的模式特征进行解析,定位所述日志生成核心函数,包括:
判断所述第一代码中的函数是否含有字符串常量参数,若含有,则记录所述函数的引用地址;
判断所述函数的调用次数是否超过预设阈值,若超过,则根据依赖关系遍历所述函数的引用函数链;
判断所述函数的引用函数链末端是否为***内核写文件函数或动态链接库函数,若是,则将所述函数定义为所述日志生成核心函数。
14.根据权利要求10-13任一所述的设备,其特征在于,所述第二获取模块包括:
第一处理单元,用于将所述第一代码中最顶端的所述日志生成核心函数定位为起始入口;
第二处理单元,用于将所述日志生成核心函数所调用的写文件函数或动态链接库函数定位为终点出口;
提取单元,用于从所述第一代码中提取所述起始入口到所述终点出口之间的代码,提取的所述代码作为第二代码。
15.根据权利要求14所述的设备,其特征在于,所述第二处理单元具体用于:当所述日志生成核心函数所调用的写文件函数定位为终点出口时,在所述第一代码中定位软中断指令,在所述软中断指令处查找对应寄存器中的赋值;
将查到的所述赋值与***调用号比对,得到函数名称,标记所述软中断指令的位置为终点出口;
或者,所述第二处理单元具体用于:当所述日志生成核心函数所调用的动态链接库函数定位为终点出口时,解析所述第一代码的文件头结构,确定动态符号表段;
通过解析所述动态符号表段,导入函数名;
确定导入所述函数在所述第一代码中的位置,标记所述函数在所述第一代码中的位置为终点出口。
16.根据权利要求10-15任一所述的设备,其特征在于,所述构建模块具体用于:根据所述第二代码中程序的调用关系,建立局部控制流程图,将条件跳转指令解析为无条件跳转指令,构建所述虚拟日志生成相关函数的调用堆栈。
17.根据权利要求11所述的设备,其特征在于,所述解析模块具体用于:将所述调用堆栈的末端函数的参数地址与所述字符串常量首地址表进行匹配。
18.根据权利要求10-17任一所述的设备,其特征在于,还包括:
第三获取模块,用于当若解析所述调用堆栈的末端函数的参数地址与所述字符串常量地址不匹配时,在所述虚拟日志生成相关函数的调用堆栈中,跟踪字符串地址寄存器数据流,获得所述调用堆栈函数的所有中间字符串;
处理模块,用于解析所述所有中间字符串的生成地址,并建立中间字符串生成表,所述中间字符串生成表包括所述中间字符串与所述中间字符串地址寄存器的对应关系;
所述生成模块,还用于当所述调用堆栈的末端函数的所有参数地址与所述中间字符串生成表中的中间字符串地址寄存器均匹配,则根据所述中间字符串生成表中的中间字符串生成完整的输出字符串;
根据所述输出字符串生成日志模板。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410212252.0A CN105095304A (zh) | 2014-05-19 | 2014-05-19 | 日志模板生成方法及设备 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410212252.0A CN105095304A (zh) | 2014-05-19 | 2014-05-19 | 日志模板生成方法及设备 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN105095304A true CN105095304A (zh) | 2015-11-25 |
Family
ID=54575754
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201410212252.0A Pending CN105095304A (zh) | 2014-05-19 | 2014-05-19 | 日志模板生成方法及设备 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN105095304A (zh) |
Cited By (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105700851A (zh) * | 2016-01-08 | 2016-06-22 | 大唐微电子技术有限公司 | 一种实现压栈和弹栈的方法和装置 |
CN106055585A (zh) * | 2016-05-20 | 2016-10-26 | 北京神州绿盟信息安全科技股份有限公司 | 一种日志解析方法及装置 |
CN106656607A (zh) * | 2016-12-27 | 2017-05-10 | 上海爱数信息技术股份有限公司 | 设备日志解析方法、***及具有该***的服务器端 |
CN107145341A (zh) * | 2017-03-31 | 2017-09-08 | 武汉斗鱼网络科技有限公司 | 一种在Flash中加入打印日志功能的方法及装置 |
CN108647195A (zh) * | 2018-02-22 | 2018-10-12 | 石化盈科信息技术有限责任公司 | 一种面向流程行业的交接班日志的实现方法和*** |
CN109271161A (zh) * | 2018-08-20 | 2019-01-25 | 中国平安人寿保险股份有限公司 | 样板代码生成方法、装置及存储设备及计算机设备 |
CN113407619A (zh) * | 2020-03-16 | 2021-09-17 | 北京沃东天骏信息技术有限公司 | 构建数据的方法和装置以及数据库之间同步数据的*** |
CN114116367A (zh) * | 2020-08-25 | 2022-03-01 | 荣耀终端有限公司 | 一种生成日志的方法及电子设备 |
-
2014
- 2014-05-19 CN CN201410212252.0A patent/CN105095304A/zh active Pending
Cited By (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105700851A (zh) * | 2016-01-08 | 2016-06-22 | 大唐微电子技术有限公司 | 一种实现压栈和弹栈的方法和装置 |
CN105700851B (zh) * | 2016-01-08 | 2018-06-01 | 大唐微电子技术有限公司 | 一种实现压栈和弹栈的方法和装置 |
CN106055585A (zh) * | 2016-05-20 | 2016-10-26 | 北京神州绿盟信息安全科技股份有限公司 | 一种日志解析方法及装置 |
CN106656607A (zh) * | 2016-12-27 | 2017-05-10 | 上海爱数信息技术股份有限公司 | 设备日志解析方法、***及具有该***的服务器端 |
CN107145341A (zh) * | 2017-03-31 | 2017-09-08 | 武汉斗鱼网络科技有限公司 | 一种在Flash中加入打印日志功能的方法及装置 |
CN108647195A (zh) * | 2018-02-22 | 2018-10-12 | 石化盈科信息技术有限责任公司 | 一种面向流程行业的交接班日志的实现方法和*** |
CN109271161A (zh) * | 2018-08-20 | 2019-01-25 | 中国平安人寿保险股份有限公司 | 样板代码生成方法、装置及存储设备及计算机设备 |
CN109271161B (zh) * | 2018-08-20 | 2024-06-04 | 中国平安人寿保险股份有限公司 | 样板代码生成方法、装置及存储设备及计算机设备 |
CN113407619A (zh) * | 2020-03-16 | 2021-09-17 | 北京沃东天骏信息技术有限公司 | 构建数据的方法和装置以及数据库之间同步数据的*** |
CN114116367A (zh) * | 2020-08-25 | 2022-03-01 | 荣耀终端有限公司 | 一种生成日志的方法及电子设备 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN105095304A (zh) | 日志模板生成方法及设备 | |
CN109376166B (zh) | 脚本转换方法、装置、计算机设备及存储介质 | |
US20220083450A1 (en) | Automated bug fixing using deep learning | |
CN110502227B (zh) | 代码补全的方法及装置、存储介质、电子设备 | |
US9223570B2 (en) | Migration assistance using compiler metadata | |
US11144506B2 (en) | Compression of log data using field types | |
US20170187734A1 (en) | System and method for field extraction of data contained within a log stream | |
US20140298321A1 (en) | Installation control method and installation control apparatus | |
CN102054149A (zh) | 一种恶意代码行为特征提取方法 | |
US11151089B2 (en) | Compression of log data using pattern recognition | |
EP4071616A1 (en) | Method for generating topology diagram, anomaly detection method, device, apparatus, and storage medium | |
JP2016099857A (ja) | 不正プログラム対策システムおよび不正プログラム対策方法 | |
US9396177B1 (en) | Systems and methods for document tracking using elastic graph-based hierarchical analysis | |
CN107579944B (zh) | 基于人工智能和MapReduce安全攻击预测方法 | |
US9286036B2 (en) | Computer-readable recording medium storing program for managing scripts, script management device, and script management method | |
JP5440287B2 (ja) | シンボリック実行支援プログラム、方法及び装置 | |
US10198426B2 (en) | Method, system, and computer program product for dividing a term with appropriate granularity | |
CN110647537A (zh) | 数据搜索方法、装置及存储介质 | |
KR100911301B1 (ko) | 오타 판단 방법 및 시스템 | |
CN113051262B (zh) | 一种数据质检方法、装置、设备及存储介质 | |
US8090750B2 (en) | Prompting of an end user with commands | |
CN113805861A (zh) | 基于机器学习的代码生成方法、代码编辑***及存储介质 | |
JP5578625B2 (ja) | プログラム分析装置、プログラム分析方法、及びプログラム | |
CN113742208A (zh) | 一种软件检测方法、装置、设备及计算机可读存储介质 | |
KR101673151B1 (ko) | 프로그램 소스 및 db 스키마의 연관 관계 변화 분석 방법 및 장치 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
WD01 | Invention patent application deemed withdrawn after publication | ||
WD01 | Invention patent application deemed withdrawn after publication |
Application publication date: 20151125 |