一种应用代码加固方法、装置、电子设备及存储介质与流程

未命名 07-20 阅读:108 评论:0


1.本技术涉及网络安全技术领域,尤其涉及一种应用代码加固方法、装置、电子设备及存储介质。


背景技术:

2.目前,智能电力系统已逐渐成熟,用户已经可以基于5g手机进行智能电力系统的业务操作,但由于5g手机位置处于相对开放的环境中,容易遭受攻击,相应的增加了智能电力系统核心设备遭受攻击的风险。
3.在现有技术中,通常是采用dex加壳技术,对5g手机上部署的智能电力系统应用进行代码加固。
4.但是,随着移动应用逆向技术的不断发展,目前已经逐渐出现一些高自动化、低门槛化的免费逆向和脱壳工具,导致现有技术将无法保证应用的安全性。


技术实现要素:

5.本技术提供一种应用代码加固方法、装置、电子设备及存储介质,以解决现有技术无法保证应用的安全性等缺陷。
6.本技术第一个方面提供一种应用代码加固方法,包括:
7.获取待加固应用的代码文件;
8.在所述代码文件中提取所述待加固应用的关键函数,得到所述待加固应用中关键函数的字节码;
9.将所述关键函数的字节码转换为中间代码,得到所述关键函数的中间代码;
10.按照自定义代码虚拟化标准,对所述关键函数的中间代码进行代码虚拟化处理,以将所述中间代码转换为本机代码;
11.将所述待加固应用的代码文件中的关键函数的字节码替换为所述本机代码,以得到所述待加固应用的目标代码文件。
12.可选的,所述在所述代码文件中提取所述待加固应用的关键函数,得到所述待加固应用中关键函数的字节码,包括:
13.根据所述代码文件的函数调用树表征的各函数之间的调用关系和各函数的自代码执行率,确定各函数的总执行时间率;
14.当任一所述函数的总执行时间率达到预设总执行时间率阈值时,将该函数确定为所述待加固应用的关键函数;
15.在所述代码文件中提取所述关键函数的字节码。
16.可选的,所述根据所述代码文件的函数调用树表征的各函数之间的调用关系和各函数的自代码执行率,确定各函数的总执行时间率,包括:
17.对所述代码文件的函数调用树进行后序遍历;
18.在当前遍历节点函数的自代码执行率达到预设自代码执行率阈值时,根据所述函
数调用树表征的各函数之间的调用关系,确定所述当前遍历节点函数的父函数,将所述父函数确定为选定函数,将所述当前遍历节点函数添加到白名单;
19.获取所述选定函数所有子函数的自代码执行率/总执行时间率、各所述子函数的占用率和所述选定函数的自代码执行率;
20.将所述选定函数中自代码执行率达到预设自代码执行率阈值的子函数,或总执行时间率达到预设总执行时间率阈值的子函数,确定为目标子函数,并将所述目标子函数添加到所述白名单;
21.根据所述选定函数所有目标子函数的自代码执行率和各所述目标子函数的占用率,和/或选定函数所有目标子函数的总执行时间率和各所述目标子函数的占用率,确定所述选定函数的子函数执行率;
22.根据所述选定函数的子函数执行率和所述选定函数的自代码执行率的累加结果,确定所述选定函数的总执行时间率。
23.可选的,所述将所述关键函数的字节码转换为中间代码,得到所述关键函数的中间代码,包括:
24.将所述关键函数的字节码转换为smali代码;
25.对所述smali代码进行语义分析,得到所述smali代码的语义分析结果;
26.根据所述语义分析结果,将所述smali代码转换为同语义的中间代码,以得到所述关键函数的中间代码。
27.可选的,所述中间代码包括c语言代码,所述根据所述语义分析结果,将所述smali代码转换为同语义的中间代码,以得到所述关键函数的中间代码,包括:
28.根据所述语义分析结果,构建所述smali代码的指令路径树;
29.遍历所述指令路径树,得到所述指令路径树的遍历结果;
30.根据所述遍历结果,确定所述smali代码对应的同语义的c语言代码的中间表示;
31.根据所述遍历结果表征的各父节点与子节点之间变量的对应关系,确定所述父节点与子节点之间的冗余变量;
32.在所述c语言代码的中间表示中剔除所述冗余变量,得到所述关键函数的c语言代码。
33.可选的,所述按照自定义代码虚拟化标准,对所述关键函数的中间代码进行代码虚拟化处理,以将所述中间代码转换为本机代码,包括:
34.将所述关键函数的中间代码转换为所述关键函数的llvmir代码;
35.按照自定义代码虚拟化标准,对所述关键函数的llvmir代码进行代码虚拟化处理,以得到所述关键函数的本机代码。
36.可选的,所述按照自定义代码虚拟化标准,对所述关键函数的llvmir代码进行代码虚拟化处理,以得到所述关键函数的本机代码,包括:
37.按照自定义代码虚拟化标准,将所述关键函数的llvmir代码中的指令语句虚拟化为自定义无类型指令,得到所述关键函数的目标llvmir代码;
38.将所述目标llvmir代码转换为本机代码,以得到所述关键函数的本机代码。
39.本技术第二个方面提供一种应用代码加固装置,包括:
40.获取模块,用于获取待加固应用的代码文件;
41.函数提取模块,用于在所述代码文件中提取所述待加固应用的关键函数,得到所述待加固应用中关键函数的字节码;
42.转换模块,用于将所述关键函数的字节码转换为中间代码,得到所述关键函数的中间代码;
43.虚拟化模块,用于按照自定义代码虚拟化标准,对所述关键函数的中间代码进行代码虚拟化处理,以将所述中间代码转换为本机代码;
44.加固模块,用于将所述待加固应用的代码文件中的关键函数的字节码替换为所述本机代码,以得到所述待加固应用的目标代码文件。
45.可选的,所述函数提取模块,具体用于:
46.根据所述代码文件的函数调用树表征的各函数之间的调用关系和各函数的自代码执行率,确定各函数的总执行时间率;
47.当任一所述函数的总执行时间率达到预设总执行时间率阈值时,将该函数确定为所述待加固应用的关键函数;
48.在所述代码文件中提取所述关键函数的字节码。
49.可选的,所述函数提取模块,具体用于:
50.对所述代码文件的函数调用树进行后序遍历;
51.在当前遍历节点函数的自代码执行率达到预设自代码执行率阈值时,根据所述函数调用树表征的各函数之间的调用关系,确定所述当前遍历节点函数的父函数,将所述父函数确定为选定函数,将所述当前遍历节点函数添加到白名单;
52.获取所述选定函数所有子函数的自代码执行率/总执行时间率、各所述子函数的占用率和所述选定函数的自代码执行率;
53.将所述选定函数中自代码执行率达到预设自代码执行率阈值的子函数,或总执行时间率达到预设总执行时间率阈值的子函数,确定为目标子函数,并将所述目标子函数添加到所述白名单;
54.根据所述选定函数所有目标子函数的自代码执行率和各所述目标子函数的占用率,和/或选定函数所有目标子函数的总执行时间率和各所述目标子函数的占用率,确定所述选定函数的子函数执行率;
55.根据所述选定函数的子函数执行率和所述选定函数的自代码执行率的累加结果,确定所述选定函数的总执行时间率。
56.可选的,所述转换模块,具体用于:
57.将所述关键函数的字节码转换为smali代码;
58.对所述smali代码进行语义分析,得到所述smali代码的语义分析结果;
59.根据所述语义分析结果,将所述smali代码转换为同语义的中间代码,以得到所述关键函数的中间代码。
60.可选的,所述中间代码包括c语言代码,所述转换模块,具体用于:
61.根据所述语义分析结果,构建所述smali代码的指令路径树;
62.遍历所述指令路径树,得到所述指令路径树的遍历结果;
63.根据所述遍历结果,确定所述smali代码对应的同语义的c语言代码的中间表示;
64.根据所述遍历结果表征的各父节点与子节点之间变量的对应关系,确定所述父节
点与子节点之间的冗余变量;
65.在所述c语言代码的中间表示中剔除所述冗余变量,得到所述关键函数的c语言代码。
66.可选的,所述虚拟化模块,具体用于:
67.将所述关键函数的中间代码转换为所述关键函数的llvmir代码;
68.按照自定义代码虚拟化标准,对所述关键函数的llvmir代码进行代码虚拟化处理,以得到所述关键函数的本机代码。
69.可选的,所述虚拟化模块,具体用于:
70.按照自定义代码虚拟化标准,将所述关键函数的llvmir代码中的指令语句虚拟化为自定义无类型指令,得到所述关键函数的目标llvmir代码;
71.将所述目标llvmir代码转换为本机代码,以得到所述关键函数的本机代码。
72.本技术第三个方面提供一种电子设备,包括:至少一个处理器和存储器;
73.所述存储器存储计算机执行指令;
74.所述至少一个处理器执行所述存储器存储的计算机执行指令,使得所述至少一个处理器执行如上第一个方面以及第一个方面各种可能的设计所述的方法。
75.本技术第四个方面提供一种计算机可读存储介质,所述计算机可读存储介质中存储有计算机执行指令,当处理器执行所述计算机执行指令时,实现如上第一个方面以及第一个方面各种可能的设计所述的方法。
76.本技术技术方案,具有如下优点:
77.本技术提供的应用代码加固方法、装置、电子设备及存储介质,通过获取待加固应用的代码文件;在代码文件中提取待加固应用的关键函数,得到待加固应用中关键函数的字节码;将关键函数的字节码转换为中间代码,得到关键函数的中间代码;按照自定义代码虚拟化标准,对关键函数的中间代码进行代码虚拟化处理,以将中间代码转换为本机代码;将待加固应用的代码文件中的关键函数的字节码替换为本机代码,以得到待加固应用的目标代码文件。上述方案提供的方法,通过对待加固应用的代码文件中的关键函数字节码进行代码转换,使转换后的代码无法被恶意攻击者逆转换,实现了待加固应用的代码加固,保证了应用的安全性。
附图说明
78.为了更清楚地说明本技术实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本技术的一些实施例,对于本领域普通技术人员来讲,还可以根据这些附图获得其他的附图。
79.图1为本技术实施例基于的应用代码加固系统的结构示意图;
80.图2为本技术实施例提供的应用代码加固方法的流程示意图;
81.图3为本技术实施例提供的示例性的函数调用树的结构示意图;
82.图4为本技术实施例提供的一种示例性的smali代码指令片段示意图;
83.图5为本技术实施例提供的一种示例性的c语言代码的中间表示指令片段示意图;
84.图6为本技术实施例提供的一种示例性的指令路径树的结构示意图;
85.图7为本技术实施例提供的一种示例性的c语言代码指令片段示意图;
86.图8为本技术实施例提供的另一种示例性的c语言代码指令片段示意图;
87.图9为本技术实施例提供的示例性的llvmir代码指令片段示意图;
88.图10为本技术实施例提供的示例性的本机代码指令片段示意图;
89.图11为本技术实施例提供的应用代码加固装置的结构示意图;
90.图12为本技术实施例提供的电子设备的结构示意图。
91.通过上述附图,已示出本技术明确的实施例,后文中将有更详细的描述。这些附图和文字描述并不是为了通过任何方式限制本公开构思的范围,而是通过参考特定实施例为本领域技术人员说明本技术的概念。
具体实施方式
92.为使本技术实施例的目的、技术方案和优点更加清楚,下面将结合本技术实施例中的附图,对本技术实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本技术一部分实施例,而不是全部的实施例。基于本技术中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本技术保护的范围。
93.此外,术语“第一”、“第二”等仅用于描述目的,而不能理解为指示或暗示相对重要性或者隐含指明所指示的技术特征的数量。在以下各实施例的描述中,“多个”的含义是两个以上,除非另有明确具体的限定。
94.在低时延高可靠的场景需求下,5g手机等5g设备端到端时延要从10ms降低到1ms,在实现高安全防护的同时要保证运行速度和传输稳定性,不能影响到应用体验。不同于传统的补丁式防护手段,5g相关应用场景下依靠网络部署移动边缘计算(mec)技术来达到降低网络时延的目的。mec的实现思路是将位于数据中心的部分功能按需求下沉到用户位置的网络边缘,在边缘侧的移动终端设备上执行部分缓存、数据传输和计算来抵消与回程相关的延迟。用户使用移动终端访问业务时,可以就近访问,提高访问速度,最终实现毫秒级应用体验。但由于部署位置处于相对开放的环境中,5g设备容易遭受攻击,相应的增加了核心设备遭受攻击的风险。
95.针对5g核心网络计算能力下沉到网络边缘移动终端设备的情况,需要提出新的安全加固手段提升电力5g网络边缘侧移动终端设备的安全防护能力。面对电网5g场景超高可靠、低时延的业务需求,提出适用于边缘侧5g终端设备的网络安全交互技术,并通过试点验证提升业务安全防护能力。
96.此外,5g技术的规模化商用以及5g终端在市面上的不断销售推广,也给5g应用安全带来了巨大的挑战。近年来,智能手机应用被逆向破解进而植入病毒损害用户权益的事件屡见不鲜。如何在保证5g应用极佳用户体验基础上最大程度提升移动应用自身安全防护能力,已成为今后5g时代移动应用安全保护的重大研究内容。
97.凭借开源的开放性以及丰富的服务,android已成为5g移动设备主要的操作系统。然而,在android生态系统中,java类文件和dex文件包含大量语义信息,使得底层源代码保护变得异常困难。传统的dex加壳等方式虽能在一定程度上满足过去移动应用的加固需求,但随着移动应用逆向技术的不断发展,市面上逐渐出现一些高自动化、低门槛化的免费逆向和脱壳工具,破解一个经过一般加固的android应用所耗费的成本几乎是零。不仅如此,传统加固方案所固有的性能损耗劣势将在5g应用场景下被进一步放大。综上所述,研究一
种适用于5g场景的轻量级、高强度的android移动应用加固方案显得尤为重要。
98.针对上述问题,本技术实施例提供的应用代码加固方法、装置、电子设备及存储介质,通过获取待加固应用的代码文件;在代码文件中提取待加固应用的关键函数,得到待加固应用中关键函数的字节码;将关键函数的字节码转换为中间代码,得到关键函数的中间代码;按照自定义代码虚拟化标准,对关键函数中间代码进行代码虚拟化处理,以将中间代码转换为本机代码;将待加固应用的代码文件中的关键函数的字节码替换为本机代码,以得到待加固应用的目标代码文件。上述方案提供的方法,通过对待加固应用的代码文件中的关键函数字节码进行代码转换,使转换后的代码无法被恶意攻击者逆转换,实现了待加固应用的代码加固,保证了应用的安全性。
99.下面这几个具体的实施例可以相互结合,对于相同或相似的概念或过程可能在某些实施例中不再赘述。下面将结合附图,对本发明实施例进行描述。
100.首先,对本技术所基于的应用代码加固系统的结构进行说明:
101.本技术实施例提供的应用代码加固方法、装置、电子设备及存储介质,适用于对android应用进行代码加固,以保证应用的安全性。如图1所示,为本技术实施例基于的应用代码加固系统的结构示意图,主要包括部署有待加固应用的5g设备和用于对该待加固应用进行代码加固的电子设备。具体地,该电子设备获取待加固应用的代码文件,对代码文件进行代码转换,得到待加固应用的目标代码文件,将目标代码文件重新打包并部署至5g设备,以使5g设备基于目标代码文件运行待加固应用。
102.本技术实施例提供了一种应用代码加固方法,用于对android应用进行代码加固,以保证应用的安全性。本技术实施例的执行主体为电子设备,比如服务器、台式电脑、笔记本电脑、平板电脑及其他可用于对android应用进行代码加固的电子设备。
103.如图2所示,为本技术实施例提供的应用代码加固方法的流程示意图,该方法包括:
104.步骤201,获取待加固应用的代码文件。
105.需要说明的是,由于dex文件具有开放的文件格式和更多语义信息,这使得解码调度模式更容易暴露,造成严重的安全漏洞,因此本技术实施例获取的代码文件可以为dex文件,由dex字节码组成。
106.步骤202,在代码文件中提取待加固应用的关键函数,得到待加固应用中关键函数的字节码。
107.需要说明的是,关键函数主要指代码文件中时间和空间开销较大的函数。
108.具体地,可以基于预设的决策模型,确定代码文件中的关键函数,进而得到待加固应用中关键函数的字节码。
109.步骤203,将关键函数的字节码转换为中间代码,得到关键函数的中间代码。
110.具体地,可以对关键函数的字节码进行语义分析,并按照语义分析结果,将关键函数的字节码转换为同语义的中间代码,得到关键函数的中间代码。其中,中间代码可以为c语言代码,c语言代码可以是c或c++代码。
111.步骤204,按照自定义代码虚拟化标准,对关键函数的中间代码进行代码虚拟化处理,以将中间代码转换为本机代码。
112.需要说明的是,在可读性和简单性方面,本机代码比dex代码可读性更差,更难被
攻击者理解分析,如果通过虚拟化处理,将中间代码转换为几乎没有语义信息的本机代码,将进一步增加攻击者的理解分析难度。并且,本机代码的解析速度要比dex字节码的快2到5倍。如果将部分dex字节码转换为本机代码,则它带来的性能改进可以抵消代码虚拟化带来的部分开销。
113.步骤205,将待加固应用的代码文件中的关键函数的字节码替换为本机代码,以得到待加固应用的目标代码文件。
114.具体地,可以将得到的关键函数对应的本机代码与代码文件打包,得到待加固应用的目标代码文件,将目标代码文件部署至5g设备,以使5g设备可以基于目标代码文件运行代码加固后的应用。
115.在上述实施例的基础上,为了提高代码混淆过程的性能,减少运行时间,作为一种可实施的方式,在一实施例中,在代码文件中提取待加固应用的关键函数,得到待加固应用中关键函数的字节码,包括:
116.步骤2021,根据代码文件的函数调用树表征的各函数之间的调用关系和各函数的自代码执行率,确定各函数的总执行时间率;
117.步骤2022,当任一函数的总执行时间率达到预设总执行时间率阈值时,将该函数确定为待加固应用的关键函数;
118.步骤2023,在代码文件中提取关键函数的字节码。
119.其中,函数调用树可以通过递归查找当前函数的所有子函数,直到子函数中没有其他函数调用来生成,函数调用树中的叶子节点即不存在函数调用的函数。
120.需要说明的是,dex字节码转换为本地层代码(本机代码)是一个开销极大的过程,部分函数的程序框架已经被业内熟知,如窗口操作和页面渲染等函数,相比于核心加密和通信逻辑等关键函数,窗口操作和页面渲染等函数本身调用大量其他函数,无需浪费额外的资源进行加固,因此可以依据各函数之间的调用关系和各函数的自代码执行率,确定各函数的总执行时间率。进一步地,将总执行时间率达到预设总执行时间率阈值的函数确定为待加固应用的关键函数。
121.具体地,在一实施例中,根据代码文件的函数调用树表征的各函数之间的调用关系和各函数的自代码执行率,确定各函数的总执行时间率,包括:
122.步骤20211,对代码文件的函数调用树进行后序遍历;
123.步骤20212,在当前遍历节点函数的自代码执行率达到预设自代码执行率阈值时,根据函数调用树表征的各函数之间的调用关系,确定当前遍历节点函数的父函数,将父函数确定为选定函数,将当前遍历节点函数添加到白名单;
124.步骤20213,获取选定函数所有子函数的自代码执行率/总执行时间率、各子函数的占用率和选定函数的自代码执行率;
125.步骤20214,将选定函数中自代码执行率达到预设自代码执行率阈值的子函数,或总执行时间率达到预设总执行时间率阈值的子函数,确定为目标子函数,并将目标子函数添加到白名单;
126.步骤20215,根据选定函数所有目标子函数的自代码执行率和各目标子函数的占用率,和/或选定函数所有目标子函数的总执行时间率和各目标子函数的占用率,确定选定函数的子函数执行率;
127.步骤20216,根据选定函数的子函数执行率和选定函数的自代码执行率的累加结果,确定选定函数的总执行时间率。
128.需要说明的是,为了权衡android应用程序的安全性和效率,决策模型的目标是筛选一些关键函数并将其列入白名单。这里的关键函数被定义为具有两个属性,一个没有递归,另一个具有尽可能减少函数调用的能力,因此可以依据自代码执行率和总执行时间率判断函数是否为关键函数。其中,决策模型的检测机制是对整个执行流中每个函数的占用情况进行采集和计数。
129.示例性的,如图3所示,为本技术实施例提供的示例性的函数调用树的结构示意图,首先对函数调用树进行后序遍历,判断当前遍历节点函数的自代码执行率是否达到预设自代码执行率阈值,若预设自代码执行率阈值和预设总执行时间率阈值均为60%,当前遍历节点函数为f_1_1,f_1_1自代码执行率为50%,未达到预设自代码执行率阈值,则遍历下一节点f_1,f_1自代码执行率为65%,将f_1添加到白名单,确定f_1的父节点为f,按照后序遍历原则,f节点有右子树,因此进一步遍历其右子树,叶节点f_2_1自代码执行率为70%,将f_2_1添加到白名单,f_2确定为选定函数,因此确定选定函数f_2的总执行时间率=50%+(35%*70%)=74.5%,子函数f_2_1在选定函数f_2的占用率为35%,f_2的总执行时间率达到了预设总执行时间率阈值,将f_2添加至白名单,将f_2确定为函数f的目标子函数,在函数f中f_1占用率为10%,f_2占用率为30%,因此确定函数f的子函数执行率=10%*65%+30%*74.5%=28.85%,函数f的自代码执行率为50%,确定函数f的总执行时间率=50%+28.85%=78.85%,达到了预设总执行时间率阈值,将f添加至白名单。进一步地,将白名单中的所有函数{f_1,f_2_1,f_2,f}确定为待加固应用的关键函数。
130.在上述实施例的基础上,作为一种可实施的方式,在一实施例中,将关键函数的字节码转换为中间代码,得到关键函数的中间代码,包括:
131.步骤2031,将关键函数的字节码转换为smali代码;
132.步骤2032,对smali代码进行语义分析,得到smali代码的语义分析结果;
133.步骤2032,根据语义分析结果,将smali代码转换为同语义的中间代码,以得到关键函数的中间代码。
134.具体地,可以使用baksmali和dexdump工具将白名单中的关键函数的dex字节码反汇编成人类可读的smali代码,按照smali代码的语义分析结果,将smali代码转换为同语义的中间代码,以得到关键函数的中间代码。在代码转换的过程中,可以在中间代码中添加无用的垃圾指令来影响攻击者逆向分析。
135.具体地,在一实施例中,当中间代码为c语言代码时,可以根据语义分析结果,构建smali代码的指令路径树;遍历指令路径树,得到指令路径树的遍历结果;根据遍历结果,确定smali代码对应的同语义的c语言代码的中间表示;根据遍历结果表征的各父节点与子节点之间变量的对应关系,确定父节点与子节点之间的冗余变量;在c语言代码的中间表示中剔除冗余变量,得到关键函数的c语言代码。
136.示例性的,如图4所示,为本技术实施例提供的一种示例性的smali代码指令片段示意图,如图5所示,为本技术实施例提供的一种示例性的c语言代码的中间表示指令片段示意图,c语言代码的中间表示不具备执行能力,需要根据指令路径树分析优化,转化为对应的c语言代码。如图6所示,为本技术实施例提供的一种示例性的指令路径树的结构示意
图,为了恢复指令之间的邻接关系,使用指令路径树来表示smali代码指令的语义逻辑。分析指令序列中跳转指令的目的地址,得到指令路径树中每个节点的前驱节点、后继节点、出度和入度,然后生成smali代码指令的指令路径树。图4与图5展示了从smali代码指令到c语言代码的中间表示指令的转换过程。图6显示了与图4和图5中的指令片段对应的指令路径树。深度优先遍历用于遍历每条路径上的节点,直到覆盖所有节点,即所有节点作用于同一作用域。在遍历过程中,不断地传递当前作用域内的可访问变量,依赖于节点之间的父子关系。此外,还传递了此变量与其寄存器之间的关系。每个节点根据可用变量完成当前节点的翻译,生成c语言代码。如图7所示,为本技术实施例提供的一种示例性的c语言代码指令片段示意图,该c语言代码指令可用于后续执行。
137.具体地,为了在代码转换的过程中,优化代码,以缓解后续代码转换压力,可以根据父节点和子节点之间变量的对应关系,建立值传递之间的依赖关系以合并phi节点,使程序具有正确的执行过程。c语言代码的中间表示形式经过优化,可删除不相关的变量和无法运行的错误代码等冗余代码,以得到关键函数的c语言代码。
138.具体地,在一实施例中,在将dex字节码转化为c语言代码时,需要进行数据类型的转换。dvm(dalvik虚拟机)的字节码指令是基于寄存器的,寄存器的数量高达65536。所有寄存器均为32位非类型化。这意味着所有计算都是通过使用几乎无限数量的虚拟寄存器在寄存器级别处理的。例如,64位数据由两个相邻的32位寄存器组成。因此,在执行一段dex字节码期间,不同类型的数据存储在同一寄存器中是一种常见现象。其中,java和c/c++都是强类型语言,所有变量都必须提前声明其类型。在函数中,每个变量都有其特定的生命周期和类型。dvm用dex工具编译java源代码时,函数使用的最大寄存器数已填入dex文件的固定字段。为了识别所有变量及其类型,可以将变量以及它们使用的所有寄存器存储到映射中。如果在翻译指令时出现新变量作为赋值语句的输出,则映射将被更新。
139.在上述实施例的基础上,作为一种可实施的方式,在一实施例中,按照自定义代码虚拟化标准,对关键函数的中间代码进行代码虚拟化处理,以将中间代码转换为本机代码,包括:
140.步骤2041,将关键函数的中间代码转换为关键函数的llvmir代码;
141.步骤2042,按照自定义代码虚拟化标准,对关键函数的llvmir代码进行代码虚拟化处理,以得到关键函数的本机代码。
142.需要说明的是,llvmir被定义为三地址形式,这意味着它需要更多的寄存器。与大多数risc指令集不同,llvmir是使用简单类型系统进行强类型化的。例如,i32是32位整数,i32**是指向32位整数的指针。与机器代码的另一个显着区别是llvmir使用一组无限的以%字符命名的临时对象,而不是一组固定的命名寄存器。
143.具体地,当中间代码为c语言代码时,可以在llvm前端clang使用gcc编译器将c语言代码翻译成llvmir代码,按照自定义代码虚拟化标准,对关键函数的llvmir代码进行代码虚拟化处理,将指令定义为无数据类型,以得到关键函数的本机代码。
144.具体地,在一实施例中,可以按照自定义代码虚拟化标准,将关键函数的llvmir代码中的指令语句虚拟化为自定义无类型指令,得到关键函数的目标llvmir代码;将目标llvmir代码转换为本机代码,以得到关键函数的本机代码。
145.具体地,为了增加逆向分析的难度,将指令定义为无数据类型,即将关键函数的
llvmir代码中的指令语句虚拟化为自定义无类型指令,因此,如何使用无类型指令模拟llvmir而不丢失其语义是一个很大的挑战。本技术实施例提供了一个类似于jvm(java虚拟机)的基于堆栈的虚拟指令架构,尽管它的指令具有数据类型。本技术实施例自定义的虚拟指令的详细信息如下表所示。当将对应类型的数据压入栈顶时,jvm指令集定义了iconst、lconst、fconst等操作码。将数据压入操作定义为const虚拟指令,它要求数据在存储时与栈对齐,取出时转换为特定的数据格式。这不仅简化了指令设计的复杂度,也增加了代码虚拟化逆向分析的复杂度。
[0146][0147]
其中,llvmir是基于ssa(静态单一分配)的表示,这意味着必须在使用变量之前定义变量并且只分配一次。所以,毫无疑问,虚拟化程序的逻辑要比原来的复杂。如图8所示,为本技术实施例提供的另一种示例性的c语言代码指令片段示意图,图9所示,为本技术实施例提供的示例性的llvmir代码指令片段示意图,图10所示,为本技术实施例提供的示例性的本机代码指令片段示意图,为了表达相同的语义,不同的语言需要不同的指令数量,c/c++为3,llvmir为7,本地代码中的自定义无类型指令(虚拟指令)为29。自定义无类型指令分为三个阶段,即虚拟寄存器初始化、虚拟操作和虚拟寄存器清空。首先,根据llvmir中使用的临时变量的数量和大小,使用虚拟指令来模拟内存中的动态分配寄存器。其次,基于虚拟指令来模拟堆栈上原始程序的逻辑流程,其中虚拟寄存器用作中间存储。最后,所有虚拟寄存器的空间在虚拟指令段的末尾被销毁。
[0148]
进一步地,可以将待加固应用的代码文件和llvm后端生成的受保护的本机代码重新打包并内置到一个新的应用程序中。最后,新加固的应用程序可以在dvm上执行,并且可以在jni的帮助下在本机端和dvm之间切换。
[0149]
本技术实施例提供的应用代码加固方法,通过获取待加固应用的代码文件;在代码文件中提取待加固应用的关键函数,得到待加固应用中关键函数的字节码;将关键函数的字节码转换为中间代码,得到关键函数的中间代码;按照自定义代码虚拟化标准,对关键
函数的中间代码进行代码虚拟化处理,以将中间代码转换为本机代码;将待加固应用的代码文件中的关键函数的字节码替换为本机代码,以得到待加固应用的目标代码文件。上述方案提供的方法,通过对待加固应用的代码文件中的关键函数字节码进行代码转换,使转换后的代码无法被恶意攻击者逆转换,实现了待加固应用的代码加固,保证了应用的安全性。并且,相比于传统的android应用加固,该方法在提高安全性的同时,具有计算和存储空间消耗少,运行效率高的特点,满足了在5g电力场景下低时延高可靠的业务需求。
[0150]
本技术实施例提供了一种应用代码加固装置,用于执行上述实施例提供的应用代码加固方法。
[0151]
如图11所示,为本技术实施例提供的应用代码加固装置的结构示意图。该应用代码加固装置110包括:获取模块1101、函数提取模块1102、转换模块1103、虚拟化模块1104和加固模块1105。
[0152]
其中,获取模块,用于获取待加固应用的代码文件;函数提取模块,用于在代码文件中提取待加固应用的关键函数,得到待加固应用中关键函数的字节码;转换模块,用于将关键函数的字节码转换为中间代码,得到关键函数的中间代码;虚拟化模块,用于按照自定义代码虚拟化标准,对关键函数的中间代码进行代码虚拟化处理,以将中间代码转换为本机代码;加固模块,用于将待加固应用的代码文件中的关键函数的字节码替换为本机代码,以得到待加固应用的目标代码文件。
[0153]
具体地,在一实施例中,函数提取模块,具体用于:
[0154]
根据代码文件的函数调用树表征的各函数之间的调用关系和各函数的自代码执行率,确定各函数的总执行时间率;
[0155]
当任一函数的总执行时间率达到预设总执行时间率阈值时,将该函数确定为待加固应用的关键函数;
[0156]
在代码文件中提取关键函数的字节码。
[0157]
具体地,在一实施例中,函数提取模块,具体用于:
[0158]
对代码文件的函数调用树进行后序遍历;
[0159]
在当前遍历节点函数的自代码执行率达到预设自代码执行率阈值时,根据函数调用树表征的各函数之间的调用关系,确定当前遍历节点函数的父函数,将父函数确定为选定函数,将当前遍历节点函数添加到白名单;
[0160]
获取选定函数所有子函数的自代码执行率/总执行时间率、各子函数的占用率和选定函数的自代码执行率;
[0161]
将选定函数中自代码执行率达到预设自代码执行率阈值的子函数,或总执行时间率达到预设总执行时间率阈值的子函数,确定为目标子函数,并将目标子函数添加到白名单;
[0162]
根据选定函数所有目标子函数的自代码执行率和各目标子函数的占用率,和/或选定函数所有目标子函数的总执行时间率和各目标子函数的占用率,确定选定函数的子函数执行率;
[0163]
根据选定函数的子函数执行率和选定函数的自代码执行率的累加结果,确定选定函数的总执行时间率。
[0164]
具体地,在一实施例中,转换模块,具体用于:
[0165]
将关键函数的字节码转换为smali代码;
[0166]
对smali代码进行语义分析,得到smali代码的语义分析结果;
[0167]
根据语义分析结果,将smali代码转换为同语义的中间代码,以得到关键函数的中间代码。
[0168]
具体地,在一实施例中,中间代码包括c语言代码,转换模块,具体用于:
[0169]
根据语义分析结果,构建smali代码的指令路径树;
[0170]
遍历指令路径树,得到指令路径树的遍历结果;
[0171]
根据遍历结果,确定smali代码对应的同语义的c语言代码的中间表示;
[0172]
根据遍历结果表征的各父节点与子节点之间变量的对应关系,确定父节点与子节点之间的冗余变量;
[0173]
在c语言代码的中间表示中剔除冗余变量,得到关键函数的c语言代码。
[0174]
具体地,在一实施例中,虚拟化模块,具体用于:
[0175]
将关键函数的中间代码转换为关键函数的llvmir代码;
[0176]
按照自定义代码虚拟化标准,对关键函数的llvmir代码进行代码虚拟化处理,以得到关键函数的本机代码。
[0177]
具体地,在一实施例中,虚拟化模块,具体用于:
[0178]
按照自定义代码虚拟化标准,将关键函数的llvmir代码中的指令语句虚拟化为自定义无类型指令,得到关键函数的目标llvmir代码;
[0179]
将目标llvmir代码转换为本机代码,以得到关键函数的本机代码。
[0180]
关于本实施例中的应用代码加固装置,其中各个模块执行操作的具体方式已经在有关该方法的实施例中进行了详细描述,此处将不做详细阐述说明。
[0181]
本技术实施例提供的应用代码加固装置,用于执行上述实施例提供的应用代码加方法,其实现方式与原理相同,不再赘述。
[0182]
本技术实施例提供了一种电子设备,用于执行上述实施例提供的应用代码加固方法。
[0183]
如图12所示,为本技术实施例提供的电子设备的结构示意图。该电子设备120包括:至少一个处理器1201和存储器1202。
[0184]
存储器存储计算机执行指令;至少一个处理器执行存储器存储的计算机执行指令,使得至少一个处理器执行如上实施例提供的应用代码加固方法。
[0185]
本技术实施例提供的一种电子设备,用于执行上述实施例提供的应用代码加固方法,其实现方式与原理相同,不再赘述。
[0186]
本技术实施例提供了一种计算机可读存储介质,计算机可读存储介质中存储有计算机执行指令,当处理器执行计算机执行指令时,实现如上任一实施例提供的应用代码加固方法。
[0187]
本技术实施例的包含计算机可执行指令的存储介质,可用于存储前述实施例中提供的应用代码加固方法的计算机执行指令,其实现方式与原理相同,不再赘述。
[0188]
在本技术所提供的几个实施例中,应该理解到,所揭露的装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结
合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
[0189]
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
[0190]
另外,在本技术各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用硬件加软件功能单元的形式实现。
[0191]
上述以软件功能单元的形式实现的集成的单元,可以存储在一个计算机可读取存储介质中。上述软件功能单元存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)或处理器(processor)执行本技术各个实施例所述方法的部分步骤。而前述的存储介质包括:u盘、移动硬盘、只读存储器(read-only memory,rom)、随机存取存储器(random access memory,ram)、磁碟或者光盘等各种可以存储程序代码的介质。
[0192]
本领域技术人员可以清楚地了解到,为描述的方便和简洁,仅以上述各功能模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能模块完成,即将装置的内部结构划分成不同的功能模块,以完成以上描述的全部或者部分功能。上述描述的装置的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
[0193]
最后应说明的是:以上各实施例仅用以说明本技术的技术方案,而非对其限制;尽管参照前述各实施例对本技术进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本技术各实施例技术方案的范围。

技术特征:
1.一种应用代码加固方法,其特征在于,包括:获取待加固应用的代码文件;在所述代码文件中提取所述待加固应用的关键函数,得到所述待加固应用中关键函数的字节码;将所述关键函数的字节码转换为中间代码,得到所述关键函数的中间代码;按照自定义代码虚拟化标准,对所述关键函数的中间代码进行代码虚拟化处理,以将所述中间代码转换为本机代码;将所述待加固应用的代码文件中的关键函数的字节码替换为所述本机代码,以得到所述待加固应用的目标代码文件。2.根据权利要求1所述的方法,其特征在于,所述在所述代码文件中提取所述待加固应用的关键函数,得到所述待加固应用中关键函数的字节码,包括:根据所述代码文件的函数调用树表征的各函数之间的调用关系和各函数的自代码执行率,确定各函数的总执行时间率;当任一所述函数的总执行时间率达到预设总执行时间率阈值时,将该函数确定为所述待加固应用的关键函数;在所述代码文件中提取所述关键函数的字节码。3.根据权利要求2所述的方法,其特征在于,所述根据所述代码文件的函数调用树表征的各函数之间的调用关系和各函数的自代码执行率,确定各函数的总执行时间率,包括:对所述代码文件的函数调用树进行后序遍历;在当前遍历节点函数的自代码执行率达到预设自代码执行率阈值时,根据所述函数调用树表征的各函数之间的调用关系,确定所述当前遍历节点函数的父函数,将所述父函数确定为选定函数,将所述当前遍历节点函数添加到白名单;获取所述选定函数所有子函数的自代码执行率/总执行时间率、各所述子函数的占用率和所述选定函数的自代码执行率;将所述选定函数中自代码执行率达到预设自代码执行率阈值的子函数,或总执行时间率达到预设总执行时间率阈值的子函数,确定为目标子函数,并将所述目标子函数添加到所述白名单;根据所述选定函数所有目标子函数的自代码执行率和各所述目标子函数的占用率,和/或选定函数所有目标子函数的总执行时间率和各所述目标子函数的占用率,确定所述选定函数的子函数执行率;根据所述选定函数的子函数执行率和所述选定函数的自代码执行率的累加结果,确定所述选定函数的总执行时间率。4.根据权利要求1所述的方法,其特征在于,所述将所述关键函数的字节码转换为中间代码,得到所述关键函数的中间代码,包括:将所述关键函数的字节码转换为smali代码;对所述smali代码进行语义分析,得到所述smali代码的语义分析结果;根据所述语义分析结果,将所述smali代码转换为同语义的中间代码,以得到所述关键函数的中间代码。5.根据权利要求4所述的方法,其特征在于,所述中间代码包括c语言代码,所述根据所
述语义分析结果,将所述smali代码转换为同语义的中间代码,以得到所述关键函数的中间代码,包括:根据所述语义分析结果,构建所述smali代码的指令路径树;遍历所述指令路径树,得到所述指令路径树的遍历结果;根据所述遍历结果,确定所述smali代码对应的同语义的c语言代码的中间表示;根据所述遍历结果表征的各父节点与子节点之间变量的对应关系,确定所述父节点与子节点之间的冗余变量;在所述c语言代码的中间表示中剔除所述冗余变量,得到所述关键函数的c语言代码。6.根据权利要求1所述的方法,其特征在于,所述按照自定义代码虚拟化标准,对所述关键函数的中间代码进行代码虚拟化处理,以将所述中间代码转换为本机代码,包括:将所述关键函数的中间代码转换为所述关键函数的llvmir代码;按照自定义代码虚拟化标准,对所述关键函数的llvmir代码进行代码虚拟化处理,以得到所述关键函数的本机代码。7.根据权利要求6所述的方法,其特征在于,所述按照自定义代码虚拟化标准,对所述关键函数的llvmir代码进行代码虚拟化处理,以得到所述关键函数的本机代码,包括:按照自定义代码虚拟化标准,将所述关键函数的llvmir代码中的指令语句虚拟化为自定义无类型指令,得到所述关键函数的目标llvmir代码;将所述目标llvmir代码转换为本机代码,以得到所述关键函数的本机代码。8.一种应用代码加固装置,其特征在于,包括:获取模块,用于获取待加固应用的代码文件;函数提取模块,用于在所述代码文件中提取所述待加固应用的关键函数,得到所述待加固应用中关键函数的字节码;转换模块,用于将所述关键函数的字节码转换为中间代码,得到所述关键函数的中间代码;虚拟化模块,用于按照自定义代码虚拟化标准,对所述关键函数的中间代码进行代码虚拟化处理,以将所述中间代码转换为本机代码;加固模块,用于将所述待加固应用的代码文件中的关键函数的字节码替换为所述本机代码,以得到所述待加固应用的目标代码文件。9.根据权利要求8所述的装置,其特征在于,所述函数提取模块,具体用于:根据所述代码文件的函数调用树表征的各函数之间的调用关系和各函数的自代码执行率,确定各函数的总执行时间率;当任一所述函数的总执行时间率达到预设总执行时间率阈值时,将该函数确定为所述待加固应用的关键函数;在所述代码文件中提取所述关键函数的字节码。10.根据权利要求9所述的装置,其特征在于,所述函数提取模块,具体用于:对所述代码文件的函数调用树进行后序遍历;在当前遍历节点函数的自代码执行率达到预设自代码执行率阈值时,根据所述函数调用树表征的各函数之间的调用关系,确定所述当前遍历节点函数的父函数,将所述父函数确定为选定函数,将所述当前遍历节点函数添加到白名单;
获取所述选定函数所有子函数的自代码执行率/总执行时间率、各所述子函数的占用率和所述选定函数的自代码执行率;将所述选定函数中自代码执行率达到预设自代码执行率阈值的子函数,或总执行时间率达到预设总执行时间率阈值的子函数,确定为目标子函数,并将所述目标子函数添加到所述白名单;根据所述选定函数所有目标子函数的自代码执行率和各所述目标子函数的占用率,和/或选定函数所有目标子函数的总执行时间率和各所述目标子函数的占用率,确定所述选定函数的子函数执行率;根据所述选定函数的子函数执行率和所述选定函数的自代码执行率的累加结果,确定所述选定函数的总执行时间率。11.根据权利要求8所述的装置,其特征在于,所述转换模块,具体用于:将所述关键函数的字节码转换为smali代码;对所述smali代码进行语义分析,得到所述smali代码的语义分析结果;根据所述语义分析结果,将所述smali代码转换为同语义的中间代码,以得到所述关键函数的中间代码。12.根据权利要求11所述的装置,其特征在于,所述中间代码包括c语言代码,所述转换模块,具体用于:根据所述语义分析结果,构建所述smali代码的指令路径树;遍历所述指令路径树,得到所述指令路径树的遍历结果;根据所述遍历结果,确定所述smali代码对应的同语义的c语言代码的中间表示;根据所述遍历结果表征的各父节点与子节点之间变量的对应关系,确定所述父节点与子节点之间的冗余变量;在所述c语言代码的中间表示中剔除所述冗余变量,得到所述关键函数的c语言代码。13.根据权利要求8所述的装置,其特征在于,所述虚拟化模块,具体用于:将所述关键函数的中间代码转换为所述关键函数的llvmir代码;按照自定义代码虚拟化标准,对所述关键函数的llvmir代码进行代码虚拟化处理,以得到所述关键函数的本机代码。14.根据权利要求13所述的装置,其特征在于,所述虚拟化模块,具体用于:按照自定义代码虚拟化标准,将所述关键函数的llvmir代码中的指令语句虚拟化为自定义无类型指令,得到所述关键函数的目标llvmir代码;将所述目标llvmir代码转换为本机代码,以得到所述关键函数的本机代码。15.一种电子设备,其特征在于,包括:至少一个处理器和存储器;所述存储器存储计算机执行指令;所述至少一个处理器执行所述存储器存储的计算机执行指令,使得所述至少一个处理器执行如权利要求1至7任一项所述的方法。16.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质中存储有计算机执行指令,当处理器执行所述计算机执行指令时,实现如权利要求1至7任一项所述的方法。

技术总结
本申请提供一种应用代码加固方法、装置、电子设备及存储介质,该方法包括:获取待加固应用的代码文件;在代码文件中提取待加固应用的关键函数,得到待加固应用中关键函数的字节码;将关键函数的字节码转换为中间代码,得到关键函数的中间代码;按照自定义代码虚拟化标准,对关键函数的中间代码进行代码虚拟化处理,以将中间代码转换为本机代码;将待加固应用的代码文件中的关键函数的字节码替换为本机代码,以得到待加固应用的目标代码文件。上述方案提供的方法,通过对待加固应用的代码文件中的关键函数字节码进行代码转换,使转换后的代码无法被恶意攻击者逆转换,实现了待加固应用的代码加固,保证了应用的安全性。保证了应用的安全性。保证了应用的安全性。


技术研发人员:李尼格 陈牧 陈璐 周鹏 张涛 马媛媛 邵志鹏 郭亚琼 徐均波 方文高
受保护的技术使用者:国网浙江省电力有限公司信息通信分公司 国家电网有限公司
技术研发日:2023.02.07
技术公布日:2023/7/19
版权声明

本文仅代表作者观点,不代表航空之家立场。
本文系作者授权航家号发表,未经原创作者书面授权,任何单位或个人不得引用、复制、转载、摘编、链接或以其他任何方式复制发表。任何单位或个人在获得书面授权使用航空之家内容时,须注明作者及来源 “航空之家”。如非法使用航空之家的部分或全部内容的,航空之家将依法追究其法律责任。(航空之家官方QQ:2926969996)

飞行汽车 https://www.autovtol.com/

分享:

扫一扫在手机阅读、分享本文

相关推荐