一种可执行程序解析方法、装置、电子设备和存储介质与流程
未命名
10-26
阅读:69
评论:0
1.本发明涉及计算机领域,特别涉及一种可执行程序解析方法、装置、电子设备和存储介质。
背景技术:
2.指令集包括cpu的指令集和各类高级语言虚拟机的解释指令集,计算机程序通常都基于一套或多套标准的指令集来运行,这使得技术人员对编译后的可执行程序进行解析和翻译成为可能。解析和翻译的结果如果是汇编语言码,则较难于理解。解析和翻译的结果如果采用一种便于理解的形式,则非常有用。因此,本领域的技术人员可以通过对可执行程序进行解析和翻译,来达到不通过源代码就确定其真实运行逻辑的目的,并且希望结果以一种便于理解和易于查看的形式来呈现。
3.在没有源代码的情况下,为了确定可执行程序的运行逻辑,现有技术通常采用如下方法:1)链路追踪:是通过对特定的代码进行人为指定插桩、埋点以达到获取程序运行路径的技术。但这种技术存在如下不足:它只能采用非精确方式确定系统逻辑,即靠人工判断来插桩,然后根据插桩被执行的情况,来猜测程序运行的逻辑。
4.2)软件测试:是首先指定输入,然后对接口进行调用,通过判断输出是否符合预期,来确定系统运行状态是否正确的技术。但这种技术存在如下不足:虽然在大部分情况下,可以通过程序的输入输出来判断程序运行是否正确,但无法确认程序真实的运行逻辑。例如:测试某函数,输入1,返回2,如果只判断输入输出,则可能有以下两种情况,都会被认为是正确的:a)函数返回为 {return x+1;}b)函数返回为 {return x*2;}可见,链路追踪和软件测试这两种方法,无法准确断定可执行程序的运行逻辑,不得不依赖源代码以及技术人员的专业编码知识才能确定程序运行逻辑,耗时耗力,效率极低。
5.另外,随着微服务、云原生架构的流行,应用系统正变得越来越复杂,一个业务功能可能由很多服务组成,这些服务分布于不同的节点,这种多节点中的逻辑关系常常也难于理顺,经常需要花费大量的时间阅读源代码和理解最初的设计方案,有时这些资料也会缺失。如果有一种方法,能够将分布式系统的可执行程序解析成逻辑语言和逻辑图,将是非常有用的。
技术实现要素:
6.为了克服现有技术的上述缺陷,本发明提出了一种可执行程序解析方法,不基于源代码,就能确定系统的运行逻辑,并且扩展后可以应用于分布式系统。
7.为此,本发明第一目的在于提供一种可执行程序解析方法,包括以下步骤:
s1、建立指令码与逻辑语言的关联;s2、获取可执行程序的所有指令集,提取指令集中的所有函数,得到函数表;s3、利用指令码与逻辑语言的关联,对函数表中的每个函数中的基础指令码、内部调用指令码和外部调用指令码进行解析;s4、将解析好的基础指令码、内部调用指令码和外部调用指令码整合进函数表;s5、由整合后的函数表生成调用逻辑图;s6、根据系统业务定义,对调用逻辑图中无调用进入的函数进行调用入口标记,得到全逻辑图。
8.进一步的,所述建立指令码与逻辑语言的关联,包括以下步骤:1)扫描可执行程序,获取可执行程序的指令集,所述指令集中包含所有的指令码;2)将指令集中重复的指令码去除;3)对去重后的指令码进行分类;4)对指令码进行逻辑语言关联,即为每一个指令码标定其对应的逻辑语言表示和规则,并同时标定该指令码的类型。
9.进一步的,所述的获取可执行程序的所有指令集,提取指令集中的所有函数,得到函数表包括以下步骤:1)归纳指令集中的函数格式模式;2)对逐条指令码进行模式匹配,如果指令码能匹配任一函数格式模式,该指令码即为一个函数;3)遍历指令集,提取指令码集合中的所有声明了函数的指令码,分别解析这些指令码组合成表格,得到可执行程序的函数表。
10.进一步的,所述利用指令码与逻辑语言的关联,对函数表中的每个函数中的基础指令码、内部调用指令码和外部调用指令码进行解析,包括如下步骤:1)对于函数中基础指令码,利用指令码与逻辑语言的关联,从上往下开始解析,最终将其解析为逻辑语言;2)对于函数中内部调用指令码,利用指令码与逻辑语言的关联,将其解析为内部函数调用,并标记其调用的函数名;3)对于函数中外部调用指令码,利用指令码与逻辑语言的关联,将其解析为外部调用,并标记所调用的目标信息。
11.进一步的,所述的由整合后的函数表生成调用逻辑图包括如下步骤:1)对内部函数调用关系进行匹配;2)对外部函数调用进行标记;3)进行表格到图形的转换,得到调用逻辑图。
12.本发明的第二目的在于提供一种分布式系统的可执行程序解析方法,包括如下步骤:根据上述的s1步骤建立指令码与逻辑语言的关联;对每一个节点可执行程序按照上述的s2-s6步骤进行解析,得到每一个可执行程序的全逻辑图;对所有节点的全逻辑图,进行调用入口与外部调用的关联聚合,得到系统逻辑图。
13.本发明的第三目的在于提供一种可执行程序解析装置,包括:指令码与逻辑语言关联模块,用于建立指令码与逻辑语言的关联;
函数提取模块,用于获取可执行程序的所有指令集,提取指令集中的所有函数,生成函数表;指令码解析模块,用于利用指令码与逻辑语言的关联,对函数表中的每个函数中的基础指令码、内部调用指令码和外部调用指令码进行解析;函数表整合模块,用于将解析好的基础指令码、内部调用指令码和外部调用指令码整合进函数表;调用逻辑图生成模块,用于由整合后的函数表生成调用逻辑图;全逻辑图生成模块,用于对调用逻辑图中无调用进入的函数进行调用入口标记,生成全逻辑图。
14.本发明的第四目的在于提供一种分布式系统的可执行程序解析装置,包括上述的可执行程序解析装置的各模块,以及系统逻辑图生成模块;所述系统逻辑图生成模块用于对所有节点的全逻辑图,进行调用入口与外部调用的关联聚合,生成系统逻辑图。
15.本发明的第五目的在于提供一种电子设备,包括:存储器,用于存储计算机程序;处理器,用于执行存储器上所存储的程序,实现上述可执行程序解析方法或分布式系统的可执行程序解析方法的步骤。
16.本发明的第六目的在于提供一种计算机可读存储介质,所述计算机可读存储介质内存储有计算机程序,所述计算机程序被处理器执行时实现上述可执行程序解析方法或分布式系统的可执行程序解析方法的步骤。
17.本发明的有益技术效果:1)不基于源代码,仅通过可执行程序,就能以白盒的方式百分百确定系统运行逻辑。
18.2)可快速地将可执行程序解析成逻辑语言,避免耗时费力的阅读源代码,可以让非专业人员迅速理解软件系统的处理逻辑。
19.3)本发明方法可应用于计算机软件的测试,更高效地确认软件整个链路的正确性与可靠性,而非传统方法仅仅凭借输入输出测试,来确认链路正确性与可靠性。
20.4)对于分布式系统,能够将分布式系统的所有可执行程序解析成系统逻辑图,对系统理解和系统测试都有很好的帮助。
21.5)本发明方法得到的逻辑语言和逻辑图,可应用于计算机安全和风险防控,以确认数据在软件系统传输过程中的可靠性。
22.综上,本发明的可执行程序解析方法,可以帮助理解软件逻辑,生成单节点的全逻辑图或多节点的系统逻辑图,可广泛应用于软件测试、系统分析和安全防控等领域。
附图说明
23.图1为本发明第一种实施例的可执行程序解析方法流程示意图;图2为本发明第一种实施例的节点c调用逻辑图;图3为本发明第一种实施例节点c全逻辑图;图4为本发明第二种实施例的分布式系统可执行程序解析方法流程示意图;图5为本发明第二种实施例节点a的全逻辑图;
图6为本发明第二种实施例节点b的全逻辑图;图7为本发明第二种实施例的系统逻辑图。
具体实施方式
24.为了进一步理解本发明,下面结合实施例对本发明优选实施方案进行描述,但是应当理解,这些描述只是为进一步说明本发明的特征和优点,而不是对本发明权利要求的限制。
25.术语说明:指令码:是可执行程序通过asm(assembly language,汇编语言)工具处理后获得的代码。
26.指令集:是一些指令码的集合。
27.指令语言:是按照一定的规范,生成或者编写指令码的语言。
28.逻辑语言:是区别于计算机程序设计语言(如java,c++)或者指令语言的概念,用于表达数据处理的过程,比如,对字符串列表的排序,或者用数学公式进行的计算。为了简化,逻辑语言可通过数字、数值及数学逻辑符号等组成的语言来描述,比如,获得的逻辑语言是“b^2-4*a*c”。
29.逻辑语言表示:是逻辑语言中使用的符号、记号等,是一种便于理解的表现形式,如“*”表示乘法,“x^y”表示x的y次幂。
30.逻辑语言规则:是逻辑语言表示需要的参数,例如逻辑语言表示“*”的逻辑语言规则为“number, number”,即需要两个number类型的参数。
31.可执行程序:源代码通过编译后,运行于一个节点上的程序。
32.分布式系统:系统由多个节点组成,每个节点运行一个或者多个可执行程序。对于一个节点运行多个可执行程序的情形,可将节点进行进一步划分,使得一个节点运行一个可执行程序。本实施例中,每个节点仅分析一个可执行程序,分布式系统包括多个可执行程序。
33.逻辑图:泛指各种表示逻辑关系的图形。
34.调用逻辑图:指一个可执行程序通过解析后,将内部调用进行匹配,生成的程序内部函数关系的图。
35.全逻辑图:指将调用逻辑图的无调用进入的函数进行调用入口标记后,生成的程序内部和外部关系的图。
36.系统逻辑图:系统中多个节点包含的所有可执行程序,解析后生成的系统总图。
实施例1
37.本实施例是针对单节点系统的一个可执行性文件进行解析。如图1所示,本实施例的将可执行程序解析成逻辑语言和逻辑图的方法包括以下步骤:s1、建立指令码与逻辑语言的关联。
38.s11、利用asm工具扫描整个可执行程序,获取每个可执行程序的指令集,指令集中包含所有的指令码。
39.s12、将指令集中重复的指令码去除。
40.可执行程序经asm工具处理后,会产生大篇幅的指令码,可能会高达几十万行或者更多。本实施例中,将这些指令码集合在一起,把重复的指令码去掉。
41.将指令集中指令码去重包括两种情形:1)对于完全一致的指令码,仅保留一条。
42.2)对于实质操作一致,仅仅类型或者参数不同的指令码进行归纳。例如,mul表示任意类型乘法,imul表示有符号整型乘法,在后续的逻辑语言解析中,如果不关心mul与imul的差别,可以把“mul”和“imul”可以用“*mul”来归纳。
43.本实施例中,表1的指令码列给出了去重后的部分常用的指令码。
44.s13、对去重后的指令码进行分类。
45.将去重后的指令码分为以下四类:1)内部指令码: 用于处理程序运行的指令码。例如,处理出栈(load)、压栈(store)以及函数表示等的指令码,此类指令码仅用于顺接程序的运行与解析,并不对应现实世界的逻辑关系,后续步骤对内部指令码无需翻译为逻辑语言,故后续进行逻辑语言关联步骤中不对该内部指令码进行关联。
46.2)基础指令码: 用于进行现实世界相关操作的指令码。例如,数学运算、统计运算、逻辑判断与字符串处理等的指令码。
47.3)内部调用指令码: 用于指示调用某个当前可执行程序内部的函数的指令码。
48.4)外部调用指令码:用于指示调用某个不属于当前可执行程序的函数或者资源的指令码,例如http,rpc(remote procedure call),或访问文件系统等硬件设备等。
49.基础指令码、内部调用指令码和外部调用指令码需要翻译为逻辑语言来表达。
50.s14、对去重后的指令码进行逻辑语言关联,即为每一个指令码标定其对应的逻辑语言表示和规则,并同时标定该指令码的类型。
51.以下是建立指令码与逻辑语言的关联具体步骤:1)为每一条指令码确定指令码类型。每一条指令码都有其确定的含义,指令码及其含义可以通过指令手册查询到。为每一条指令码确定指令码类型,此步骤中,指令码类型包括基础指令码、内部调用指令码和外部调用指令码。
52.2)为每一条指令码确定逻辑语言表示,选择适当的符号或者记号来表示。如可以选择数学符号来表示,也可以用单词缩写来表示,还可以自定义字符串来表示。通常,选择适当的符号或者记号以简单明了、易于理解为原则。
53.3)为每一条指令码指定逻辑语言规则,即确定指令码需要的参数。指令码参数包括参数个数和参数类型,其依据指令码的含义来确定。比如:指令码“*mul”的逻辑语言规则是“number,number”,即指令码需要“number,number”两个参数。
54.通过如上步骤,本实施例的指令码的类型、逻辑语言表示和逻辑语言规则完成关联。本实施例得到的指令码与逻辑语言的关联,可以通过指令码与逻辑语言关联表储存。表1是部分指令码与逻辑语言关联的示例。表中,对于每一条指令码,指出了指令码类型,并且给出了逻辑语言表示和逻辑语言规则,表1中的说明列仅做解释,不参与实质操作。
55.表1 指令码与逻辑语言关联示例
56.s2、获取可执行程序的所有指令集,提取指令集中的所有函数,得到函数表。
57.在前述步骤s1中,已经用asm工具扫描过可执行程序,得到了可执行程序的指令集。通常指令集包含若干个类,每个类里面包含若干函数,每个函数包含若干指令码。函数有一定的格式,通常包括作用范围、返回类型、函数名和参数等等。具体步骤如下:s21、归纳指令集中的函数格式模式。
58.函数格式模式通常不限于一个,可以归纳出多个函数格式模式,例如归纳出的模式可能为“public bool ***() ***;”,或者“private int ***() ***;”。归纳函数格式模式,依据指令集中前几个函数格式的共性,抽取通用部分,得到格式模式。后续操作中如果有函数缺失,可能是模式归纳不全,需要补充漏掉的模式。
59.s22、对逐条指令码进行模式匹配,如果指令码能匹配任一函数格式模式,该指令码即为一个函数。
60.s23、遍历指令集,提取指令码集合中的所有声明了函数的指令码,分别解析这些指令码,组合成表格,得到可执行程序的函数表。得到的函数表中的函数数量可能有几十个、几百个等。
61.本实施例以可执行程序systemc为例,其指令集的前两个函数为:public void syscservicemethoda() throws java.lang.throwable;public void syscservicemethodb() throws java.lang.throwable;根据这两个函数归纳出它们的函数格式模式是“public void ***() ***;”,然后,对逐条指令码进行模式匹配,遍历指令集后,找到了systemc指令集中的12个函数。后续的操作中,如果没有发现函数缺失,则说明函数归纳是正确的。由此,得到了systemc的指令集中的所有函数,即函数表,如表2所示。
62.表2 本实施例中systemc中的函数表
63.需要说明的是,在其他系统中,“public”也可为“private”,“void”也可为其他类型如“int”或者“bool”。函数的格式模式需依据实际情况具体确定。
64.s3、利用指令码与逻辑语言的关联,对函数表中的每个函数中的基础指令码、内部调用指令码和外部调用指令码进行解析。
65.对上一步骤中获得的函数表中的函数,逐个进行解析。通常每个函数中会包含大量的指令码,按照s1中的分类,这些指令码可以分为内部指令码、基础指令码、内部调用指令码和外部调用指令码。利用表1中建立的指令码与逻辑语言的关联,逐行解析这些指令码。对不同类型的指令码,需采用不同的解析方式。
66.s31、对函数中的基础指令码进行解析。
67.对于函数中基础指令码,利用指令码与逻辑语言的关联,从上往下开始单条或者多条合并解析,最终将其解析为逻辑语言。
68.当开始解析时,从指令集中取出一条指令码,与表1的指令码列进行匹配。
69.如果匹配成功,找到此指令码对应的逻辑语言表示和逻辑语言规则,此时进行单条指令码解析,将指令码用逻辑语言来表达。
70.如果匹配失败,即这条基础指令码没有存在于表1的指令码列中,说明此指令码是内部指令码,继续向下抓取下一条基础指令码,直到匹配成功。将这几条基础指令码共同解析,并应用匹配成功的逻辑语言表示和逻辑语言规则,把这几条基础指令码解析成逻辑语言,这就是多条基础指令码合并解析。
71.当函数内所有的基础指令码都解析完成后,综合已经解析出来的逻辑语言,就能把整个函数中的基础指令码解析为逻辑语言。通常最后面的解析结果就是期望得到的逻辑语言,因为一般来说,后面的解析结果会包括前面的解析结果。例如,前一步的解析结果为计算“b^2-4*a*c”,后一步的“逻辑语言表示”是sqrt开平方,后一步就可以用逻辑语言“sqrt(b^2-4*a*c)”来表达,后一步的解析也实质上包含了前面的解析。通过解析后,原来几十行甚至上百行的指令码,往往用一两个数学公式或者操作符号就能表示出来,这非常便于理解应用程序中的逻辑。
72.本实施例中,以表2中第5个函数syscservicemethode() 为例,该函数有70条指令
码,表3中给出了该函数的部分指令码解析过程。例如,表3中的指令码
ꢀ“
iconst_2”,为一个内部指令码,结合公开的指令手册可知,该指令码含义为创建一个整形数字2,并将其压入栈,则我们得到一个栈深为1,栈顶为整形数字2的栈,形如:|2|,用竖线表示栈的分割,最左为栈顶,最右为栈底。接着下一条指令码“newarray double”,根据表1可知,该指令为一个基础指令码,表示为[],含义为创建一个数组并压入栈顶,需要一个参数,则我们从栈顶取出整形数字2作为参数,并创建长度为2的数组放入栈顶,则我们的栈变为:|[0.0,0.0]|,得到的逻辑语言是“double[2]”,含义是创建一个大小为2的类型为double的数组。
[0073]
再如,表3中的“iload_2”,其为一个内部指令码,且结合公开的指令手册,可知其含义为从当前函数的本地变量表第二个位置加载一个整形,并压入栈。根据该函数定义,其本地变量表为|a|b|c|d|,总共四个位置,1、2和3位置为作为函数入参的三个整形a、b和c ,而第四个位置为函数执行过程中的双精度浮点数变量d,则解析该指令码我们将得到如下栈:|b|。下一条指令集为"i2d",其为一个内部指令码,且结合公开的指令手册,可知其含义为取出栈顶的整形数字并将其转化为双精度浮点数再压入栈,则解析该条指令后,可得到如下栈:|(double)b|。下一条指令为“ldc2_w double 2.0d”,其为一个内部指令码,且结合公开的指令手册,可知其含义为向栈压入双精度浮点数常量2.0d,则解析该条指令我们将得到如下栈:|2.0d|(double)b|。下一条指令为“invokestatic method java/lang/math.pow:(dd)d”,根据表1其为一个基础指令码,其含义为计算x的y次方并压入栈顶,需要两个参数,表示为x^y,则我们解析该指令码将得到如下栈:|(double)b^2d|,将这几条指令码合并解析,得到的逻辑语言是“b^2”,含义是b的平方。
[0074]
表3 本实施例中syscservicemethode()函数解析为逻辑语言
[0075]
最终,解析完函数syscservicemethode() 的所有指令码后,得到可以表示为如下数学形式的逻辑语言:
[0076]
这样一种解析后的表达形式就非常便于理解,即使是不懂指令码或者编程语言的非专业人员,也能很容易明白这个函数的实现逻辑。本实施例通过这个函数的复杂的指令
码解析,最后得到的逻辑语言仅仅用数学公式就能很好的表达。这个函数的指令码有约70条,现在用一个公式就能直观表达。类似这样的解析过程,可以让非专业人员很好地理解函数的工作原理,免去了繁琐的阅读指令码或者源码的工作,可以将更多的精力集中于软件测试或者安全风险防范。
[0077]
s32、对函数中的内部调用指令码进行解析。
[0078]
对于函数中内部调用指令码,利用指令码与逻辑语言的关联,将其解析为内部函数调用,并标记其调用的函数名。
[0079]
当对指令码进行逐条解析时,将指令码与表1中的指令码列进行匹配,如果匹配上的指令码对应的类型是内部调用指令码,说明此指令码是内部调用指令码,依据逻辑语言表示和逻辑语言规则,可将此内部调用指令码标记为“call name”,name是目标函数名,意思是调用了函数名为name的内部函数。
[0080]
表4 本实施例中函数syscbizmethoda()的指令码
[0081]
本实施例以表2中第6个函数syscbizmethoda()为例,该函数的部分指令码如表4所示。此函数中的指令码包含有内部调用指令码,如:“4: invokevirtual methoddecompile/single/sysc/systemcservice.syscservicemethoda:()v”。
[0082]
从表1中检索到序号为9的行,说明此指令码为内部调用,得到逻辑语言是调用一个函数,即“call decompile/single/sysc/systemcservice.syscservicemethoda:()v”,此函数是表2中的第1个函数,意思是表2中的第6个函数调用了表2中的第1个函数。
[0083]
又如,表2中第6个函数syscbizmethoda()的指令码还包含:“11: invokevirtual methoddecompile/single/sysc/systemcservice.syscservicemethodb:()v”。
[0084]
从表1中检索到序号为9行,说明此指令码为内部调用,得到逻辑语言是调用一个函数,即“call decompile/single/sysc/systemcservice.syscservicemethodb:()v”。此函数是表2中的第2个函数,意思是表2中的第6个函数又调用了表2中的第2个函数。
[0085]
需要说明的是,内部调用的函数必须存在于s2中提取的函数表中,如果此函数不
存在于函数表中,则有两种可能:a)表1中指令码与逻辑语言关联有缺失或错误;b)表2中函数表缺失或错误。
[0086]
出现上述两种错误时,解析程序将停止运行,需检查和排除错误。
[0087]
本实施例中,可以看到,两个内部调用指令码所对应的函数都在表2的函数表中,这说明内部调用指令码的解析是正确的。
[0088]
s33、对函数中的外部调用指令码进行解析。
[0089]
对于函数中外部调用指令码,利用指令码与逻辑语言的关联,将其解析为外部调用,并标记所调用的目标信息。
[0090]
当对指令码进行逐条解析时,将指令码与表1中的指令码列进行匹配,如果匹配上的指令码对应的类型外部调用指令码,说明此指令码是外部调用指令码,依据逻辑语言表示和逻辑语言规则,可将此外部调进行标记,指明其目标信息,例如网络地址或者文件签名等。
[0091]
本实施例以表2中的第1个函数syscservicemethoda()为例,此函数对应的部分指令码如表5所示。
[0092]
表5 本实施例中函数syscservicemethode()指令码
[0093]
表5中的序号第90行,调用httpurlconnection.connect:()v函数,根据表1中序号10的关联可知,此指令码为一个http外部调用,根据表5中的第77~84行,该外部调用具体为一个针对外部地址“http://baidu.com”的http外部调用。
[0094]
需要说明的是,外部调用的函数不能存在于s2中提取的系统函数表中,如果此函数存在于函数表中,则有两种可能:a)表1中指令码与逻辑语言关联缺失或错误;b)表2中函数表提取错误。
[0095]
出现上述两种错误时,解析程序将停止运行,需人工检查或者核验。
[0096]
通过步骤s3,就完成了函数表中每个函数的解析,把其中的基础指令码、内部调用指令码和外部调用指令码都解析完成。
[0097]
s4、将解析好的基础指令码、内部调用指令码和外部调用指令码整合进函数表。
[0098]
函数表中的每个函数的每条指令码经过解析后,函数的内部逻辑和实现功能可以通过逻辑语言来表达。一个函数解析后的结果可能同时包含多个外部调用和多个内部调用,以及其他的逻辑语言。将这些信息整合进函数表,后续将依据此表生成调用逻辑图。生成表格中的调用关系及逻辑语言采用易于理解的方式,比如直接用数学公式,内部调用直接写明函数名称,外部调用直接写明业务内容如http等等。
[0099]
本发明实施例中的表2的函数表,经过此步骤,就被更新为如下所示的表6。表6仅列出部分函数。从表6中可以看出,第6个函数通过内部调用,调用了两个函数,分别是第1个和第2个函数,第1个和第2个函数通过外部调用,提供http服务。此时,由于此函数表仅包含数个函数,比较简单,通过此函数表就能大概看清楚调用关系。如果系统比较复杂,通常还需进一步的处理。
[0100]
表6 本实施例中systemc中的函数逻辑语言及调用关系
[0101]
s5、由整合后的函数表生成调用逻辑图。
[0102]
需要说明的是,对于非常简单的函数表,由于其包含的函数个数仅仅为数个,可以通过整合后的函数表看出系统逻辑和调用关系,但对于比较复杂的系统,仅仅通过整合后的函数表,通常还不能理清楚调用关系,还不能获得有用的信息,这需要进一步的处理,由整合后的函数表生成调用逻辑图,才能更方便地查看程序的逻辑和调用关系。
[0103]
以下是本实施例由整合后的函数表生成调用逻辑图的具体步骤:1)对内部函数调用关系进行匹配,将每一次内部函数调用与函数本身联系起来。
[0104]
2)对外部函数调用进行标记,指明外部调用的文件、地址等。
[0105]
3)进行表格到图形的转换,得到调用逻辑图。由表格到图形的生成,可以采用多种方式,也有很多图论的算法可以利用。
[0106]
本实施例中的表6,把函数调用关系进行匹配,就得到了如图2所示的systemc的调用逻辑图,图中的箭头指明了内部函数调用关系,图中的叉子形指向外部调用的标记或者逻辑语言的链接,通过图中逻辑语言的链接可以进一步向下查看具体的逻辑语言。例如:函数syscbizmethoda()有两个箭头指向了syscservicemethoda()和syscservicemethodb
(),函数syscservicemethode()可以用一个三个参数的数学公式来做链接,点击链接显示公式的具体内容。
[0107]
s6、根据系统业务定义,对调用逻辑图中无调用进入的函数进行调用入口标记,得到全逻辑图。
[0108]
每个系统都有自己的业务定义,就是指该系统能够完成什么功能,这些功能基于系统的配置,以及系统开放的接口,比如http接口、rpc接口、tcp连接入口。调用逻辑图中,包括有调用进入的函数和无调用进入的函数。有调用进入的函数在节点内提供服务,无调用进入的函数,对节点外提供服务。此步骤中,需要据此对无调用进入的函数进行调用入口标记,即指明内部无调用进入的函数对外提供什么服务。完成标记后就得到了全逻辑图,全逻辑图反映了可执行程序的全部内部和外部关系。
[0109]
本实施例,对图2中的无调用进入的函数进行调用入口标记,得到如图3所示的systemc的全逻辑图。图3与图2的差别在于,图中的syscentrancemethoda()、syscentrancemethodb()和syscentrancemethodc()被添加了调用入口标记。例如,syscentrancemethoda()被添加了"http://c.perfma.com/a"的调用入口标记,表明这个函数可以提供此地址的http接口。
[0110]
至此,通过s2-s6步骤,就完成了对可执行程序systemc的解析工作。s2-s6步骤也是一个单节点系统实施例的可执行程序的解析流程。
实施例2
[0111]
本实施例针对分布式系统,包括多个可执行程序,如图4所示,以下是分布式系统的可执行程序的解析流程。
[0112]
由多个节点组成的分布式系统,由于每个节点独立完成一定的功能,节点之间又互相调用,节点对外提供相应的服务,节点也可能利用其他节点提供的服务,因此,针对多个节点组成的分布式系统,仅仅有每个单节点的全逻辑图就会有一些链路不能完成逻辑展示。例如,对于一个跨节点的链路,就不能够查看完整的流程,不能找出数据在各个节点间的流动。因此,有必要对分布式系统的多个全逻辑图做进一步的聚合,以展现整个分布式系统的逻辑关系。具体步骤如下:1)按照上述s2-s6步骤,对分布式系统中的每一个节点的可执行程序进行解析,得到每一个可执行程序的全逻辑图。需要说明的是,针对单个可执行程序的解析顺序,没有限制,可以选择不同的先后顺序来解析。
[0113]
本实施例中,分布式系统由三个节点组成。每个节点上有一个待解析的可执行程序,分别为systema、systemb和systemc。先按照上述s2-s6步骤对systemc进行解析,得到systemc的全逻辑图,再对syetemb和systema解析,得到systema和systemb的全逻辑图。systema和systemb的全逻辑图分别如图5和图6所示,两图分别展示的是systema和systemb的内部调用关系和调用入口标记。
[0114]
2)对所有节点的全逻辑图,进行调用入口与外部调用的关联聚合,可得到系统逻辑图。
[0115]
在分布式系统中,各个节点之间互相调用来完成一定的功能,只有得到多节点的系统逻辑图,才能完成对整个分布式系统的图形化构建。
[0116]
经过步骤s2-s6,得到了多个全逻辑图,每一个全逻辑图代表着一个节点的可执行程序,包含节点可以提供的服务,以及需要的服务。节点提供的服务通过s6中的调用入口进行标记,节点需要的服务通过外部调用来实现。此时,进行调用入口与外部调用的关联聚合,即将这些服务进行匹配,就是把相同的提供的服务和需要的服务连接在图形上连接在一起,完成后就得到了最终的系统逻辑图。需要说明的是,不同的节点可以使用同一节点的同一服务,同一节点也可以使用不同节点的不同服务。
[0117]
通过多节点的系统逻辑图,可以看到一项业务的流程如何通过在多个节点间的调用来完成,通过对节点功能的进一步深入查看,就能看到其中进一步的函数调用关系以及函数处理的过程。
[0118]
本实施例中,对图3、图5和图6进行调用入口与外部调用的关联聚合,就得到系统逻辑图,如图7所示。图7中包含3个节点的可执行程序,分别为systema、systemb和systemc,用三个立方体表示,立方体之间的连线展示了各节点提供的服务和需要的服务。进入图7中某个立方体后,还可以看到程序内部的调用关系,以及内部函数的逻辑语言。
[0119]
通过以上步骤,本实施例就将分布式系统的可执行程序解析为逻辑语言和逻辑图。本实施例得到的系统逻辑图,包含各节点的程序及程序间的调用关系。本实施例就通过提供逻辑图和逻辑语言的方式,将纷繁复杂的包含多个节点的可执行文件,以易于理解和查看的手段呈现出来。通过在可视化图形上的操作,向下可层层深入,下钻到具体的数据操作;向上可跳出具体实现,查看链路关系。这对于理解复杂系统、分析链路都有很好的帮助,也可以进一步应用于其他很多领域。
[0120]
本发明的实施例还提供了一种可执行程序解析装置,包括:指令码与逻辑语言关联模块,用于建立指令码与逻辑语言的关联;函数提取模块,用于获取可执行程序的所有指令集,提取指令集中的所有函数,生成函数表;指令码解析模块,用于利用指令码与逻辑语言的关联,对函数表中的每个函数中的基础指令码、内部调用指令码和外部调用指令码进行解析;函数表整合模块,用于将解析好的基础指令码、内部调用指令码和外部调用指令码整合进函数表;调用逻辑图生成模块,用于由整合后的函数表生成调用逻辑图;全逻辑图生成模块,用于对调用逻辑图中无调用进入的函数进行调用入口标记,生成逻辑图。
[0121]
本发明的实施例还提供了一种分布式系统的可执行程序解析装置,包括上述的可执行程序解析装置的各模块,以及系统逻辑图生成模块;所述系统逻辑图生成模块用于对所有节点的全逻辑图,进行调用入口与外部调用的关联聚合,生成系统逻辑图。
[0122]
本发明实施例还提供了一种电子设备,包括:存储器,用于存储计算机程序;处理器,用于执行存储器上所存储的程序,实现上述可执行程序解析方法或分布式系统的可执行程序解析方法的步骤。。
[0123]
关于该方法各个步骤的具体实现以及相关解释内容可以参见该方法的实施例,在此不做赘述。
[0124]
本实施例提到的电子设备的存储器可以包括随机存取存储器(random access memory,ram),也可以包括非易失性存储器(non-volatile memory,nvm),例如至少一个磁盘存储器。
[0125]
上述的处理器可以是通用处理器,包括中央处理器(central processing unit,cpu)、网络处理器(network processor,np)等;还可以是数字信号处理器(digital signal processing,dsp)、专用集成电路(application specific integrated circuit,asic)、现场可编程门阵列(field-programmable gate array,fpga)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。
[0126]
本发明实施例还提供了一种计算机可读存储介质,该计算机可读存储介质内存储有计算机程序,该计算机程序被处理器执行时实现上述可执行程序解析方法或分布式系统的可执行程序解析方法的步骤。关于该方法各个步骤的具体实现以及相关解释内容可以参见该方法的实施例,在此不做赘述。
[0127]
需要说明的是,本说明书中的各个实施例均采用相关的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。
[0128]
尤其,对于装置、电子设备、计算机可读存储介质实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
[0129]
以上实施例的说明只是用于帮助理解本发明的方法及其核心思想。应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以对本发明进行若干改进和修饰,这些改进和修饰也落入本发明权利要求的保护范围内。
技术特征:
1.一种可执行程序解析方法,其特征在于,包括以下步骤:s1、建立指令码与逻辑语言的关联;s2、获取可执行程序的所有指令集,提取指令集中的所有函数,得到函数表;s3、利用指令码与逻辑语言的关联,对函数表中的每个函数中的基础指令码、内部调用指令码和外部调用指令码进行解析;s4、将解析好的基础指令码、内部调用指令码和外部调用指令码整合进函数表;s5、由整合后的函数表生成调用逻辑图;s6、根据系统业务定义,对调用逻辑图中无调用进入的函数进行调用入口标记,得到全逻辑图。2.根据权利要求1所述的可执行程序解析方法,其特征在于,所述建立指令码与逻辑语言的关联,包括以下步骤:1)扫描可执行程序,获取可执行程序的指令集,所述指令集中包含所有的指令码;2)将指令集中重复的指令码去除;3)对去重后的指令码进行分类;4)对指令码进行逻辑语言关联,为每一个指令码标定其对应的逻辑语言表示和规则,并同时标定该指令码的类型。3.根据权利要求1或2所述的可执行程序解析方法,其特征在于,所述的获取可执行程序的所有指令集,提取指令集中的所有函数,得到函数表包括以下步骤:1)归纳指令集中的函数格式模式;2)对逐条指令码进行模式匹配,如果指令码能匹配任一函数格式模式,该指令码即为一个函数;3)遍历指令集,提取指令码集合中的所有声明了函数的指令码,分别解析这些指令码组合成表格,得到可执行程序的函数表。4.根据权利要求1或2所述的可执行程序解析方法,其特征在于,所述利用指令码与逻辑语言的关联,对函数表中的每个函数中的基础指令码、内部调用指令码和外部调用指令码进行解析,包括如下步骤:1)对于函数中基础指令码,利用指令码与逻辑语言的关联,从上往下开始解析,最终将其解析为逻辑语言;2)对于函数中内部调用指令码,利用指令码与逻辑语言的关联,将其解析为内部函数调用,并标记其调用的函数名;3)对于函数中外部调用指令码,利用指令码与逻辑语言的关联,将其解析为外部调用,并标记所调用的目标信息。5.根据权利要求1或2所述的可执行程序解析方法,其特征在于,所述的由整合后的函数表生成调用逻辑图包括如下步骤:1)对内部函数调用关系进行匹配;2)对外部函数调用进行标记;3)进行表格到图形的转换,得到调用逻辑图。6.一种分布式系统的可执行程序解析方法,其特征在于包括如下步骤:根据权利要求1-5任一项所述的一种可执行程序解析方法中s1步骤建立指令码与逻辑语言的关联;对每
一个节点可执行程序按照权利要求1-5任一项所述的一种可执行程序解析方法中s2-s6步骤进行解析,得到每一个可执行程序的全逻辑图;对所有节点的全逻辑图,进行调用入口与外部调用的关联聚合,得到系统逻辑图。7.一种可执行程序解析装置,其特征在于包括:指令码与逻辑语言关联模块,用于建立指令码与逻辑语言的关联;函数提取模块,用于获取可执行程序的所有指令集,提取指令集中的所有函数,生成函数表;指令码解析模块,用于利用指令码与逻辑语言的关联,对函数表中的每个函数中的基础指令码、内部调用指令码和外部调用指令码进行解析;函数表整合模块,用于将解析好的基础指令码、内部调用指令码和外部调用指令码整合进函数表;调用逻辑图生成模块,用于由整合后的函数表生成调用逻辑图;全逻辑图生成模块,用于对调用逻辑图中无调用进入的函数进行调用入口标记,生成全逻辑图。8.一种分布式系统的可执行程序解析装置,其特征在于,包括根据权利要求7所述的可执行程序解析装置的各模块,以及系统逻辑图生成模块;所述系统逻辑图生成模块用于对所有节点的全逻辑图,进行调用入口与外部调用的关联聚合,生成系统逻辑图。9.一种电子设备,包括:存储器,用于存储计算机程序;处理器,用于执行存储器上所存储的程序,实现权利要求1-5任一项所述的方法或权利要求6所述方法的步骤。10.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质内存储有计算机程序,所述计算机程序被处理器执行时实现权利要求1-5任一项所述的方法或权利要求6所述方法步骤。
技术总结
本发明公开了一种可执行程序解析方法、装置、电子设备和存储介质。本发明的一种可执行程序解析方法,包括以下步骤:S1、建立指令码与逻辑语言的关联;S2、获取可执行程序的所有指令集,提取指令集中的所有函数,得到函数表;S3、对函数表中的每个函数中的基础指令码、内部调用指令码和外部调用指令码进行解析;S4、将解析好的基础指令码、内部调用指令码和外部调用指令码整合进函数表;S5、由整合后的函数表生成调用逻辑图;S6、根据系统业务定义,对调用逻辑图中无调用进入的函数进行调用入口标记,得到全逻辑图。对于分布式系统,将每一个节点的全逻辑图关联聚合,得到系统逻辑图。本发明可广泛应用于软件测试、系统分析和安全防控等领域。等领域。等领域。
技术研发人员:童寅 李嘉鹏 黎雨露 徐磊
受保护的技术使用者:杭州笨马网络技术有限公司
技术研发日:2023.09.13
技术公布日:2023/10/20
版权声明
本文仅代表作者观点,不代表航家之家立场。
本文系作者授权航家号发表,未经原创作者书面授权,任何单位或个人不得引用、复制、转载、摘编、链接或以其他任何方式复制发表。任何单位或个人在获得书面授权使用航空之家内容时,须注明作者及来源 “航空之家”。如非法使用航空之家的部分或全部内容的,航空之家将依法追究其法律责任。(航空之家官方QQ:2926969996)
航空之家 https://www.aerohome.com.cn/
航空商城 https://mall.aerohome.com.cn/
航空资讯 https://news.aerohome.com.cn/