CN110287123A - 一种绕过ios系统调试检测的方法及装置 - Google Patents
一种绕过ios系统调试检测的方法及装置 Download PDFInfo
- Publication number
- CN110287123A CN110287123A CN201910593681.XA CN201910593681A CN110287123A CN 110287123 A CN110287123 A CN 110287123A CN 201910593681 A CN201910593681 A CN 201910593681A CN 110287123 A CN110287123 A CN 110287123A
- Authority
- CN
- China
- Prior art keywords
- function
- replacement
- address
- target program
- module
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/362—Software debugging
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3668—Software testing
- G06F11/3672—Test management
- G06F11/3688—Test management for test execution, e.g. scheduling of test suites
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明实施例提供的一种绕过IOS系统调试检测的方法及装置,所述方法包括:获取需要绕过调试检测的目标程序;对所述目标程序进行解析,获得目标函数的函数地址;构建第一替换函数;获取内存的系统模块中的冗余空间,所述冗余空间为系统模块中未使用的地址空间;将所述第一替换函数保存至所述冗余空间,并获得所述第一替换函数的函数地址;将所述目标函数的函数地址替换为所述第一替换函数的函数地址,以在所述第一替换函数执行时,使所述目标函数的调试参数修改为目标参数,所述目标参数用于表示所述目标程序未处于调试状态。本发明实现了在IOS系统中绕过系统的调试检测,有利于开发人员对目标程序的运行状态进行查看,更加方便维护和测试。
Description
技术领域
本发明涉及软件技术领域,具体而言,涉及一种绕过IOS系统调试检测的方法及装置。
背景技术
对于IOS系统(苹果公司开发的移动操作系统)而言,通常会对当前程序是否有在调试进行检测,从而防止黑客逆向分析IOS程序的核心代码功能。然而,在一些软件的开发过程中,为了提高开发的效率和软件质量(如查找漏洞等),通常需要对软件程序进行调试,以便了解程序执行过程中的一些状态。因此,目前急需一种能够绕过IOS系统调试检测的方法。
发明内容
有鉴于此,本发明实施例的目的在于提供一种绕过IOS系统调试检测的方法及装置,本发明实现了在IOS系统中绕过系统的调试检测,有利于开发人员对目标程序的运行状态进行查看,更加方便维护和测试。
第一方面,本申请通过一实施例提供如下技术方案:
一种绕过IOS系统调试检测的方法,包括:
获取需要绕过调试检测的目标程序;对所述目标程序进行解析,获得目标函数的函数地址;其中,所述目标函数用于读取并向系统返回调试参数,所述调试参数为用于表征当前的所述目标程序是否处于调试状态的参数;构建第一替换函数;获取内存的系统模块中的冗余空间,所述冗余空间为系统模块中未使用的地址空间;将所述第一替换函数保存至所述冗余空间,并获得所述第一替换函数的函数地址;将所述目标函数的函数地址替换为所述第一替换函数的函数地址,以在所述第一替换函数执行时,使所述目标函数的调试参数修改为目标参数,所述目标参数用于表示所述目标程序未处于调试状态。
优选地,所述将所述第一替换函数保存至所述冗余空间,并获得所述第一替换函数的函数地址,包括:
调用函数mprotect对所述系统模块对应的内存属性修改为可读写状态;在所述系统模块中查找所述冗余空间,确定第一替换函数的函数地址;将所述第一替换函数保存至所述第一替换函数的函数地址;调用函数mprotect对所述系统模块对应的内存属性进行恢复。
优选地,所述调用函数mprotect对所述系统模块对应的内存属性进行恢复之后,还包括:
对保存至所述系统模块中的所述第一替换函数的属性,修改为可读与可执行状态。
优选地,所述冗余空间包括:
函数空隙;所述目标程序不调用的系统函数的函数地址。
优选地,所述对所述目标程序进行解析,获得目标函数的函数地址,包括:
对所述目标程序进行解析,获得所述目标程序的函数索引;根据所述函数索引,获得所述目标函数的函数地址。
优选地,所述将所述目标函数的函数地址替换为所述第一替换函数的函数地址之后,还包括:
将对所述目标程序调用的退出函数替换为预设的第二替换函数,所述第二替换函数执行时为空实现;所述空实现表示不对所述目标程序进行退出。
第二方面,基于同一发明构思,本申请通过一实施例提供如下技术方案:
一种绕过IOS系统调试检测的装置,包括:
获取模块,用于获取需要绕过调试检测的目标程序;解析模块,用于对所述目标程序进行解析,获得目标函数的函数地址;其中,所述目标函数用于读取并向系统返回调试参数,所述调试参数为用于表征当前的所述目标程序是否处于调试状态的参数;构建模块,用于构建第一替换函数;冗余空间查找模块,用于获取内存的系统模块中的冗余空间,所述冗余空间为系统模块中未使用的地址空间;保存模块,用于将所述第一替换函数保存至所述冗余空间,并获得所述第一替换函数的函数地址;替换模块,用于将所述目标函数的函数地址替换为所述第一替换函数的函数地址,以在所述第一替换函数执行时,使所述目标函数的调试参数修改为目标参数,所述目标参数表示所述目标程序未处于调试状态。
优选地,所述保存模块,还用于:
调用函数mprotect对所述系统模块对应的内存属性修改为可读写状态;在所述系统模块中查找所述冗余空间,确定第一替换函数的函数地址;将所述第一替换函数保存至所述第一替换函数的函数地址;调用函数mprotect对所述系统模块对应的内存属性进行恢复。
第三方面,基于同一发明构思,本申请通过一实施例提供如下技术方案:
一种绕过IOS系统调试检测的装置,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现以下步骤:
获取需要绕过调试检测的目标程序;对所述目标程序进行解析,获得目标函数的函数地址;其中,所述目标函数用于读取并向系统返回调试参数,所述调试参数为用于表征当前的所述目标程序是否处于调试状态的参数;构建第一替换函数;获取内存的系统模块中的冗余空间,所述冗余空间为系统模块中未使用的地址空间;将所述第一替换函数保存至所述冗余空间,并获得所述第一替换函数的函数地址;将所述目标函数的函数地址替换为所述第一替换函数的函数地址,以在所述第一替换函数执行时,使所述目标函数的调试参数修改为目标参数,所述目标参数表示所述目标程序未处于调试状态。
第四方面,基于同一发明构思,本申请通过一实施例提供如下技术方案:
一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现以下步骤:
获取需要绕过调试检测的目标程序;对所述目标程序进行解析,获得目标函数的函数地址;其中,所述目标函数用于读取并向系统返回调试参数,所述调试参数为用于表征当前的所述目标程序是否处于调试状态的参数;构建第一替换函数;获取内存的系统模块中的冗余空间,所述冗余空间为系统模块中未使用的地址空间;将所述第一替换函数保存至所述冗余空间,并获得所述第一替换函数的函数地址;将所述目标函数的函数地址替换为所述第一替换函数的函数地址,以在所述第一替换函数执行时,使所述目标函数的调试参数修改为目标参数,所述目标参数表示所述目标程序未处于调试状态。
本申请实施例中提供的一个或多个技术方案,至少具有如下技术效果或优点:
本发明实施例的一种绕过IOS系统调试检测的方法及装置,通过获取需要绕过调试检测的目标程序;对所述目标程序进行解析,通过解析可获得目标函数的函数地址;其中,所述目标函数用于读取并向系统返回调试参数,所述调试参数为用于表征当前的所述目标程序是否处于调试状态的参数,通过解析保证了目标函数地址获取的完整性,避免对目标函数地址的遗漏。由于调试参数表征了目标程序是否处于调试状态。因此,对将所述目标函数的函数地址替换为所述第一替换函数的函数地址,以在所述第一替换函数执行时,使所述目标函数的调试参数修改为目标参数,所述目标参数表示所述目标程序未处于调试状态。通过对目标函数的替换,以实现对调试参数的修改,让系统无法检测出当前目标程序的调试状态;同时替换的目标函数使对目标程序进行解析获得,表征了目标函数替换的完整性,避免了存在未修改调试参数的目标函数,使系统检出调试。进一步的,由于在本发明中第一替换函数的保存位置是在系统模块的冗余空间中,冗余空间为系统模块中未使用的地址空间,因此即使IOS系统中存在安全程序也不会检测到第一替换函数,不会对调试过程造成影响。综上,本发明实现了在IOS系统中绕过调试检测,有利于开发人员对目标程序的运行状态进行查看,更加方便维护和测试。
为使本发明的上述目的、特征和优点能更明显易懂,下文特举较佳实施例,并配合所附附图,作详细说明如下。
附图说明
为了更清楚地说明本发明实施例的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,应当理解,以下附图仅示出了本发明的某些实施例,因此不应被看作是对范围的限定,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他相关的附图。
图1为本发明第一实施例提供的一种绕过IOS系统调试检测的方法及装置的流程图;
图2为本发明第二实施例提供的一种绕过IOS系统调试检测装置的功能模块示意图;
图3为本发明第三实施例提供的一种绕过IOS系统调试检测装置的结构框图;
图4为本发明第四实施例提供的一种计算机存储介质的功能模块示意图。
具体实施方式
下面将结合本发明实施例中附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。通常在此处附图中描述和示出的本发明实施例的组件可以以各种不同的配置来布置和设计。因此,以下对在附图中提供的本发明的实施例的详细描述并非旨在限制要求保护的本发明的范围,而是仅仅表示本发明的选定实施例。基于本发明的实施例,本领域技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本发明保护的范围。
应注意到:相似的标号和字母在下面的附图中表示类似项,因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步定义和解释。同时,在本发明的描述中,术语“第一”、“第二”等仅用于区分描述,而不能理解为指示或暗示相对重要性。
在IOS系统中,通过分析可以发现IOS系统对程序调试的检测具有如下逻辑。
如果一个程序被调试,那么系统通过读取进程的标识P_TRACED状态,就可以知道程序是否在调试,具体的检测方式则是检测上述标记的状态。在具体的调试检测时,首先会定义一个读取进程的结构,例如:
int value[4]={0};
然后,定义一个4个变量的数组来传入对应的核心参数:
value[0]=CTL_KERN;
value[1]=KERN_PROC;
value[2]=KERN_PROC_PID;
value[3]=getpid();当前进程的id编号。
最后,调用系统函数sysctl来读取进程状态信息(即是否进行调试的调试参数),进而将状态信息存储在info中,具体如:sysctl(value4,&info,&size,NULL,0)。再通过状态信息进行是否调试的判断,例如:int debug=info.kp_proc.p_flag&P_TRACED,其中,若info.kp_proc.p_flag与P_TRACED的逻辑与为1则表明该程序处于调试状态,若为0则表明该程序处于非调试状态。上述说明中的代码字段仅作为示例性的阐述,以便读者理解,不对本发明的后续方案形成限制。
因此,基于上述发现的IOS的调试检测原理在本发明中提出了如下的一种绕过IOS系统调试检测的方法,以便开发人员在程序的开发过程中方便的对IOS程序进行调试,快速的掌握程序运行状态,便于对程序进行维护和改进。
第一实施例
请参照图1,在本实施例中提供一种绕过IOS系统调试检测的方法,所述方法,包括:
步骤S10:获取需要绕过调试检测的目标程序;
步骤S20:对所述目标程序进行解析,获得目标函数的函数地址;其中,所述目标函数用于读取并向系统返回调试参数,所述调试参数为用于表征当前的所述目标程序是否处于调试状态的参数;
步骤S30:构建第一替换函数;
步骤S40:获取内存的系统模块中的冗余空间,所述冗余空间为系统模块中未使用的地址空间;
步骤S50:将所述第一替换函数保存至所述冗余空间,并获得所述第一替换函数的函数地址;
步骤S60:将所述目标函数的函数地址替换为所述第一替换函数的函数地址,以在所述第一替换函数执行时,使所述目标函数的调试参数修改为目标参数,所述目标参数用于表示所述目标程序未处于调试状态。
需要说明的是,在本实施例中,步骤S10-S20与步骤S30-S50之间的先后顺序不作限制。
在步骤S10中,所述的目标程序在启动后一般会加载多个Mach-o文件,每个Mach-o文件都存储有自己的函数地址。每个Mach-o文件均有可能,会调用到系统函数sysctl来读取进程状态信息。
因此,进一步的,在步骤S20中,每个Mach-o文件均有可能存在目标函数,对每个目标函数均需要进行步骤S60的执行。
步骤S20:对所述目标程序进行解析,获得目标函数的函数地址;其中,所述目标函数用于读取并向系统返回调试参数,所述调试参数为用于表征当前的所述目标程序是否处于调试状态的参数。
例如,参数1表示调试状态,参数0表示未调试状态,亦可采用其他参数表示,不作限制。若,参数0表示未调试状态,那么在步骤S60中的目标参数也为0。
具体的,在步骤S20中具体包括:
步骤S21:对所述目标程序进行解析,获得所述目标程序的函数索引;
在步骤S21中,需要对目标程序进行解析,Mach-o文件的解析是开源的,解析的具体手段为相关技术人员可以直接实施的,不再赘述。在解析后,获得目标程序的多个Mach-o文件,以及每个Mach-o文件中对应的load commands(包括:linkedit_segment、symtab_cmd、dysymtab_cmd),从linkedit_segment则可以查找到symtab_cmd中的symtab和strtab(在进行查找时,可直接对Load command进行遍历,可找到section、symtab、strtab、indirect_symtab等)。其中,strtab和symtab则存储着每个函数的名称和索引,而函数指针则存储在每个section中。
然后,通过函数的名称就可对每个Mach-o文件中的目标函数进行查找(在本实施例中为sysctl,下同),以及目标函数的函数地址。即:
步骤S22:根据所述函数索引,获得所述目标函数的函数地址。
在步骤S30中,构建第一替换函数。
构建的一具体方式例如,可采用编写一函数my_sysctl作为第一替换函数用于代替sysctl的执行。
第一替换函数的具体示例如下:
在IOS系统中提供了函数open用来打开文件。其函数具体原型如下:
int sysctl(const int*name,u_int namelen,void*oldp,size_t*oldlenp,const void*newp,size_t newlen)。
1、定义一个函数指针static int(*orig_sysctl)(const char*,int,...),用于存储系统真正的sysctl函数的地址。
2.编写第一替换函数my_sysctl,用于在应用程序调用目标函数sysctl时跳转到执行第一替换函数my_sysctl,从而整个函数执行流程会先执行我们所编写的第一替换函数my_sysctl。
3.调用HOOK函数。
HOOK_Function("sysctl",my_sysctl,(void*)&orig_sysctl)从而完成了对sysctl函数的hook操作,具体参照后文步骤S60的阐述。
4.在第一替换函数my_sysctl中修改进程的调试参数。
int my_sysctl(const char*,int,...)由于在本实施例的代码示例中为通过读取进程的状态变量.p_flag来判断当前进程是否有被调试。那么可通过修改该值从而让其永远都不会返回为1的值,从而绕过调试的检测。具体实现如下:首先我们调用系统的sysctl得到进程信息orig_sysctl(value4,&info,&size,NULL,0);然后修改p_flag的值为info.kp_proc.p_flag=0,从而使得p_flag的值总为0(目标参数),从而绕过了程序的反调试检测。
进一步的,在具体实施步骤S60时会采用hook功能。但,考虑到在一些IOS系统中若存在安全程序,安全程序将会对系统函数是否存在hook进行检测。通常安全程序的检测功能则是获取被检测的系统函数的函数地址,然后查看其地址是否存在于系统模块范围内,如果不是则说明该系统函数被hook。由于本实施例中是将系统函数的函数sysctl替换成了预先构建的第一替换函数my_sysctl,而第一替换函数my_sysctl的代码区域又不属于系统模块,从而安全程序进行检测是可以检测到原系统函数sysctl被hook了。
若被检测到系统函数sysctl被hook,将会导致本发明方案的实施失败,不能达到目的。针对该种问题,在本实施例中进一步的提出解决方案为,将第一替换函数加载在内存模块范围内,避免安全程序进行检测。具体的,参照步骤S40-S50。实现了反反hook的检测功能,保障了即使有检测hook功能的程序,本实施例也可以绕过检测。
步骤S40:获取内存的系统模块中的冗余空间,所述冗余空间为系统模块中未使用的地址空间;该冗余空间可包括:系统函数与系统函数之间的函数空隙,以及目标程序不调用的系统函数的函数地址。一般来说,函数是无法加载到系统模块中的,但是由于本实施中的第一替换函数my_sysctl所需要的代码空间很小,因此可通在系统模块的函数空隙进行存放。另外,实在无法存放的情况下,可在系统模块中查找目标程序不会调用的系统函数,将第一替换函数拷贝到该不会被调用的系统函数的地址空间中予以替换。
步骤S50:将所述第一替换函数保存至所述冗余空间,并获得所述第一替换函数的函数地址。由于冗余空间为系统模块的地址空间,可保证保存在该地址空间中的第一替换函数不被安全程序所检测到。
具体的,在步骤S50中包括:
步骤S51:调用函数mprotect对所述系统模块对应的内存属性修改为可读写状态;
步骤S52:在所述系统模块中查找所述冗余空间,确定第一替换函数的函数地址;
步骤S53:将所述第一替换函数保存至所述第一替换函数的函数地址;
步骤S54:调用函数mprotect对所述系统模块对应的内存属性进行恢复。
对于步骤S51-S54具体的一实现方式为:
首先,调用系统函数mprotect来修改系统模块对应的内存属性,使得其可以写入数据。具体示例:mprotect(dest,size,PROT_READ|PROT_WRITE),其中dest则为函数空隙,或目标程序调用不到的系统函数的函数地址。然后,查找对应的冗余空间,将本文的第一替换函数my_sysctl函数的代码拷贝到系统模块的冗余空间中也就是上述的函数空隙或目标程序调用不到的系统函数的函数地址,如,memcpy(dest,my_sysctl,size)。
最后,将系统内存修改回原来的属性,mprotect(dest,size,PROT_READ|PROT_EXEC)。
进一步,为了保证第一替换函数的正常执行,在步骤S54之后,还包括:对保存至所述系统模块中的所述第一替换函数的属性,修改为可读与可执行状态。例如,通过PROT_EXEC标示第一替换函数的可执行。
步骤S60:将所述目标函数的函数地址替换为所述第一替换函数的函数地址,以在所述第一替换函数执行时,使所述目标函数的调试参数修改为目标参数,所述目标参数用于表示所述目标程序未处于调试状态。
在执行步骤S60的时候,可通过如下的hook功能进行具体实现,代码示例如下:
首先,定义HOOK函数的原型如下:
HOOK_Function(char*pFuncName,void*pNew,void**pSaveOrg);其中,函数名称是HOOK_Function;参数char*pFuncName表示需要hook的目标函数的名称;参数void*pNew表示第一替换函数的函数地址;参数void**pSaveOrg表示存储目标函数原本的函数地址。
HOOK_Function具体功能实现如下:
本实施例中,HOOK实现功能是依赖于此文件格式来进行编写HOOK功能,具体实现为:找到需要HOOK的目标函数的函数地址,替换目标函数的函数地址为自己编写的第一替换函数的函数地址。
由于IOS的应用程序中会有多个Mach-o文件存在,所以需要枚举系统的每一个Mach-o文件,来对每一个Mach-o文件进行HOOK。每一个Mach-o的HOOK方法相同。
具体为:
1、获取系统的每一个Mach-o文件其内存起始地址。
首先通过系统函数可以获取到系统的Mach-o文件的个数,以及Mach-o文件的内存起始地址。具体实现如下:
uint32_tc=_dyld_image_count();通过_dyld_image_count来获取IOS程序所加载的Mach-o文件的个数。
for(uint32_t i=0;i<c;i++);通过for循环来遍历Mach-o文件。
const struct mach_header*header=_dyld_get_image_header(i);通过函数_dyld_get_image_header获取该Mach-o文件的内存起始地址。
intptr_t slide=dyld_get_image_vmaddr_slide(i);通过函数_dyld_get_image_vmaddr_slide来获取其在内存的中的内存虚拟地址。
2、确定函数地址,进行hook功能
得到目标函数的函数地址之后,通过section和步骤1查找的slide内存虚拟地址来获取具体HOOK的目标函数的函数地址,然后将其保存下来,并将原有函数地址的替换成第一替换函数的函数地址。具体的:
pSaveOrg=setion_indirect_symbol_bindings[i];保存原始的函数地址。
setion_indirect_symbol_bindings[i]=pNew;将目标函数的函数地址替换成第一替换函数的函数地址,从而实现了HOOK功能。
对遍历的每一个Mach-o文件都采用这样的hook形式,从而最终对目标程序中的每一个Mach-o文件都进行了函数HOOK。
若在IOS系统中存在其他辅助程序或目标程序本身包含反调试的功能时,使得上述的步骤S10-S60不足以完全绕开调试检测,将会触发系统函数exit,使目标程序结束进程或崩溃。为了进一步的提高本发明实施例提供的方法的适用环境,在步骤S60之后还包括:
步骤S40:将对所述目标程序调用的退出函数替换为预设的第二替换函数,所述第二替换函数执行时为空实现;所述空实现表示不对所述目标程序进行退出。
其中,所述的空实现在本实施例中表示不对目标函数进行退出;具体的,第二替换函数执行时不产生实际的执行效果或结果。
在步骤S40中:
具体的,可编写对退出函数exit函数进行hook的功能。以防止程序退出,从而可以继续执行程序,让程序的退出函数exit无效。其中,退出函数为系统函数。
系统的退出函数exit,函数原型如下:
void exit(int status);可编写一个第二替换函数fake_exit,从而不实际的调用系统函数exit,从而导致程序调用exit无效。
Void fake_exit(int status)是一个空实现,不进行退出,对exit函数进行HOOK_Function("exit",fake_exit,(void*)&orig_exit),进而避免了系统函数exit的执行。即使在步骤S10-S60执行后均未完全绕过调试检测时,也能保证目标函数的调试正常进行,不会导致目标函数的退出或崩溃,结合步骤S10-S40双重保险的作用,提高了对程序调试的稳定性,便于开发人员对目标程序的运行状态进行监测。
在本实施例中,需要说明的是上述步骤S10-S60应用在安装有IOS系统的电子设备中,可以直接在该电子设备上进行目标程序的调试,而不会被反调试程序以及其他安全程序的检出,同时还能避免目标程序的退出。提高了调试的效率和稳定性,便于开发人员对目标程序的运行状态进行检测。
第二实施例
请参阅图2,在本实施例中提供一种绕过IOS系统调试检测的装置300,该装置可用于执行第一实施例所述的方法,包括:
获取模块301,用于获取需要绕过调试检测的目标程序;
解析模块302,用于对所述目标程序进行解析,获得目标函数的函数地址;其中,所述目标函数用于读取并向系统返回调试参数,所述调试参数为用于表征当前的所述目标程序是否处于调试状态的参数;
构建模块303,用于构建第一替换函数;
冗余空间查找模块304,用于获取内存的系统模块中的冗余空间,所述冗余空间为系统模块中未使用的地址空间;
保存模块305,用于将所述第一替换函数保存至所述冗余空间,并获得所述第一替换函数的函数地址;
替换模块306,用于将所述目标函数的函数地址替换为所述第一替换函数的函数地址,以在所述第一替换函数执行时,使所述目标函数的调试参数修改为目标参数,所述目标参数用于表示所述目标程序未处于调试状态。
作为一种可选的实施方式,所述保存模块305,还用于:
调用函数mprotect对所述系统模块对应的内存属性修改为可读写状态;在所述系统模块中查找所述冗余空间,确定第一替换函数的函数地址;将所述第一替换函数保存至所述第一替换函数的函数地址;调用函数mprotect对所述系统模块对应的内存属性进行恢复。
作为一种可选的实施方式,所述保存模块305,还用于:
在所述调用函数mprotect对所述系统模块对应的内存属性进行恢复之后,对保存至所述系统模块中的所述第一替换函数的属性,修改为可读与可执行状态。
作为一种可选的实施方式,所述冗余空间包括:
函数空隙;所述目标程序不调用的系统函数的函数地址。
作为一种可选的实施方式,所述解析模块302,还用于:
对所述目标程序进行解析,获得所述目标程序的函数索引;根据所述函数索引,获得所述目标函数的函数地址。
作为一种可选的实施方式,还包括退出保护模块,用于:
在所述将所述目标函数的函数地址替换为所述第一替换函数的函数地址之后,将对所述目标程序调用的退出函数替换为预设的第二替换函数,所述第二替换函数执行时为空实现;所述空实现表示不对所述目标程序进行退出。
关于上述实施例中的装置,其中各个模块执行操作的具体方式已经在有关该方法的实施例中进行了详细描述,此处将不做详细阐述说明。
第三实施例
基于同一发明构思,如图3所示,本实施例提供了一种绕过IOS系统调试检测的装置400,包括存储器410、处理器420及存储在存储器410上并可在处理器420上运行的计算机程序411,处理器420执行计算机程序411时实现以下步骤:
获取需要绕过调试检测的目标程序;对所述目标程序进行解析,获得目标函数的函数地址;其中,所述目标函数用于读取并向系统返回调试参数,所述调试参数为用于表征当前的所述目标程序是否处于调试状态的参数;构建第一替换函数;获取内存的系统模块中的冗余空间,所述冗余空间为系统模块中未使用的地址空间;将所述第一替换函数保存至所述冗余空间,并获得所述第一替换函数的函数地址;将所述目标函数的函数地址替换为所述第一替换函数的函数地址,以在所述第一替换函数执行时,使所述目标函数的调试参数修改为目标参数,所述目标参数用于表示所述目标程序未处于调试状态。
在具体实施过程中,处理器420执行计算机程序411时,可以实现实第一实施例(或第二实施例)中的任一实施方式,在此不再赘述。
第四实施例
基于同一发明构思,如图4所示,本实施例提供了一种计算机可读存储介质500,其上存储有计算机程序511,计算机程序511被处理器执行时实现以下步骤:
获取需要绕过调试检测的目标程序;对所述目标程序进行解析,获得目标函数的函数地址;其中,所述目标函数用于读取并向系统返回调试参数,所述调试参数为用于表征当前的所述目标程序是否处于调试状态的参数;构建第一替换函数;获取内存的系统模块中的冗余空间,所述冗余空间为系统模块中未使用的地址空间;将所述第一替换函数保存至所述冗余空间,并获得所述第一替换函数的函数地址;将所述目标函数的函数地址替换为所述第一替换函数的函数地址,以在所述第一替换函数执行时,使所述目标函数的调试参数修改为目标参数,所述目标参数用于表示所述目标程序未处于调试状态。
在具体实施过程中,计算机程序511被处理器执行时,可以实现第一实施例(或第二实施例)中的任一实施方式,在此不再赘述。
综上所述:
上述本申请实施例中的技术方案,至少具有如下的技术效果或优点:
本发明实施例的一种绕过IOS系统调试检测的方法及装置,通过获取需要绕过调试检测的目标程序;对所述目标程序进行解析,通过解析可获得目标函数的函数地址;其中,所述目标函数用于读取并向系统返回调试参数,所述调试参数为用于表征当前的所述目标程序是否处于调试状态的参数,通过解析保证了目标函数地址获取的完整性,避免对目标函数地址的遗漏。由于调试参数表征了目标程序是否处于调试状态。因此,对将所述目标函数的函数地址替换为所述第一替换函数的函数地址,以在所述第一替换函数执行时,使所述目标函数的调试参数修改为目标参数,所述目标参数表示所述目标程序未处于调试状态。通过对目标函数的替换,以实现对调试参数的修改,让系统无法检测出当前目标程序的调试状态;同时替换的目标函数使对目标程序进行解析获得,表征了目标函数替换的完整性,避免了存在未修改调试参数的目标函数,使系统检出调试。进一步的,由于在本发明中第一替换函数的保存位置是在系统模块的冗余空间中,冗余空间为系统模块中未使用的地址空间,因此即使IOS系统中存在安全程序也不会检测到第一替换函数,不会对调试过程造成影响。综上,本发明实现了在IOS系统中绕过调试检测,有利于开发人员对目标程序的运行状态进行查看,更加方便维护和测试。
在本申请所提供的几个实施例中,应该理解到,所揭露的装置和方法,也可以通过其它的方式实现。以上所描述的装置实施例仅仅是示意性的,例如,附图中的流程图和框图显示了根据本发明的多个实施例的装置、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段或代码的一部分,所述模块、程序段或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现方式中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个连续的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或动作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
另外,在本发明各个实施例中的各功能模块可以集成在一起形成一个独立的部分,也可以是各个模块单独存在,也可以两个或两个以上模块集成形成一个独立的部分。
本发明中的所述方法功能如果以软件功能模块的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-OnlyMemory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。应注意到:相似的标号和字母在下面的附图中表示类似项,因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步定义和解释。
以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应所述以权利要求的保护范围为准。
Claims (10)
1.一种绕过IOS系统调试检测的方法,其特征在于,包括:
获取需要绕过调试检测的目标程序;
对所述目标程序进行解析,获得目标函数的函数地址;其中,所述目标函数用于读取并向系统返回调试参数,所述调试参数为用于表征当前的所述目标程序是否处于调试状态的参数;
构建第一替换函数;
获取内存的系统模块中的冗余空间,所述冗余空间为系统模块中未使用的地址空间;
将所述第一替换函数保存至所述冗余空间,并获得所述第一替换函数的函数地址;
将所述目标函数的函数地址替换为所述第一替换函数的函数地址,以在所述第一替换函数执行时,使所述目标函数的调试参数修改为目标参数,所述目标参数用于表示所述目标程序未处于调试状态。
2.根据权利要求1所述的方法,其特征在于,所述将所述第一替换函数保存至所述冗余空间,并获得所述第一替换函数的函数地址,包括:
调用函数mprotect对所述系统模块对应的内存属性修改为可读写状态;
在所述系统模块中查找所述冗余空间,确定第一替换函数的函数地址;
将所述第一替换函数保存至所述第一替换函数的函数地址;
调用函数mprotect对所述系统模块对应的内存属性进行恢复。
3.根据权利要求2所述的方法,其特征在于,所述调用函数mprotect对所述系统模块对应的内存属性进行恢复之后,还包括:
对保存至所述系统模块中的所述第一替换函数的属性,修改为可读与可执行状态。
4.根据权利要求2所述的方法,其特征在于,所述冗余空间包括:
函数空隙;
所述目标程序不调用的系统函数的函数地址。
5.根据权利要求1所述的方法,其特征在于,所述对所述目标程序进行解析,获得目标函数的函数地址,包括:
对所述目标程序进行解析,获得所述目标程序的函数索引;
根据所述函数索引,获得所述目标函数的函数地址。
6.根据权利要求1所述的方法,其特征在于,所述将所述目标函数的函数地址替换为所述第一替换函数的函数地址之后,还包括:
将对所述目标程序调用的退出函数替换为预设的第二替换函数,所述第二替换函数执行时为空实现;所述空实现表示不对所述目标程序进行退出。
7.一种绕过IOS系统调试检测的装置,其特征在于,包括:
获取模块,用于获取需要绕过调试检测的目标程序;
解析模块,用于对所述目标程序进行解析,获得目标函数的函数地址;其中,所述目标函数用于读取并向系统返回调试参数,所述调试参数为用于表征当前的所述目标程序是否处于调试状态的参数;
构建模块,用于构建第一替换函数;
冗余空间查找模块,用于获取内存的系统模块中的冗余空间,所述冗余空间为系统模块中未使用的地址空间;
保存模块,用于将所述第一替换函数保存至所述冗余空间,并获得所述第一替换函数的函数地址;
替换模块,用于将所述目标函数的函数地址替换为所述第一替换函数的函数地址,以在所述第一替换函数执行时,使所述目标函数的调试参数修改为目标参数,所述目标参数用于表示所述目标程序未处于调试状态。
8.根据权利要求7所述的装置,其特征在于,所述保存模块,还用于:
调用函数mprotect对所述系统模块对应的内存属性修改为可读写状态;
在所述系统模块中查找所述冗余空间,确定第一替换函数的函数地址;
将所述第一替换函数保存至所述第一替换函数的函数地址;
调用函数mprotect对所述系统模块对应的内存属性进行恢复。
9.一种绕过IOS系统调试检测的装置,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其特征在于,所述处理器执行所述计算机程序时实现以下步骤:
获取需要绕过调试检测的目标程序;
对所述目标程序进行解析,获得目标函数的函数地址;其中,所述目标函数用于读取并向系统返回调试参数,所述调试参数为用于表征当前的所述目标程序是否处于调试状态的参数;
构建第一替换函数;
获取内存的系统模块中的冗余空间,所述冗余空间为系统模块中未使用的地址空间;
将所述第一替换函数保存至所述冗余空间,并获得所述第一替换函数的函数地址;
将所述目标函数的函数地址替换为所述第一替换函数的函数地址,以在所述第一替换函数执行时,使所述目标函数的调试参数修改为目标参数,所述目标参数用于表示所述目标程序未处于调试状态。
10.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现以下步骤:
获取需要绕过调试检测的目标程序;
对所述目标程序进行解析,获得目标函数的函数地址;其中,所述目标函数用于读取并向系统返回调试参数,所述调试参数为用于表征当前的所述目标程序是否处于调试状态的参数;
构建第一替换函数;
获取内存的系统模块中的冗余空间,所述冗余空间为系统模块中未使用的地址空间;
将所述第一替换函数保存至所述冗余空间,并获得所述第一替换函数的函数地址;
将所述目标函数的函数地址替换为所述第一替换函数的函数地址,以在所述第一替换函数执行时,使所述目标函数的调试参数修改为目标参数,所述目标参数用于表示所述目标程序未处于调试状态。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910593681.XA CN110287123A (zh) | 2019-07-03 | 2019-07-03 | 一种绕过ios系统调试检测的方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910593681.XA CN110287123A (zh) | 2019-07-03 | 2019-07-03 | 一种绕过ios系统调试检测的方法及装置 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN110287123A true CN110287123A (zh) | 2019-09-27 |
Family
ID=68020375
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910593681.XA Pending CN110287123A (zh) | 2019-07-03 | 2019-07-03 | 一种绕过ios系统调试检测的方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN110287123A (zh) |
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113328995A (zh) * | 2021-05-06 | 2021-08-31 | 深圳市联软科技股份有限公司 | 一种针对android的流量代理方法及系统 |
CN113672424A (zh) * | 2021-08-19 | 2021-11-19 | 支付宝(杭州)信息技术有限公司 | 修复异常任务的方法及装置 |
CN113704753A (zh) * | 2020-05-22 | 2021-11-26 | 网神信息技术(北京)股份有限公司 | 对系统调用进行拦截替换的方法和装置、电子设备和介质 |
CN113918935A (zh) * | 2021-12-15 | 2022-01-11 | 飞天诚信科技股份有限公司 | 一种函数被hook时的处理方法及装置 |
Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104598823A (zh) * | 2015-01-21 | 2015-05-06 | 华东师范大学 | 一种安卓系统中内核级rootkit检测方法及其系统 |
CN106371940A (zh) * | 2015-07-21 | 2017-02-01 | 腾讯科技(深圳)有限公司 | 一种程序崩溃解决方法及装置 |
CN106529299A (zh) * | 2016-12-26 | 2017-03-22 | 郑州云海信息技术有限公司 | 一种在linux系统中对恶意软件Rootkit的检测和修复方法 |
CN107545182A (zh) * | 2017-09-06 | 2018-01-05 | 武汉斗鱼网络科技有限公司 | 一种ios应用中绕过函数调用链检测的方法及系统 |
CN109086183A (zh) * | 2018-07-12 | 2018-12-25 | 武汉斗鱼网络科技有限公司 | 一种应用程序的监控方法、装置、电子设备及存储介质 |
CN109117201A (zh) * | 2018-07-05 | 2019-01-01 | 武汉斗鱼网络科技有限公司 | 一种程序退出的方法及相关设备 |
-
2019
- 2019-07-03 CN CN201910593681.XA patent/CN110287123A/zh active Pending
Patent Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104598823A (zh) * | 2015-01-21 | 2015-05-06 | 华东师范大学 | 一种安卓系统中内核级rootkit检测方法及其系统 |
CN106371940A (zh) * | 2015-07-21 | 2017-02-01 | 腾讯科技(深圳)有限公司 | 一种程序崩溃解决方法及装置 |
CN106529299A (zh) * | 2016-12-26 | 2017-03-22 | 郑州云海信息技术有限公司 | 一种在linux系统中对恶意软件Rootkit的检测和修复方法 |
CN107545182A (zh) * | 2017-09-06 | 2018-01-05 | 武汉斗鱼网络科技有限公司 | 一种ios应用中绕过函数调用链检测的方法及系统 |
CN109117201A (zh) * | 2018-07-05 | 2019-01-01 | 武汉斗鱼网络科技有限公司 | 一种程序退出的方法及相关设备 |
CN109086183A (zh) * | 2018-07-12 | 2018-12-25 | 武汉斗鱼网络科技有限公司 | 一种应用程序的监控方法、装置、电子设备及存储介质 |
Non-Patent Citations (3)
Title |
---|
HOUJINGYI233: "【技术分享】利用FRIDA攻击Android应用程序(四)", 《WWW.SUPHP.CN/ANQUANKE/1/86201.HTML》 * |
KUNNAN: "HookDetection", 《HTTPS://KUNNAN.GITHUB.IO/2018/08/17/HOOKDETECTION/》 * |
LDZSPACE: ""ios逆向--反调试和反反调试", 《HTTPS://WWW.JIANSHU.COM/P/A3FC10C70A29》 * |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113704753A (zh) * | 2020-05-22 | 2021-11-26 | 网神信息技术(北京)股份有限公司 | 对系统调用进行拦截替换的方法和装置、电子设备和介质 |
CN113328995A (zh) * | 2021-05-06 | 2021-08-31 | 深圳市联软科技股份有限公司 | 一种针对android的流量代理方法及系统 |
CN113328995B (zh) * | 2021-05-06 | 2023-03-24 | 深圳市联软科技股份有限公司 | 一种针对android的流量代理方法及系统 |
CN113672424A (zh) * | 2021-08-19 | 2021-11-19 | 支付宝(杭州)信息技术有限公司 | 修复异常任务的方法及装置 |
CN113918935A (zh) * | 2021-12-15 | 2022-01-11 | 飞天诚信科技股份有限公司 | 一种函数被hook时的处理方法及装置 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN110287123A (zh) | 一种绕过ios系统调试检测的方法及装置 | |
US8799875B2 (en) | Streamlining unit testing through hot code swapping | |
CN111756575B (zh) | 存储服务器的性能分析方法及装置、电子设备 | |
JP5430570B2 (ja) | システムコールカバレッジ基準による試験スイート削減のための方法 | |
US9465718B2 (en) | Filter generation for load testing managed environments | |
CN103186461B (zh) | 一种现场数据的保存方法和恢复方法以及相关装置 | |
US9569345B2 (en) | Architectural failure analysis | |
US20110107307A1 (en) | Collecting Program Runtime Information | |
US20060143596A1 (en) | Program analyzing apparatus and testing apparatus, and analyzing method and program therefor | |
US10353809B2 (en) | System and method for executing integration tests in multiuser environment | |
Iqbal et al. | A model-based regression testing approach for evolving software systems with flexible tool support | |
JP7404839B2 (ja) | ソフトウェアプログラム不良位置の識別 | |
US7685471B2 (en) | System and method for detecting software defects | |
US10209984B2 (en) | Identifying a defect density | |
CN111045927A (zh) | 性能测试评估方法、装置、计算机设备及可读存储介质 | |
CN105260312B (zh) | 一种多核实时系统应用数据竞争错误的调试方法 | |
CN103678116A (zh) | 用于促进自动化程序测试的方法和系统 | |
CN110018954A (zh) | 代码质量检测、代码检测质量的评估方法、装置及设备 | |
CN112925524A (zh) | 一种检测驱动程序中不安全直接存储器访问的方法及装置 | |
US8850407B2 (en) | Test script generation | |
CN103186463A (zh) | 确定软件的测试范围的方法和系统 | |
US10380313B1 (en) | Implementation and evaluation of designs for heterogeneous computing platforms with hardware acceleration | |
US11099978B2 (en) | Modeling system for software-implemented testing using domain specific profiles to translate tests for a subset of paths included in a UML test model | |
US10853051B2 (en) | Automated candidate repair patch generation | |
Saavedra et al. | GitBug-Actions: Building Reproducible Bug-Fix Benchmarks with GitHub Actions |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
RJ01 | Rejection of invention patent application after publication |
Application publication date: 20190927 |
|
RJ01 | Rejection of invention patent application after publication |