一种针对Android平台Unity3D游戏中加壳文件的安全检测方
法及装置
技术领域
本发明涉及一种手机游戏的安全检测方法及对应的装置,尤其涉及一种针对Android平台Unity3D游戏中加壳文件的安全检测方法及装置。
背景技术
在智能手机行业,随着手机游戏的市场占有率越来越高,大部分的知名游戏开发公司都在手机游戏开发投入了较多的技术研发。随着手机游戏的复杂程度不断提高,其开发过程中不可避免地引入各种安全性的问题。手游发布后,被破解所带来的损失是无法估计的,有时候甚至是致命的,因此发布前的安全性检测至关重要。
随着安全对抗的升级,基于Mono运行时的Unity3D手游为了保证客户端安全,都会将游戏的关键逻辑封装成动态库,即so文件(SharedLibrary),例如源文件的代码被编译成汇编指令,存储于.text段;源文件中定义的字符串等信息,被存储于.rodata段。本质上so文件是一种ELF文件,其结构如图1所示,包括:
ELF头部:描述整个文件组织;
程序头部:告诉系统如何创建进程映像;
节区头部:每个节区在表中都有一项,每一项给出节区名称、大小等信息。用于链接的目标文件必含节区头部表。
使用反编译工具IDA pro打开后,可以看到ELF文件所有信息。源文件被编译成共享库生成so文件后,为了对抗静态分析,还会给so文件加壳,实际上就是对ELF文件的段做加密处理,使so文件被反编译后,不会暴露段的内容。
破解客户端的第一步就是反编译so文件,对游戏逻辑做静态分析。“壳”是客户端安全的第一道防御,“壳”的坚固程度直接影响着游戏的安全性,但需要寻找一种方法用于检测“壳”的坚固程度。
发明内容
本发明的目的是解决现有技术的不足,提供一种针对Android平台Unity3D游戏中加壳文件安全检测方法和装置,检测加壳后的游戏安装包是否真正达到加固保护的效果,以解决目前手机游戏破解难度低的问题。
为了实现上述目的,本发明采用以下的技术方案。
首先,本发明提出一种针对Android平台Unity3D游戏中加壳文件安全检测方法,包括以下步骤:
S100,解压游戏应用安装包,提取原加壳文件;
S200,反编译原加壳文件;
S300,提取内存映像中目标段的二进制内容;
S400,替换原加壳文件中的目标段的二进制内容,形成新加壳文件;
S500,利用逆向工具反编译新加壳文件,检测脱壳效果。
在本发明的上述方法中,步骤S200)还包括子步骤:
S210,检测原加壳文件是否被加壳保护;
S220,如果检测到原加壳文件已被加壳保护则继续执行下一步骤,否则直接提示安全检测结果,完成检测。
在本发明的上述方法中,步骤S300包括定位内存映像中目标段的地址。
进一步地,定位内存映像中目标段的地址包括获取原加壳文件被加载的起始地址。
进一步地,定位内存映像中目标段的地址包括获取目标段的偏移和长度。
再进一步地,在本发明的上述方法中,检测过程中用于反编译的工具为IDA pro。
其次,本发明提出针对Android平台Unity3D游戏中加壳文件安全检测装置,包括以下模块:启动模块,用于解压游戏安装包,提取原加壳文件;逆向模块,用于反编译原加壳文件和新加壳文件;查找模块,用于判断原加壳文件是否已成功加壳保护;编辑模块,用于生成新加壳文件;记录模块,用于记录新加壳文件被反编译后目标段的具体信息。
在本发明的上述装置中,编辑模块提取模块和替换模块,其中,提取模块用于提取内存映像中目标段的二进制内容,替换模块用于将原加壳文件中目标段替换为二进制内容。
在本发明的上述装置中,还包括导出模块,用于将所述记录模块中关于反编译后加壳文件中的所有段信息导出到外部文件,方便检测人员修改加壳方法。
最后,本发明还提供了一种计算机可读存储介质,其上存储有计算机指令。该指令被处理器执行时实现如前述任一项方法的步骤。
本发明的有益效果为:能直接从内存中提取相应的段信息,对加壳文件做脱壳安全检测,及早发现漏洞。
附图说明
图1所示为将关键逻辑封装的动态库so文件结构图;
图2所示为本发明所提出的加壳文件安全检测方法的一个实施例流程图;
图3所示为本发明所提出的加壳文件安全检测装置的一个实施例模块结构图;
图4所示为本发明所提出的加壳文件安全检测装置的另一个实施例模块结构图;
图5所示为本发明所提出的加壳文件安全检测方法的一个具体实施例中原加壳文件反编译图;
图6所示为本发明所提出的加壳文件安全检测方法的一个具体实施例中新加壳文件反编译图。
具体实施方式
以下将结合实施例和附图对本发明的构思、具体结构及产生的技术效果进行清楚、完整的描述,以充分地理解本发明的目的、方案和效果。需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互组合。附图中各处使用的相同的附图标记指示相同或相似的部分。
参照图2所示的一个实施例流程图,根据本发明的一个实施例,本发明所提出方法包括以下步骤:
S100,解压游戏应用安装包,提取原加壳文件,即游戏客户端中将游戏的关键逻辑成的封装Native层的动态库;
S200,利用逆向工具反编译原加壳文件,如果被检测文件已被加壳保护,则原文件中用于加载包含游戏逻辑代码的函数被反编译后,其指令序列不能显示出来,可以知道该文件被加壳保护,则直接进行步骤S300。否则,检测人员可以得知该游戏客户端安全性低,进一步对其进行加壳处理;
S300,根据逆向工具中的Segments视图获取原加壳文件中各段的偏移和长度,然后计算并提取内存映像中目标段的地址并提取该段的二进制内容;
S400,替换原加壳文件中的目标段二进制内容,形成新加壳文件;
S500,反编译新加壳文件,检测脱壳效果,并记录和导出到外部文件,便于开发人员针对游戏文件中的漏洞进行加强壳保护的设计。
具体地,在本发明的一个实施例中,计算内存映像中目标段的地址还需要获取游戏中内存映像中原加壳文件被加载的起始地址。
在本发明的一个实施例中,提取内存影像中目标段的二进制内容可以通过编程,或使用查看工具提取,例如gdb工具、hexdump工具。
下面,提出一个具体实施例进一步说明本文所提出的检测方法。
在一个具体的实施例中,以对某游戏的加壳文件即libmoso.so文件中.text段的脱壳检测为例,libmoso.so是基于Mono运行时的Unity3D手游依赖库,其中mono_image_open_from_data_with_name函数用于加载包含游戏逻辑代码的Assembly-CSharp.dll。
在上述具体的实施例中,首先解压游戏安装包,提取其中的libmono.so文件,使用逆向工具IDA pro反编译libmono.so文件,获得如图5所示的数据列表,从图中可以看出.text段的mono_image_open_from_data_with_name函数反编译后,看不到指令序列,确认其是被加壳保护的。
进一步地,确认文件是被加壳保护后,再作脱壳检测。libmono.so属于ELF文件,可以使用IDA pro的Segments视图查看其各个段的偏移和大小,可知.text段的偏移offset和长度length。
进一步地,找到游戏内存映像中libmono.so的被加载的起始地址addr,通过计算得到.text在内存中的地址=addr+offset,然后编程将起始于.text在内存中的地址长度为length的二进制内容提取出来。
进一步地,使用二进制编辑工具将原加壳文件libmono.so的.text段替换为提取出来的二进制内容,生成新的加壳文件libmono.so。使用IDA pro反编译新加壳文件libmono.so,如图6所示,可以看到其中的指令序列,也就是说原加壳文件libmono.so被脱壳了,同时说明该so文件加壳程度不够高。
参照图3所示的本发明所提出的壳文件安全检测装置的一个实施例模块结构图,本发明还提出一种针对Android平台Unity3D游戏中加壳文件安全检测装置,其特征在于,包括:启动模块,用于解压游戏安装包,提取原加壳文件;逆向模块,用于反编译原加壳文件和新加壳文件;查找模块,用于判断原加壳文件是否已成功加壳保护;编辑模块,用于生成新加壳文件;记录模块,用于记录新加壳文件被反编译后目标段的具体信息。
在本发明的一个实施例中,启动模块将待检测游戏安装包解压,获取原加壳文件;逆向模块接收来自启动模块的原加壳文件,对原加壳文件进行反编译;同时,查找模块在反编译结果中查找目标段相关的指令序列,若查找到相关指令序列,将反编译结果传递到记录模块,若查找不到相关指令序列,将反编译结果传递到编辑模块;编辑模块还包括两个子模块,分别是提取模块和替换模块,提取模块先获取游戏内存映像中原加壳文件被加载的起始位置和目标段的偏移和长度,计算出目标段的地址并提取内存映射中的目标段二进制内容,替换模块利用内存映射中的目标段二进制内容替换原加壳文件中的目标段二进制内容,形成新的加壳文件;逆向模块接收新加壳文件并进行反编译,观察文件中目标段是否被脱壳。
参照图4所示,在本发明的另一个实施例中,还包括导出模块,用于将记录模块中加壳文件所有段的具体信息导出到外部文件,在导出文件中可以知道加壳文件中哪些信息被脱壳,例如.text段、rodata段,开发人员参照导出文件的信息有针对性地对游戏文件修补漏洞,提高修复效率。
尽管本发明的描述已经相当详尽且特别对几个所述实施例进行了描述,但其并非旨在局限于任何这些细节或实施例或任何特殊实施例,而是应当将其视作是通过参考所附权利要求考虑到现有技术为这些权利要求提供广义的可能性解释,从而有效地涵盖本发明的预定范围。此外,上文以发明人可预见的实施例对本发明进行描述,其目的是为了提供有用的描述,而那些目前尚未预见的对本发明的非实质性改动仍可代表本发明的等效改动。
所述功能如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在二个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。
以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应所述以权利要求的保护范围为准。