CN117349803B - 代码解混淆方法、装置、电子设备及计算机可读存储介质 - Google Patents

代码解混淆方法、装置、电子设备及计算机可读存储介质 Download PDF

Info

Publication number
CN117349803B
CN117349803B CN202311663103.1A CN202311663103A CN117349803B CN 117349803 B CN117349803 B CN 117349803B CN 202311663103 A CN202311663103 A CN 202311663103A CN 117349803 B CN117349803 B CN 117349803B
Authority
CN
China
Prior art keywords
node
confusion
function
subtree
syntax tree
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.)
Active
Application number
CN202311663103.1A
Other languages
English (en)
Other versions
CN117349803A (zh
Inventor
李响
于虎圣
王箭
陈焰
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Zhejiang University ZJU
Original Assignee
Zhejiang University ZJU
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Zhejiang University ZJU filed Critical Zhejiang University ZJU
Priority to CN202311663103.1A priority Critical patent/CN117349803B/zh
Publication of CN117349803A publication Critical patent/CN117349803A/zh
Application granted granted Critical
Publication of CN117349803B publication Critical patent/CN117349803B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/10Protecting distributed programs or content, e.g. vending or licensing of copyrighted material ; Digital rights management [DRM]
    • G06F21/12Protecting executable software
    • G06F21/14Protecting executable software against software analysis or reverse engineering, e.g. by obfuscation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/42Syntactic analysis
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/42Syntactic analysis
    • G06F8/427Parsing
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/43Checking; Contextual analysis
    • G06F8/433Dependency analysis; Data or control flow analysis
    • G06F8/434Pointers; Aliasing

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Multimedia (AREA)
  • Technology Law (AREA)
  • Computer Hardware Design (AREA)
  • Computer Security & Cryptography (AREA)
  • Devices For Executing Special Programs (AREA)

Abstract

本发明公开了一种代码解混淆检测方法、装置、电子设备及计算机可读存储介质,根据抽象语法树分析各个节点的混淆条件,然后针对不同的解混淆条件采用不同的解混淆策略进行解混淆。本发明的解混淆准确率高,采用的处理方式是语义上的等价替换,解混淆的结果并不会引入任何原本不存在的恶意特征,且基于本发明的混淆方法的进行解混淆的代码进行webshell检测时,大幅提升了webshell检出率。

Description

代码解混淆方法、装置、电子设备及计算机可读存储介质
技术领域
本申请涉及信息安全技术领域,特别是涉及一种代码解混淆方法、装置、电子设备及存储介质。
背景技术
现有的webshell检测手段大都存在有很大局限性:
通过正则表达式匹配文本特征子串:
原理:这种检测方式通过正则表达式匹配存在于webshell中的恶意文本特征,例如尝试匹配webshell中的“system($_REQUEST['a'])”等文本特征实现webshell的检测。
该方法局限性:正则表达式匹配只能匹配预先定义的恶意语法且无法应对复杂的混淆语法。如果检测系统中并没有写针对某种恶意利用的正则表达式,则该检测系统完全不会对该种类型的正则表达式做出任何报警,即使是正则表达式做了检测的利用,也可以轻易地使用语法混淆使得正则表达式无法成功检测,例如,正则表达式尝试匹配“system”函数,简单的使用base64解码混淆,将函数调用写作“base64_decode('c3lzdGVt')($_REQUEST['a']);”(这里“base64_decode('c3lzdGVt')”执行的结果是“system”),即可在完全不出现“system”字段的情况下调用该函数,类似的混淆方式不胜枚举。
通过文本相似度算法匹配特征子串,具体实现原理如下:通过各类文本相似度算法,匹配待检测内容同恶意内容的相似度。
该方法也存在局限性:首先,通过文本相似度算法匹配特征子串无法检测未知的或者新型的webshell,因为该算法需要依赖已知特征的子串进行匹配,其次,和正则表达式匹配一样,经过混淆或加密的webshell可能会改变其特征子串,导致文本相似度算法无法正确匹配。
此外,还有基于统计特征检测,具体原理:通过分析和统计webshell代码的特征(如关键字频率、函数调用频率、代码长度等),并与正常web代码的统计特征进行对比,从而识别出异常的webshell代码。
该方法也存在局限性:这种检测方式仅仅在攻击者混淆的代码同正常代码在统计特征上差别很大时能有不错的检测效果,攻击者可以通过在webshell中插入大量正常的web代码来减少webshell与正常web代码的统计特征的差别,因此这种检测方式也非常容易被攻击者绕过。
以及基于抽象语法树检测方法,其原理在于:基于抽象语法树检测常见的方法有基于抽象语法树的静态局部特征匹配方法,这种方法是将webshell源代码转化为一种新的中间码,针对该中间码进行特征匹配,也有基于抽象语法树的静态符号执行检测方法,这种方法通过模拟符号执行对抽象语法树进行归纳、约简,从而得到一个精简后的语法表达式。
但是该方法也具有局限性:攻击者通过某些语法混淆之后,从抽象语法树的层面上,无法获取到攻击者真正的行为,例如前面提到过的“base64_decode('c3lzdGVt')($_REQUEST['a']);”这个例子,仅从抽象语法树的层面上看依然无法知道攻击者实际执行的函数究竟是什么。
通过上述方法的原理和局限性分析,可以知道代码混淆是影响webshell检测方法成功率的基础,准确的完成代码的解混淆,对于提升webshell检测成功率和准确率具有重要意义。
发明内容
基于此,有必要针对上述技术问题,本发明提供了一种代码解混淆方法,包括:
生成目标代码的抽象语法树;
针对所述的抽象语法树中的每一个节点,在该当前节点满足解混淆条件中的第二解混淆条件时,将抽象语法树中函数名位置的子树替换为echo语句;将替换后的抽象语法树还原为代码并输入到解释器进行解析得到函数名的真实值;以所述得到的函数名真实值作为该函数调用表达式节点对应函数名处节点的取值构建抽象语法树作为当前节点的解混淆子树;
在所生成的目标代码的抽象语法树中将该当前节点的混淆子树更新为所述解混淆子树,并根据所述更新后的抽象语法树生成目标代码的解混淆代码;
其中,所述第二解混淆条件为当前节点是函数调用表达式节点,且对应的函数名处节点不为常量,所述当前节点的混淆子树为所述抽象语法树中抽取以当前节点为根的子树。所述解混淆条件包括第一解混淆条件和第三解混淆条件,在当前节点满足第一解混淆条件或第三解混淆条件时,采用对应的解混淆策略对当前节点进行解混淆,其中,
所述第一解混淆条件为当前节点是函数调用表达式节点,且对应的函数名处的节点为常量,且该常量为用于调用其他函数的函数的函数名,对应的第一解混淆策略为:以该函数调用表达式节点对应被调用的函数的函数名处节点的取值作为新的函数调用表达式节点的函数名处节点的取值,以该函数调用表达式节点对应被调用的函数的参数处节点取值作为新的函数调用表达式节点的函数参数处节点的取值构建抽象语法树作为当前节点的解混淆子树;
所述第三解混淆条件为当前节点为eval表达式节点,且eval表达式节点对应的参数处节点的真实值是非空字符串;对应的第三解混淆策略为:采用解释器对该eval表达式节点对应的参数处节点的值进行解析得到参数的真实值,构建该参数取值的抽象语法树作为该eval表达式节点的解混淆子树。
所述采用解释器对该eval表达式节点对应的参数处节点的值进行解析得到参数的真实值包括:
将目标代码的抽象语法树复制出一份作为临时抽象语法树,
根据eval表达式节点对应的参数处节点的值在临时抽象语法树中确定需要解的子树;
将需要解析的子树所在语句替换为echo语句,且echo语句的参数为该需要解析的子树;
将替换为echo语句的临时抽象语法树还原为代码,并将还原得到的代码输入到解释器进行解析得到参数的真实值。
所述在将需要解析的子树所在语句替换为echo语句后还包括:在所述需要解析的子树的父节点和祖先节点中存在条件分支时,修改该子树所在语句相关的条件分支语句的条件表达式的取值,以使处于分支中的echo语句满足执行条件。
作为优选,所述修改该子树所在语句相关的条件分支语句的条件表达式的取值还包括将修改后的条件表达式作为第一条语句插入到对应语句块中。
进一步,所述采用所满足的混淆条件对应的解混淆策略对当前节点对应的混淆子树进行解混淆得到解混淆子树,并利用所述的解混淆子树替换抽象语法树中该当前节点的混淆子树后还包括:根据本次解混淆结果继续判断当前节点是否满足解混淆条件中的一个,若满足其中任何一种混淆条件,则继续按照相应解混淆策略进行解混淆,直至不满足任何一种混淆条件后结束。
本发明还提供了一种解混淆装置,所述装置包括:
第一模块,用于生成目标代码的抽象语法树;
第二模块,用于针对所述的抽象语法树中的每一个节点,在该当前节点满足解混淆条件中的第二解混淆条件时,将抽象语法树中函数名位置的子树替换为echo语句;将替换后的抽象语法树还原为代码并输入到解释器进行解析得到函数名的真实值;以所述得到的函数名真实值作为该函数调用表达式节点对应函数名处节点的取值构建抽象语法树作为当前节点的解混淆子树;
第三模块,用于在所生成的目标代码的抽象语法树中将该当前节点的混淆子树更新为所述解混淆子树,并根据所述更新后的抽象语法树生成目标代码的解混淆代码;
其中,所述第二解混淆条件为当前节点是函数调用表达式节点,且对应的函数名处节点不为常量,所述当前节点的混淆子树为所述抽象语法树中抽取以当前节点为根的子树。
本申请还提供了一种电子设备,包括存储器和处理器,所述存储器存储有计算机程序,,所述处理器执行所述计算机程序时实现上述代码解混淆方法的步骤。
本发明还提供了一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现上述的方法的步骤。
上述代码解混淆检测方法、装置、电子设备和计算机可读存储介质,根据抽象语法树分析各个节点的混淆条件,然后针对不同类型采用不同的解混淆策略进行解混淆,本方法解混淆准确率高。此外,基于本发明的混淆方法的进行解混淆的代码进行webshell检测时,大幅提升了webshell检出率。与此同时,由于解混淆时采用的处理方式是语义上的等价替换,解混淆的结果并不会引入任何原本不存在的恶意特征。
附图说明
图1为本发明一实施例的一种代码解混淆方法的流程示意图;
图2为本发明一实施例中目标代码的抽象语法树;
图3为本发明一实施例中目标代码的解析完成后的抽象语法树;
图4为本发明另一实施例中目标代码的抽象语法树;
图5为本发明另一实施例中采用第二解混淆策略对目标代码的抽象语法树进行解析的示意图;
图6为本发明另一实施例中目标代码的解析完成后的抽象语法树;
图7为本发明另一实施例中目标代码的抽象语法树;
图8为本发明另一实施例中采用第三解混淆策略对目标代码的抽象语法树进行解析的示意图;
图9为本发明另一实施例中目标代码的解析完成后的抽象语法树;
图10为本发明另一实施例中目标代码的解析完成后的抽象语法树;
图11为本发明另一实施例中采用第一解混淆策略为目标代码的解析完成后的抽象语法树;
图12本发明另一实施例中继续采用第二解混淆策略为目标代码的解析完成后的抽象语法树;
图13为将需要解析的子树所在的语句替换为一个echo语句后的抽象语法树;
图14为本发明一实施例中的目标代码的解析完成后的抽象语法树;
图15为本发明一实施例添加echo语句节点后的抽象语法树;
图16为修改分支条件后的抽象语法树;
图17为本发明一实施例提供的代码解混淆装置。
具体实施方式
下面结合附图和实施例对本发明作进一步的详细说明。可以理解的是,此处所描述的具体实施例仅仅用于解释本发明,而非对本发明的限定。
需要说明的是,为了便于描述,附图中仅示出了与本发明相关的部分而非全部内容。在更加详细地讨论示例性实施例之前应当提到的是,一些示例性实施例被描述成作为流程图描绘的处理或方法。虽然流程图将各项操作(或步骤)描述成顺序的处理,但是未作特殊说明,其中的许多操作可以被并行地、并发地或者同时实施。此外,各项操作的顺序可以被重新安排。当其操作完成时所述处理可以被终止,但是还可以具有未包括在附图中的附加步骤。所述处理可以对应于方法、函数、规程、子例程、子程序等等。
本发明设计了一种通过改造抽象语法树将混淆的webshell解混淆还原为未混淆状态的技术,通过将webshell还原为未混淆的状态,能够大幅暴露webshell的恶意特征,使得webshell更容易被检测出来。该解混淆方法可以作为任意检测模块的前置处理流程,大幅提升该检测系统的检出率。从原理上说,该解混淆技术是对源代码语义的等价替换,并不会导致原本不是webshell的正常脚本在处理后出现恶意特征的情况,即不会增加误报。
此外,本发明还定义了一系列的解混淆策略和解混淆条件,解混淆策略和解混淆条件具有对应关系。解混淆条件用于定义满足什么条件的抽象语法树节点或子树需要解混淆。解混淆策略用于定义处理:满足对应解混淆条件的抽象语法树的节点或子树通过修改抽象语法树进行解混淆处理的方法。
本发明的解混淆的过程是首先生成需要解混淆的目标代码对应的抽象语法树,然后遍历该抽象语法树,对每一个节点判断是否被混淆,若被混淆则按照对应的解混淆策略进行解混淆处理。本发明中不同的解混淆策略之间还可以相互配合,即节点x满足解混淆策略a,采用解混淆策略a进行解混淆处理时改造抽象语法树之后,改造的结果也可能会触发解混淆策略b,因此,可以进一步采用解混淆策略b进行解混淆处理,以此类推,直到抽象语法树上不再有任何被混淆的节点或子树时,将整个抽象语法树还原为代码,即可实现整个代码的解混淆。不同的混淆策略之间相互配合,实现高质量的解混淆。
如图1所示,为本发明一实施例的代码解混淆方法,包括:
S101,生成目标代码的抽象语法树;
语法树是代码句子结构的图形表示,它代表了句子的推导结果,有利于理解句子语法结构的层次。简单说,语法树就是按照某一规则进行推导时所形成的树。语法树和代码之间可以实现相互转化。
S102,针对所述的抽象语法树中的每一个节点,判断当前节点是否满足解混淆条件中的一个,若满足,则在所述抽象语法树中抽取以当前节点为根的子树作为当前节点的混淆子树,采用所满足的混淆条件对应的解混淆策略对当前节点对应的混淆子树进行解混淆得到解混淆子树,并利用所述的解混淆子树替换抽象语法树中该当前节点的混淆子树;
S103,根据所述替换后的抽象语法树生成目标代码的解混淆代码。
在步骤S102中,针对所述的抽象语法树中的每一个节点进行解混淆时,实际应用时多采用深度优先遍历,但并不局限于采用深度优先的遍历顺序。针对遍历到的该抽象语法树的每个节点,判断该节点或以该节点为根的子树是否满足任何一个解混淆条件,一旦满足某一解混淆条件,则根据解混淆策略的指示,通过相应的解混淆处理改造抽象语法树。
本实施例的代码解混淆方法实施前,需要预先定义解混淆条件和相应的解混淆策略。在本发明的一实施例中,所述混淆条件包括第一解混淆条件、第二解混淆条件和第三解混淆条件,其中,
所述第一解混淆条件为当前节点是函数调用表达式节点,且对应的函数名处的节点为常量,且该常量为用于调用其他函数的函数的函数名,如“call_user_func”、“call_user_func_array”、“array_map”、“array_walk”、“array_filter”、 “array_walk_recursive”、 “array_reduce”、 “uasort”、 “uksort”、 “array_udiff”、“array_udiff_assoc”、“array_intersect_uassoc”、 “array_intersect_ukey”等。对应的第一解混淆策略为:以该函数调用表达式节点对应被调用的函数的函数名处节点的取值作为新的函数调用表达式节点的函数名处节点的取值,以该函数调用表达式节点对应被调用的函数的参数处节点取值作为新的函数调用表达式节点的函数参数处节点的取值构建抽象语法树作为当前节点的解混淆子树;
所述第二解混淆条件为当前节点是函数调用表达式节点,且对应的函数名处节点不为常量;对应的第二解混淆策略为:采用解释器对所述该函数调用表达式节点对应函数名处节点的值进行解析得到函数名真实值,并以所述得到的函数名真实值作为该函数调用表达式节点对应函数名处节点的取值构建抽象语法树作为当前节点的解混淆子树;
所述第三解混淆条件为当前节点为eval表达式节点,且eval表达式节点对应的参数处节点的值是非空字符串;对应的第三解混淆策略为:采用解释器对该eval表达式节点对应的参数处节点的值进行解析得到参数的真实值,构建该参数的真实值的抽象语法树作为该eval表达式节点的解混淆子树。
在步骤S102中判断当前节点是否满足解混淆条件中的一个,若当前节点满足其中一个解混淆条件,则认为该当前节点被混淆,因此,根据所满足的解混淆条件对应的解混淆策略进行解混淆处理。若不满足任何解混淆条件,则认为该当前节点未混淆,不需要进行解混淆处理。
解混淆条件和解混淆策略可以根据研究不同的代码混淆方法归纳总结得到。需要说明的是,上述解混淆条件和解混淆策略只是针对目前常用的混淆方法列举的,实际还有很多方法,在此并未一一列举。且每一种解混淆策略都能够通用地应对一大类的混淆方式,如混淆函数名。这意味着随着技术发展,还可以出现新的混淆方法和手段,但只要符合相应的混淆条件,如对函数名部分的混淆,依然可以采用相应的策略进行解混淆。此外,如果出现新的混淆方法和手段现有的混淆条件以及解混淆策略无法覆盖,可以通过添加新的混淆条件和解混淆策略即可解决,系统扩展性强。
所述第一解混淆条件中,该函数调用表达式节点可以为call_user_func函数调用表达式节点,还可以为“call_user_func_array”、“array_map”、“array_walk”、“array_filter”、 “array_walk_recursive”、 “array_reduce”、 “uasort”、 “uksort”、 “array_udiff”、 “array_udiff_assoc”、 “array_intersect_uassoc”、 “array_intersect_ukey”等函数调用表达式节点。下面将以该函数调用表达式节点为call_user_func函数调用表达式节点为例对第一解混淆策略的解混淆处理过程进行详细说明。
当前节点是函数调用表达式节点,且函数调用表达式节点对应函数名处的节点为call_user_func函数调用表达式节点,则判断该节点被混淆,且该函数调用表达式节点对应函数名处节点的值call_user_func为常量,且call_user_func为一个函数名,call_user_func函数用于调用其他函数,因此,可以判断该被混淆节点满足第一混淆条件,相应的采用第一解混淆策略进行解混淆处理:将call_user_func修改为直接的函数调用,即重新构建函数调用表达式节点,将call_user_func的第一个参数作为函数名,后续参数作为新的函数调用表达式节点的函数参数,使用新的函数调用表达式节点替换call_user_func节点。
在webshell中,攻击者可能并不是直接调用函数,而是借助call_user_func来调用另一函数,call_user_func实现了执行以它的第一个参数作为函数名的函数,后续参数作为执行该函数时的参数,通过这种方式实现混淆。该解混淆策略的目的在于将通过call_user_func调用的函数解混淆为直接调用该函数,即将“call_user_func('a', 'b')”解混淆为“a('b')”。
以如下代码作为示例进行说明:
<?php
call_user_func('system', $_GET['a']);
?>
首先,可以生成该目标代码的抽象语法树(部分)如图2所示。可以看到,这里的函数调用表达式节点调用的函数是call_user_func,而实际上被调用的函数应该是system函数,可以看出实际调用的函数被混淆,因此,满足第一解混淆条件。
当解混淆项目遍历到该节点时,会发现该节点满足第一解混淆条件,那么根据第一解混淆条件对应的第一解混淆策略进行解混淆处理,首先需要构建新的函数调用表达式节点,以call_user_func的第一个参数“system”作为函数名,后续参数“$_GET['a']”作为新的函数参数,构建新的函数调用表达式节点如图3所示。然后用该新创建的函数调用表达式节点替代图2所示的原本的call_user_func的函数调用表达式节点,至此,该节点的替换完成,即完成对该节点的解混淆处理。
后续解混淆模块会继续遍历该代码的抽象语法树,直到所有的解混淆策略都被处理。当然,在本示例中只有上述一个节点符合解混淆策略的解混淆条件。在所有的抽象语法树节点都不满足任何一个解混淆条件时,将整个抽象语法树还原为代码,即可得到:
<?php
system($_GET['a']);
?>
可以看到,通过第一解混淆策略对混淆了实际调用函数的函数调用表达式节点进行解混淆处理,可以成功将call_user_func修改为直接的函数调用的函数名system。
针对第二解混淆条件,其解混淆条件为当前节点是函数调用表达式节点,且函数名位置不是常量(可以理解为不是直接的函数名的值,而是表达式节点,且表达式节点的值不是常量)。对应采用第二解混淆策略进行解混淆处理:通过解释器获取函数名位置的节点或子树对应的表达式的真实值,创建新的函数名节点,该函数名节点的值是解释器的输出。以该新创建的函数名节点替换原本的函数名位置的子树。
以如下代码作为示例进行说明:
<?php
base64_decode('c3lzdGVt')($_REQUEST['a']);
?>
首先,可以生成该代码的抽象语法树(部分)如图4所示, 可以看到,这里的外层函数调用表达式节点的函数名部分并不是直接的函数名,而是另外一个函数调用表达式节点,实际调用的函数的函数名为base64_decode函数的计算结果。当遍历到该节点时,会发现该节点是函数调用表达式节点,且函数名位置不是常量,符合第二混淆条件,那么根据对应的第二解混淆策略进行解混淆处理,首先需要通过解释器获取到图5中的虚线框中的子树的值:
如何通过解释器获取子树的值在后面再进行描述,这里需要知道,通过解释器能够获取到该子树的值为“system”,那么按照该解混淆策略的解混淆处理,得到的要用于替换的节点就是值为“system”的String类型节点。
使用该节点替换子树,得到的新的抽象语法树如图6所示,在这个例子中,只有这里符合了解混淆条件,进一步将改造后的抽象语法树还原为代码即得到解混淆代码了,具体如下:
<?php
system($_REQUEST['a']);
?>
可以看到,这里成功将函数名部分还原,并且由于函数名的真实值是通过解释器执行之后得到的,因此函数名部分无论是使用字符串拼接、base64解码、加解密函数或任何特性做的混淆,都可以通过解释器正确拿到它的真实值之后成功完成还原。
针对第三混淆条件,采用的第三解混淆策略为eval重解析,该第三解混淆条件为当前节点是eval表达式节点,且eval的参数或参数执行的结果是非空字符串。对应采用第三解混淆策略进行解混淆处理:将eval的参数或参数执行的结果作为代码,构建该代码的抽象语法树,后续用该代码的抽象语法树,替换eval表达式节点。
下面将以如下代码作为示例进行说明:
<?php
eval('system($'. '_GET["b"]);');
?>
首先,可以生成该代码的抽象语法树(部分)如图7所示, 当解混淆项目遍历到该eval表达式节点时,会尝试使用解释器获取图8所示虚线框中的值:
解释器计算出这里的值是“system($_GET["b"]);”,可以看到是非空字符串,那么按照解混淆策略,需要构造“system($_GET["b"]);”的抽象语法树,得到如图9所示的结果;
用该抽象语法树替换整个eval表达式子树(即图7所示的抽象语法树),完成这里的解混淆。
同样,在这个简单的例子中,也只有这里符合了解混淆策略,最终会将代码解混淆为:
<?php
system($_GET["b"]);
?>
和第二混淆策略中一样,这里的eval表达式节点的表达式的值是通过解释器获取的,因此不论这里是使用字符串处理、编码解码或任何特性进行的混淆,都能通过解释器获取到该值,并构建为对应的抽象语法树来替换eval表达式子树,完成这里的解混淆。
在实际应用中,为了达到更好的解混淆效果,不同的解混淆策略之间可以相互配合,在本发明的一实施例中,步骤S102中,所述针对所述的抽象语法树中的每一个节点进行解混淆时在完成一次解混淆后还包括:根据本次解混淆结果继续判断该节点是否满足解混淆条件,若属于其中任何一种混淆条件,则继续按照相应类型进行解混淆,直至不属于任何一种混淆条件后结束。
下面将以如下代码作为示例进行说明:
<?php
call_user_func('sys'.'tem', $_GET['c']);
?>
首先,可以生成该代码的抽象语法树(部分)如图10所示,可以看出,这里就满足第一混淆条件,即节点是call_user_func的函数调用表达式节点这一解混淆条件。按照解混淆处理的指示,需要构建新的函数调用表达式节点,以call_user_func的第一个参数作为函数名,后续参数作为函数参数,构建得到新的函数调用表达式节点如图11所示。可以看到,虽然将call_user_func修改为了直接的函数调用,但是函数名部分依然是混淆的。此时,因为这里利用第一解混淆策略解混淆得到的结果又满足了第二解混淆条件,则继续按照第二解混淆策略将这里的二元拼接表达式还原为直接的值为“system”的String类型节点,进而将图11所示的抽象语法树改造为图12所示结果,最终该代码解混淆的结果为:
<?php
system($_GET['c']);
?>
在一实施例中,所述采用解释器对所述子树进行解析包括:
首先将原本的抽象语法树复制出一份临时抽象语法树,
然后在临时抽象语法树中确定需要解析的子树,并将需要解析的子树所在语句替换为echo语句,且echo语句的参数为该需要解析的子树,
将替换为echo语句后的临时抽象语法树还原为代码,并将还原得到的代码输入到解释器进行解析。
在临时抽象语法树中确定需要解析的子树根据解析的目标确定,例如,可以根据所述采用解释器对所述该函数调用表达式节点对应函数名处节点的值确定;也可以为eval表达式节点对应的参数处节点的值确定。
需要说明的是,需要解析的子树在满足某个解混淆条件的时候就确定了,比如满足了第二解混淆条件,需要解释器解析的子树就是函数名位置的子树,比如满足了第三解混淆条件,需要解释器解析的子树就是eval表达式节点参数位置的子树。
进一步,所述采用解释器对子树进行解析还包括:在所述需要解析的子树的父节点和祖先节点中存在条件分支时,修改该子树所在语句相关的条件分支语句的条件表达式的取值,保证处于分支中的echo语句一定能够执行到。在另一优选实施例中,除所述修改该子树所在语句相关的条件分支语句的条件表达式的取值之外,还会将修改后的条件表达式作为第一条语句插入到对应语句块中。
当某个解混淆策略需要获取到某个抽象语法树节点或子树对应的表达式的值时,在通过解释器获取该值时,对应的解混淆策略需要用到解释器。例如上文的第二混淆条件,第二解混淆策略需要知道函数名位置的表达式的值,第三混淆条件,第三解混淆策略需要知道参数位置的表达式的值。
这里以上述第二解混淆策略的例子为例,详细解释如何通过解释器获取子树的值。该例子的源码是:
<?php
base64_decode('c3lzdGVt')($_REQUEST['a']);
?>
上文提到需要获取该抽象语法树的子树对应的表达式的值,该子树对应了函数调用的函数名部分,如图5虚线框中部分所示。
从解释器拿到某个表达式的值也存在一些复杂的优化处理,为了方便描述,简单地认为解释器echo出来的内容是可以被获取到的,即如果解释器执行了“$a='123';$b='456';echo $a.$b;”,很显然这里解释器会输出“123456”,这个就是“$a.$b”实际的值。换句话说,当要通过解释器获取某个表达式的值的时候,传给解释器的代码应该包含将该表达式echo出来的语句,在解释器执行该echo语句之后我们即可知道该表达式实际的值是多少。需要注意的是,整个解混淆包括从解释器获取值的过程都是自动化的过程,不需要任何人工干预。
在本示例中,想要获取到实际值的表达式,是图5中虚线框内的子树对应的表达式,首先,解混淆模块会将抽象语法树复制一份,在复制出的临时的抽象语法树上进行修改,不会修改原本的抽象语法树。之后,将需要获取到值的子树所在的语句替换为一个echo语句,并且该echo语句所echo的内容就是该子树。针对这个例子,会将临时的抽象语法树的该函数调用表达式节点所在语句的子树替换为如图13所示子树:
然后将这个临时的抽象语法树还原为对应的源码,得到的源码就是用于获取虚线框中子树对应的表达式的值的源码,该源码为:
<?php
echo base64_decode('c3lzdGVt');
?>
将该代码交给解释器执行,解释器会告诉执行的结果为“system”,图5中虚线框内的子树对应的表达式的值是“system”,后续处理则参考上文提到的第二解混淆策略描述的后续处理。
虽然通过上面的方式可以在上述简单例子中获取到被混淆的函数名的值,但是在实际场景中这是不够的,因为实际场景中会存在条件分支处理的问题。
在众多领域,比如模糊测试、恶意软件分析等领域中,通过执行代码以获取相关信息的方法已经被广泛应用。然而,无论是在工业界还是学术界,处理程序的条件分支一直是一个挑战性的难题。同样的,本项目通过解释器执行php代码获取某个表达式的值也存在这样的难题,并针对该难题做出了相应的解决方案。例如对于如下代码:
<?php
$a='sys';
$b='tem';
if (isset($_GET['cmd'])) {
($a.$b)($_GET['cmd']);
}
?>
该代码的一个特点是只有在传入$_GET['cmd']时才会执行恶意逻辑,攻击者会在使用该webshell的时候传入该值,但是解混淆项目并不能提前知道需要传入该值才能进入到恶意逻辑。
很明显,这里的“($a.$b)($_GET['cmd']);”中的“$a.$b”部分是符合第二解混淆条件的,需要通过解释器获取到“$a.$b”的值。假如还是仅仅按照上述方式来修改临时抽象语法树并还原为获取“$a.$b”的值的代码,该代码如下:
<?php
$a='sys';
$b='tem';
if (isset($_GET['cmd'])) {
echo $a.$b;
}
?>
将该代码交给解释器执行,尝试得到这里“$a.$b”的值,由于没有传入$_GET['cmd'],导致解释器完全不会执行到“echo $a.$b;”语句,拿不到该值。
为了能够顺利拿到表达式实际的值,要做的是对分支语句进行修改,嵌套地将所有相关的条件分支的条件修改为true或false,使得最终能够执行到echo语句,并且为了防止条件表达式做了某些必要的操作,将条件表达式插入对应语句块作为该语句块的第一条语句。
体现在抽象语法树上的是,在按照前文描述的将子树所在语句修改为echo语句之后,还需要对所有与该子树所在语句相关的条件分支语句进行修改,一方面将他们的条件修改为true或false保证能够执行到子树所在语句,另一方面将条件表达式插入为对应语句块的第一句,以防止条件表达式本身做了影响后续执行结果的操作。
例如上述例子的抽象语法树(部分)如图14所示。
按照上文所述的流程,首先复制一份临时的抽象语法树,修改临时抽象语法树,将需要值的子树所在的语句替换为echo语句,并echo出该子树,如图15所示,其中的二次元拼接子树(也称为BinaryOperation子树)即为“$a.$b”对应的子树。
由于BinaryOperation子树所在的是if语句的if语句块而不是else语句块,因此需要将该if语句的条件修改为true,并将条件表达式插入到if语句块为该语句块的第一条语句,修改该抽象语法树如图16所示;此时还原该临时抽象语法树为源码即可得到:
<?php
$a='sys';
$b='tem';
if (true) {
isset($_GET['cmd']);
echo $a.$b;
}
?>
此时将该代码交给解释器执行,即可获取“$a.$b”的实际值为“system”。
值得注意的是,该修改会嵌套地修改每一个相关的条件分支语句,即如果if语句外还有更外层的if语句,针对所有的这些if语句都会进行处理,使得最终能尽可能地成功获取表达式的值,例如对于下面的伪代码:
If condition1:
If condition2:
Some statements here.
Else:
If condition3:
x
尝试获取x的值时,项目会将代码修改为:
If true:
condition1
If false:
Some statements here.
Else:
condition2
If true:
condition3
echo x
将该代码交给解释器执行,获取表达式x的值。
通过这种方式,可以在保留原本的执行逻辑的同时,保证代码能够执行到我们需要执行的语句,以使我们能够获取到某个表达式的实际值。
复杂的现实案例举例
仅使用上文提到的3种解混淆策略已经可以解混淆很多复杂的混淆方式了,例如下面的代码:
<?php
$a='YmFzZTY0X2RlY29kZSgnYzNsemR';
$b=base64_decode('SFZuUW5LU2drWDBkRlZGc25ZU2RkS1RzPQ==');
$c = strrev('edoced_46esab');
$d= strtr('abll_usdr_funh', 'abdh', 'caec');
eval($d($c, $a.$b));
?>
这里的$d通过strtr函数混淆,实际值是“call_user_func”,$c通过strrev函数混淆,实际值是“base64_decode”,$b通过base64_decode函数混淆,实际值是“HVnQnKSgkX0dFVFsnYSddKTs=”,而$a.$b的实际值是“YmFzZTY0X2RlY29kZSgnYzNsemRHVnQnKSgkX0dFVFsnYSddKTs=”,因此eval的内容是“base64_decode('c3lzdGVt')($_GET['a']);”,而这里“base64_decode('c3lzdGVt')”的结果是“system”,因此上面实际最终执行了“system($_GET['a']);”。
通过上述3种解混淆策略,可以将该代码解混淆为:
<?php
$a='YmFzZTY0X2RlY29kZSgnYzNsemR';
$b=base64_decode('SFZuUW5LU2drWDBkRlZGc25ZU2RkS1RzPQ==');
$c = strrev('edoced_46esab');
$d= strtr('abll_usdr_funh', 'abdh', 'caec');
system($_GET['a']);
?>
解混淆直接将该代码的目的——“system($_GET['a']);”暴露出来,此时即使使用最简单的正则表达式检测,也能发现该代码是webshell。
如图17所示,本发明一实施例中还提供了一种解混淆装置,所述装置包括:
第一模块,用于生成目标代码的抽象语法树;
第二模块,用于针对所述的抽象语法树中的每一个节点,判断当前节点是否满足解混淆条件中的一个,若满足,则在所述抽象语法树中抽取以当前节点为根的子树作为当前节点的混淆子树,采用所满足的混淆条件对应的解混淆策略对当前节点对应的混淆子树进行解混淆得到解混淆子树,并利用所述的解混淆子树替换抽象语法树中该当前节点的混淆子树;
第三模块,用于根据所述替换后的抽象语法树生成目标代码的解混淆代码。
上述中检测装置各模块的具体细节已经在对应的检测方法中进行了详细的描述,因此此处不再赘述。
应当注意,尽管在上文详细描述中提及了解混淆装置的若干模块或者单元,但是这种划分并非强制性的。实际上,根据本公开的实施方式,上文描述的两个或更多模块或者单元的特征和功能可以在一个模块或者单元中具体化。反之,上文描述的一个模块或者单元的特征和功能可以进一步划分为由多个模块或者单元来具体化。
此外,在本发明公开的示例性实施例中,还提供了一种能够实现上述代码解混方法的电子设备,包括:
处理器;以及
存储器,所述存储器上存储有计算机可读指令,所述计算机可读指令被所述处理器执行时实现上述的代码解混淆方法。
此外,在本发明公开的示例性实施例中,还提供了一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现上述的代码解混方法。
应当理解,本实施例的计算机设备包括中央处理单元(CPU),其可以根据存储在只读存储器(ROM)中的程序或者从存储部分加载到随机访问存储器1003中的程序而执行各种适当的动作和处理。在RAM中,还存储有系统1000操作所需的各种程序和数据。CPU、ROM以及RAM通过总线彼此相连。输入/输出(I/O)接口也连接至总线。
特别地,根据本公开的实施例,上文参考流程图描述的过程可以被实现为计算机软件程序。例如,本公开的实施例包括一种计算机程序产品,其包括承载在计算机可读介质上的计算机程序,该计算机程序包含用于执行流程图所示的方法的程序代码。在这样的实施例中,该计算机程序可以通过通信部分从网络上被下载和安装,和/或从可拆卸介质被安装。在该计算机程序被中央处理单元(CPU)执行时,执行本申请的终端中限定的上述功能。
需要说明的是,本申请所示的计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质或者是上述两者的任意组合。计算机可读存储介质例如可以是——但不限于——电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。计算机可读存储介质的更具体的例子可以包括但不限于:具有一个或多个导线的电连接、便携式计算机磁盘、硬盘、随机访问存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、光纤、便携式紧凑磁盘只读存储器(CD-ROM)、光存储器件、磁存储器件、或者上述的任意合适的组合。在本申请中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。而在本申请中,计算机可读的信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了计算机可读的程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。计算机可读的信号介质还可以是计算机可读存储介质以外的任何计算机可读介质,该计算机可读介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。计算机可读介质上包含的程序代码可以用任何适当的介质传输,包括但不限于:无线、电线、光缆、RF等等,或者上述的任意合适的组合。
附图中的流程图和框图,图示了按照本申请各种实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段、或代码的一部分,上述模块、程序段、或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个接连地表示的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图或流程图中的每个方框、以及框图或流程图中的方框的组合,可以用执行规定的功能或操作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
描述于本申请实施例中所涉及到的单元可以通过软件的方式实现,也可以通过硬件的方式来实现。所描述的单元或模块也可以设置在处理器中,其中,这些模块的名称在某种情况下并不构成对该模块本身的限定。
以上具体示出和描述了本发明的示例性实施例。应可理解的是,本发明不限于这里描述的详细结构、设置方式或实现方法;相反,本发明意图涵盖包含在所附权利要求的精神和范围内的各种修改和等效设置。

Claims (7)

1.一种代码解混淆方法,其特征在于,包括:
生成目标代码的抽象语法树;
针对所述的抽象语法树中的每一个节点,在当前节点满足解混淆条件中的第二解混淆条件时,将抽象语法树中函数名位置的子树替换为echo语句;将替换后的抽象语法树还原为代码并输入到解释器进行解析得到函数名的真实值;以所述得到的函数名真实值作为该函数调用表达式节点对应函数名处节点的取值构建抽象语法树作为当前节点的解混淆子树;
在所生成的目标代码的抽象语法树中将该当前节点的混淆子树更新为所述解混淆子树,并根据所述更新后的抽象语法树生成目标代码的解混淆代码;
其中,所述第二解混淆条件为当前节点是函数调用表达式节点,且对应的函数名处节点不为常量,所述当前节点的混淆子树为所述抽象语法树中抽取以当前节点为根的子树;
所述解混淆条件包括第一解混淆条件和第三解混淆条件,在当前节点满足第一解混淆条件或第三解混淆条件时,采用对应的解混淆策略对当前节点进行解混淆,其中,
所述第一解混淆条件为当前节点是函数调用表达式节点,且对应的函数名处的节点为常量,且该常量为用于调用其他函数的函数的函数名,对应的第一解混淆策略为:以该函数调用表达式节点对应被调用的函数的函数名处节点的取值作为新的函数调用表达式节点的函数名处节点的取值,以该函数调用表达式节点对应被调用的函数的参数处节点取值作为新的函数调用表达式节点的函数参数处节点的取值构建抽象语法树作为当前节点的解混淆子树;
所述第三解混淆条件为当前节点为eval表达式节点,且eval表达式节点对应的参数处节点的真实值是非空字符串;对应的第三解混淆策略为:采用解释器对该eval表达式节点对应的参数处节点的值进行解析得到参数的真实值,构建该参数取值的抽象语法树作为该eval表达式节点的解混淆子树。
2.如权利要求1所述的代码解混淆方法,其特征在于,所述采用解释器对该eval表达式节点对应的参数处节点的值进行解析得到参数的真实值包括:
将目标代码的抽象语法树复制出一份作为临时抽象语法树,
根据eval表达式节点对应的参数处节点的值在临时抽象语法树中确定需要解析的子树;
将需要解析的子树所在语句替换为echo语句,且echo语句的参数为该需要解析的子树;
将替换为echo语句的临时抽象语法树还原为代码,并将还原得到的代码输入到解释器进行解析得到参数的真实值。
3.如权利要求2所述的代码解混淆方法,其特征在于,所述将需要解析的子树所在语句替换为echo语句后还包括:在所述需要解析的子树的父节点和祖先节点中存在条件分支时,修改该子树所在语句相关的条件分支语句的条件表达式的取值,以使处于分支中的echo语句满足执行条件。
4.如权利要求3所述的代码解混淆方法,其特征在于,所述修改该子树所在语句相关的条件分支语句的条件表达式的取值还包括将修改后的条件表达式作为第一条语句插入到对应语句块中。
5.一种解混淆装置,其特征在于,所述装置包括:
第一模块,用于生成目标代码的抽象语法树;
第二模块,用于针对所述的抽象语法树中的每一个节点,在当前节点满足解混淆条件中的第二解混淆条件时,将抽象语法树中函数名位置的子树替换为echo语句;将替换后的抽象语法树还原为代码并输入到解释器进行解析得到函数名的真实值;以所述得到的函数名真实值作为该函数调用表达式节点对应函数名处节点的取值构建抽象语法树作为当前节点的解混淆子树;
第三模块,用于在所生成的目标代码的抽象语法树中将该当前节点的混淆子树更新为所述解混淆子树,并根据所述更新后的抽象语法树生成目标代码的解混淆代码;
其中,所述第二解混淆条件为当前节点是函数调用表达式节点,且对应的函数名处节点不为常量,所述当前节点的混淆子树为所述抽象语法树中抽取以当前节点为根的子树;
所述解混淆条件包括第一解混淆条件和第三解混淆条件,所述第二模块还用于在当前节点满足第一解混淆条件或第三解混淆条件时,采用对应的解混淆策略对当前节点进行解混淆,其中,
所述第一解混淆条件为当前节点是函数调用表达式节点,且对应的函数名处的节点为常量,且该常量为用于调用其他函数的函数的函数名,对应的第一解混淆策略为:以该函数调用表达式节点对应被调用的函数的函数名处节点的取值作为新的函数调用表达式节点的函数名处节点的取值,以该函数调用表达式节点对应被调用的函数的参数处节点取值作为新的函数调用表达式节点的函数参数处节点的取值构建抽象语法树作为当前节点的解混淆子树;
所述第三解混淆条件为当前节点为eval表达式节点,且eval表达式节点对应的参数处节点的真实值是非空字符串;对应的第三解混淆策略为:采用解释器对该eval表达式节点对应的参数处节点的值进行解析得到参数的真实值,构建该参数取值的抽象语法树作为该eval表达式节点的解混淆子树。
6.一种电子设备,包括存储器和处理器,所述存储器存储有计算机程序,其特征在于,所述处理器执行所述计算机程序时实现权利要求1至4中任一项所述方法的步骤。
7.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现权利要求1至4中任一项所述的方法的步骤。
CN202311663103.1A 2023-12-06 2023-12-06 代码解混淆方法、装置、电子设备及计算机可读存储介质 Active CN117349803B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202311663103.1A CN117349803B (zh) 2023-12-06 2023-12-06 代码解混淆方法、装置、电子设备及计算机可读存储介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202311663103.1A CN117349803B (zh) 2023-12-06 2023-12-06 代码解混淆方法、装置、电子设备及计算机可读存储介质

Publications (2)

Publication Number Publication Date
CN117349803A CN117349803A (zh) 2024-01-05
CN117349803B true CN117349803B (zh) 2024-03-19

Family

ID=89367246

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202311663103.1A Active CN117349803B (zh) 2023-12-06 2023-12-06 代码解混淆方法、装置、电子设备及计算机可读存储介质

Country Status (1)

Country Link
CN (1) CN117349803B (zh)

Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN110647329A (zh) * 2019-08-13 2020-01-03 平安科技(深圳)有限公司 代码混淆方法、装置、计算机设备和存储介质
CN114090964A (zh) * 2021-11-18 2022-02-25 北京五八信息技术有限公司 代码处理方法、装置、电子设备及可读介质
CN114296793A (zh) * 2021-12-29 2022-04-08 北京金堤科技有限公司 混淆代码的反混淆方法、装置、可读介质及电子设备
CN114357391A (zh) * 2022-01-13 2022-04-15 阿里巴巴(中国)有限公司 数据加、解密方法及计算机存储介质
CN115729797A (zh) * 2021-08-25 2023-03-03 北京有竹居网络技术有限公司 代码相似函数检测方法、装置、电子设备及存储介质
CN116340939A (zh) * 2021-12-16 2023-06-27 三六零数字安全科技集团有限公司 webshell检测方法、装置、设备及存储介质

Family Cites Families (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8429637B2 (en) * 2008-09-02 2013-04-23 Apple Inc. System and method for conditional expansion obfuscation

Patent Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN110647329A (zh) * 2019-08-13 2020-01-03 平安科技(深圳)有限公司 代码混淆方法、装置、计算机设备和存储介质
CN115729797A (zh) * 2021-08-25 2023-03-03 北京有竹居网络技术有限公司 代码相似函数检测方法、装置、电子设备及存储介质
CN114090964A (zh) * 2021-11-18 2022-02-25 北京五八信息技术有限公司 代码处理方法、装置、电子设备及可读介质
CN116340939A (zh) * 2021-12-16 2023-06-27 三六零数字安全科技集团有限公司 webshell检测方法、装置、设备及存储介质
CN114296793A (zh) * 2021-12-29 2022-04-08 北京金堤科技有限公司 混淆代码的反混淆方法、装置、可读介质及电子设备
CN114357391A (zh) * 2022-01-13 2022-04-15 阿里巴巴(中国)有限公司 数据加、解密方法及计算机存储介质

Non-Patent Citations (3)

* Cited by examiner, † Cited by third party
Title
Invoke-Deobfuscation and Semantics-Preserving Deobfuscation for Powershell Scripts;Huajun Chai;《IEEE》;全文 *
Javascript代码混淆的检测和反混淆应用研究;崔莹;;集宁师范学院学报(第03期);全文 *
通用、有效且轻量的PowerShell解混淆和语义敏感的攻击检测方法;陈焰等;《Frontiers of Information Technology & Electronic Engineering》;全文 *

Also Published As

Publication number Publication date
CN117349803A (zh) 2024-01-05

Similar Documents

Publication Publication Date Title
US10146532B2 (en) Apparatus and method for detecting code cloning of software
CN109033764B (zh) 反混淆处理方法及终端、计算机设备
CN111639344A (zh) 一种基于神经网络的漏洞检测方法及装置
US11775414B2 (en) Automated bug fixing using deep learning
CN113190849B (zh) Webshell脚本检测方法、装置、电子设备及存储介质
US20040205411A1 (en) Method of detecting malicious scripts using code insertion technique
CN102867144A (zh) 一种用于检测和清除计算机病毒的方法和装置
CN103559447A (zh) 一种基于病毒样本特征的检测方法、检测装置及检测系统
KR101645019B1 (ko) 소프트웨어 보안취약점 검출을 위한 규칙명세언어
CN115168847A (zh) 应用补丁生成方法、装置、计算机设备及可读存储介质
Wang et al. Gvd-net: Graph embedding-based machine learning model for smart contract vulnerability detection
CN117349803B (zh) 代码解混淆方法、装置、电子设备及计算机可读存储介质
CN115688108B (zh) 一种webshell静态检测方法及系统
CN117113347A (zh) 一种大规模代码数据特征提取方法及系统
CN115310087A (zh) 一种基于抽象语法树的网站后门检测方法和系统
CN115391785A (zh) 一种软件漏洞的风险检测方法、装置以及设备
CN111796832B (zh) 热补丁文件生成方法、装置、设备及存储介质
EP3872663A1 (en) Method and device for symbolic analysis of a software program
US10789067B2 (en) System and method for identifying open source usage
CN113392016A (zh) 对程序异常情况处理的规约生成方法、装置、设备及介质
CN116305131B (zh) 脚本静态去混淆方法及系统
Chen et al. Automatic detection of android steganography apps via symbolic execution and tree matching
CN115391780B (zh) 应用代码的安全加固方法、系统、设备及存储介质
RU2783152C1 (ru) Система и способ статического анализа исполняемого двоичного кода и исходного кода с использованием нечеткой логики
CN111611149B (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
GR01 Patent grant
GR01 Patent grant