反混淆处理方法及终端、计算机设备转让专利

申请号 : CN201710432152.2

文献号 : CN109033764B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 马慧培

申请人 : 腾讯科技(深圳)有限公司

摘要 :

本发明公开了一种反混淆处理方法及终端、计算机设备,所述方法包括:获取混淆数据,所述混淆数据为对原数据进行混淆处理后得到的数据;对所述混淆数据进行解析,得到所述混淆数据对应的抽象语法树;基于所述抽象语法树的结构,对所述抽象语法树的各个节点进行遍历,遍历到目标节点时,根据所述目标节点的类型对所述目标节点对应的作用域执行反混淆操作;根据反混淆操作结果对所述抽象语法树进行重建;根据重建的抽象语法树,得到所述原数据。

权利要求 :

1.一种反混淆处理方法,其特征在于,所述方法包括:

获取对源代码进行混淆处理后得到的混淆代码;

通过语法解析器对所述混淆代码进行语法解析,得到所述混淆代码对应的抽象语法树,其中,所述抽象语法树是所述源代码的抽象语法结构的树状表示,所述抽象语法树上的每个节点表示所述源代码中的一种结构;

设置用于表征作用域链的类,所述用于表征作用域链的类至少包括如下变量:作用域变量、父变量、层变量,其中,所述作用域变量用于存储当前作用域下的变量数据;所述父变量用于存储上层变量数据;所述层变量用于存储当前作用域的层级数;

根据所述混淆代码的逻辑执行顺序,对所述抽象语法树的各个节点按序进行遍历,遍历到目标节点时,识别所述目标节点的作用域,并将所述作用域变量中的数据存储至所述父变量中,将所述目标节点对应的作用域下的变量数据存储至所述作用域变量中,以及将所述层变量中的层级数增加预设步长,其中,所述目标节点的类型为函数调用类型,所述目标节点包括第一子节点和第二子节点,所述第一子节点用于表征调用的函数,所述第二子节点用于表征参数;

对所述第二子节点表征的参数进行反混淆操作;

根据所述第一子节点的类型执行相应的函数,得到函数处理结果;

将所述函数处理结果替换至所述抽象语法树中对应的节点上;

根据反混淆操作结果对所述抽象语法树进行重建;

对重建后的所述抽象语法树进行反向分析,得到所述源代码。

2.根据权利要求1所述的反混淆处理方法,其特征在于,所述方法还包括:根据所述目标节点的类型,对所述目标节点的作用域内的目标代码,执行如下操作的至少之一:变量处理操作、赋值操作、函数处理操作、一元操作、二元操作、逻辑操作、语句操作、成员表达式处理操作、解密操作。

3.一种终端,其特征在于,所述终端包括:

获取单元,用于获取对源代码进行混淆处理后得到的混淆代码;

第一解析单元,用于通过语法解析器对所述混淆代码进行语法解析,得到所述混淆代码对应的抽象语法树,其中,所述抽象语法树是所述源代码的抽象语法结构的树状表示,所述抽象语法树上的每个节点表示所述源代码中的一种结构;

设置单元,用于设置用于表征作用域链的类,所述用于表征作用域链的类至少包括如下变量:作用域变量、父变量、层变量,其中,所述作用域变量用于存储当前作用域下的变量数据;所述父变量用于存储上层变量数据;所述层变量用于存储当前作用域的层级数;

反混淆单元,用于根据所述混淆代码的逻辑执行顺序,对所述抽象语法树的各个节点按序进行遍历,遍历到目标节点时,识别所述目标节点的作用域;其中,所述目标节点的类型为函数调用类型,所述目标节点包括第一子节点和第二子节点,所述第一子节点用于表征调用的函数,所述第二子节点用于表征参数;

所述设置单元,还用于将所述作用域变量中的数据存储至所述父变量中,将目标节点对应的作用域下的变量数据存储至所述作用域变量中,以及将所述层变量中的层级数增加预设步长;

所述反混淆单元,还用于对所述第二子节点表征的参数进行反混淆操作;根据所述第一子节点的类型执行相应的函数,得到函数处理结果;将所述函数处理结果替换至所述抽象语法树中对应的节点上;

重建单元,用于根据反混淆操作结果对所述抽象语法树进行重建;

第二解析单元,用于对重建后的所述抽象语法树进行反向分析,得到所述源代码。

4.根据权利要求3所述的终端,其特征在于,所述反混淆单元还用于:根据所述目标节点的类型,对所述目标节点的作用域内的目标代码,执行如下操作的至少之一:变量处理操作、赋值操作、函数处理操作、一元操作、二元操作、逻辑操作、语句操作、成员表达式处理操作、解密操作。

5.一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机可执行指令,其特征在于,所述处理器执行所述计算机可执行指令时实现权利要求1‑2任一项所述的方法步骤。

6.一种计算机可读存储介质,其上存储有计算机可执行指令,其特征在于,该计算机可执行指令被处理器执行时实现权利要求1‑2任一项所述的方法步骤。

说明书 :

反混淆处理方法及终端、计算机设备

技术领域

[0001] 本发明涉及反混淆处理技术,尤其涉及一种反混淆处理方法及终端、计算机设备。

背景技术

[0002] Javascript是一种运行在客户端的脚本语言,所有用户都可以阅读其完整源代码。而很多开发者并不希望自己的代码逻辑、功能被直接阅读,如:安全类前端代码、敏感操作类的前端代码。而对于一些恶意软件的作者们,也会想方设法掩盖自己代码的关键逻辑,以此来躲避杀毒软件的识别查杀。为了增加代码分析的难度,很多黑客会使用代码混淆工具来加密自己的恶意软件代码,如:挂马、跨站攻击等。分析人员为了分析恶意软件代码原理、探究恶意软件的真实行为,必须得对脚本进行反混淆逆向分析处理。
[0003] 而对于大量代码混淆后难读难懂的恶意代码,自动化、辅助类反混淆逆向分析工具就尤为必要,目前业内一些Javascript反混淆逆向分析工具只能够实现简单的代码格式美化、正则替换、语法树替换等反混淆处理,对于添加了大量复杂化表达式的混淆代码,显得较为乏力。

发明内容

[0004] 为解决上述技术问题,本发明实施例提供了一种反混淆处理方法及终端、计算机存储介质、计算机设备。
[0005] 本发明实施例提供的反混淆处理方法,包括:
[0006] 获取混淆数据,所述混淆数据为对原数据进行混淆处理后得到的数据;
[0007] 对所述混淆数据进行解析,得到所述混淆数据对应的抽象语法树;
[0008] 基于所述抽象语法树的结构,对所述抽象语法树的各个节点进行遍历,遍历到目标节点时,根据所述目标节点的类型对所述目标节点对应的作用域执行反混淆操作;
[0009] 根据反混淆操作结果对所述抽象语法树进行重建;
[0010] 根据重建的抽象语法树,得到所述原数据。
[0011] 本发明实施例中,所述根据所述目标节点的类型对所述目标节点对应的作用域执行反混淆操作,包括:
[0012] 识别所述目标节点的作用域;
[0013] 根据所述目标节点的类型,对所述目标节点的作用域内的目标数据进行局部反混淆处理,并根据局部反混淆处理后的结果,更新所述抽象语法树。
[0014] 本发明实施例中,所述根据所述目标节点的类型,对所述目标节点的作用域内的目标数据进行局部反混淆处理,包括:
[0015] 根据所述目标节点的类型,对所述目标节点的作用域内的目标数据,执行如下操作的至少之一:
[0016] 变量处理操作、赋值操作、函数处理操作、一元操作、二元操作、逻辑操作、语句操作、成员表达式处理操作、解密操作。
[0017] 本发明实施例中,所述方法还包括:
[0018] 设置用于表征作用域链的类,所述用于表征作用域链的类至少包括如下变量:作用域变量、父变量、层变量,其中,
[0019] 所述作用域变量用于存储当前作用域下的变量数据;
[0020] 所述父变量用于存储上层变量数据;
[0021] 所述层变量用于存储当前作用域的层级数。
[0022] 本发明实施例中,所述方法还包括:
[0023] 遍历到目标节点时,将所述作用域变量中的数据存储至所述父变量中,将所述目标节点对应的作用域下的变量数据存储至所述作用域变量中,以及将所述层变量中的层级数增加预设步长。
[0024] 本发明实施例中,所述目标节点的类型为函数调用类型,相应地,所述目标节点包括第一子节点和第二子节点,其中,所述第一子节点用于表征调用的函数,所述第二子节点用于表征参数;
[0025] 所述根据所述目标节点的类型对所述目标节点对应的作用域执行反混淆操作,包括:
[0026] 对所述第二子节点表征的参数进行反混淆操作;
[0027] 根据所述第一子节点的类型执行相应的函数,得到函数处理结果;
[0028] 将所述函数处理结果替换至所述抽象语法树中对应的节点上。
[0029] 本发明实施例中,所述基于所述抽象语法树的结构,对所述抽象语法树的各个节点进行遍历,包括:
[0030] 根据所述混淆数据的逻辑执行顺序,对所述抽象语法树的各个节点按序进行遍历。
[0031] 本发明实施例提供的终端,包括:
[0032] 获取单元,用于获取混淆数据,所述混淆数据为对原数据进行混淆处理后得到的数据;
[0033] 第一解析单元,用于对所述混淆数据进行解析,得到所述混淆数据对应的抽象语法树;
[0034] 反混淆单元,用于基于所述抽象语法树的结构,对所述抽象语法树的各个节点进行遍历,遍历到目标节点时,根据所述目标节点的类型对所述目标节点对应的作用域执行反混淆操作;
[0035] 重建单元,用于根据反混淆操作结果对所述抽象语法树进行重建;
[0036] 第二解析单元,用于根据重建的抽象语法树,得到所述原数据。
[0037] 本发明实施例中,所述反混淆单元包括:
[0038] 作用域跟踪子单元,用于识别所述目标节点的作用域;
[0039] 反混淆处理子单元,用于根据所述目标节点的类型,对所述目标节点的作用域内的目标数据进行局部反混淆处理。
[0040] 本发明实施例中,所述反混淆处理子单元,具体用于:根据所述目标节点的类型,对所述目标节点的作用域内的目标数据,执行如下操作的至少之一:
[0041] 变量处理操作、赋值操作、函数处理操作、一元操作、二元操作、逻辑操作、语句操作、成员表达式处理操作、解密操作。
[0042] 本发明实施例中,所述终端还包括:
[0043] 设置单元,用于设置用于表征作用域链的类,所述用于表征作用域链的类至少包括如下变量:作用域变量、父变量、层变量,其中,
[0044] 所述作用域变量用于存储当前作用域下的变量数据;
[0045] 所述父变量用于存储上层变量数据;
[0046] 所述层变量用于存储当前作用域的层级数。
[0047] 本发明实施例中,所述设置单元,还用于遍历到目标节点时,将所述作用域变量中的数据存储至所述父变量中,将所述目标节点对应的作用域下的变量数据存储至所述作用域变量中,以及将所述层变量中的层级数增加预设步长。
[0048] 本发明实施例中,所述目标节点的类型为函数调用类型,相应地,所述目标节点包括第一子节点和第二子节点,其中,所述第一子节点用于表征调用的函数,所述第二子节点用于表征参数;
[0049] 所述反混淆单元,具体用于:对所述第二子节点表征的参数进行反混淆操作;根据所述第一子节点的类型执行相应的函数,得到函数处理结果;将所述函数处理结果替换至所述抽象语法树中对应的节点上。
[0050] 本发明实施例中,所述反混淆单元,用于根据所述混淆数据的逻辑执行顺序,对所述抽象语法树的各个节点按序进行遍历。
[0051] 本发明实施例提供的计算机存储介质,其上存储有计算机可执行指令,其特征在于,该计算机可执行指令被处理器执行时实现本发明实施例提供的反混淆处理方法。
[0052] 本发明实施例提供的计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机可执行指令,其特征在于,所述处理器执行所述计算机可执行指令时实现本发明实施例提供的反混淆处理方法。
[0053] 本发明实施例的技术方案中,获取混淆数据,所述混淆数据为对原数据进行混淆处理后得到的数据;对所述混淆数据进行解析,得到所述混淆数据对应的抽象语法树;基于所述抽象语法树的结构,对所述抽象语法树的各个节点进行遍历,遍历到目标节点时,根据所述目标节点的类型对所述目标节点对应的作用域执行反混淆操作;根据反混淆操作结果对所述抽象语法树进行重建;根据重建的抽象语法树,得到所述原数据。采用本发明实施例的技术方案,从抽象语法树层面遍历代码逻辑,对符合规则的代码逻辑进行局部反混淆处理,减少了代码处理的复杂度,如此,能够针对各种复杂化表达式的混淆代码实现自动化、辅助性的反混淆逆向分析,在给分析人员一定自由度的情况下能够对混淆代码实现灵活地自动化分析。

附图说明

[0054] 图1为本发明实施例的反混淆处理方法的流程示意图一;
[0055] 图2为本发明实施例的反混淆处理系统架构图;
[0056] 图3为本发明实施例的反混淆处理方法的流程示意图二;
[0057] 图4为本发明实施例的ScopeChain的类结构图;
[0058] 图5为本发明实施例的函数调用表达式语句的局部执行流程图;
[0059] 图6为本发明实施例的终端的结构组成示意图;
[0060] 图7为本发明实施例的计算机设备的结构组成示意图。

具体实施方式

[0061] 为了能够更加详尽地了解本发明实施例的特点与技术内容,下面结合附图对本发明实施例的实现进行详细阐述,所附附图仅供参考说明之用,并非用来限定本发明实施例。
[0062] 以下为本发明实施例涉及到的相关术语的解释说明:
[0063] 抽象语法树(AST,Abstract Syntax Tree):对程序语句进行词法和语法分析之后,按照该程序语句的语法规则进行推导时所形成的树,AST代表了程序语句的推导结果。
[0064] 混淆(obfuscate):代码混淆是指将程序代码,转换成功能不变,但是难于阅读和理解的形式。执行代码混淆的程序被称作代码混淆器。
[0065] 反混淆(deobfuscate):代码混淆的反向过程,对混淆后的代码进行逆向分析,还原出其最初的较为可读的源代码逻辑,执行代反码混淆的程序被称作代码反混淆器。
[0066] 为了实现对Javascript混淆代码的逆向分析,Javascript反混淆逆向分析工具(也称为JS反混淆器)大多使用代码格式美化、正则匹配替换的方式,以及使用语法树对字符串等变量进行静态替换的方式,进行反混淆处理。这些反混淆处理方案适用范围较为局限,并且误操作较多,对于使用了大量的复杂化表达式和自定义加密解密函数的混淆代码较为乏力。
[0067] 图1为本发明实施例的反混淆处理方法的流程示意图一,如图1所示,所述反混淆处理方法包括以下步骤:
[0068] 步骤101:获取混淆数据,所述混淆数据为对原数据进行混淆处理后得到的数据。
[0069] 本发明实施例的技术方案旨在对混淆数据进行反混淆处理,这里,混淆数据是指对原数据进行混淆处理后得到的数据。进一步,原数据是指具有特定语言规则的代码程序,例如Javascript。本发明以下实施例以Javascript为例进行解释说明,本领域技术人员应当理解,本发明实施例的技术方案并不局限于Javascript,还可以是其他语言的代码程序。
[0070] 本发明实施例中,获取混淆数据的方式并不做限制,以混淆数据为Javascript为例,由于Javascript是运行在客户端的脚本语言,因此,可以通过客户端直接获取到Javascript,这里,Javascript是指被混淆处理后的程序代码。
[0071] 步骤102:对所述混淆数据进行解析,得到所述混淆数据对应的抽象语法树。
[0072] 本发明实施例中,抽象语法树是源代码的抽象语法结构的树状表示,树上的每个节点都表示源代码中的一种结构。例如:在构造if-condition-then语句的抽象语法树时,只需要用两个节点来表示抽象语法树,一个节点为condition,另一个节点为if_body。
[0073] 对混淆数据进行解析,得到所述混淆数据对应的抽象语法树,也即:根据混淆数据构造对应的抽象语法树。这里,构建抽象语法树的最佳途径是伴随代码程序的语法分析过程;为每个产生式规则构建抽象语法树的节点,然后使用指针指向其叶子节点。这里,构建抽象语法树时,需要掠去一些不重要的规则(例如直接转换规则),或者再后续的分析中不要的部分(例如括号、变量声明等)。
[0074] 步骤103:基于所述抽象语法树的结构,对所述抽象语法树的各个节点进行遍历,遍历到目标节点时,根据所述目标节点的类型对所述目标节点对应的作用域执行反混淆操作。
[0075] 本发明实施例中,根据所述混淆数据的逻辑执行顺序,对所述抽象语法树的各个节点按序进行遍历。这里,由于抽象语法树代表了混淆数据的执行架构,因而,混淆数据的逻辑执行顺序也决定了抽象语法树中各个节点的执行顺序。
[0076] 所述根据所述目标节点的类型对所述目标节点对应的作用域执行反混淆操作,包括:
[0077] 识别所述目标节点的作用域;
[0078] 根据所述目标节点的类型,对所述目标节点的作用域内的目标数据进行局部反混淆处理,并根据局部反混淆处理后的结果,更新所述抽象语法树。
[0079] 这里,局部反混淆处理包括如下操作的至少之一:
[0080] 变量处理操作、赋值操作、函数处理操作、一元操作、二元操作、逻辑操作、语句操作、成员表达式处理操作、解密操作。
[0081] 上述方案中,需要根据目标节点的类型,确定需要具体执行哪些操作。
[0082] 本发明实施例中,需要设置用于表征作用域链的类,所述用于表征作用域链的类至少包括如下变量:作用域变量、父变量、层变量,其中,
[0083] 所述作用域变量用于存储当前作用域下的变量数据;
[0084] 所述父变量用于存储上层变量数据;
[0085] 所述层变量用于存储当前作用域的层级数。
[0086] 如此,可以实现作用域的跟踪,具体地:遍历到目标节点时,将所述作用域变量中的数据存储至所述父变量中,将所述目标节点对应的作用域下的变量数据存储至所述作用域变量中,以及将所述层变量中的层级数增加预设步长。这样,作用域变量中始终存储有当前作用域下的变量数据。
[0087] 步骤104:根据反混淆操作结果对所述抽象语法树进行重建。
[0088] 以目标节点的类型为函数调用类型为例,目标节点包括第一子节点和第二子节点,其中,所述第一子节点用于表征调用的函数,所述第二子节点用于表征参数。
[0089] 具体地,对所述第二子节点表征的参数进行反混淆操作;
[0090] 根据所述第一子节点的类型执行相应的函数,得到函数处理结果;
[0091] 将所述函数处理结果替换至所述抽象语法树中对应的节点上。
[0092] 步骤105:根据重建的抽象语法树,得到所述原数据。
[0093] 本发明实施例中,由于重建的抽象语法树已经被反混淆处理过,因此,可以对重建的抽象语法树进行反向分析,得到原数据。
[0094] 本发明实施例的技术方案中,从抽象语法树层面遍历代码逻辑,对符合规则的代码逻辑进行局部反混淆处理,减少了代码处理的复杂度;此外,解密已知对称算法下的混淆密文,最终输出可读的源代码内容,如此,能够针对各种复杂化表达式的混淆代码实现自动化、辅助性的反混淆逆向分析,在给分析人员一定自由度的情况下能够对混淆代码实现灵活地自动化分析。
[0095] 图2为本发明实施例的反混淆处理系统架构图,如图2所示,该系统包括如下模块:语法解析模块、反混淆模块、作用域链模块、代码输出模块、结果输出模块。以下对各个模块的功能分别进行说明,值得注意的是,以下解释说明中均以数据为代码为例:
[0096] 语法解析模块:可以通过esprima语法解析器来实现;语法解析模块将输入的混淆代码进行词法语法解析,推导生成抽象语法树,以便后续反混淆的程序化处理。
[0097] 反混淆模块:包括抽象语法树遍历功能和局部执行功能。其中,抽象语法树遍历功能是指:基于抽象语法树的结构,对每个节点进行深度优先遍历。局部执行功能是反混淆逆向分析的核心引擎,能够对不同类型的代码逻辑分支进行处理,根据节点类型进行相应的解析并局部执行操作。如:变量声明、定义、赋值,二元、一元、逻辑操作、成员变量操作、函数定义的识别等等。上述在进行局部执行操作时,需要识别当前节点的作用域,因而需要结合本发明实施例中的作用域链模块对局部代码逻辑进行求值或者等价变换处理,反混淆为更加可读的逻辑结构形式,并更新原有的抽象语法树中对应的节点。
[0098] 作用域链模块:用于记录抽象语法树结构局部执行过程中的作用域变换信息,并对执行过程中的变量进行存储以供调用。此外,能够自定义设置加解密函数以对原混淆代码中的部分内容进行解密。
[0099] 代码输出模块:用于将反混淆逆向处理后的抽象语法树结构进行代码还原,最终从新的抽象语法树还原出格式化的源代码。
[0100] 结果输出模块:用于将源代码保存到指定文件并输出。
[0101] 图3为本发明实施例的反混淆处理方法的流程示意图二,如图3所示,所述反混淆处理方法包括以下步骤:
[0102] 步骤301:对输入的源代码进行语法解析,输出对应的抽象语法树。
[0103] 这里,将源代码解析成抽象语法树结构以便后续程序化的处理,在一实施方式中,采用esprima引擎对源代码进行语法解析,输出JSON格式的抽象语法树结构。
[0104] 步骤302:对抽象语法树结构体进行遍历,根据节点的类型对相应的语句逻辑进行局部处理。
[0105] 这里,根据源代码语句的执行顺序对抽象语法树结构体进行逐步遍历,根据节点的类型对相应的语句逻辑进行局部处理。
[0106] 当遍历到抽象语法树中的某个节点(也称为目标节点)时,需要对该节点执行如下步骤303至步骤307中的一项或多项反混处理操作。
[0107] 步骤303:变量处理操作。
[0108] 这里,变量处理操作包括但不限于以下操作:变量声明、变量定义、变量赋值等相关存取操作。
[0109] 具体应用时,源代码为Javascript,基于此,执行变量处理操作的节点包括AssignmentExpression、MemberExpression、VariableDeclaration、VariableDeclarator等节点,这里,进行变量处理操作时需要结合节点当前的作用域进行具体处理。
[0110] 步骤304:函数处理操作。
[0111] 这里,函数处理操作至少包括:函数声明操作、函数表达式处理操作。在执行函数处理操作时,需要同时进行节点的作用域跟踪操作。这里,节点的作用域跟踪操作是指:当遍历到第一节点时,当前作用域即为第一节点的作用域。当遍历到下一个节点,即第二节点时,当前作用域为第二节点的作用域。可见,当前作用域需要随着当前遍历到的节点而实现跟踪切换。
[0112] 步骤305:成员表达式处理操作。
[0113] 这里,对于某些特定情况下的成员表达式进行局部执行。如:全局变量声明的字符串数组,在代码中直接使用数字下标引用其值的情况。很多混淆代码使用全局数组变量提取字符串内容,将字符串替换为数组成员变量的形式来进行代码复杂化处理。
[0114] 步骤306:一元操作、二元操作、逻辑操作。
[0115] 这里,对于一些结果固定的一元操作、二元操作、逻辑操作,需要进行预执行处理。例如:
[0116] UnaryExpression节点下的“+”“‑”“~”“!”“delete”“void”“typeof”等一元操作。
[0117] LogicalExpression节点下的“||”“&&”等逻辑操作。
[0118] BinaryExpression节点下的“|”“^”“&”“<<”“>>”“>>>”“==”“!=”“===”“>”“<”“<=”“>=”“+”“‑”“*”“/”“%”等二元操作。
[0119] 步骤307:函数调用处理操作及加解密函数的处理操作。
[0120] 本实施例中,对一些输入为常量、输出为固定值的函数进行局部预执行求值,例如:
[0121] 字符串常量的substr/charAt等方法的返回值;
[0122] 完全由字符串常量组成的数组,其join/reverse/slice等方法的返回值;
[0123] 结果为常数的数学函数调用,如Math.sin(3.14);
[0124] 以及代码预设值的加解密函数的调用。
[0125] 这里,分析人员可以根据手工分析结果,预先录入一些目标代码用到的独立函数,如自定义的加解密函数等。在遍历到这些预设值的函数调用节点时,根据分析人员录入的对应逻辑进行预执行处理,并将对应的目标代码处替换为执行后的返回值。
[0126] 步骤308:将上述反混处理后的返回值替换到对应的语法树节点上。
[0127] 步骤309:根据新的抽象语法树重新生成JavaScript代码,并美化格式后输出到指定文件。
[0128] 下面对本发明实施例的变量及作用域、函数调用等处理流程进行进一步描述。
[0129] 本发明实施例的技术方案中,为了实现自动化的对代码进行解析和局部执行,变量及作用域链起到关键作用。本发明实施例中,通过一个名为作用域链(ScopeChain)的类来进行变量的寄存、读取以及作用域链的跟踪。如图4所示,图4示意出了ScopeChain的类结构。
[0130] 基于图4的结构,本发明实施例的作用域跟踪流程如下:
[0131] 遍历处理抽象语法树时,ScopChain中的scope变量存储了当前作用域下的所有变量数据,parent变量则存储了所有上层信息,level变量存储了当前解析的作用域层级数。遍历到FunctionDeclaration、FunctionExpression等节点时,调用enter方法,表示进入下一层级作用域,并将变量scope存储到变量parent中,并给scope变量重新初始化用来存储当前作用域的变量信息。具体可以通过如下代码来实现作用域跟踪:
[0132] this.parent={"scope":this.scope,"parent":this.parent};
[0133] this.scope=Object.create(this.scope)。
[0134] 本发明实施例中的变量赋值与存取流程如下:
[0135] 变量数据通过字典键值对的形式存储在ScopeChain的scope变量中的,如:
[0136] a=1
[0137] 解析后,scope变量的值为
[0138] {"a":1}
[0139] 根据JavaScript的语法特性,有几个关键语法节点需要进行变量处理,包括:AssignmentExpression赋值表达式、VariableDeclarator变量声明、VariableDeclaration变量声明语句。
[0140] 由于JavaScript语法可以不用var关键字直接声明并使用变量,所以在处理AssignmentExpression表达式时可能也需要进行变量的初始化等操作。
[0141] 本发明实施例中,将代码中的变量分为三个类型:字面量型、引用型、标识型。
[0142] 对于字面量型,直接将其值存入到ScopeChain的scope成员变量(以下简称scope)中。
[0143] 对于引用型,需要将其引用存储到scope中,如:
[0144] a=[1,2]
[0145] b=a
[0146] b[1]=5
[0147] console.log(a)
[0148] 输出来的a是[1,5]。
[0149] 初始化和存储引用型变量时,如上述例子中的“b=a”,处理流程为:先在scope中找到a变量,并直接将其值赋值给a变量。
[0150] 对于标识型变量,这里指的是语法节点类型为Identifier且非用户自定义的变量,如document、window、String等等。这里,单独使用一个类来表示这些变量的语法信息:
[0151]
[0152] 并将这个IdentifierVar类的实例存放到scope中,在其他处调用该变量的语法节点,将其原样还原。如:
[0153] a=[1,document]
[0154] console.log(a[1])
[0155] 在上述代码中,document变量对应的抽象语法树节点为:{"type":"Identifier","name":"document"}。
[0156] 经过本发明的操作处理后,将第二行a[1]的引用处原样替换为document语法节点。反混淆后输出的代码为:
[0157]
[0158] 大多数代码混淆程序会通过一些固定输入输出的函数将代码进行复杂化处理,如:String.fromCharCode、Math.abs等方法来替换一些数字、字符串。从而使代码混淆难读。本发明实施例对这些花指令进行自动化局部执行,包括:
[0159] 特定对象属性的自动求值,如:string.length、regex.source、array.length等[0160] 特定方法的自动调用求值,如:string.charCodeAt()、string.replace()、string.slice()、number.toString()、array.concat()等等
[0161] 特定类的静态方法,如:String.fromCharCode、Number.parseInt()、Date.parse()、Math.abs()等等
[0162] 特定常亮及一些全局函数,如:Number.NaN、Math.E、isFinite()、parseFloat()、encodeURIComponent()等等。
[0163] 分析人员预设值的加解密函数,也会进行自动执行。
[0164] 这些函数执行完成后,再将对应的函数调用点替换为函数的返回值,并写入到抽象语法树中。
[0165] 图5为本发明实施例的函数调用表达式语句的局部执行流程图,如图5所示,该流程包括:
[0166] 步骤501:识别出遍历的节点为CallExpression类型的节点,对调用的参数进行预处理。
[0167] 这里,CallExpression节点包含两个子节点,一个子节点是callee,callee表示调用的具体函数,另一个子节点是arguments,arguments表示参数。
[0168] 这里,对传入的参数进行预处理。具体地,对参数进行简化,若参数中包含一些成员表达式、一元操作、二元操作、逻辑操作等,均先进行局部执行。如:
[0169] b=[1,2,3]
[0170] test(b[1],2)
[0171] 调用test函数时传入的参数b[1]会预处理为其真实值:2。处理后如下:
[0172] test(2,2)
[0173] 步骤502:根据callee的类型进行分类处理。
[0174] 这里,根据callee的类型进行如下步骤503至步骤505所述的分类处理。
[0175] 步骤503:callee为Identifier类型,对应全局函数调用。
[0176] 对于全局函数调用,进一步对其传入的参数进行判断:参数是否均为可计算值(值为常数或者可求值的变量),并判断函数名是否在可预执行函数范围内。如果是,则执行该函数,并返回结果。如果否,则查询函数名是否为分析人员预设的加解密函数,如果是则执行并返回结果。
[0177] 步骤504:callee为MemberExpression,对应特定类的静态方法调用。
[0178] 这里,callee为MemberExpression,且callee.object为Identifier类型,callee.property为Identifier类型。如:String.fromCharCode、Number.parseInt()、Date.parse()等等。
[0179] 步骤505:callee为MemberExpression,对应某些数据类型的特定方法。
[0180] 这里,callee为MemberExpression,且callee.object为Literal类型,callee.property为Identifier类型。如:['a','r','r','a','y'].join()、2..toString()、'string'.substr()
[0181] 步骤506:根据具体函数调用场景执行对应的函数,并将执行结果替换到抽象语法树的相应节点上。
[0182] 本发明实施例的技术方案,从抽象语法树层面实现了快速、自动化、准确的反混淆处理流程,可以减少大量费时费力的人工反混淆工作,自动简化代码,去除无用逻辑。此外,支持对函数调用的局部执行,分析人员可以预设加解密函数,灵活控制代码的反混淆程度。结合手工分析,可以半自动化的将一些自定义对称加密函数进行批量处理。并且,支持作用域识别,可有效识别区分不同作用域的同名标识,从语法解析层面结合语义进行处理,保证了运行的准确性,有效降低误处理。规避了可能影响代码逻辑的局部执行语句的处理,同时也具有较好的扩展性,如本发明实施例的处理流程结合具体的混淆方案自定义一套处理规则,进行针对性自动化处理。
[0183] 图6为本发明实施例的终端的结构组成示意图,如图6所示,所述终端包括:
[0184] 获取单元61,用于获取混淆数据,所述混淆数据为对原数据进行混淆处理后得到的数据;
[0185] 第一解析单元62,用于对所述混淆数据进行解析,得到所述混淆数据对应的抽象语法树;
[0186] 反混淆单元63,用于基于所述抽象语法树的结构,对所述抽象语法树的各个节点进行遍历,遍历到目标节点时,根据所述目标节点的类型对所述目标节点对应的作用域执行反混淆操作;
[0187] 重建单元64,用于根据反混淆操作结果对所述抽象语法树进行重建;
[0188] 第二解析单元65,用于根据重建的抽象语法树,得到所述原数据。
[0189] 在本发明一实施方式中,所述反混淆单元63包括:
[0190] 作用域跟踪子单元631,用于识别所述目标节点的作用域;
[0191] 反混淆处理子单元632,用于根据所述目标节点的类型,对所述目标节点的作用域内的目标数据进行局部反混淆处理。
[0192] 在本发明一实施方式中,所述反混淆处理子单元632,具体用于:根据所述目标节点的类型,对所述目标节点的作用域内的目标数据,执行如下操作的至少之一:
[0193] 变量处理操作、赋值操作、函数处理操作、一元操作、二元操作、逻辑操作、语句操作、成员表达式处理操作、解密操作。
[0194] 在本发明一实施方式中,所述终端还包括:
[0195] 设置单元66,用于设置用于表征作用域链的类,所述用于表征作用域链的类至少包括如下变量:作用域变量、父变量、层变量,其中,
[0196] 所述作用域变量用于存储当前作用域下的变量数据;
[0197] 所述父变量用于存储上层变量数据;
[0198] 所述层变量用于存储当前作用域的层级数。
[0199] 在本发明一实施方式中,所述设置单元66,还用于遍历到目标节点时,将所述作用域变量中的数据存储至所述父变量中,将所述目标节点对应的作用域下的变量数据存储至所述作用域变量中,以及将所述层变量中的层级数增加预设步长。
[0200] 在本发明一实施方式中,所述目标节点的类型为函数调用类型,相应地,所述目标节点包括第一子节点和第二子节点,其中,所述第一子节点用于表征调用的函数,所述第二子节点用于表征参数;
[0201] 所述反混淆单元63,具体用于:对所述第二子节点表征的参数进行反混淆操作;根据所述第一子节点的类型执行相应的函数,得到函数处理结果;将所述函数处理结果替换至所述抽象语法树中对应的节点上。
[0202] 在本发明一实施方式中,所述反混淆单元63,用于根据所述混淆数据的逻辑执行顺序,对所述抽象语法树的各个节点按序进行遍历。
[0203] 本发明实施例的技术方案基于抽象语法树对混淆代码(如JavaScript)进行解析,并结合语义分析,遵循代码原生语法逻辑对混淆代码进行逆向处理,同时依托局部执行的思想,对代码进行一定的静态解释执行,从而实现了高效准确的反混淆自动化处理框架。本发明实施例的技术方案不限定于特定的替换规则,根据源代码按照语法自动执行。
[0204] 本领域技术人员应当理解,图6所示的终端中的各单元的实现功能可参照前述反混淆处理方法的相关描述而理解。图6所示的终端中的各单元的功能可通过运行于处理器上的程序而实现,也可通过具体的逻辑电路而实现。
[0205] 本发明实施例上述终端如果以软件功能模块的形式实现并作为独立的产品销售或使用时,也可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明实施例的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机、服务器、或者网络设备等)执行本发明各个实施例所述方法的全部或部分。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read Only Memory)、磁碟或者光盘等各种可以存储程序代码的介质。这样,本发明实施例不限制于任何特定的硬件和软件结合。
[0206] 相应地,本发明实施例还提供一种计算机存储介质,其中存储有计算机可执行指令,该计算机可执行指令被处理器执行时实现本发明实施例的上述反混淆处理方法。
[0207] 图7为本发明实施例的计算机设备的结构组成示意图,如图7所示,所述计算机设备包括存储器701、处理器702及存储在存储器701上并可在处理器702上运行的计算机可执行指令,所述处理器702执行所述计算机可执行指令时实现如下方法步骤:
[0208] 获取混淆数据,所述混淆数据为对原数据进行混淆处理后得到的数据;
[0209] 对所述混淆数据进行解析,得到所述混淆数据对应的抽象语法树;
[0210] 基于所述抽象语法树的结构,对所述抽象语法树的各个节点进行遍历,遍历到目标节点时,根据所述目标节点的类型对所述目标节点对应的作用域执行反混淆操作;
[0211] 根据反混淆操作结果对所述抽象语法树进行重建;
[0212] 根据重建的抽象语法树,得到所述原数据。
[0213] 以上涉及计算机设备的描述,与上述方法描述是类似的,同方法的有益效果描述,不做赘述。
[0214] 本发明实施例所记载的技术方案之间,在不冲突的情况下,可以任意组合。
[0215] 以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。