掌桥专利:专业的专利平台
掌桥专利
首页

一种安卓系统反调试的检测方法、移动终端及存储介质

文献发布时间:2023-06-19 09:29:07


一种安卓系统反调试的检测方法、移动终端及存储介质

技术领域

本发明涉及移动终端技术领域,具体涉及一种安卓(Android)系统反调试的检测方法、移动终端及存储介质。

背景技术

Android系统自发布之后,因其开源性、开放性和可定制性,备受行业人员青睐,如今Android系统的市场占有率非常高且每年都呈正增长趋势,但是Android系统也因其自身的开放性和高市场占有率,安卓系统上的应用程序(以下简称应用)也渐渐成为黑客攻击的主要对象。

攻击者在攻击Android系统上的某个应用时,通常情况下攻击者在获得目标应用之后,会做简单的静态反编译查看,并搜索敏感调用的接口,然后再分析较为关键的代码实现逻辑,最后通过直接修改代码或者利用其它修改工具篡改关键信息,以此达到攻击目的。

目前,Android系统上的应用为了防止被攻击,主要采用代码混淆、核心参数加密或加固(也称为加壳)处理,如此可以使攻击者在静态反编译查看后,获取不到有用的代码实现逻辑,如此造成攻击者在静态分析时具有一定的阻碍和难度,但是,为了快速准确的实现攻击和篡改,攻击者会利用动态调试技术,采用一个或多个调试工具(例如IDA、apktool)对应用进行调试,具体为在应用运行过程中针对性地对有效代码进行定位,并通过单步调试或动态追踪等方式分析关键的代码实现逻辑,进而达到攻击的目的。可以看出,Android系统应用在运行过程中的安全性仍然较低。

因此,现有技术还有待于改进和发展。

发明内容

鉴于上述现有技术的不足,本发明的目的在于提供一种安卓系统反调试的检测方法、移动终端及存储介质,旨在解决现有安卓系统中应用在运行过程中安全性不高的问题。

第一方面,本发明提供的一种安卓系统反调试的检测方法,所述方法包括以下步骤:

预先在Android系统动态链接库的初始化函数中编译用于检测网络端口状态和应用进程状态的检测代码,并在应用的启动代码中添加所述检测代码的加载链接;

应用启动后加载并执行所述检测代码,所述检测代码根据所述网络端口状态和应用进程状态判断应用是否被调试工具调试;

若检测到应用被调试工具调试时,则弹出提示对话框并终止应用。

进一步地,所述检测代码根据所述网络端口状态和应用进程状态判断应用是否被调试工具攻击的步骤包括:

检测网络端口是否被调试工具占用,若是,则应用正被调试工具调试。

进一步地,所述检测代码根据所述网络端口状态和应用进程状态判断应用是否被调试工具攻击的步骤包括:

监听并捕获调试工具是否向应用主进程发送进程调试信号,若是,则应用正被调试工具调试;所述进程调试信号包括:使应用主进程继续运行的SIGCONT信号、使与应用主进程相关的线程暂停运行的SIGSTOP信号。

进一步地,所述检测代码根据所述网络端口状态和应用进程状态判断应用是否被调试工具攻击的步骤包括:

检测应用主进程的状态值和与所述主进程相关的所有线程的状态值,若所述主进程的状态值和所有线程的状态值中至少有一个为T,则应用正被调试工具调试。

进一步地,所述检测代码根据所述网络端口状态和应用进程状态判断应用是否被调试工具攻击的步骤还包括:

建立用于读取应用主进程状态值的第一进程,检测所述第一进程读取到的状态值是否为T,若是,则应用正被调试工具调试。

进一步地,所述检测代码根据所述网络端口状态和应用进程状态判断应用是否被调试工具攻击的步骤包括:

预先建立第二进程,并设置第一时间阈值、第一终止时间,

所述第二进程向应用主进程发送第一检验数据后,把第一终止时间置为零后开始计时,

所述应用主进程接收到所述第一校验数据后向所述第二进程发送第二校验数据,

所述第二进程接收到所述第二检验数据后停止计时,并保存所述第一终止时间,

检测所述第一终止时间是否大于所述第一时间阈值,若是,则应用正被调试工具调试,若不是,则继续执行所述第二进程向应用主进程发送第一检验数据后,把终止时间置为零后开始计时的步骤。

进一步地,所述检测代码根据所述网络端口状态和应用进程状态判断应用是否被调试工具攻击的步骤包括:

预先建立第三进程,并设置第二时间阈值、第二终止时间,

应用主进程向所述第三进程发送第一检验数据后,把第二终止时间置为零后开始计时,

所述第三进程接收到所述第一校验数据后向所述应用主进程发送第二校验数据,

所述应用主进程接收到所述第二检验数据后停止计时,并保存所述第二终止时间,

检测所述第二终止时间是否大于所述第二时间阈值,若是,则应用正被调试工具调试,若不是,则继续执行应用主进程向所述第三进程发送第一检验数据后,把第二终止时间置为零后开始计时的步骤。

第二方面,本发明提供一种移动终端,其中,包括,处理器、存储器和通信总线;

所述存储器上存储有可被所述处理器执行的安卓系统反调试的检测方法程序;

所述通信总线实现处理器和存储器之间的连接通信;

所述处理器执行所述安卓系统反调试的检测方法程序时实现任意一项所述的安卓系统反调试的检测方法中的步骤。

第三方面,本发明提供一种计算机可读存储介质,其中,所述计算机可读存储介质存储有一个或者多个程序,所述一个或者多个程序可被一个或者多个处理器执行,以实现任意一项所述的安卓系统反调试的检测方法中的步骤。

第四方面,本发明提供一种安卓系统反调试的检测装置,其中,包括:

启动单元,用于启动应用和加载检测代码;

检测单元,用于实时检测应用是否被调试工具调试;

处理单元,用于弹出提示对话框并终止应用。

相较于现有技术,本发明提供了一种安卓系统反调试的检测方法、移动终端及存储介质,由于预先在Android系统动态链接库编译了检测代码,并在应用的启动代码中添加了检测代码的加载链接,能够使应用在启动后加载并执行检测代码,检测代码在应用运行过程中根据网络端口的状态和应用主进程的状态,能够精准且及时的检测出应用是否正被常见的或不常见的调试工具调试,一旦检测出应用正被调试工具调试,立即弹出对话框并终止程序,从而中断了调试工具对应用的调试,有效防止应用受攻击,提高了应用运行时的安全性。

附图说明

图1为本发明提供的一种安卓系统反调试的检测方法的流程图。

图2为本发明移动终端较佳实施例的功能模块图。

图3为本发明安装移动终端较佳实施例的功能模块图。

具体实施方式

本发明提供了一种安卓系统反调试的检测方法、移动终端及存储介质,为使本发明的目的、技术方案及效果更加清楚、明确,以下对本发明进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。

请参阅图1,本发明提供的一种安卓系统反调试的检测方法包括以下步骤:

S10、预先在Android系统动态链接库的初始化函数中编译用于检测网络端口状态和应用进程状态的检测代码,并在应用的启动代码中添加所述检测代码的加载链接;

在Android系统中,任何一个应用的根目录中都必须包含一个AndroidManifest.xml文件,此文件包含有Application标签,当应用启动时,系统会为应用创建有且仅有一个的Application类的对象,且此对象的生命周期等于应用的生命周期(从启动到终止)。动态链接库中存在一个较为特殊的函数_init函数,也称初始化函数,初始化函数会在动态链接库被加载时自动执行,主要用来初始化动态链接库。

具体地,预先在应用的AndroidManifest.xml文件指定的Application类的attachBaseContext或onCreate函数中添加检测代码的加载链接,预先在系统的动态链接库中的初始化函数中编译检测代码。由于应用在启动后会加载动态链接库,且动态链接库被加载则会自动运行初始化函数,进而运行检测代码,如此可以保证应用启动后能够立即加载并执行检测代码,且检测代码能够在应用的运行过程中一直保持运行,保证了后续实时检测的可靠性。

S20、应用启动后加载并执行所述检测代码,所述检测代码根据所述网络端口状态和应用进程状态判断应用是否被调试工具调试;

在一种实施例中,所述步骤S20包括:

S201、检测网络端口是否被调试工具占用,若是,则应用正被调试工具调试。

当应用被调试工具调试时,调试工具与应用处于通讯的状态,在Android系统和PC端(调试工具一般运行在PC端)相应的网络端口都开启转发时,调试工具能通过Android系统的android-server程序与应用进行通讯,并且,常用的调试工具都有自己默认的使用的端口号,比如IDA调试工具默认的网络端口号为23946,apktool默认的网络端口号为5037(apktool占用adb端口)。

因此,可以预先通过一个数组或其他形式存储常用的调试工具默认占用的端口号,然后检测Android系统的一些网络端口是否被常见调试工具占用,若是,则应用正在被调试工具调试;若不是,则继续检测。此检测逻辑可以有效的检测应用是否被一些常见的调试工具调试。

在另一种实施例中,所述步骤S20包括:

S202、监听并捕获调试工具是否向应用主进程发送进程调试信号,若是,则应用正被调试工具调试;其中,所述进程调试信号包括:使应用主进程继续运行的SIGCONT信号、使与应用主进程相关的线程暂停运行的SIGSTOP信号。

当应用被调试工具调试时,应用主进程会因被调试而处于暂停运行的状态,此时调试者若想应用恢复运行,则需要向应用主进程发送进程进程调试信号SIGCONT,因此需要监听和捕获此进程信号;另外,攻击者为了防止调试过程中被检测到,通常会通过向与主进程相关的线程发送进程调试信号SIGSTOP,停止这些线程的运行,而检测代码此时为主线程下的一个线程,若检测代码被停止运行,则应用则会被调试进而被攻击,因此也需要监听和捕获此进程信号。

因此,通过监听是否有调试工具向应用主进程发送进程调试信号,若是,则捕获并检测该信号并是否为SIGCONT信号或SIGSTOP信号,若是,则应用正在被调试工具调试;若没有监听到,则继续监听。此检测逻辑可以有效的检测应用是否被一些常见或不常见的调试工具调试。

在另一种实施例中,所述步骤S20包括:

S203、检测应用主进程的状态值和与所述主进程相关的所有线程的状态值,若所述主进程的状态值和所有线程的状态值中至少有一个为T,则应用正被调试工具调试。

当应用正被调试工具调试时,通常攻击者会调试应用主进程或与主进程相关的一些线程,无论所述主进程或线程哪一个正处于被调试状态,则该进程或线程的状态值会变为T(tracing stop,表示进程或线程处于被调试状态)。具体实施时,可以通过getpid函数获取当前应用主进程的id值,接着再获得与应用主进程相关的所有线程的id值,最后在遍历并检测所述主进程和所有线程的状态值。比如,首先通过getpid函数获取到当前应用主进程的id值为28363,且在主进程目录(/proc/28363/task)下有28363、28371和28528等多个线程(此时已获取到与主进程相关的所有线程),接着就可以读取并检测目录/proc/28363/status文件中的State值(此值为应用主进程的状态值)、目录/proc/28371/status文件中的State值(此值为与应用主进程相关的其中一个线程的状态值)和目录/proc/28528/status文件中的State值(此文件夹目录下的State值可直接读取,不需要多余的解析转换等操作)。

因此,通过遍历(可以通过循环等手段实现)并检测应用主进程的状态值和与所述主进程相关的所有线程的状态值,若主进程的状态值和所有线程的状态值中至少有一个为T,则应用正被调试工具调试;若没有,则继续遍历和检测。此检测逻辑可以有效的检测应用是否被一些常见或不常见的调试工具调试。

在另一种实施例中,所述步骤S20包括:

S204、建立用于读取应用主进程状态值的第一进程,检测所述第一进程读取到的状态值是否为T,若是,则应用正被调试工具调试。

若应用正被调试工具调试,会存在一种情况,主进程因被调试工具暂停运行后,主进程及其所有线程不能获取自身的状态值,为了防止这种情况,可通过建立一个进程,优选建立此进程为应用主进程的子进程,然后此进程就可以通过getppid函数读取所述主进程的id值,进而读取所述主进程的状态值。

因此,通过第一进程读取应用主进程的状态值,检测此状态值是否为T,若是,则应用正被调试工具调试;若不是,则继续读取检测。此检测逻辑可以有效的检测应用是否被一些常见或不常见的调试工具调试。

在另一种实施例中,所述步骤S20包括S203和所述S204;

具体地,通过第一进程,可以确保能够获取到应用主进程的id,进而获取与所述主进程相关的所有线程的id,因此才能继续遍历并检测主进程和所有线程的状态值是否至少有一个为T,才能准确判断应用是否正被调试工具调试。通过此检测逻辑,能够确保检测的可靠性,有效的检测应用是否被一些常见或不常见的调试工具调试。

在另一种实施例中,所述步骤S20包括S205,S205具体包括:

S2051、预先建立第二进程,并设置第一时间阈值、第一终止时间;

当应用主进程被调试工具调试时,主进程会处于暂停运行状态,若预先建立一个进程与应用主进程进行实时通讯,优选建立主进程子进程,若检测出通讯运行异常的情况则可以判断应用是否被调试。为了检测出此运行异常的情况,通过设置第一时间阈值和第一终止时间,供后续步骤中比较检测,其中,第一时间阈值只需比应用主进程没被调试的情况下一个完整的通讯所花的时间稍大即可,第一终止时间用来记录一次完整的通讯所花的时间。

S2052、所述第二进程向应用主进程发送第一检验数据后,把第一终止时间置为零后开始计时;

S2053、所述应用主进程接收到所述第一校验数据后向所述第二进程发送第二校验数据;

S2054、所述第二进程接收到所述第二检验数据后停止计时,并保存所述第一终止时间;

上述步骤为一个完整的通讯过程,具体实施时,首先,第二进程向主进程发送第一检验数据,并把第一终止时间置为0并开始计时。把第一终止时间置为0为了保证第一终止时间能准确记录一个完整的通讯过程所花的时间,其中,第一检验数据可以任意设置,例如发送字符串"1"。

然后,主进程收到第一校验数据后向第二进程反馈第二检验数据,其中,第二校验数据也可以任意设置,例如字符串"1";也可以为对第一校验数据进行预定的处理后得到,例如第一检验数据为字符串"1",预设的处理流程为在第一检验数据的基础上加一,则得到的第二检验数据为字符串"2"。

最后,第二进程接收到第二校验数据后,停止计时,并把这个过程所花的时间赋值给第一终止时间,此时第一终止时间的值变为一个完整的通讯过程所花的时间。

S2055、检测所述第一终止时间是否大于所述第一时间阈值,若是,则应用正被调试工具调试,若不是,则继续执行步骤S2052。

若应用主进程没有被调试工具调试,则通讯过程不会出现异常,此时第一终止时间小于第一时间阈值;若应用主进程正被调试工具调试,则通讯过程会出现异常,此时第一终止时间大于第一时间阈值。通过比较这两者之间的大小,可以准确的反映出当前应用主进程有没有被应用工具调试。若在一次完整的通讯过程中,第一终止时间小于第一时间阈值,则继续执行步骤S2052,继续循环检测。此检测逻辑可以有效的检测应用是否被一些常见或不常见的调试工具调试。

在另一种实施例中,所述步骤S20包括S206,S206具体包括:

S2061、预先建立第三进程,并设置第二时间阈值、第二终止时间;此步骤与S2051设计原理一样。

S2062、应用主进程向所述第三进程发送第三检验数据后,把第二终止时间置为零后开始计时;

S2063、所述第三进程接收到所述第三校验数据后向所述应用主进程发送第四校验数据;

S2064、所述应用主进程接收到所述第四检验数据后停止计时,并保存所述第二终止时间;

上诉步骤为一个完整的通讯过程,与S205步骤的通讯过程相似,与其不同的是,应用主进程先向第三进程发送检验数据,第三进程接收到后反馈校验数据。

S2065、检测所述第二终止时间是否大于所述第二时间阈值,若是,则应用正被调试工具调试,若不是,则继续执行步骤S2062。

若应用主进程没有被调试工具调试,则通讯过程不会出现异常,此时第二终止时间小于第二时间阈值;若应用主进程正被调试工具调试,则通讯过程会出现异常,此时第二终止时间大于第二时间阈值。通过比较这两者之间的大小,可以准确的反映出当前应用主进程有没有被应用工具调试。若在一次完整的通讯过程中,第二终止时间小于第二时间阈值,则继续执行步骤S2052,继续循环检测。此检测逻辑可以有效的检测应用是否被一些常见或不常见的调试工具调试。

S30、若检测到应用被调试工具调试时,则弹出提示对话框并终止应用。

若在上述S20步骤中检测出应用正被调试工具调试,则弹出提示对话框并立即终止应用,避免调试工具对应用的进一步调试。

由上可见,本发明提供了一种安卓系统反调试的检测方法,所述方法由于预先在Android系统动态链接库编译了检测代码,并在应用的启动代码中添加了检测代码的加载链接,能够使应用在启动后加载并执行检测代码,检测代码在应用运行过程中根据网络端口的状态和应用主进程的状态,能够精准且及时的检测出应用是否正被常见的或不常见的调试工具调试,一旦检测出应用正被调试工具调试,立即弹出对话框并终止程序,从而中断了调试工具对应用的调试,有效防止应用受攻击,提高了应用运行时的安全性。

请参阅图2,基于上述安卓系统反调试的检测方法,本发明还相应提供了一种移动终端,所述移动终端可以是手机、桌上型计算机、掌上电脑及服务器等计算设备。该移动终端包括处理器10、存储器20及显示屏30, 处理器10通过通信总线50与存储器20连接,所述显示屏30通过通信总线50与处理器10连接。图2仅示出了移动终端的部分组件,但是应理解的是,并不要求实施所有示出的组件,可以替代的实施更多或者更少的组件。

所述存储器20在一些实施例中可以是所述移动终端的内部存储单元,例如移动终端的内存。所述存储器20在另一些实施例中也可以是所述移动终端的外部存储设备,例如所述移动终端上配备的插接式U盘,智能存储卡(Smart Media Card, SMC),安全数字(Secure Digital, SD)卡,闪存卡(Flash Card)等。进一步地,所述存储器20还可以既包括所移动终端的内部存储单元也包括外部存储设备。所述存储器20用于存储安装于所述移动终端的应用软件及各类数据,例如所述安装移动终端的程序代码等。所述存储器20还可以用于暂时地存储已经输出或者将要输出的数据。在一实施例中,存储器20上存储有安卓系统反调试的检测方法程序40,该安卓系统反调试的检测方法程序40可被处理器10所执行,从而实现本申请中安卓系统反调试的检测方法。

所述处理器10在一些实施例中可以是一中央处理器(Central Processing Unit,CPU),微处理器,手机基带处理器或其他数据处理芯片,用于运行所述存储器20中存储的程序代码或处理数据,例如执行所述基于Android系统反调试的检测方法等。

所述显示屏30在一些实施例中可以是LED显示屏、液晶显示屏、触控式液晶显示屏以及OLED(Organic Light-Emitting Diode,有机发光二极管)触摸器等。所述显示屏30用于显示在所述移动终端的信息以及用于显示可视化的用户界面。所述移动终端的部件10-30通过系统总线相互通信。

在一实施例中,当处理器10执行所述存储器20中安卓系统反调试的检测方法程序40时实现任意一项所述的安卓系统反调试的检测方法中的步骤,具体如上所述。

请参阅图3,其为本发明安装安卓系统反调试的检测方法计算机程序的移动终端较佳实施例的功能模块图。在本实施例中,安装安卓系统反调试的检测方法程序的系统可以被分割成一个或多个模块,所述一个或者多个模块被存储于所述存储器20中,并由一个或多个处理器(本实施例为所述处理器10)所执行,以完成本发明。例如,在图3中,安装移动终端刷机控制处理方法计算机程序的移动终端可以被分割成启动单元21、检测单元22、处理单元23。本发明所称的单元是指能够完成特定功能的一系列计算机程序指令段,比程序更适合于描述所述安卓系统反调试的检测方法程序在所述移动终端中的执行过程。以下描述将具体介绍所述模块21-23的功能。

启动单元21,用于启动应用和加载检测代码;

检测单元22,用于实时检测应用是否被调试工具调试;

处理单元23,用于弹出提示对话框并终止应用,具体如上所述。

基于上述实施例,本发明还提供了一种计算机可读存储介质,所述计算机可读存储介质存储有一个或者多个程序,所述一个或者多个程序可被一个或者多个处理器执行,以实现如上述任意一项所述的安卓系统反调试的检测方法中的步骤,具体如上所述。

应当理解的是,本发明的应用不限于上述的举例,对本领域普通技术人员来说,可以根据上述说明加以改进或变换,所有这些改进和变换都应属于本发明所附权利要求的保护范围。

相关技术
  • 一种安卓系统反调试的检测方法、移动终端及存储介质
  • 安卓系统下的恶意代码检测方法、系统及一种移动终端
技术分类

06120112181963