CN108133126B - 一种安卓应用的加固方法和装置 - Google Patents

一种安卓应用的加固方法和装置 Download PDF

Info

Publication number
CN108133126B
CN108133126B CN201711260537.1A CN201711260537A CN108133126B CN 108133126 B CN108133126 B CN 108133126B CN 201711260537 A CN201711260537 A CN 201711260537A CN 108133126 B CN108133126 B CN 108133126B
Authority
CN
China
Prior art keywords
file
reinforced
instruction
library
files
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
CN201711260537.1A
Other languages
English (en)
Other versions
CN108133126A (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.)
Beijing Qihoo Technology Co Ltd
Original Assignee
Beijing Qihoo Technology Co Ltd
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 Beijing Qihoo Technology Co Ltd filed Critical Beijing Qihoo Technology Co Ltd
Priority to CN201711260537.1A priority Critical patent/CN108133126B/zh
Publication of CN108133126A publication Critical patent/CN108133126A/zh
Application granted granted Critical
Publication of CN108133126B publication Critical patent/CN108133126B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

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

Abstract

本发明公开了一种安卓应用的加固方法和装置,所述方法包括:对所述安卓应用的待加固文件中的至少部分函数,按预设的指令变换表对各函数的指令进行指令变换,得到与所述待加固文件对应的加固文件;生成用于加载所述加固文件的库文件,在所述库文件中写入与各经过指令变换的函数对应的调用逻辑和所述指令变换表;将所述库文件和所述待加固文件打包进所述安卓应用的安装包中。该技术方案示出的加密方式并不是单纯地对文件整体进行加密,而是对其中的各函数进行指令变换,由于函数的调用是在应用启动后,对变换后的指令可以根据指令变换表进行正确的识别,该过程又是一个动态过程,这样就增大了破解难度,保护了开发者的利益。

Description

一种安卓应用的加固方法和装置
技术领域
本发明涉计算机技术领域,具体涉及一种安卓应用的加固方法和装置。
背景技术
“王者荣耀”等手机游戏的流行体现了游戏业发展的趋势,游戏应用作为手机应用中的主流应用,能够为应用开发者带来巨大的经济利益。当然,除了游戏应用以外,工作、教育等其他类别的应用也可以以各种方式为应用开发者谋求利益。
利益驱动着破解者对应用进行破解,也驱动着开发者对应用进行加固,矛与盾的攻坚是无休止的,而安卓应用因为开源系统环境的原因,破解技术与加固技术的发展都十分迅速,对文件整体进行加密的手段变得越来越容易被破解,难以保护开发者的利益。
发明内容
鉴于上述问题,提出了本发明以便提供一种克服上述问题或者至少部分地解决上述问题的安卓应用的加固方法和装置。
依据本发明的一个方面,提供了一种安卓应用的加固方法,包括:
对所述安卓应用的待加固文件中的至少部分函数,按预设的指令变换表对各函数的指令进行指令变换,得到与所述待加固文件对应的加固文件;
生成用于加载所述加固文件的库文件,在所述库文件中写入与各经过指令变换的函数对应的调用逻辑和所述指令变换表;
将所述库文件和所述待加固文件打包进所述安卓应用的安装包中。
可选地,所述在所述库文件中写入与各经过指令变换的函数对应的调用逻辑和所述指令变换表还包括:
对所述指令变换表进行加密。
可选地,所述库文件用于在所述安卓应用被启动后,为所述加固文件申请第一内存块,将所述加固文件加载到所述第一内存块中。
可选地,所述调用逻辑用于在调用函数时,在所述第一内存块中定位待调用的函数的函数指令块;
根据所述指令变换表对所述函数指令块进行逆变换,编译逆变换后的函数指令块并进行调用。
可选地,所述安卓应用是基于Unity3D引擎开发的游戏应用,所述待加固文件是动态链接库dll文件,所述库文件为动态链接库SO文件。
可选地,所述dll文件为Assembly-CSharp.dll文件,所述对所述安卓应用的待加固文件中的至少部分函数,按预设的指令变换表对各函数的指令进行指令变换,得到与所述待加固文件对应的加固文件包括:
基于ECMA-335标准,对所述Assembly-CSharp.dll文件进行解析,得到所述Assembly-CSharp.dll文件中的所有函数;
从得到的函数中选择一个或多个函数,按所述指令变换表对选择的各函数的指令进行指令变换,得到加固后的Assembly-CSharp.dll文件。
可选地,所述SO文件是libmono.so文件。
可选地,该方法还包括:
提供加固接口,接收通过所述加固接口提交的安卓应用的安装包;
对所述安装包进行解包,得到解包文件,所述解包文件包含所述待加固文件和用于加载所述待加固文件的库文件;
所述将所述库文件和所述待加固文件打包进所述安卓应用的安装包中包括:以加固文件替换所述解包文件中的待加固文件,以生成的库文件替换所述解包文件中的用于加载所述待加固文件的库文件,将替换后的解包文件重新打包为安装包。
依据本发明的另一方面,提供了一种安卓应用的加固装置,包括:
加固文件生成单元,适于对所述安卓应用的待加固文件中的至少部分函数,按预设的指令变换表对各函数的指令进行指令变换,得到与所述待加固文件对应的加固文件;
库文件生成单元,适于生成用于加载所述加固文件的库文件,在所述库文件中写入与经过指令变换的函数对应的调用逻辑和所述指令变换表;
打包单元,适于将所述库文件和所述待加固文件打包进所述安卓应用的安装包中。
可选地,所述库文件生成单元,还适于对所述指令变换表进行加密。
可选地,所述库文件用于在所述安卓应用被启动后,为所述加固文件申请第一内存块,将所述加固文件加载到所述第一内存块中。
可选地,所述调用逻辑用于在调用函数时,在所述第一内存块中定位待调用的函数的函数指令块;
根据所述指令变换表对所述函数指令块进行逆变换,编译逆变换后的函数指令块并进行调用。
可选地,所述安卓应用是基于Unity3D引擎开发的游戏应用,所述待加固文件是动态链接库dll文件,所述库文件为动态链接库SO文件。
可选地,所述dll文件为Assembly-CSharp.dll文件;
所述加固文件生成单元,适于基于ECMA-335标准,对所述Assembly-CSharp.dll文件进行解析,得到所述Assembly-CSharp.dll文件中的所有函数,从得到的函数中选择一个或多个函数,按所述指令变换表对选择的各函数的指令进行指令变换,得到加固后的Assembly-CSharp.dll文件。
可选地,所述SO文件是libmono.so文件。
可选地,该装置还包括:
安装包接收单元,适于提供加固接口,接收通过所述加固接口提交的安卓应用的安装包;
解包单元,适于对所述安装包进行解包,得到解包文件,所述解包文件包含所述待加固文件和用于加载所述待加固文件的库文件;
所述打包单元,适于以加固文件替换所述解包文件中的待加固文件,以生成的库文件替换所述解包文件中的用于加载所述待加固文件的库文件,将替换后的解包文件重新打包为安装包。
依据本发明的又一方面,提供了一种电子设备,包括:处理器;以及被安排成存储计算机可执行指令的存储器,所述可执行指令在被执行时使所述处理器执行根据如上述任一项所述的方法。
依据本发明的再一方面,提供了一种计算机可读存储介质,所述计算机可读存储介质存储一个或多个程序,所述一个或多个程序当被处理器执行时,实现如上述任一项所述的方法。
由上述可知,本发明的技术方案,采用对待加固文件中函数按预设指令变换表进行指令变换的方式得到加固文件,并生成用于加载加密文件的库文件,在其中写入各加密函数的调用逻辑和指令变换表,将得到的加密文件和库文件打包进安卓应用的安装包中。该技术方案示出的加密方式并不是单纯地对文件整体进行加密,而是对其中的各函数进行指令变换,由于函数的调用是在应用启动后,对变换后的指令可以根据指令变换表进行正确的识别,该过程又是一个动态过程,这样就增大了破解难度,保护了开发者的利益。
上述说明仅是本发明技术方案的概述,为了能够更清楚了解本发明的技术手段,而可依照说明书的内容予以实施,并且为了让本发明的上述和其它目的、特征和优点能够更明显易懂,以下特举本发明的具体实施方式。
附图说明
通过阅读下文优选实施方式的详细描述,各种其他的优点和益处对于本领域普通技术人员将变得清楚明了。附图仅用于示出优选实施方式的目的,而并不认为是对本发明的限制。而且在整个附图中,用相同的参考符号表示相同的部件。在附图中:
图1示出了根据本发明一个实施例的一种安卓应用的加固方法的流程示意图;
图2示出了根据本发明一个实施例的一种安卓应用的加固装置的结构示意图;
图3示出了根据本发明一个实施例的另一种安卓应用的加固装置的结构示意图;
图4示出了根据本发明一个实施例的电子设备的结构示意图;
图5示出了根据本发明一个实施例的计算机可读存储介质的结构示意图。
具体实施方式
下面将参照附图更详细地描述本公开的示例性实施例。虽然附图中显示了本公开的示例性实施例,然而应当理解,可以以各种形式实现本公开而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本公开,并且能够将本公开的范围完整的传达给本领域的技术人员。
图1示出了根据本发明一个实施例的一种安卓应用的加固方法的流程示意图,如图1所示,该方法包括:
步骤S110,对安卓应用的待加固文件中的至少部分函数,按预设的指令变换表对各函数的指令进行指令变换,得到与待加固文件对应的加固文件。具体来说,可以根据需求,将业务相关的核心函数进行指令变换,这样在应用启动后,并不是需要对所有函数都进行识别,也就节约了应用运行时的资源消耗。
步骤S120,生成用于加载加固文件的库文件,在库文件中写入与各经过指令变换的函数对应的调用逻辑和指令变换表。依据指令变换表可以对经过指令变换的函数进行正确的识别,也就能够使函数正确地被调用执行。
步骤S130,将库文件和待加固文件打包进安卓应用的安装包中。
可见,图1所示的方法,采用对待加固文件中函数按预设指令变换表进行指令变换的方式得到加固文件,并生成用于加载加密文件的库文件,在其中写入各加密函数的调用逻辑和指令变换表,将得到的加密文件和库文件打包进安卓应用的安装包中。该技术方案示出的加密方式并不是单纯地对文件整体进行加密,而是对其中的各函数进行指令变换,由于函数的调用是在应用启动后,对变换后的指令可以根据指令变换表进行正确的识别,该过程又是一个动态过程,这样就增大了破解难度,保护了开发者的利益。
在本发明的一个实施例中,上述方法中,在库文件中写入与各经过指令变换的函数对应的调用逻辑和指令变换表还包括:对指令变换表进行加密。
在本实施例中对指令变换表进行加密,使得加固方式有了多个层级,进一步提高了应用的破解难度。
在本发明的一个实施例中,上述方法中,库文件用于在安卓应用被启动后,为加固文件申请第一内存块,将加固文件加载到第一内存块中。
在本实施例中,应用启动后,库文件先被加载执行,再由库文件对加固文件进行加载执行。在加固文件包含类、函数的情况下,库文件会在加载加固文件后,再加载其包含的类和函数。
在加载过程中并不会涉及函数的识别,而是在调用时再进行,因此在本发明的一个实施例中,上述方法中,调用逻辑用于在调用函数时,在第一内存块中定位待调用的函数的函数指令块;根据指令变换表对函数指令块进行逆变换,编译逆变换后的函数指令块并进行调用。
在本实施例中,对经过指令变换的函数指令块进行逆变换,举例来说,当一个函数指令a经过映射变换为b后,如果不对其进行逆变换,则会执行b函数指令的功能,这显然影响了应用的逻辑。而对其逆变换就是将b重新变换为a,也就正确地执行了函数指令的功能,而且由于函数指令的调用执行本来就可以通过库文件实现,也不需要开辟新的内存空间,更加节约资源。而第一内存块中的数据即使被破解者通过dump等方式获取到,也是无法被反编译工具进行正确的反编译和修改的,这就保护了开发者的利益。
在本发明的一个实施例中,上述方法中,安卓应用是基于Unity3D引擎开发的游戏应用,待加固文件是动态链接库dll文件,库文件为动态链接库SO文件。
目前,安卓游戏的开发中,Unity3D引擎,也就是通称的U3D是最为火热的技术手段,U3D通常采用C#(CSharp)和JS语言进行开发,在作为安卓应用使用时往往需要借助库文件,例如SO文件和dll文件来实现相应的功能。在本实施例中就可以对dll文件进行加固,并由SO文件来加载dll文件。
一般而言,采用U3D开发的安卓游戏应用,其所有的游戏逻辑代码均在为Assembly-CSharp.dll文件中,而游戏逻辑代码是一款游戏最需要保护的部分,因此在本发明的一个实施例中,上述方法中,dll文件为Assembly-CSharp.dll文件,对安卓应用的待加固文件中的至少部分函数,按预设的指令变换表对各函数的指令进行指令变换,得到与待加固文件对应的加固文件包括:基于ECMA-335标准,对Assembly-CSharp.dll文件进行解析,得到Assembly-CSharp.dll文件中的所有函数;从得到的函数中选择一个或多个函数,按指令变换表对选择的各函数的指令进行指令变换,得到加固后的Assembly-CSharp.dll文件。
Assembly-CSharp.dll文件通常是符合ECMA-335标准的,因此基于该标准就可以对Assembly-CSharp.dll文件进行正确的解析,并得到其中的函数。
而加载Assembly-CSharp.dll等dll文件的SO文件可以是libmono.so文件,因此在本发明的一个实施例中,上述方法中,SO文件是libmono.so文件。
在本发明的一个实施例中,上述方法还包括:提供加固接口,接收通过加固接口提交的安卓应用的安装包;对安装包进行解包,得到解包文件,解包文件包含待加固文件和用于加载待加固文件的库文件;将库文件和待加固文件打包进安卓应用的安装包中包括:以加固文件替换解包文件中的待加固文件,以生成的库文件替换解包文件中的用于加载待加固文件的库文件,将替换后的解包文件重新打包为安装包。
由于安卓应用的加固与安卓应用的开发可以是两个互相独立的过程,以同一公司为例,可以由一个项目组负责开发,另一个项目组负责加固;也可以将加固工作外包出去,也就是说,可以由一个公司提供进行加固的服务,因此在本实施例中,从这个角度进行设计,接收一个或多个公司发来的安装包,对这些安装包进行加固,因此,具体的核心加固过程也就是对这些安装包中的目标文件进行替换。
图2示出了根据本发明一个实施例的一种安卓应用的加固装置的结构示意图,如图2所示,安卓应用的加固装置200包括:
加固文件生成单元210,适于对安卓应用的待加固文件中的至少部分函数,按预设的指令变换表对各函数的指令进行指令变换,得到与待加固文件对应的加固文件。具体来说,可以根据需求,将业务相关的核心函数进行指令变换,这样在应用启动后,并不是需要对所有函数都进行识别,也就节约了应用运行时的资源消耗。
库文件生成单元220,适于生成用于加载加固文件的库文件,在库文件中写入与经过指令变换的函数对应的调用逻辑和指令变换表。依据指令变换表可以对经过指令变换的函数进行正确的识别,也就能够使函数正确地被调用执行。
打包单元230,适于将库文件和待加固文件打包进安卓应用的安装包中。
可见,图2所示的装置,通过各单元的相互配合,采用对待加固文件中函数按预设指令变换表进行指令变换的方式得到加固文件,并生成用于加载加密文件的库文件,在其中写入各加密函数的调用逻辑和指令变换表,将得到的加密文件和库文件打包进安卓应用的安装包中。该技术方案示出的加密方式并不是单纯地对文件整体进行加密,而是对其中的各函数进行指令变换,由于函数的调用是在应用启动后,对变换后的指令可以根据指令变换表进行正确的识别,该过程又是一个动态过程,这样就增大了破解难度,保护了开发者的利益。
在本发明的一个实施例中,上述装置中,库文件生成单元220,还适于对指令变换表进行加密。
在本发明的一个实施例中,上述装置中,库文件用于在安卓应用被启动后,为加固文件申请第一内存块,将加固文件加载到第一内存块中。
在本发明的一个实施例中,上述装置中,调用逻辑用于在调用函数时,在第一内存块中定位待调用的函数的函数指令块;根据指令变换表对函数指令块进行逆变换,编译逆变换后的函数指令块并进行调用。
在本发明的一个实施例中,上述装置中,安卓应用是基于Unity3D引擎开发的游戏应用,待加固文件是动态链接库dll文件,库文件为动态链接库SO文件。
在本发明的一个实施例中,上述装置中,dll文件为Assembly-CSharp.dll文件;加固文件生成单元,适于基于ECMA-335标准,对Assembly-CSharp.dll文件进行解析,得到Assembly-CSharp.dll文件中的所有函数,从得到的函数中选择一个或多个函数,按指令变换表对选择的各函数的指令进行指令变换,得到加固后的Assembly-CSharp.dll文件。
在本发明的一个实施例中,上述装置中,SO文件是libmono.so文件。
图3示出了根据本发明一个实施例的另一种安卓应用的加固装置的结构示意图,如图3所示,安卓应用的加固装置300同样包括如前的加固文件生成单元210、库文件生成单元220和打包单元230,上述各单元的功能和连接关系可以参照前述实施例,在此不再赘述。安卓应用的加固装置300还包括:
安装包接收单元340,适于提供加固接口,接收通过加固接口提交的安卓应用的安装包。
解包单元350,适于对安装包进行解包,得到解包文件,解包文件包含待加固文件和用于加载待加固文件的库文件。
打包单元230,适于以加固文件替换解包文件中的待加固文件,以生成的库文件替换解包文件中的用于加载待加固文件的库文件,将替换后的解包文件重新打包为安装包。
需要说明的是,上述各装置实施例的具体实施方式可以参照前述对应方法实施例的具体实施方式,在此不再赘述。
综上所述,本发明的技术方案,采用对待加固文件中函数按预设指令变换表进行指令变换的方式得到加固文件,并生成用于加载加密文件的库文件,在其中写入各加密函数的调用逻辑和指令变换表,将得到的加密文件和库文件打包进安卓应用的安装包中。该技术方案示出的加密方式并不是单纯地对文件整体进行加密,而是对其中的各函数进行指令变换,由于函数的调用是在应用启动后,对变换后的指令可以根据指令变换表进行正确的识别,该过程又是一个动态过程,这样就增大了破解难度,保护了开发者的利益。
需要说明的是:
在此提供的算法和显示不与任何特定计算机、虚拟装置或者其它设备固有相关。各种通用装置也可以与基于在此的示教一起使用。根据上面的描述,构造这类装置所要求的结构是显而易见的。此外,本发明也不针对任何特定编程语言。应当明白,可以利用各种编程语言实现在此描述的本发明的内容,并且上面对特定语言所做的描述是为了披露本发明的最佳实施方式。
在此处所提供的说明书中,说明了大量具体细节。然而,能够理解,本发明的实施例可以在没有这些具体细节的情况下实践。在一些实例中,并未详细示出公知的方法、结构和技术,以便不模糊对本说明书的理解。
类似地,应当理解,为了精简本公开并帮助理解各个发明方面中的一个或多个,在上面对本发明的示例性实施例的描述中,本发明的各个特征有时被一起分组到单个实施例、图、或者对其的描述中。然而,并不应将该公开的方法解释成反映如下意图:即所要求保护的本发明要求比在每个权利要求中所明确记载的特征更多的特征。更确切地说,如下面的权利要求书所反映的那样,发明方面在于少于前面公开的单个实施例的所有特征。因此,遵循具体实施方式的权利要求书由此明确地并入该具体实施方式,其中每个权利要求本身都作为本发明的单独实施例。
本领域那些技术人员可以理解,可以对实施例中的设备中的模块进行自适应性地改变并且把它们设置在与该实施例不同的一个或多个设备中。可以把实施例中的模块或单元或组件组合成一个模块或单元或组件,以及此外可以把它们分成多个子模块或子单元或子组件。除了这样的特征和/或过程或者单元中的至少一些是相互排斥之外,可以采用任何组合对本说明书(包括伴随的权利要求、摘要和附图)中公开的所有特征以及如此公开的任何方法或者设备的所有过程或单元进行组合。除非另外明确陈述,本说明书(包括伴随的权利要求、摘要和附图)中公开的每个特征可以由提供相同、等同或相似目的的替代特征来代替。
此外,本领域的技术人员能够理解,尽管在此所述的一些实施例包括其它实施例中所包括的某些特征而不是其它特征,但是不同实施例的特征的组合意味着处于本发明的范围之内并且形成不同的实施例。例如,在下面的权利要求书中,所要求保护的实施例的任意之一都可以以任意的组合方式来使用。
本发明的各个部件实施例可以以硬件实现,或者以在一个或者多个处理器上运行的软件模块实现,或者以它们的组合实现。本领域的技术人员应当理解,可以在实践中使用微处理器或者数字信号处理器(DSP)来实现根据本发明实施例的安卓应用的加固装置中的一些或者全部部件的一些或者全部功能。本发明还可以实现为用于执行这里所描述的方法的一部分或者全部的设备或者装置程序(例如,计算机程序和计算机程序产品)。这样的实现本发明的程序可以存储在计算机可读介质上,或者可以具有一个或者多个信号的形式。这样的信号可以从因特网网站上下载得到,或者在载体信号上提供,或者以任何其他形式提供。
例如,图4示出了根据本发明一个实施例的电子设备的结构示意图。该电子设备传统上包括处理器410和被安排成存储计算机可执行指令(程序代码)的存储器420。存储器420可以是诸如闪存、EEPROM(电可擦除可编程只读存储器)、EPROM、硬盘或者ROM之类的电子存储器。存储器420具有存储用于执行上述方法中的任何方法步骤的程序代码431的存储空间430。例如,用于程序代码的存储空间430可以包括分别用于实现上面的方法中的各种步骤的各个程序代码431。这些程序代码可以从一个或者多个计算机程序产品中读出或者写入到这一个或者多个计算机程序产品中。这些计算机程序产品包括诸如硬盘,紧致盘(CD)、存储卡或者软盘之类的程序代码载体。这样的计算机程序产品通常为例如图5所述的计算机可读存储介质。该计算机可读存储介质500可以具有与图4的电子设备中的存储器420类似布置的存储段、存储空间等。程序代码可以例如以适当形式进行压缩。通常,计算机可读存储介质500存储有用于执行根据本发明的方法步骤的计算机可读程序代码431’,即可以由诸如410之类的处理器读取的程序代码,当这些程序代码由电子设备运行时,导致该电子设备执行上面所描述的方法中的各个步骤。
应该注意的是上述实施例对本发明进行说明而不是对本发明进行限制,并且本领域技术人员在不脱离所附权利要求的范围的情况下可设计出替换实施例。在权利要求中,不应将位于括号之间的任何参考符号构造成对权利要求的限制。单词“包含”不排除存在未列在权利要求中的元件或步骤。位于元件之前的单词“一”或“一个”不排除存在多个这样的元件。本发明可以借助于包括有若干不同元件的硬件以及借助于适当编程的计算机来实现。在列举了若干装置的单元权利要求中,这些装置中的若干个可以是通过同一个硬件项来具体体现。单词第一、第二、以及第三等的使用不表示任何顺序。可将这些单词解释为名称。
本发明公开了A1、一种安卓应用的加固方法,包括:
对所述安卓应用的待加固文件中的至少部分函数,按预设的指令变换表对各函数的指令进行指令变换,得到与所述待加固文件对应的加固文件;
生成用于加载所述加固文件的库文件,在所述库文件中写入与各经过指令变换的函数对应的调用逻辑和所述指令变换表;
将所述库文件和所述待加固文件打包进所述安卓应用的安装包中。
A2、如A1所述的方法,其中,所述在所述库文件中写入与各经过指令变换的函数对应的调用逻辑和所述指令变换表还包括:
对所述指令变换表进行加密。
A3、如A1所述的方法,其中,所述库文件用于在所述安卓应用被启动后,为所述加固文件申请第一内存块,将所述加固文件加载到所述第一内存块中。
A4、如A3所述的方法,其中,所述调用逻辑用于在调用函数时,在所述第一内存块中定位待调用的函数的函数指令块;
根据所述指令变换表对所述函数指令块进行逆变换,编译逆变换后的函数指令块并进行调用。
A5、如A1所述的方法,其中,所述安卓应用是基于Unity3D引擎开发的游戏应用,所述待加固文件是动态链接库dll文件,所述库文件为动态链接库SO文件。
A6、如A5所述的方法,其中,所述dll文件为Assembly-CSharp.dll文件,所述对所述安卓应用的待加固文件中的至少部分函数,按预设的指令变换表对各函数的指令进行指令变换,得到与所述待加固文件对应的加固文件包括:
基于ECMA-335标准,对所述Assembly-CSharp.dll文件进行解析,得到所述Assembly-CSharp.dll文件中的所有函数;
从得到的函数中选择一个或多个函数,按所述指令变换表对选择的各函数的指令进行指令变换,得到加固后的Assembly-CSharp.dll文件。
A7、如A5所述的方法,其中,所述SO文件是libmono.so文件。
A8、如A1所述的方法,其中,该方法还包括:
提供加固接口,接收通过所述加固接口提交的安卓应用的安装包;
对所述安装包进行解包,得到解包文件,所述解包文件包含所述待加固文件和用于加载所述待加固文件的库文件;
所述将所述库文件和所述待加固文件打包进所述安卓应用的安装包中包括:以加固文件替换所述解包文件中的待加固文件,以生成的库文件替换所述解包文件中的用于加载所述待加固文件的库文件,将替换后的解包文件重新打包为安装包。
本发明还公开了B9、一种安卓应用的加固装置,包括:
加固文件生成单元,适于对所述安卓应用的待加固文件中的至少部分函数,按预设的指令变换表对各函数的指令进行指令变换,得到与所述待加固文件对应的加固文件;
库文件生成单元,适于生成用于加载所述加固文件的库文件,在所述库文件中写入与经过指令变换的函数对应的调用逻辑和所述指令变换表;
打包单元,适于将所述库文件和所述待加固文件打包进所述安卓应用的安装包中。
B10、如B9所述的装置,其中,
所述库文件生成单元,还适于对所述指令变换表进行加密。
B11、如B9所述的装置,其中,所述库文件用于在所述安卓应用被启动后,为所述加固文件申请第一内存块,将所述加固文件加载到所述第一内存块中。
B12、如B11所述的装置,其中,所述调用逻辑用于在调用函数时,在所述第一内存块中定位待调用的函数的函数指令块;
根据所述指令变换表对所述函数指令块进行逆变换,编译逆变换后的函数指令块并进行调用。
B13、如B9所述的装置,其中,所述安卓应用是基于Unity3D引擎开发的游戏应用,所述待加固文件是动态链接库dll文件,所述库文件为动态链接库SO文件。
B14、如B13所述的装置,其中,所述dll文件为Assembly-CSharp.dll文件;
所述加固文件生成单元,适于基于ECMA-335标准,对所述Assembly-CSharp.dll文件进行解析,得到所述Assembly-CSharp.dll文件中的所有函数,从得到的函数中选择一个或多个函数,按所述指令变换表对选择的各函数的指令进行指令变换,得到加固后的Assembly-CSharp.dll文件。
B15、如B13所述的装置,其中,所述SO文件是libmono.so文件。
B16、如B9所述的装置,其中,该装置还包括:
安装包接收单元,适于提供加固接口,接收通过所述加固接口提交的安卓应用的安装包;
解包单元,适于对所述安装包进行解包,得到解包文件,所述解包文件包含所述待加固文件和用于加载所述待加固文件的库文件;
所述打包单元,适于以加固文件替换所述解包文件中的待加固文件,以生成的库文件替换所述解包文件中的用于加载所述待加固文件的库文件,将替换后的解包文件重新打包为安装包。
本发明还公开了C17、一种电子设备,其中,该电子设备包括:处理器;以及被安排成存储计算机可执行指令的存储器,所述可执行指令在被执行时使所述处理器执行根据A1-A8中任一项所述的方法。
本发明还公开了D18、一种计算机可读存储介质,其中,所述计算机可读存储介质存储一个或多个程序,所述一个或多个程序当被处理器执行时,实现A1-A8中任一项所述的方法。

Claims (14)

1.一种安卓应用的加固方法,包括:
对所述安卓应用的待加固文件中的至少部分函数,按预设的指令变换表对各函数的指令进行指令变换,得到与所述待加固文件对应的加固文件;
生成用于加载所述加固文件的库文件,在所述库文件中写入与各经过指令变换的函数对应的调用逻辑和所述指令变换表,所述库文件用于在所述安卓应用被启动后,为所述加固文件申请第一内存块,将所述加固文件加载到所述第一内存块中;所述调用逻辑用于在调用函数时,在所述第一内存块中定位待调用的函数的函数指令块;根据所述指令变换表对所述函数指令块进行逆变换,编译逆变换后的函数指令块并进行调用;
将所述库文件和所述待加固文件打包进所述安卓应用的安装包中。
2.如权利要求1所述的方法,其中,所述在所述库文件中写入与各经过指令变换的函数对应的调用逻辑和所述指令变换表还包括:
对所述指令变换表进行加密。
3.如权利要求1所述的方法,其中,所述安卓应用是基于Unity3D引擎开发的游戏应用,所述待加固文件是动态链接库dll文件,所述库文件为动态链接库SO文件。
4.如权利要求3所述的方法,其中,所述dll文件为Assembly-CSharp.dll文件,所述对所述安卓应用的待加固文件中的至少部分函数,按预设的指令变换表对各函数的指令进行指令变换,得到与所述待加固文件对应的加固文件包括:
基于ECMA-335标准,对所述Assembly-CSharp.dll文件进行解析,得到所述Assembly-CSharp.dll文件中的所有函数;
从得到的函数中选择一个或多个函数,按所述指令变换表对选择的各函数的指令进行指令变换,得到加固后的Assembly-CSharp.dll文件。
5.如权利要求3所述的方法,其中,所述SO文件是libmono.so文件。
6.如权利要求1所述的方法,其中,该方法还包括:
提供加固接口,接收通过所述加固接口提交的安卓应用的安装包;
对所述安装包进行解包,得到解包文件,所述解包文件包含所述待加固文件和用于加载所述待加固文件的库文件;
所述将所述库文件和所述待加固文件打包进所述安卓应用的安装包中包括:以加固文件替换所述解包文件中的待加固文件,以生成的库文件替换所述解包文件中的用于加载所述待加固文件的库文件,将替换后的解包文件重新打包为安装包。
7.一种安卓应用的加固装置,包括:
加固文件生成单元,适于对所述安卓应用的待加固文件中的至少部分函数,按预设的指令变换表对各函数的指令进行指令变换,得到与所述待加固文件对应的加固文件;
库文件生成单元,适于生成用于加载所述加固文件的库文件,在所述库文件中写入与经过指令变换的函数对应的调用逻辑和所述指令变换表,所述库文件用于在所述安卓应用被启动后,为所述加固文件申请第一内存块,将所述加固文件加载到所述第一内存块中;所述调用逻辑用于在调用函数时,在所述第一内存块中定位待调用的函数的函数指令块;根据所述指令变换表对所述函数指令块进行逆变换,编译逆变换后的函数指令块并进行调用;
打包单元,适于将所述库文件和所述待加固文件打包进所述安卓应用的安装包中。
8.如权利要求7所述的装置,其中,
所述库文件生成单元,还适于对所述指令变换表进行加密。
9.如权利要求8所述的装置,其中,所述安卓应用是基于Unity3D引擎开发的游戏应用,所述待加固文件是动态链接库dll文件,所述库文件为动态链接库SO文件。
10.如权利要求9所述的装置,其中,所述dll文件为Assembly-CSharp.dll文件;
所述加固文件生成单元,适于基于ECMA-335标准,对所述Assembly-CSharp.dll文件进行解析,得到所述Assembly-CSharp.dll文件中的所有函数,从得到的函数中选择一个或多个函数,按所述指令变换表对选择的各函数的指令进行指令变换,得到加固后的Assembly-CSharp.dll文件。
11.如权利要求9所述的装置,其中,所述SO文件是libmono.so文件。
12.如权利要求7所述的装置,其中,该装置还包括:
安装包接收单元,适于提供加固接口,接收通过所述加固接口提交的安卓应用的安装包;
解包单元,适于对所述安装包进行解包,得到解包文件,所述解包文件包含所述待加固文件和用于加载所述待加固文件的库文件;
所述打包单元,适于以加固文件替换所述解包文件中的待加固文件,以生成的库文件替换所述解包文件中的用于加载所述待加固文件的库文件,将替换后的解包文件重新打包为安装包。
13.一种电子设备,其中,该电子设备包括:处理器;以及被安排成存储计算机可执行指令的存储器,所述可执行指令在被执行时使所述处理器执行根据权利要求1-6中任一项所述的方法。
14.一种计算机可读存储介质,其中,所述计算机可读存储介质存储一个或多个程序,所述一个或多个程序当被处理器执行时,实现权利要求1-6中任一项所述的方法。
CN201711260537.1A 2017-12-04 2017-12-04 一种安卓应用的加固方法和装置 Active CN108133126B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201711260537.1A CN108133126B (zh) 2017-12-04 2017-12-04 一种安卓应用的加固方法和装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201711260537.1A CN108133126B (zh) 2017-12-04 2017-12-04 一种安卓应用的加固方法和装置

Publications (2)

Publication Number Publication Date
CN108133126A CN108133126A (zh) 2018-06-08
CN108133126B true CN108133126B (zh) 2021-04-06

Family

ID=62388940

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201711260537.1A Active CN108133126B (zh) 2017-12-04 2017-12-04 一种安卓应用的加固方法和装置

Country Status (1)

Country Link
CN (1) CN108133126B (zh)

Families Citing this family (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN108846264A (zh) * 2018-06-11 2018-11-20 北京奇虎科技有限公司 代码加固方法、装置、智能终端和计算机可读存储介质
CN112685697B (zh) * 2019-10-17 2022-10-21 福建天晴数码有限公司 一种防止安卓应用被破解篡改的方法及终端
CN111596970B (zh) * 2020-05-12 2023-04-28 广州市百果园信息技术有限公司 动态库延迟加载方法、装置、设备和存储介质
CN112134905B (zh) * 2020-11-20 2021-02-09 深圳市房多多网络科技有限公司 基于安卓系统的签名方法、装置以及设备

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103186746A (zh) * 2013-03-26 2013-07-03 北京深思数盾科技有限公司 一种可执行文件的保护方法及系统
CN105512521A (zh) * 2015-12-25 2016-04-20 北京奇虎科技有限公司 一种软件安装包的加固保护方法和系统
CN105930735A (zh) * 2016-04-22 2016-09-07 北京奇虎科技有限公司 一种文件加固方法及装置
CN106295370A (zh) * 2016-08-19 2017-01-04 北京奇虎科技有限公司 一种加固安装包的动态链接库dll文件的方法和装置

Family Cites Families (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN107038354A (zh) * 2016-02-03 2017-08-11 阿里巴巴集团控股有限公司 代码混淆方法、代码运行方法及装置
CN106203006A (zh) * 2016-08-31 2016-12-07 北京鼎源科技有限公司 基于dex与so文件动态执行的Android应用加固方法

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103186746A (zh) * 2013-03-26 2013-07-03 北京深思数盾科技有限公司 一种可执行文件的保护方法及系统
CN105512521A (zh) * 2015-12-25 2016-04-20 北京奇虎科技有限公司 一种软件安装包的加固保护方法和系统
CN105930735A (zh) * 2016-04-22 2016-09-07 北京奇虎科技有限公司 一种文件加固方法及装置
CN106295370A (zh) * 2016-08-19 2017-01-04 北京奇虎科技有限公司 一种加固安装包的动态链接库dll文件的方法和装置

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
"Unity3D 加密 Assembly-CSharp.dll(Android平台)防止反编译";iiiCircle;《http://blog.csdn.net/u013108312/article/details/54234439》;20170108;1-5 *

Also Published As

Publication number Publication date
CN108133126A (zh) 2018-06-08

Similar Documents

Publication Publication Date Title
CN107977552B (zh) 一种安卓应用的加固方法和装置
CN108133126B (zh) 一种安卓应用的加固方法和装置
CN106295370B (zh) 一种加固安装包的动态链接库dll文件的方法和装置
CN108345773B (zh) 基于虚拟机的代码保护方法及装置、电子设备、存储介质
CN103460217B (zh) 用于保护应用程序的方法及其装置
JP5602597B2 (ja) 外来情報を区分けすることにより仮想マシン・コードをメモリ最適化する方法、コンピュータ・プログラム、およびシステム
CN106355049B (zh) 一种加固安卓安装包的动态链接库so文件的方法和装置
CN103914637B (zh) 一种安卓平台的可执行程序加密方法
CN105653432B (zh) 一种崩溃数据的处理方法和装置
KR20150024842A (ko) 적응식 이식가능 라이브러리
CN109598107A (zh) 一种基于应用安装包文件的代码转换方法及装置
CN108846264A (zh) 代码加固方法、装置、智能终端和计算机可读存储介质
CN109614772B (zh) 基于应用安装包文件的代码转换方法及装置
CN105404794A (zh) Java应用软件的保护方法和装置
CN105989252A (zh) 一种针对函数级别加壳的脱壳方法及系统
US11036852B2 (en) System and method for software diversification
CN110119601B (zh) 基于应用程序安装包的程序加固方法及装置
CN110147653A (zh) 应用程序安全加固方法及装置
US20150347745A1 (en) Method for extracting executable code of application using memory dump
CN107092517B (zh) 一种sdk工具包的生成方法及装置
CN106681782B (zh) 一种编译安卓安装包的动态链接库so文件的方法和装置
CN107463423B (zh) 依赖包工具的验证方法、存储介质、电子设备及系统
CN111198690A (zh) 一种安装包的修改方法和装置
KR101863325B1 (ko) 역공학 방지 방법 및 장치
CN108460276B (zh) 一种安卓安装包的动态链接库so文件的处理方法和装置

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