一种应用于Android系统的应用程序反调试方法及装置与流程

文档序号:11432468阅读:199来源:国知局
一种应用于Android系统的应用程序反调试方法及装置与流程
本发明涉及信息安全
技术领域
,尤其涉及一种应用于android系统的应用程序反调试方法及装置。
背景技术
:基于android(安卓)系统开发的应用程序越来越多,许多应用程序在使用过程会涉及到个人隐私以及财产安全问题,因此,提高android系统应用程序的安全防护变得尤为重要。目前,android系统应用程序的安全防护方式主要包括静态加密和反动态调试两种方式,其中,反动态调试的基本原理为:在应用程序运行时,检测应用程序是否被动态调试,当检测到应用程序被动态调试时,立即退出应用程序。通过这种退出机制,禁止攻击者对应用程序继续调试。但是,在实际应用中,攻击者往往利用应用程序的退出机制,逐步确定反调试代码的位置,进而绕开反调试代码,最终分析出应用程序的实现流程。技术实现要素:本发明的目的在于提供一种应用于android系统的应用程序反调试方法及装置,用以加大攻击者找到反调试代码的难度。为实现上述发明目的,本发明提供了如下技术方案:本发明提供一种应用于android系统的应用程序反调试方法,应用于客户端设备,所述方法包括:当启动加固的应用程序时,发送携带加密密钥和加固标识的请求指令,所述请求指令用于指示服务器查找与所述加固标识匹配的第一加固密钥,并采用所述加密密钥加密后发送给所述客户端设备;接收到服务器发送的加密后的所述第一加固密钥时,检测所述应用程序是否被调试;若所述应用程序处于被调试状态,修改所述加密密钥;采用修改后的加密密钥对加密后的所述第一加固密钥解密,得到第二加固密钥,其中,所述第二加固密钥与所述第一加固密钥不同;利用所述第二加固密钥对所述应用程序进行解密并加载,以使攻击者获得无效的应用程序。本发明还提供一种应用于android系统的应用程序反调试方法,应用于服务器,所述方法包括:当接收到客户端设备发送的携带加密密钥和加固标识的请求指令时,查找与所述加固标识匹配的第一加固密钥;采用所述加密密钥对所述第一加固密钥加密后,发送给所述客户端设备,其中,所述加密密钥为根据所述客户端设备发送所述请求指令的时间生成的密钥。本发明还提供一种应用于android系统的应用程序反调试装置,应用于客户端设备,所述装置包括:请求发送单元,用于当启动加固的应用程序时,发送携带加密密钥和加固标识的请求指令,所述请求指令用于指示服务器查找与所述加固标识匹配的第一加固密钥,并采用所述加密密钥加密后发送给所述客户端设备;调试检测单元,用于接收到服务器发送的加密后的所述第一加固密钥时,检测所述应用程序是否被调试;密钥修改单元,用于若所述应用程序处于被调试状态,修改所述加密密钥;密钥解密单元,用于采用修改后的加密密钥对加密后的所述第一加固密钥解密,得到第二加固密钥,其中,所述第二加固密钥与所述第一加固密钥不同;程序解密单元,用于利用所述第二加固密钥对所述应用程序进行解密并加载,以使攻击者获得无效的应用程序。本发明还提供一种应用于android系统的应用程序反调试装置,应用于服务器,所述装置包括:密钥查找单元,用于当接收到客户端设备发送的携带加密密钥和加固标识的请求指令时,查找与所述加固标识匹配的第一加固密钥;密钥发送单元,用于采用所述加密密钥对所述第一加固密钥加密后,发送给所述客户端设备,其中,所述加密密钥为根据所述客户端设备发送所述请求指令的时间生成的密钥。由以上描述可以看出,本发明中,客户端设备在检测到应用程序被调试时,没有立即停止对应用程序的处理,而是通过修改加密密钥,对从服务器获取的加密后的第一加固密钥进行解密,得到第二加固密钥。由于加密密钥被修改,因此,解密得到的第二加固密钥与第一加固密钥不同,利用该第二加固密钥解密得到的应用程序无效。攻击者直到加载完成后才知道获取的应用程序无效,因此,无法定位应用程序中反调试代码的位置,加大了攻击者破解应用程序的难度。附图说明图1是本发明实施例示出的一种应用于android系统的应用程序反调试方法流程图;图2是本发明实施例示出的另一种应用于android系统的应用程序反调试方法流程图;图3是本发明实施例示出的客户端设备/服务器的结构示意图;图4是本发明实施例示出的一种应用于android系统的应用程序反调试装置的结构示意图;图5是本发明实施例示出的另一种应用于android系统的应用程序反调试装置的结构示意图。具体实施方式这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本发明相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本发明的一些方面相一致的装置和方法的例子。在本发明使用的术语是仅仅出于描述特定实施例的目的,而非旨在限制本发明。在本发明和所附权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。还应当理解,本文中使用的术语“和/或”是指并包含一个或多个相关联的列出项目的任何或所有可能组合。应当理解,尽管在本发明可能采用术语第一、第二、第三等来描述各种信息,但这些信息不应限于这些术语。这些术语仅用来将同一类型的信息彼此区分开。例如,在不脱离本发明范围的情况下,第一信息也可以被称为第二信息,类似地,第二信息也可以被称为第一信息。取决于语境,如在此所使用的词语“如果”可以被解释成为“在……时”或“当……时”或“响应于确定”。本发明实施例提出一种应用于android系统的应用程序反调试方法,该方法由客户端设备在启动加固的应用程序时,向服务器发送携带加密密钥和加固标识的请求指令,服务器查找与加固标识匹配的第一加固密钥,并采用加密密钥对第一加固密钥加密后,发送给客户端设备;客户端设备在检测到应用程序被调试时,修改加密密钥,采用修改后的加密密钥对加密后的第一加固密钥解密,得到与第一加固密钥不同的第二加固密钥,利用该第二加固密钥对应用程序进行解密并加载,以使攻击者获得无效的应用程序。参见图1,为本发明应用于android系统的应用程序反调试方法的一个实施例流程图,该实施例从客户端设备侧对应用于android系统的应用程序反调试过程进行描述。步骤101,当启动加固的应用程序时,发送携带加密密钥和加固标识的请求指令。本发明中,原始的应用程序由服务器负责加固,在加固的应用程序中包括服务器分配给应用程序的加固标识,具体加固过程参见后续服务器侧的描述,这里暂不赘述。客户端设备可从服务器下载加固的应用程序或通过其它移动存储设备将加固的应用程序拷贝到客户端设备上。客户端设备启动加固的应用程序时,检测应用程序是否被调试,根据检测结果分以下两种情况进行处理:若应用程序被调试,说明当前运行环境不安全,在对应用程序正式解密和加载之前,可关闭当前应用程序,防止应用程序被调试。若应用程序未被调试,向服务器发送携带加密密钥和加固标识的请求指令,正式进入对应用程序的解密和加载过程。服务器查找与加固标识匹配的第一加固密钥,并利用加密密钥对第一加固密钥加密后发送给客户端设备。步骤102,接收到服务器发送的加密后的所述第一加固密钥时,检测所述应用程序是否被调试。步骤103,若所述应用程序处于被调试状态,修改所述加密密钥。步骤104,采用修改后的加密密钥对加密后的所述第一加固密钥解密,得到第二加固密钥。步骤105,利用所述第二加固密钥对所述应用程序进行解密并加载。客户端设备在接收到服务器返回的加密后的第一加固密钥后,再次检测当前应用程序是否被调试,根据检测结果分以下两种情况处理:若应用程序处于未被调试状态,说明运行环境安全,利用加密密钥对接收到的加密后的第一加固密钥进行解密。由于服务器是采用客户端设备提供的加密密钥对第一加固密钥进行加密,因此,当客户端设备利用该加密密钥对加密后的第一加固密钥进行解密时,可得到服务器对原始的应用程序进行加固时使用的第一加固密钥,利用该第一加固密钥对加固的应用程序进行解密后得到原始的应用程序并加载,此时,原始的应用程序可正常运行。若应用程序处于被调试状态,说明运行环境不安全,但此时客户端设备不会主动关闭应用程序,而是修改加密密钥,利用修改后的加密密钥对服务器提供的加密后的第一加固密钥进行解密,得到第二加固密钥,由于修改后的加密密钥与服务器加密第一加固密钥时的加密密钥不一致,因此,客户端设备解密出的第二加固密钥与第一加固密钥不同,利用第二加固密钥对加固的应用程序进行解密得不到有效的原始应用程序,导致解密出的应用程序加载后无法正常运行,攻击者获取的是无效的应用程序。需要补充说明的是,客户端设备在发送的请求指令中携带的加密密钥为根据客户端设备发送请求指令的时间生成的密钥。当客户端设备检测到应用程序处于被调试状态需要修改加密密钥时,可将加密密钥修改为根据客户端设备的当前时间生成的密钥。例如,客户端设备发送请求指令的时间为10点30分15秒,客户端设备根据该时间(10点30分15秒)生成加密密钥并携带在请求指令中发送给服务器,服务器基于该加密密钥对第一加固密钥进行加密并发送给客户端设备,当客户端设备检测到应用程序被调试时,将加密密钥修改为根据客户端设备的当前时间(例如,10点30分20秒)生成的密钥,从而使客户端设备在利用该时间(10点30分20秒)生成的加密密钥对服务器提供的加密后的第一加固密钥进行解密时,得到与第一加固密钥不同的第二加固密钥,进而利用该第二加固密钥对应用程序进行解密和加载时,使攻击者获得无效的应用程序。从上述描述可以看出,客户端设备在检测到应用程序被调试时,没有立即退出应用程序,而是执行完整个应用程序的解密加载过程,使得攻击者无法定位到反调试代码的具体位置,也就无法绕开该反调试代码,加大了破解应用程序的难度。参见图2,为本发明应用于android系统的应用程序反调试方法的一个实施例流程图,该实施例从服务器侧对应用于android系统的应用程序反调试过程进行描述。步骤201,当接收到客户端设备发送的携带加密密钥和加固标识的请求指令时,查找与所述加固标识匹配的第一加固密钥。本发明由服务器对原始的应用程序进行加固,具体加固过程如下:服务器从本地记录的加固标识与加固密钥的对应关系中,选择一个未使用的加固密钥对应用程序进行加密,并标记该选择的加密密钥已使用,其中,加固密钥可以为服务器随机生成的字符串;服务器根据加密后的应用程序以及与选择的加固密钥对应的加固标识生成加固的应用程序,例如,可将加密后的应用程序以及与选择的加固密钥对应的加固标识添加到脱壳程序中,得到加固的应用程序。客户端设备在启动该加固的应用程序时,获取该加固的应用程序中的加固标识,向服务器发送携带该加固标识和加密密钥的请求指令,其中,该加密密钥为根据客户端设备发送请求指令的时间生成的密钥,具体参见客户端设备侧的描述,在此不再赘述。服务器接收到客户端设备发送的请求指令后,在本地记录的加固标识与加固密钥的对应关系中,查找与请求指令中携带的加固标识对应的加固密钥(记为第一加固密钥)。步骤202,采用所述加密密钥对所述第一加固密钥加密后,发送给所述客户端设备。服务器利用从客户端设备获取的加密密钥对第一加固密钥加密后发送给客户端设备。客户端设备利用加密密钥对服务器提供的加密后的第一加固密钥进行解密,并利用解密后的加固密钥对加固的应用程序进行解密并加载,具体参见客户端设备侧的描述,在此不再赘述。从上述描述可以看出,本发明将用于解密加固的应用程序的加固密钥保存在服务器端,客户端设备通过与服务器之间的动态交互过程,获取保存在服务器端的加固密钥,这种解密方式相对于将加固密钥保存在加固的应用程序中(即客户端设备可以本地获取到加固密钥)的方式,安全性更高。此外,需要补充说明的是,在客户端设备发送的请求指令中还携带有客户端设备的设备标识,当服务器通过步骤201接收到客户端设备发送的请求指令时,可根据该客户端设备的设备标识确定客户端设备的运行环境是否为模拟器(攻击者常使用模拟器模拟应用程序的运行环境),具体为,当请求指令中的设备标识为预设值时,确定客户端设备的运行环境不是虚拟器;当请求指令中的设备标识不为预设值时,确定客户端设备的运行环境是虚拟器。以客户端设备的设备标识为imei(internationalmobileequipmentidentity,国际移动设备身份码)号为例,该imei号唯一标识移动设备的身份,当imei号为预设值0时,表明客户端设备的运行环境为模拟器;当imei号不为预设值0时,表明客户端设备的运行环境不为模拟器。当客户端设备的运行环境不为模拟器时,即不是攻击者模拟出来的运行环境时,在本地记录的加固标识与加固密钥的对应关系中,查找与请求指令中携带的加固标识匹配的第一加固密钥;当客户端设备的运行环境为模拟器时,即是攻击者模拟出来的运行环境时,将无效的加固密钥确定为与加固标识匹配的第一加固密钥,客户端设备根据该无效的加固密钥不可能解密出有效的应用程序,因此,起到进一步防护的目的。现举一具体实施例,详细介绍应用于android系统的应用程序反调试过程。本实施例中,将服务器记为server,客户端设备记为client,原始的应用程序记为a_apk,脱壳程序记为ns_apk。server本地维护加固标识与加固密钥的对应关系,如表1所示。加固标识加固密钥使用标记id1key1已使用id2key2未使用id3key3未使用表1当server对a_apk进行加固时,首先,编译ns_apk,生成classes.dex文件(记为ns_dex);从表1中选择一个未使用的加固密钥(例如,key2)对a_apk进行加密,得到加密后的应用程序(记为aen_apk),并将表1中第2条表项的使用标记更新为已使用;将aen_apk和aen_apk文件的大小以及与key2对应的加固标识id2写入ns_dex文件尾部,按照dex文件格式的要求对ns_dex文件的大小、哈希值、校验值进行修复,得到新的dex文件(记为nsnew_dex),利用nsnew_dex替换掉ns_dex,并删除原有签名文件重新进行签名,得到加固的应用程序(记为nsnew_a_apk)。client从server下载nsnew_a_apk后,启动nsnew_a_apk,首先,检测nsnew_a_apk是否被调试,在一种实施方式中,可定时读取/proc/mympid/status文件中tracerpid值,当tracerpid值为0时,表明nsnew_a_apk没有被调试;当tracerpid值不为0时,该值为调试器的进程id,表明nsnew_a_apk被调试。根据检测结果,当nsnew_a_apk被调试时,关闭nsnew_a_apk程序,不再继续执行;当nsnew_a_apk未被调试时,client向server发送携带加密密钥和加固标识的请求指令(记为packet1),作为一个实施例,可根据加固标识、设备标识以及发送请求指令的时间生成加密密钥,即在加密密钥内包含加固标识的信息。本实施例中,加固标识为id2;设备标识为client的imei号,记为imei_c;发送请求指令的时间记为rtime,例如,为10点30分15秒。server接收到packet1后,首先检测client的imei号,若imei_c为0,表明client的运行环境为模拟器(攻击者常使用模拟器模拟应用程序的运行环境),则server向client发送一个无效的加固密钥(记为key_n);若imei_c不为0,server根据加固标识id2查询表1,找到与id2对应的加固密钥key2,然后,获取id2、imei_c、rtime的md5(messagedigestalgorithm5,信息摘要算法第五版)值,对key2进行加密,加密后的加固密钥记为key2_en,server将key2_en发送给client。client接收到server提供的加固密钥(key_n或key2_en)后,再一次检测nsnew_a_apk是否被调试,检测方法如前所述,不再赘述。以下以key2_en为例,当检测到nsnew_a_apk未被调试时,获取id2、imei_c、rtime的md5值,对key2_en进行解密,由于该md5值与服务器对key2加密时的md5值一致,因此,client可解密出key2,利用key2对nsnew_a_apk中的aen_apk进行解密,得到a_apk,加载并执行a_apk。当检测到nsnew_a_apk被调试时,client不会再关闭nsnew_a_apk,而是修改rtime为client的当前时间,记为ctime,例如,10点30分20秒,然后,获取id2、imei_c、ctime的md5值,对key2_en进行解密,由于该md5值与服务器对key2加密时的md5值不一致,因此,client无法解密出key2,将解密出的key值记为key_e,利用key_e对nsnew_a_apk中的aen_apk进行解密,得到无效的应用程序,记为a_e_apk,该应用程序无法正常执行。攻击者直到此时才发现调试失败,无法找到反调试代码的位置。此外,当client从server获取的加固密钥为key_n时,由于key_n是无效key,因此,无论client如何处理都不会得到有效的a_apk,应用程序无法正常执行,在此不再赘述。与前述应用于android系统的应用程序反调试方法的实施例相对应,本发明还提供了应用于android系统的应用程序反调试装置的实施例。本发明应用于android系统的应用程序反调试装置的实施例可以应用在客户端设备或服务器上。装置实施例可以通过软件实现,也可以通过硬件或者软硬件结合的方式实现。以软件实现为例,作为一个逻辑意义上的装置,是通过其所在设备的处理器运行存储器中对应的计算机程序指令形成的。从硬件层面而言,如图3所示,为本发明应用于android系统的应用程序反调试装置所在设备的一种硬件结构图,除了图3所示的处理器以及非易失性存储器之外,实施例中装置所在的设备通常根据该设备的实际功能,还可以包括其他硬件,对此不再赘述。请参考图4,为本发明一个实施例中的应用于android系统的应用程序反调试装置的结构示意图。该应用于android系统的应用程序反调试装置包括请求发送单元401、调试检测单元402、密钥修改单元403、密钥解密单元404以及程序解密单元405,其中:请求发送单元401,用于当启动加固的应用程序时,发送携带加密密钥和加固标识的请求指令,所述请求指令用于指示服务器查找与所述加固标识匹配的第一加固密钥,并采用所述加密密钥加密后发送给所述客户端设备;调试检测单元402,用于接收到服务器发送的加密后的所述第一加固密钥时,检测所述应用程序是否被调试;密钥修改单元403,用于若所述应用程序处于被调试状态,修改所述加密密钥;密钥解密单元404,用于采用修改后的加密密钥对加密后的所述第一加固密钥解密,得到第二加固密钥,其中,所述第二加固密钥与所述第一加固密钥不同;程序解密单元405,用于利用所述第二加固密钥对所述应用程序进行解密并加载,以使攻击者获得无效的应用程序。进一步地,所述请求发送单元401,具体用于当启动加固的应用程序时,向服务器发送携带加密密钥和加固标识的请求指令,其中,所述加密密钥为根据所述客户端设备发送所述请求指令的时间生成的密钥。进一步地,所述密钥修改单元403,具体用于若所述应用程序处于被调试状态,将所述加密密钥修改为根据所述客户端设备的当前时间生成的密钥。进一步地,所述请求发送单元401,具体用于当启动加固的应用程序时,检测所述应用程序是否被调试;若所述应用程序未被调试,向服务器发送携带加密密钥和加固标识的请求指令。请参考图5,为本发明另一个实施例中的应用于android系统的应用程序反调试装置的结构示意图。该应用于android系统的应用程序反调试装置包括密钥查找单元501和密钥发送单元502,其中:密钥查找单元501,用于当接收到客户端设备发送的携带加密密钥和加固标识的请求指令时,查找与所述加固标识匹配的第一加固密钥;密钥发送单元502,用于采用所述加密密钥对所述第一加固密钥加密后,发送给所述客户端设备,其中,所述加密密钥为根据所述客户端设备发送所述请求指令的时间生成的密钥。进一步地,所述密钥查找单元501,具体用于当接收到客户端设备发送的请求指令时,若所述请求指令中的设备标识为预设值,则确定所述客户端设备的运行环境不是虚拟器,其中,所述设备标识用于表征所述客户端设备的运行环境是否为虚拟器;查找与所述加固标识匹配的第一加固密钥。进一步地,所述密钥查找单元501,具体用于当接收到客户端设备发送的请求指令时,若所述请求指令中的设备标识不是预设值,则确定所述客户端设备的运行环境是虚拟器,则将无效的加固密钥确定为与所述加固标识匹配的第一加固密钥。上述装置中各个单元的功能和作用的实现过程具体详见上述方法中对应步骤的实现过程,在此不再赘述。对于装置实施例而言,由于其基本对应于方法实施例,所以相关之处参见方法实施例的部分说明即可。以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本发明方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明保护的范围之内。当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1