一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

代码的反混淆方法、装置、电子设备及存储介质与流程

2022-03-16 16:04:53 来源:中国专利 TAG:


1.本技术涉及数据处理技术领域,具体而言,涉及一种代码的反混淆方法、装置、电子设备及计算机可读存储介质。


背景技术:

2.代码混淆是指将程序代码,转换成功能不变,但是难于阅读和理解的形式。现有脚本代码大多数都会经过代码混淆处理,以防止源代码泄露。但是,经过代码混淆处理后的脚本,由于其形式与正常脚本存在较大区别,从而导致许多杀毒软件无法对脚本进行正常识别,进而造成无法对恶意脚本进行有效的检测查杀的后果。
3.而代码的反混淆技术可以帮助安全人员更快地分析出恶意脚本的攻击方法及攻击意图,有效提升杀毒软件对于恶意脚本的识别能力。
4.目前代码的反混淆技术主要分为基于正则表达式的反混淆方法和基于机器学习的反混淆方法。
5.基于正则表达式的反混淆方法是一种常见的混淆定位及处理技术。字符串级别的混淆方法有特定的文本特征,可以通过设计特定的正则表达式来快速识别这类混淆语句,并利用预先设计的策略进行反混淆。但是正则表达式没有考虑语句的句法和语义,经常导致识别的混淆语句在句法上不完整。对于复杂的编码混淆,正则表达式很难设计合适的模式进行匹配,导致遗漏了大量的混淆语句,进而导致反混淆效果不佳。
6.基于机器学习的反混淆方法利用代码的ast(abstract syntax tree,抽象语法树)特征来识别混淆子树,通过模拟器执行混淆子树对应的混淆语句来进行还原。但是,该方案只能处理ast中的pipeline节点(即具有完整混淆语句的节点),导致同样会遗漏很多混淆语句,进而导致反混淆效果不佳。


技术实现要素:

7.本技术实施例的目的在于提供一种代码的反混淆方法、装置、电子设备及计算机可读存储介质,用以提高反混淆效果。
8.本技术实施例提供了一种代码的反混淆方法,包括:获取待处理代码的token列表;所述token列表中的各token为构成所述待处理代码的各代码单词,所述待处理代码为经过混淆后的代码;对所述token列表中的各token进行反混淆处理,得到第一反混淆代码;对所述第一反混淆代码进行解析,得到所述第一反混淆代码的ast;对所述ast的目标节点中的内容进行模拟执行得到第一执行结果,并根据所述第一执行结果替换所述目标节点的内容;所述目标节点为所述ast中属于设定类型的节点;根据替换后的ast得到最终的反混淆代码。
9.在上述实现过程中,通过先进行待处理代码的各代码单词的校正(即token级的校正),然后再基于ast对可能存在混淆目标节点中的内容进行模拟执行,从而实现了token级和语句片段(节点中的内容即为代码的语句片段)级的修正。相比于现有基于正则表达式的
反混淆方法而言,考虑代码语句层面的混淆修正,降低了混淆语句遗漏风险,提高了反混淆效果。而相比于基于机器学习的反混淆方法,一方面考虑了token级的修正,使得得到的ast中的内容可读性更强,更易被模拟执行从而进行语句片段级的修正,反混淆可靠性更高;另一方面发明人发现代码中进行混淆的节点通常为ast中特定类型的节点(例如“binary expression”节点、“pipeline”节点等),因此通过对这些节点进行模拟执行达到语句片段的修正,相比于现有方案只能处理ast中的pipeline节点而言,也可以达到更为细粒度的修正,也降低了混淆语句遗漏风险,提高了反混淆效果。
10.进一步地,对所述ast的目标节点中的内容进行模拟执行得到第一执行结果,并根据所述第一执行结果替换所述目标节点的内容,包括:后序遍历所述ast的各个节点;在当前遍历到的节点属于所述设定类型的目标节点时,对所述当前遍历到的节点中的内容进行模拟执行,得到所述当前遍历到的节点的第一执行结果;根据所述当前遍历到的节点的第一执行结果,替换所述当前遍历到的节点中的内容,直至所述ast的所有节点遍历完毕。
11.在上述实现过程中,通过后序遍历的方式进行各节点的识别与目标节点的模拟执行,并根据目标节点的第一执行结果替换该目标节点中的内容,实现了严格的原地替换,可以保证针对所有目标节点的内容的有效修正,并保证了反混淆的结果与待处理代码的语义一致性。
12.进一步地,在后序遍历所述ast的各个节点的过程中,所述方法还包括:获取当前遍历到的节点的子节点中的内容;将当前遍历到的节点中与该子节点相对应的内容,替换为所述子节点中的内容。
13.通过上述实现过程,即可保证在一个目标节点中所进行的替换,可以有效传导至根节点,从而实现在该目标节点至根节点的整个链上的可靠性替换,从而保证还原得到的反混淆后的代码准确、可靠。并且,由于后序遍历是从下级子节点出发进行的遍历,当遍历到父节点时,由于父节点中与该子节点相对应的内容会进行替换,此时父节点也为目标节点,则模拟执行时可以更为快速地实现模拟执行,提高模拟执行效率,从而提高反混淆处理效率,并降低反混淆处理所产生的开销。
14.进一步地,根据所述当前遍历到的节点的第一执行结果,替换所述当前遍历到的节点中的内容,包括:判断所述第一执行结果中是否存在预设的混淆执行命令;所述混淆执行命令为进行代码混淆时需要用到的命令;若存在,获取所述混淆执行命令的参数部分;对所述参数部分中的各代码单词进行反混淆处理,得到处理后的参数部分;对所述处理后的参数部分进行模拟执行,得到第二执行结果;将所述第一执行结果中的所述参数部分替换为所述第二执行结果;在所述第二执行结果不存在所述混淆执行命令时,将所述当前遍历到的节点中的全部内容替换为所述第一执行结果。
15.在实际应用中,可能存在多层混淆的情况。在上述实现过程中,通过对第一执行结果中是否存在混淆执行命令进行判断,进而在存在时提取出混淆执行命令的参数部分再进行代码单词的反混淆处理和模拟执行。这样,即可有效实现对于多层混淆的不断解混淆,得到更为可靠、可信的反混淆代码。
16.进一步地,在目标节点中的内容存在变量时,在对该目标节点中的内容进行模拟执行之前,所述方法还包括:从预先建立的记录表中,获取该目标节点所属作用域下所述变量的变量值;将所述变量值写入所述变量中。
17.应理解,在现有基于机器学习的反混淆方法中,是基于独立的pipeline节点中的混淆语句进行的处理。但是由于各节点中混淆语句上下文的缺失,将导致直接通过模拟器执行混淆语句无法得到正确的反混淆结果。而在上述实现过程中,通过预先建立记录表的方式,实现了变量追踪,完善了模拟执行时的混淆语句片段的上下文,使得混淆语句片段可以执行得到正确的还原结果。相比于现有基于机器学习的反混淆方法而言,反混淆结果更为准确,具有更好的反混淆效果。
18.进一步地,在得到所述第一反混淆代码的ast之后,对所述ast的目标节点中的内容进行模拟执行之前,所述方法还包括:从所述ast的赋值类节点中,获取变量值以及各变量值的作用域;在所述记录表关联记录各变量值和各变量值的作用域。
19.在上述实现过程中,通过从ast的赋值类节点中,获取变量值以及各变量值的作用域,从而构建出记录表,从而可以实现对于变量值以及各变量值的作用域的预先关联,从而便于后续进行目标节点中的内容的模拟执行。
20.进一步地,对所述token列表中的各token进行反混淆处理,得到第一反混淆代码,包括:逆序遍历所述token列表;按照预设的token修正规则,对当前遍历到的token进行修正,直至所述token列表遍历完毕;根据修正后的token列表得到第一反混淆代码。
21.在上述实现过程中,通过逆序遍历token列表,从后向前修正待处理代码的token,这就使得当修正后的token的字符数量相比于原token的字符数量发生了变化之后,不会影响token列表中未进行修正的token的位置,从而可以在每修正一个token,无需重新定位未修正的token的位置,降低了处理开销,并提高了处理效率。
22.进一步地,根据替换后的ast得到最终的反混淆代码,包括:将替换后的ast转换为第二反混淆代码;对所述第二反混淆代码中的变量名和函数名进行重命名,并对所述第二反混淆代码进行重排版,得到最终的反混淆代码。
23.在上述实现过程中,通过对第二反混淆代码中的变量名和函数名进行重命名,并对所述第二反混淆代码进行重排版,可以使得得到的最终的反混淆代码更利于识别与阅读,利于杀毒软件进行查杀以及工程师检阅。
24.进一步地,对所述第二反混淆代码中的变量名和函数名进行重命名之前,所述方法还包括:确定所述第二反混淆代码中的所有非重复的变量和函数所构成的字符串集合中,元音字符和辅音字符之间的比值未在预设比值范围内,以在所述比值未在预设比值范围内时,对所述第二反混淆代码中的变量名和函数名进行重命名。
25.在上述实现过程中,通过检测第二反混淆代码中的所有非重复的变量和函数所构成的字符串集合中,元音字符和辅音字符之间的比值,可以基于该比值确定该第二反混淆代码中的变量名和函数名的随机性。若第二反混淆代码中的所有非重复的变量和函数所构成的字符串集合中,元音字符和辅音字符之间的比值未在预设比值范围内,即可认为该第二反混淆代码中的变量名和函数名目前是随机命名的,从而进行重命名,以保证变量名和函数名具有更高的可读性。
26.本技术实施例还提供了一种代码的反混淆装置,包括:获取模块,用于获取待处理代码的token列表,所述待处理代码为经过混淆后的代码;处理模块,用于对所述token列表中的各token进行反混淆处理得到第一反混淆代码,对所述第一反混淆代码进行解析得到所述第一反混淆代码的ast,对所述ast的目标节点中的内容进行模拟执行得到第一执行结
果,并根据所述第一执行结果替换所述目标节点的内容,根据替换后的ast得到最终的反混淆代码;其中,所述token列表中的各token为构成所述待处理代码的各代码单词;所述目标节点为所述ast中属于设定类型的节点。
27.本技术实施例还提供了一种电子设备,包括处理器、存储器及通信总线;所述通信总线用于实现处理器和存储器之间的连接通信;所述处理器用于执行存储器中存储的一个或者多个程序,以实现上述任一种的代码的反混淆方法。
28.本技术实施例中还提供了一种计算机可读存储介质,所述计算机可读存储介质存储有一个或者多个程序,所述一个或者多个程序可被一个或者多个处理器执行,以实现上述任一种的代码的反混淆方法。
附图说明
29.为了更清楚地说明本技术实施例的技术方案,下面将对本技术实施例中所需要使用的附图作简单地介绍,应当理解,以下附图仅示出了本技术的某些实施例,因此不应被看作是对范围的限定,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他相关的附图。
30.图1为本技术实施例提供的一种代码的反混淆方法的基本流程示意图;
31.图2为本技术实施例提供的一种节点示例图;
32.图3为本技术实施例提供的一种处理多次混淆的流程示意图;
33.图4为本技术实施例提供的一种示例过程图;
34.图5为本技术实施例提供的一种代码的反混淆装置的结构示意图;
35.图6为本技术实施例提供的一种电子设备的结构示意图。
具体实施方式
36.下面将结合本技术实施例中的附图,对本技术实施例中的技术方案进行描述。
37.实施例一:
38.为了解决提高反混淆效果,本技术实施例中提供了一种代码的反混淆方法。可以参见图1所示,图1为本技术实施例中提供的代码的反混淆方法的流程示意图,包括:
39.s101:获取待处理代码的token列表。
40.在本技术实施例中,待处理代码是指当前需要进行反混淆处理的,经过混淆后的代码,其可以是powershell代码或其他类型的代码,在本技术实施例中不做限制。
41.混淆,是指将程序代码转换成功能不变,但是难于阅读和理解的形式。代码的混淆操作可以通过代码混淆器实现。
42.反混淆处理是混淆的反向过程,是指对混淆后的代码进行逆向分析,还原出其最初的较为可读的源代码逻辑的过程。
43.在本技术实施例中,通过图1所提供的方案,对被混淆过的待处理代码进行反混淆处理,以得到可读性更高的反混淆代码,从而便于杀毒软件识别和工程师查阅。
44.在本技术实施例中,可以利用代码的官方库来对待处理代码进行词法分析,得到待处理代码的token列表。比如,对于powershell代码,可以利用powershell官方库来对待处理代码进行词法分析,得到组成powershell代码的各个代码单词。
45.需要说明的是,在本技术实施例中,token列表中的各token为构成待处理代码的各代码单词。
46.s102:对该token列表中的各token进行反混淆处理,得到第一反混淆代码。
47.在本技术实施例中,可以预先构建token修正规则,从而利用token修正规则对各token进行反混淆处理。
48.在本技术实施例中,token修正规则中可以定义不同token对应的正常token形式,从而通过token修正规则,可将token列表中的各token修正为正常形式。比如,可以将混淆后的代码中的单词简写或简称修正为单词全称;又比如,可以将混淆后的代码中的大小写混乱的字符串,修正为首字母大写,其他部分小写的代码单词。
49.示例性的,上述token修正规则可以采用诸如正则表达式、预设的对应关系表等方式实现,但不作为限制。
50.在本技术实施例中,可以采用逆序遍历的方式遍历该token列表,进而按照预设的token修正规则,对当前遍历到的token进行修正,直至该token列表遍历完毕。这样,通过逆序遍历token列表,从后向前修正待处理代码的token,使得当修正后的token的字符数量相比于原token的字符数量发生了变化之后,不会影响token列表中未进行修正的token的位置,从而可以在每修正一个token,无需重新定位未修正的token的位置,降低了处理开销,并提高了处理效率。
51.当然,在本技术实施例中也可以采用正序遍历的方式遍历该token列表,或者采用其他顺序遍历该token列表,此时只需要每进行一个token的修正之后,即从新解析待处理代码,得到新的token列表,从而实现对于下一需校正的token的位置的重新定位,以保证可以正确对每一个token进行修正即可。
52.s103:对第一反混淆代码进行解析,得到第一反混淆代码的ast。
53.应理解,ats是对程序代码进行语法分析之后,按照该程序语句的语法规则进行推导时所形成的树,ast代表了程序代码的推导结果。
54.在本技术实施例中,通过对进行了token校正后的第一反混淆代码进行解析,而非是对原始的待处理代码进行解析,可以使得得到的ast中的内容可读性更强,使得得到的ast更贴近待处理代码在混淆之前的结构,从而使得基于ast进行反混淆时,可以更易被模拟执行,并得到更为准确的反混淆结果。
55.s104:对该ast的目标节点中的内容进行模拟执行得到第一执行结果,并根据第一执行结果替换该目标节点的内容。
56.需要说明的是,在本技术实施例中,目标节点为ast中属于设定类型的节点。这里的设定类型,可以由工程师根据可能进行混淆的节点的类型进行设置。比如,可以设定“binaryexpression”类型的节点、“pipeline”类型的节点等为设定类型的节点。
57.在本技术实施例中,可以通过后序遍历的方式,依次遍历ast的各个节点。
58.针对每一个节点,在被遍历到时,即可以判断该节点(即当前遍历到的节点)是否属于设定类型的目标节点。
59.如果当前遍历到的节点属于设定类型的目标节点,即可以对该目标节点中的内容进行模拟执行,得到该目标节点的第一执行结果。进而,可以根据该目标节点的第一执行结果,替换该目标节点中的内容,直至ast的所有节点遍历完毕。
60.在本技术实施例中,可以采用模拟器或者各种执行函数来对目标节点中的内容进行模拟执行。示例性的,可以采用invoke函数来执行。
61.需要注意的是,对于ast中的各个节点而言,节点直接具有上下级关系,且父节点会具有子节点的所有内容,并还可能具有其他内容。而为了保证替换后的内容可以有效还原成代码,则在针对任一个子节点的内容进行替换后,在该子节点到根节点的整个链路中的所有节点中,相应的内容也需要进行替换。也即,假设在一个子节点中将内容“a b”替换为了“ab”,那么需要在从该子节点到根节点的整个链路中的所有节点中,均需要将“a b”替换为了“ab”,以保证替换的有效性。
62.而为了保证替换的有效性,在本技术实施例的一种可行实施方式中,可以在对一个目标节点中的内容进行模拟执行之后,在替换该目标节点的内容的同时,就针对该子节点到根节点的整个链路中的所有节点进行替换。
63.比如,在对一个目标节点中的内容进行模拟执行之后,可以替换该目标节点中的内容,并按照该目标节点至根节点的顺序,依次替换该链路中的所有节点中与该目标节点相同的内容。
64.示例性的,如图2所示,假设当前遍历到的节点为节点1,且节点1为目标节点,内容为a b,模拟执行结果为ab,则可以将节点1的内容替换为ab,并将其至根节点(即节点5)的链路中的所有节点(即节点1、节点3、节点5)中的内容“a b”替换为“ab”。
65.而在本技术实施例的另一种可行实施方式中,也可以在对一个目标节点中的内容进行模拟执行之后,在替换该目标节点的内容的同时,仅对该目标节点的父节点进行替换。进而当遍历到该父节点后,再对该父节点的父节点进行替换。这样,同样可以保证替换的有效性,且由于每一次替换操作少,使得每一次模拟执行的时间得以缩短,可以提供整体的模拟执行效率。
66.需要注意的是,在上述可行实施方式中,在进行节点遍历时,针对每一个节点,均需要判断当前遍历到的节点是否进行过内容替换。若进行过内容替换,则将该替换部分的内容在该节点的父节点中进行替换。这样,当遍历到该目标节点的父节点时,即可进一步向上替换相应内容,从而达到在该目标节点至根节点的整个链路中的所有节点都进行替换的效果。
67.示例性的,仍如图2所示,假设当前遍历的节点为节点1,且节点1为目标节点,内容为a b,模拟执行结果为ab。假设节点1的父节点(节点3)的内容为a b c。对节点1的内容模拟执行之后,可以将节点1的内容替换为ab,并将节点3的内容中的“a b”替换为“ab”,得到新的内容为“ab c”。当遍历到节点3时,由于其进行过替换,从而无论其是否为目标节点,均将节点5中的“a b”替换为“ab”。
68.而在本技术实施例的又一种可行实施方式中,也可以在对一个目标节点中的内容进行模拟执行之后,仅替换该目标节点的内容。在后序遍历ast的各个节点的过程中,当遍历到该目标节点的父节点时,再将该目标节点的内容替换到该父节点中。
69.也即,在进行后序遍历时,对于当前遍历到的节点,无论其是否为目标节点,均可以获取该节点的子节点中的内容,并将当前遍历到的节点中与该子节点相对应的内容,替换为该子节点中的内容。这样,同样可以保证替换的有效性,达到在目标节点至根节点的整个链路中的所有节点都进行替换的效果。
70.需要注意的是,对于最下级的子节点而言,由于其不具有更下级的子节点,因此其可以不进行替换。
71.在本可行实施方式中,若当前遍历到的节点为目标节点,则可以在将当前遍历到的节点中与该子节点相对应的内容,替换为该子节点中的内容之后,再对当前遍历到的节点中的内容进行模拟执行。
72.示例性的,仍如图2所示,假设当前遍历的节点为节点1,且节点1为目标节点,内容为a b,模拟执行结果为ab。假设节点1的父节点(节点3)的内容为a b c。对节点1的内容模拟执行之后,可以将节点1的内容替换为ab。当遍历到节点3时,无论其是否为目标节点,都先将节点3的内容中的“a b”替换为“ab”,得到新的内容为“ab c”。若节点3也为目标节点,则模拟执行“ab c”。若节点3不为目标节点,则继续遍历。当遍历到节点5时,假设节点3和节点4均不为目标节点,节点3的内容为“ab c”,节点4的内容为“d e”,则将节点5的内容替换为“ab c d e”。
73.需要注意的是,在实际应用过程中,许多目标节点中的代码语句可能存在有变量。若直接执行该代码语句,而不为代码语句中的变量进行赋值,那么将导致模拟执行的结果可能不准确,进而影响整个反混淆效果。
74.为此,在本技术实施例中,在得到第一反混淆代码的ast之后,对ast的目标节点中的内容进行模拟执行之前,还可以先从ast的赋值类节点中,获取变量值以及各变量值的作用域;进而在记录表中关联记录各变量值和各变量值的作用域。
75.然后,在目标节点中的内容存在变量时,在对该目标节点中的内容进行模拟执行之前,先从预先建立的记录表中,获取该目标节点所属作用域下变量的变量值,然后将该变量值写入该变量中,然后再进行模拟执行。这样,就实现了变量追踪,完善了模拟执行时的混淆语句片段的上下文,使得混淆语句片段可以执行得到正确的还原结果。
76.还需要注意的是,在实际应用中,可能存在目标节点内的语句片段过于零散,导致模拟执行无法输出结果的情况,即可能存在不具有第一执行结果的情况。对于这种情况,可以不对该目标节点进行替换,而继续遍历ast中的下一节点。
77.还需要说明的是,在实际应用中,可能存在多层混淆的情况。那么在对于一个目标节点中的内容进行模拟执行时,若该内容进行了多层混淆,则可能导致第一执行结果并不能完全解除混淆。为此,在本技术实施例中,在对该ast的目标节点中的内容进行模拟执行得到第一执行结果之后,可以执行如图3所示的操作过程:
78.s301:判断第一执行结果中是否存在预设的混淆执行命令。若存在,转至步骤s302。若不存在,转至步骤s307。
79.需要说明的是,混淆执行命令是指进行代码混淆时需要用到的命令。例如,在powershell代码中,混淆执行命令可以是invoke-expression命令、powershell命令等。
80.s302:获取该混淆执行命令的参数部分。
81.s303:对该参数部分中的各代码单词(即token)进行反混淆处理,得到处理后的参数部分。
82.此处的反混淆处理方式与前文所述的token反混淆处理一致,在此不再赘述。
83.s304:对处理后的参数部分进行模拟执行,得到第二执行结果。
84.s305:将第一执行结果中的该参数部分替换为该第二执行结果。
85.s306:判断该第二执行结果中是否还存在预设的混淆执行命令。若存在,转至步骤s302。若不存在,转至步骤s307。
86.s307:将该目标节点中的全部内容替换为该第一执行结果。
87.应理解,上述过程通过不断对混淆执行命令的参数部分进行token级的反混淆处理并重新进行模拟执行,直至不再存在混淆执行命令为止,从而实现了对于多层混淆的层层解析,保证了反混淆结果的可靠性。
88.在本技术实施例中,在进行节点中的内容替换时,可以利用字典方式实现。即可以利用字典记录每个ast节点的文本内容,然后在字典中替换ast节点的文本内容。这样,通过严格执行原地替换,可以保证反混淆处理得到的反混淆代码与待处理代码的语义一致性。
89.s105:根据替换后的ast得到最终的反混淆代码。
90.在本技术实施例的一种可行实施方式中,可以将替换后的ast转换为第二反混淆代码,并直接以该第二反混淆代码作为最终的反混淆代码。
91.但是,为了进一步提高可读性,在本技术实施例的另一种可行实施方式中,在将替换后的ast转换为第二反混淆代码后,还可以对第二反混淆代码中的变量名和函数名进行重命名,并对第二反混淆代码进行重排版,得到最终的反混淆代码。
92.在本技术实施例中,工程师可以预先设定变量名和函数名的命名规则,从而实现对第二反混淆代码中的变量名和函数名进行重命名。类似的,工程师可以预先设定重排版规则,比如空格距离,缩进大小等,从而实现对第二反混淆代码的重排版。
93.考虑到在实际应用过程中,可能存在第二反混淆代码中的变量名和函数名本身并非随机的,而是具有较高可读性,那么在此情况下,即可以不进行第二反混淆代码中的变量名和函数名的重命名,从而降低处理开销。
94.为了识别出第二反混淆代码中的变量名和函数名是否随机,在本技术实施例的一种可行实施方式中,可以获取第二反混淆代码中的所有非重复的变量和函数所构成的字符串集合中,元音字符和辅音字符之间的比值。然后判断该比值是否在预设比值范围内。若在,即可以认为该第二反混淆代码中的变量名和函数名目前不是随机命名的,从而无需进行重命名。相反,若该比值不在预设比值范围内,即可认为该第二反混淆代码中的变量名和函数名目前是随机命名的,从而进行重命名,以保证变量名和函数名具有更高的可读性。
95.需要理解的是,在本技术实施例中,除了可以通过判断第二反混淆代码中的所有非重复的变量和函数所构成的字符串集合中,元音字符和辅音字符之间的比值是否在预设比值范围内,来确定是否需要进行重命名外,还可以通过判断元音字符占该字符串集合中总字符的占比,或者辅音字符占该字符串集合中总字符的占比,来确定是否需要进行重命名,原理与上述基于元音字符和辅音字符之间的比值来确定是否需要进行重命名的原理相同,在此不再赘述。
96.本技术实施例所提供的代码的反混淆方法,通过先进行待处理代码的各代码单词的校正(即token级的校正),然后再基于ast对可能存在混淆目标节点中的内容进行模拟执行,从而实现了token级和语句片段(节点中的内容即为代码的语句片段)级的修正。相比于现有基于正则表达式的代码的反混淆方法而言,考虑代码语句层面的混淆修正,降低了混淆语句遗漏风险,提高了反混淆效果。而相比于基于机器学习的代码的反混淆方法,一方面考虑了token级的修正,使得得到的ast中的内容可读性更强,更易被模拟执行从而进行语
句片段级的修正,反混淆可靠性更高;另一方面发明人发现代码中进行混淆的节点通常为ast中特定类型的节点(例如“binaryexpression”节点、“pipeline”节点等),因此通过对这些节点进行模拟执行达到语句片段的修正,相比于现有方案只能处理ast中的pipeline节点而言,也可以达到更为细粒度的修正,也降低了混淆语句遗漏风险,提高了反混淆效果。
97.此外,本技术实施例中的方案中,严格执行原地替换,并可以通过ast树的后序遍历不断更新到根节点,保证了反混淆处理后得到的代码与反混淆处理前的代码的语义一致性。
98.此外,本技术实施例中的方案中,可以实现变量追踪,完善了混淆语句的上下文,使得混淆语句可以执行得到正确的还原结果,提高了反混淆效果。
99.实施例二:
100.本实施例在实施例一的基础上,以一个针对powershell代码的具体示例为例,为本技术做进一步示例说明。
101.参见图4所示,图4中左侧为混淆理过的待处理代码。
102.首先对待处理代码进行词法解析,将待处理代码中的各token进行反混淆处理(参见图4中上侧标注有词法解析的方框),得到第一反混淆代码。
103.然后,参见图4中标注有基于ast的还原的方框,对第一反混淆代码进行解析,得到第一反混淆代码的ast。
104.对ast中的赋值类型的节点进行变量值和作用域的识别,在记录表关联记录各变量值和各变量值的作用域。
105.后序遍历ast的各个节点。
106.在当前遍历到的节点不属于设定类型的目标节点,且当前节点不存在子节点时,进行下一个节点的遍历。
107.在当前遍历到的节点不属于设定类型的目标节点,但当前节点存在子节点时,获取当前节点的子节点中的内容,将当前节点中与该子节点相对应的内容,替换为该子节点中的内容。
108.在当前遍历到的节点属于设定类型的目标节点,且当前节点未进行过内容替换时,通过invoke函数执行当前节点中的内容(即执行当前节点中的混淆语句),并将该节点中的内容替换为执行结果。
109.示例性的,参见图4中标有“还原”的虚线框所示,虚线框为针对“binaryexpression”节点的模拟执行过程。该过程中,由于执行结果不具有invoke-expression命令、powershell命令,所以直接输出执行结果并进行替换。
110.在ast遍历结束后,将替换后的ast转换为第二反混淆代码,并对第二反混淆代码中的变量名和函数名进行重命名,并对第二反混淆代码进行重排版,得到最终的反混淆代码。
111.图4中右下侧框内即为反混淆处理后的反混淆代码。
112.上述方案,针对powershell混淆代码多样化的特点,通过词法解析和ast各节点的类型进行混淆代码片段的精准识别,基于变量追踪的模拟执行可以正确地得到混淆代码的还原结果,严格的原地替换可以保证反混淆处理后的反混淆代码与反混淆处理前的代码语义一致,重命名和重排版让反混淆结果更加易读,易于理解。
113.实施例三:
114.基于同一发明构思,本技术实施例中还提供代码的反混淆装置500。请参阅图5所示,图5示出了采用图1所示的方法的代码的反混淆装置。应理解,装置500具体的功能可以参见上文中的描述,为避免重复,此处适当省略详细描述。装置500包括至少一个能以软件或固件的形式存储于存储器中或固化在装置500的操作系统中的软件功能模块。具体地:
115.参见图5所示,装置500包括:获取模块501和处理模块502。其中:
116.获取模块501,用于获取待处理代码的token列表,所述待处理代码为经过混淆后的代码;
117.处理模块502,用于对所述token列表中的各token进行反混淆处理得到第一反混淆代码,对所述第一反混淆代码进行解析得到所述第一反混淆代码的抽象语法树ast,对所述ast的目标节点中的内容进行模拟执行得到第一执行结果,并根据所述第一执行结果替换所述目标节点的内容,根据替换后的ast得到最终的反混淆代码;
118.其中,所述token列表中的各token为构成所述待处理代码的各代码单词;所述目标节点为所述ast中属于设定类型的节点。
119.在本技术实施例的一种可行实施方式中,所述处理模块502具体用于,后序遍历所述ast的各个节点,在当前遍历到的节点属于所述设定类型的目标节点时,对所述当前遍历到的节点中的内容进行模拟执行,得到所述当前遍历到的节点的第一执行结果,根据所述当前遍历到的节点的第一执行结果,替换所述当前遍历到的节点中的内容,直至所述ast的所有节点遍历完毕。
120.在上述可行实施方式中,在后序遍历所述ast的各个节点的过程中,所述处理模块502还用于,获取当前遍历到的节点的子节点中的内容,将当前遍历到的节点中与该子节点相对应的内容,替换为所述子节点中的内容。
121.在上述可行实施方式中,所述处理模块502具体用于,判断所述第一执行结果中是否存在预设的混淆执行命令;所述混淆执行命令为进行代码混淆时需要用到的命令;若存在,获取所述混淆执行命令的参数部分;对所述参数部分中的各代码单词进行反混淆处理,得到处理后的参数部分;对所述处理后的参数部分进行模拟执行,得到第二执行结果;将所述第一执行结果中的所述参数部分替换为所述第二执行结果;在所述第二执行结果不存在所述混淆执行命令时,将所述当前遍历到的节点中的全部内容替换为所述第一执行结果。
122.在本技术实施例的一种可行实施方式中,在目标节点中的内容存在变量时,在对该目标节点中的内容进行模拟执行之前,所述处理模块502还用于从预先建立的记录表中,获取该目标节点所属作用域下所述变量的变量值;将所述变量值写入所述变量中。
123.在上述可行实施方式中,在得到所述第一反混淆代码的ast之后,对所述ast的目标节点中的内容进行模拟执行之前,所述处理模块502还用于:从所述ast的赋值类节点中,获取变量值以及各变量值的作用域;在所述记录表关联记录各变量值和各变量值的作用域。
124.在本技术实施例中,所述处理模块502具体用于:逆序遍历所述token列表;按照预设的token修正规则,对当前遍历到的token进行修正,直至所述token列表遍历完毕;根据修正后的token列表得到第一反混淆代码。
125.在本技术实施例中,所述处理模块502具体用于:将替换后的ast转换为第二反混
淆代码;对所述第二反混淆代码中的变量名和函数名进行重命名,并对所述第二反混淆代码进行重排版,得到最终的反混淆代码。
126.在本技术实施例中,所述处理模块502还用于:对所述第二反混淆代码中的变量名和函数名进行重命名之前,确定所述第二反混淆代码中的所有非重复的变量和函数所构成的字符串集合中,元音字符和辅音字符之间的比值未在预设比值范围内,以在所述比值未在预设比值范围内时,对所述第二反混淆代码中的变量名和函数名进行重命名。
127.需要理解的是,出于描述简洁的考量,部分实施例一中描述过的内容在本实施例中不再赘述。
128.实施例四:
129.本实施例提供了一种电子设备,参见图6所示,其包括处理器601、存储器602以及通信总线603。其中:
130.通信总线603用于实现处理器601和存储器602之间的连接通信。
131.处理器601用于执行存储器602中存储的一个或多个程序,以实现上述实施例一和/或实施例二中的代码的反混淆方法。
132.可以理解,图6所示的结构仅为示意,电子设备还可包括比图6中所示更多或者更少的组件,或者具有与图6所示不同的配置。示例性的,电子设备可以为服务器、终端等具有数据处理能力的设备。
133.本实施例还提供了一种计算机可读存储介质,如软盘、光盘、硬盘、闪存、u盘、sd(secure digital memory card,安全数码卡)卡、mmc(multimedia card,多媒体卡)卡等,在该计算机可读存储介质中存储有实现上述各个步骤的一个或者多个程序,这一个或者多个程序可被一个或者多个处理器执行,以实现上述实施例一和/或实施例二中的代码的反混淆方法。在此不再赘述。
134.在本技术所提供的实施例中,应该理解到,所揭露装置和方法,可以通过其它的方式实现。以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,又例如,多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些通信接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
135.另外,作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
136.再者,在本技术各个实施例中的各功能模块可以集成在一起形成一个独立的部分,也可以是各个模块单独存在,也可以两个或两个以上模块集成形成一个独立的部分。
137.在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。
138.在本文中,多个是指两个或两个以上。
139.以上所述仅为本技术的实施例而已,并不用于限制本技术的保护范围,对于本领
域的技术人员来说,本技术可以有各种更改和变化。凡在本技术的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本技术的保护范围之内。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献