一种应用程序的反调试方法和系统与流程

文档序号:12467467阅读:468来源:国知局
一种应用程序的反调试方法和系统与流程

本发明涉及应用程序的调试领域,尤其涉及一种应用程序的反调试方法和系统。



背景技术:

随着计算机技术应用日益普及,Android智能终端的快速发展,Android软件产业得以飞速发展,与此同时,攻击者利用Android软件逆向技术对软件的各种攻击和未授权使用以及盗版复制等行为也越来越多。

Android逆向分析技术可以被用来在不知道应用程序源代码的情况下分析应用程序的功能流程、篡改应用程序的数据代码等,逆向分析技术如果被不加限制的恶意使用,利用者可以分析获取应用程序的核心技术,也可以篡改应用程序的签名和作者信息,还可以将恶意代码注入到已有的应用程序中并通过二次打包进行伪装,这些行为都极大的危害了应用程序开发者的利益,严重损害了广大用户的隐私安全。

在Android软件逆向技术中,Android调试技术是一个非常重要的组成部分。通过进行Android应用的调试,可以得到Android应用的运行流程,推断出Android应用的基本原理,通常可以非常顺利且快速地绕过一些登陆限制或功能限制,获取到一些用户私密信息,具有较大的危害。例如,可以分析清楚Android程序中使用的数据加解密方法、如分析清楚应用收费功能的判断逻辑,从而可以绕过是否付费的检查,从而可以不缴费的情况下使用收费功能等、如对于游戏应用可以去开发出相应的“游戏外挂”等。而软件逆向的第一步则是能够对程序进行调试,如果没有反调试技术,则相当于程序被“裸露”在黑客面前。目前比较重要的程序都希望能够加入反调试功能,防止黑客进行调试,从而不让别人分析程序的实现原理,极大的提高了程序被破解的门槛,如何进行应用程序的反调试已成为急需解决的问题。



技术实现要素:

本发明的目的在于提供一种应用程序的反调试方法和系统,通过判断当前的应用程序是否正在被调试,如果检测到当前的应用程序正在被调试,则立刻终止该应用程序,从而实现了对应用程序的反调试。

本发明所采用的技术方案如下:

一种应用程序的反调试方法,其特征在于,该方法包括:步骤S101,检测当前应用程序是否处于被调试状态;步骤S102,在应用程序的关键点上,加入检测逻辑;步骤S103,如果检测到应用程序被调试,则获取执行调试操作的用户信息,并将该用户信息发送到服务器,并执行退出程序。

优选地,检测当前应用程序是否处于被调试状态具体包括:编写功能函数用于检测当前应用程序是否处于被调试状态,该功能函数读取Android系统的状态文件,并判断所读取的状态文件中的TracePid字段,如果TracePid字段的值等于0,则说明该应用程序没有被调试,如果不等于0,则说明该应用程序已经被调试,并且TracePid字段的值就是调试进程的ID。

优选地,加入检测逻辑具体包括:调用编写的用于检查当前进程是否被调试的功能函数。

优选地,在应用程序的关键点上,加入检测逻辑具体包括:在应用程序启动的时候、用户登录成功后以及应用程序加载其他SO文件时,加入检测逻辑。

优选地,执行退出程序具体包括:如果检测到应用程序当前正在被调试,则创建n个线程,并在每个线程中加入程序退出逻辑,然后随机选择一个线程来执行退出逻辑,其中n为大于1的正整数,其中,该程序退出逻辑为Android系统提供的接口System.exit(0)。

优选地,随机选择一个线程来执行退出逻辑具体包括:调用系统函数Rand来产生一个1到n的随机数,来从n个线程中选择一个线程来执行。

优选地,执行退出程序具体包括:通过删除应用程序执行所需的对象,让程序无法继续执行下去,其中所述应用程序执行所需的对象包括读文件的句柄或者分配的内存空间。

优选地,获取执行调试操作的用户信息,并将该用户信息发送到服务器具体包括:通过网络套接字将当前用户信息发送到服务器,服务器标记当前用户有调试应用程序。

一种应用程序的反调试系统,该系统包括检测模块、加入模块以及处理模块:其特征在于:检测模块,用于检测当前应用程序是否处于被调试状态;加入模块,用于在应用程序的关键点上,加入检测逻辑;处理模块,用于当如果检测到应用程序被调试,则获取执行调试操作的用户信息,并将该用户信息发送到服务器,并执行退出程序。

优选地,检测当前应用程序是否处于被调试状态具体包括编写功能函数用于检测当前应用程序是否处于被调试状态,该功能函数读取Android系统的状态文件,并判断所读取的状态文件中的TracePid字段,如果TracePid字段的值等于0,则说明该应用程序没有被调试,如果不等于0,则说明该应用程序已经被调试,并且TracePid字段的值就是调试进程的ID。

优选地,加入检测逻辑具体包括调用编写的用于检查当前进程是否被调试的功能函数。

优选地,在应用程序的关键点上,加入检测逻辑具体包括在应用程序启动的时候、用户登录成功后以及应用程序加载其他SO文件时,加入检测逻辑。

优选地,执行退出程序具体包括如果检测到应用程序当前正在被调试,则创建n个线程,并在每个线程中加入程序退出逻辑,然后随机选择一个线程来执行退出逻辑,其中n为大于1的正整数,其中,该程序退出逻辑为Android系统提供的接口System.exit(0)。

优选地,随机选择一个线程来执行退出逻辑具体包括调用系统函数Rand来产生一个1到n的随机数,来从n个线程中选择一个线程来执行。

优选地,执行退出程序具体包括通过删除应用程序执行所需的对象,让程序无法继续执行下去,其中所述应用程序执行所需的对象包括读文件的句柄或者分配的内存空间。

优选地,获取执行调试操作的用户信息,并将该用户信息发送到服务器具体包括通过网络套接字将当前用户信息发送到服务器,服务器标记当前用户有调试应用程序。

本发明的技术方案所能获得的有益效果包括,极大的提高了程序被破解的门槛,增强了安全性。

附图说明

图1为该反调试方法的流程示意图;

图2为该反调试系统的功能模块示意图。

具体实施方式

为了更好的说明本发明,现结合具体实施例以及说明书附图对技术方案作进一步的说明。虽然实施例中记载了这些具体的实施方式,然其并非用以限定本发明,任何所属技术领域中具有通常知识者,在不脱离本发明的精神和范围内,当可作些许的更动与润饰,故本发明的保护范围当视权利要求书所界定者为准。

Android系统会将进程的调试状态保存在状态文件中,该反调试方法首先会读取Android系统保存的状态文件来获知应用程序的当前调试进程,如果当前应用程序没有被调试,则调试进程的进程编号ID值为0,如果当前应用程序正在被调试,则调试进程的进程编号ID值,通过进程编号ID值就能判断出应用程序是否被调试。如果检测到应用程序正在被调试,则会调用退出程序,终止当前的应用程序,并同时将执行调试操作的用户信息上报到服务器,服务器会对当前执行调试的用户进行相应的惩罚,例如,对该用户进行封号处理,或者是在一段时间内禁止该用户登陆应用程序等。同时为了进一步加强检测进程是否在调试,会在程序的多个关键点都插入检测逻辑。

该应用程序的反调试方法的流程示意图如图1所示,该反调试方法包括如下步骤:

1)步骤S101:检测当前应用程序是否处于被调试状态;

Android系统会将应用程序的调试进程ID记录在该应用的状态(status)文件中,并且用字段TracerPid来表示该应用的调试进程的ID,只需要读取状态文件,并判断所读取的状态文件中的TracePid字段,如果TracePid字段的值等于0则说明该应用没有被调试,如果不等于0则说明该进程已经被调试,并且TracePid字段的值就是调试进程的ID。具体实现方法如下:

Pid = getpid();//获取当前进程的PID,即状态文件中的TracePid字段

Snprintf(path,“/proc/%d/status”,Pid);

File *fp = fopen(path);//打开status文件

其中,Snprintf()函数用来拼接出调试进程的ID和状态文件的路径,“/proc/%d/status”表示%d需要填入当前调试进程的PID,path表示最终读取的状态文件的路径。然后,使用fopen()函数来打开状态status文件。

While(fgets(line, 255, fp))

{

if(strncmp(line,"TracerPid",9) == 0)

{int statue = atoi(&line[10]);

If statue != 0 {}//说明进程正在被调试

Else {} //说明进程没有被调试

}

}

调用函数strncmp()判断读取的行的内容line中是否有TracerPid这个字段,While循环用来调用函数fgets()读取文件,按照行的方式,每次读取一行,然后读取status文件的内容,并且判断读取内容中是否有TracePid这个字段,如果有这个字段,则读取其后的值,判断其值是否是0,如果不是0则说明当前进程正在被调试。

2)步骤S102:在应用程序的关键点上,加入检测逻辑;

读取进程是否被调试的状态,需要在应用程序中一直进行判断,每判断一次都是判断当前状态下有没有被调试,所以该反调试方法采用在应用程序的关键点都加入检测逻辑进行检查,应用程序的关键点例如应用程序启动的时候、用户登录成功后、应用程序加载其他SO文件等等。具体加入检测逻辑的方法是调用步骤S101编写的检查当前进程是否被调试的功能函数,调用完成后可以得到是否当前进程被调试的返回结果。

3)步骤S103:如果检测到应用程序被调试,则获取执行调试操作的用户信息,并将该用户信息发送到服务器,并执行退出程序;

如果检测到应用程序当前正在被调试,则调用Android系统提供的接口System.exit(0)来退出当前应用程序,防止执行调试操作的黑客进一步逆向分析应用程序。考虑到程序退出是一个薄弱点,黑客比较容易分析到程序退出的逻辑点,从而对退出逻辑进行修改,绕过退出逻辑。在本发明的反调试方法中提供了一些加强程序退出的方式,一旦检测到应用程序当前正在被调试,采用创建多个线程的方法,每个线程加入程序退出逻辑,然后随机选择一个线程来执行退出逻辑,这样每次退出时调用的线程是不一样的,同时调用的函数代码的位置也是不一样的。

多线程退出实现方法如下:创建3个线程,然后随机选择一个线程退出程序。

Thread1 = new Thread();

Thread2 = new Thread();

Thread2 = new Thread();

在每个线程的接口函数中RUN函数中加入程序退出逻辑,具体如下:

Thread

{ public void run()

{System.exit(0);}

}

然后调用系统函数Rand来产生一个1到3的随机数来从3个线程中选择一个线程来执行。

此外,还可以使用产生异常的方法,让程序无法继续执行下去,例如,删除应用程序执行所需的对象(可以是读文件的句柄,可以是分配的内存空间等),当程序一旦用到删除的对象则会使得程序产生错误,从而退出。还可以将以上方法结合起来使用,从而进一步加强了程序退出的复杂度,使得黑客分析的门槛更高。同时可以通过网络套接字将当前用户信息发送到服务器,服务器标记当前用户有调试应用程序,可以作出相应的惩罚。

该反调试系统的功能模块示意图如图2所示,该反调试系统包括检测模块201、加入模块202以及处理模块203。检测模块201,用于检测当前应用程序是否处于被调试状态,加入模块202,用于在应用程序的关键点上,加入检测逻辑,处理模块203,用于当如果检测到应用程序被调试,则获取执行调试操作的用户信息,并将该用户信息发送到服务器,并执行退出程序。

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

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

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

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

显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。

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