一种安卓系统应用程序的保护方法和装置与流程

文档序号:12467455阅读:275来源:国知局
一种安卓系统应用程序的保护方法和装置与流程

本发明涉及安卓(Android)软件保护技术,尤其涉及一种安卓系统应用程序的保护方法和装置。



背景技术:

在对安卓系统应用程序进行保护,现有技术主要通过软件加壳和代码混淆来实现。虽然加壳和混淆是目前安卓软件开发者常用的软件保护手段,针对静态分析确实有很好的效果;但是这两种方法在反动态调试方面效果不佳,无法很好的保证程序运行时的安全。

在实现安卓系统应用程序反动态调试时,当前使用最多的反动态调试的技术方案为:通过调用ptrace系统函数来使调试器失效,从而实现反动态调试;然而,这种反动态调试的技术还至少存在以下缺点:

1)由于这种反动态调试的技术的核心在于通过调用ptrace系统函数来使调试器失效,体现在代码里只是一个函数调用,实现机制较为简单,破解者可以通过静态反编译的手段将这一函数调用注释掉,如此,反调试机制就会失效。

2)无法兼容安卓4.4及以后的版本;具体地说,由于安卓4.4及以后的版本中开启了全新的安全模式,无法再调ptrace系统函数来实现反调试。



技术实现要素:

为解决上述技术问题,本发明实施例期望提供一种安卓系统应用程序的保护方法和装置,具有较高的兼容性和安全性。

本发明的技术方案是这样实现的:

本发明实施例提供了一种安卓系统应用程序的保护方法,包括:

在安卓系统应用程序运行时,通过监测特定进程的进程状态文件,确定所 述应用程序是否处于被调试状态;所述特定进程为所述应用程序主进程或预先创建的应用程序主进程的子进程;

所述应用程序处于被调试状态时,强制退出所述应用程序。

上述方案中,所述监测特定进程状态文件包括:监测特定进程的进程状态文件的TracerPid字段的值。

上述方案中,所述确定所述应用程序是否处于被调试状态,包括:所述应用程序主进程的进程状态文件的TracerPid字段的值非0,或应用程序主进程的子进程的进程状态文件的TracerPid字段的值非0时,确定所述应用程序处于被调试状态;否则,确定所述应用程序未处于被调试状态。

上述方案中,在确定所述应用程序是否处于被调试状态之前,所述方法还包括:获取预设的反调试函数;所述反调试函数,用于在被执行时,实现第一功能和第二功能;所述第一功能为所述通过监测特定进程的进程状态文件,确定所述应用是否处于被调试状态的功能,所述第二功能为所述应用程序处于被调试状态时,强制退出所述应用程序的功能;

所述确定所述应用程序是否处于被调试状态,包括:利用所述应用程序主进程的子进程调用反调试函数,实现所述第一功能;所述应用程序处于被调试状态时,强制退出所述应用程序,包括:在反调试函数实现所述第一功能后,实现所述第二功能。

上述方案中,所述获取预设的反调试函数,包括:将预设的反调试函数封装在C语言编写的SO文件中;通过执行SO文件加载函数来调用SO文件中的反调试函数。

上述方案中,在获取预设的反调试函数之后,所述方法还包括:在所述反调试函数中创建所述应用程序主进程的子进程。

上述方案中,所述利用所述应用程序主进程的子进程调用反调试函数,包括:所述应用程序主进程的子进程每隔n秒调用反调试函数,n为正数。

上述方案中,所述强制退出所述应用程序,包括:结束所述应用程序的主进程,使所述应用程序退出。

本发明实施例还提供了一种安卓系统应用程序的保护装置,包括:确定模块和强制退出模块;其中,

确定模块,用于在安卓系统应用程序运行时,通过监测特定进程的进程状态文件,确定所述应用程序是否处于被调试状态;所述特定进程为所述应用程序主进程或预先创建的应用程序主进程的子进程;

强制退出模块,用于在所述应用程序处于被调试状态时,强制退出所述应用程序。

上述方案中,所述确定模块,具体用于通过监测特定进程的进程状态文件的TracerPid字段的值,确定所述应用程序是否处于被调试状态。

上述方案中,所述确定模块,具体用于在所述应用程序主进程的进程状态文件的TracerPid字段的值非0,或应用程序主进程的子进程的进程状态文件的TracerPid字段的值非0时,确定所述应用程序处于被调试状态;否则,确定所述应用程序未处于被调试状态。

上述方案中,所述装置还包括获取模块,用于在确定所述应用程序是否处于被调试状态之前,获取预设的反调试函数;所述反调试函数,用于在被执行时,实现第一功能和第二功能;所述第一功能为所述通过监测特定进程的进程状态文件,确定所述应用是否处于被调试状态的功能,所述第二功能为所述应用程序处于被调试状态时,强制退出所述应用程序的功能;

所述确定模块,具体用于利用所述应用程序主进程的子进程调用反调试函数,实现所述第一功能;

所述强制退出模块,具体用于在反调试函数实现所述第一功能后,利用反调试函数实现所述第二功能。

上述方案中,所述获取模块,具体用于将预设的反调试函数封装在C语言编写的SO文件中;通过执行SO文件加载函数来调用SO文件中的反调试函数。

上述方案中,所述强制退出模块,具体用于在所述应用程序处于被调试状态时,结束所述应用程序的主进程,使所述应用程序退出。

本发明实施例提供的一种安卓系统应用程序的保护方法和装置,在安卓系 统应用程序运行时,通过监测特定进程的进程状态文件的TracerPid字段的值,确定所述应用程序是否处于被调试状态;所述特定进程为所述应用程序主进程或预先创建的应用程序主进程的子进程;在所述应用程序处于被调试状态时,强制退出所述应用程序。如此,本发明实施例采用通过监测进程状态文件的TracerPid字段的值,确定所述应用程序是否处于被调试状态,适用性更广,可以兼容安卓4.4及之后的版本;并且采用信号量机制实现对特定进程的进程状态文件的实时监控,不容易被绕过,提高了应用程序的安全性。

附图说明

图1为本发明安卓系统应用程序的保护方法的第一实施例的流程图;

图2为本发明实施例安卓系统应用程序的保护装置的组成结构示意图。

具体实施方式

下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述。

第一实施例

本发明第一实施例提供了一种安卓系统应用程序的保护方法,图1为本发明安卓系统应用程序的保护方法的第一实施例的流程图,如图1所示,该流程包括:

步骤100:在安卓系统应用程序运行时,通过监测特定进程的进程状态文件,确定所述应用程序是否处于被调试状态;所述特定进程为所述应用程序主进程或预先创建的应用程序主进程的子进程。

本步骤中,所述监测特定进程状态文件包括:监测特定进程的进程状态文件的TracerPid字段的值。

这里,进程状态文件用于表示对应进程的状态,在进程状态文件中,TracerPid字段的值可以作为确定相应进程是否在被调试的依据,当TracerPid字段的值为0时,说明相应进程未被调试;否则,当TracerPid字段的值非0时, 说明相应进程在被调试;也就是说,每个进程在运行时都会将自己的进程状态以文件的形式进行实时记录,而文件中的TracerPid字段会反映该进程的调试状态;示例性地,对于进程号为$pid的进程来说,安卓系统的/proc/$pid/status文件实时反映了进程号为$pid的进程的状态,如果/proc/$pid/status文件中TracerPid字段的值为0,则说明进程号为$pid的进程处于未被调试状态。

本步骤具体包括:所述确定所述应用程序是否处于被调试状态,包括:所述应用程序主进程的进程状态文件的TracerPid字段的值非0,或应用程序主进程的子进程的进程状态文件的TracerPid字段的值非0时,确定所述应用程序处于被调试状态;否则,确定所述应用程序未处于被调试状态。

另外,本步骤中,应用程序主进程的子进程主要用于通过监测所述应用程序主进程以及自身的进程状态文件,实现对所述应用程序的保护。具体地说,在本步骤之前,获取预设的反调试函数,创建所述应用程序主进程的子进程;这里,所述反调试函数,用于在被执行时,实现第一功能;所述第一功能为所述通过监测特定进程的进程状态文件,确定所述应用是否处于被调试状态的功能,也就是说,第一功能是本步骤所实现的功能。

在实现本步骤时,利用所述应用程序主进程的子进程调用反调试函数,实现所述第一功能。

针对获取预设的反调试函数的方式,进一步地,在本步骤之前,将反调试函数进行封装,形成封装文件;在需要获取反调试函数时,从封装文件中读取出反调试函数;进一步地,获取预设的反调试函数,包括:将反调试函数进行封装时,可以将反调试函数封装于设定文件中,示例性地,设定文件C语言编写的文件,也可以利用java代码编写的文件。

在将反调试函数封装在C语言编写的SO文件时;通过执行SO文件加载函数(System.loadLibrary)来调用SO文件,调用出所述反调试函数。

具体地说,在将反调试函数封装在C语言编写的SO文件中的JNI_Onload()函数中,之后,使用Android Dalvik虚拟机执行SO文件加载函数,此时自动执行JNI_Onload()函数来完成一系列初始化操作,这样,在加载该SO文件时反调 试函数也会被读取出。

本步骤中,可以在获取预设的反调试函数之后,在反调试函数中创建所述应用程序主进程的子进程;例如,当通过加载SO文件读取出反调试函数后,在该反调试函数中创建所述应用程序主进程的子进程,这里,将应用程序主进程的子进程的ID记为child_pid,将所述应用程序主进程的ID记为parent_pid。

这里,相对于java代码,用C语言编写生成的SO文件在对抗静态逆向方面安全性更高,所以,将反调试函数封装在C语言编写的SO文件中,可以提高反调试函数的安全性。

此外,由于所述应用程序主进程的子进程创建于反调试函数中,那么,所述应用程序主进程的子进程不同于所述应用程序主进程,如此,在应用程序主进程的子进程运行时,不会影响所述应用程序。

本步骤中,所述利用所述应用程序主进程的子进程调用反调试函数,包括:所述应用程序主进程的子进程每隔n秒,调用反调试函数,n为正数。例如,n等于2。

示例性地,在子进程中设置一个定时器,该定时器可以是安卓系统提供的定时器,定时器的设定超时时间为n秒;定时器每一次超时都会触发SIGALRM信号;在子进程中通过系统函数signal()来接收SIGALRM信号,在接收到SIGALRM信号后,调用所述反调试函数。

步骤101:所述应用程序处于被调试状态时,强制退出所述应用程序。

示例性地,所述反调试函数,用于在实现第一功能的基础上,实现第二功能;所述第二功能为所述应用程序处于被调试状态时,强制退出所述应用程序的功能;也就是说,第二功能是本步骤所实现的功能。

本步骤中,强制退出所述应用程序,包括:结束所述应用程序的主进程,使所述应用程序退出;如此,在所述应用程序的主进程后,动态调试自然无法进行,从而达到反调试的效果。

需要说明的是,所述应用程序未处于被调试状态时,不作任何处理。例如,当反调试函数在实现第一功能时,如果确定应用程序未处于被调试状态,则反 调试函数不执行任何操作。

显然,反调试函数实现的功能可以总结为:读取特定进程的进程状态文件的TracerPid字段的值,如果该值为0,不做任何操作;否则,如果该值非0,则杀死所述应用程序的主进程。

可以看出,反调试函数在被执行时,采用信号量机制实现对特定进程的进程状态文件的实时监控,不容易被绕过,提高应用程序的安全性。

本发明安卓系统应用程序的保护方法的第一实施例,在确定所述应用程序处于被调试状态时,强制退出所述应用程序,不给破解者进行调试的机会;本发明第一实施例中,采用监测进程状态文件,确定所述应用程序是否处于被调试状态,适用性更广,可以兼容安卓4.4及之后的版本;采用信号量机制实现对特定进程的进程状态文件的实时监控,不容易被绕过,提高了应用程序的安全性。

第二实施例

针对本发明第一实施例的安卓系统应用程序的保护方法,本发明第二实施例提供了一种安卓系统应用程序的保护装置。

图2为本发明实施例安卓系统应用程序的保护装置的组成结构示意图,如图2所示,该装置包括:确定模块200和强制退出模块201;其中,

确定模块200,用于在安卓系统应用程序运行时,通过监测特定进程的进程状态文件,确定所述应用程序是否处于被调试状态;所述特定进程为所述应用程序主进程或预先创建的应用程序主进程的子进程。

强制退出模块201,用于在所述应用程序处于被调试状态时,强制退出所述应用程序。

具体地,所述确定模块200,具体用于通过监测特定进程的进程状态文件的TracerPid字段的值,确定所述应用程序是否处于被调试状态。

所述确定模块200,具体用于在所述应用程序主进程的进程状态文件的TracerPid字段的值非0,或应用程序主进程的子进程的进程状态文件的TracerPid字段的值非0时,确定所述应用程序处于被调试状态;否则,确定所 述应用程序未处于被调试状态。

进一步地,所述装置还包括获取模块202,用于在确定所述应用程序是否处于被调试状态之前,获取预设的反调试函数;所述反调试函数,用于在被执行时,实现第一功能和第二功能;所述第一功能为所述通过监测特定进程的进程状态文件,确定所述应用是否处于被调试状态的功能,所述第二功能为所述应用程序处于被调试状态时,强制退出所述应用程序的功能。

所述确定模块200,具体用于利用所述应用程序主进程的子进程调用反调试函数,实现所述第一功能。

所述强制退出模块201,具体用于在反调试函数实现所述第一功能后,利用反调试函数实现所述第二功能。

具体地,所述获取模块202,用于将预设的反调试函数封装在C语言编写的SO文件中;通过执行SO文件加载函数来调用SO文件中的反调试函数。

具体地,所述强制退出模块201,用于在所述应用程序处于被调试状态时,结束所述应用程序的主进程,使所述应用程序退出。

在实际应用中,所述确定模块200、强制退出模块201和获取模块202均可由位于移动终端中的中央处理器(Central Processing Unit,CPU)、微处理器(Micro Processor Unit,MPU)、数字信号处理器(Digital Signal Processor,DSP)、或现场可编程门阵列(Field Programmable Gate Array,FPGA)等实现。

本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用硬件实施例、软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器和光学存储器等)上实施的计算机程序产品的形式。

本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或 其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。

这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。

这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。

以上所述,仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1