CN112149113A - 一种iOS应用反钩子的方法及装置 - Google Patents
一种iOS应用反钩子的方法及装置 Download PDFInfo
- Publication number
- CN112149113A CN112149113A CN202011342321.1A CN202011342321A CN112149113A CN 112149113 A CN112149113 A CN 112149113A CN 202011342321 A CN202011342321 A CN 202011342321A CN 112149113 A CN112149113 A CN 112149113A
- Authority
- CN
- China
- Prior art keywords
- function
- application
- unit
- module
- dynamic library
- 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.)
- Granted
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/50—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
- G06F21/51—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems at application loading time, e.g. accepting, rejecting, starting or inhibiting executable software based on integrity or source reliability
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/448—Execution paradigms, e.g. implementations of programming paradigms
- G06F9/4482—Procedural
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Computer Security & Cryptography (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Computer Hardware Design (AREA)
- Stored Programmes (AREA)
Abstract
本发明提供的一种iOS应用反钩子的方法,包括反钩子动态库被应用加载;当反钩子动态库的具有Objective‑c函数钩子检测功能的第一接口被应用调用时,反钩子动态库获取应用的自定义Objective‑c函数所在模块的模块路径和预定的可执行文件的全路径,判断应用的自定义Objective‑c函数所在模块的模块路径和预定的可执行文件的全路径是否相同,如果相同,反钩子动态库向应用返回应用未被钩住的返回值,如果不相同,反钩子动态库向应用返回应用被钩住的返回值。本发明保证了iOS应用的安全使用。
Description
技术领域
本发明涉及互联网技术领域,特别涉及一种iOS应用反钩子的方法及装置。
背景技术
随着时代的发展,iOS应用得到广泛的使用,由于iOS应用的关键函数容易被钩住,从而导致iOS应用的关键数据的泄露, iOS应用被破解的问题日渐显现,iOS应用的安全问题也逐渐上升为一个受关注且亟待解决的问题。
发明内容
本发明提供了一种iOS应用反钩子的方法及装置,解决了上述技术问题。
一种iOS应用反钩子的方法,包括:
步骤1,反钩子动态库被应用加载;
步骤2,当反钩子动态库的具有Objective-c函数钩子检测功能的第一接口被应用调用时,反钩子动态库获取应用的自定义Objective-c函数的函数名称,根据函数名称获取函数指针,根据所函数的指针获取应用的自定义Objective-c函数所在模块的模块路径,反钩子动态库获取预定的可执行文件的全路径,判断应用的自定义Objective-c函数所在模块的模块路径和预定的可执行文件的全路径是否相同,如果相同,执行步骤3,如果不相同,执行步骤4;
步骤3,反钩子动态库向应用返回应用未被钩住的返回值;
步骤4,反钩子动态库向应用返回应用被钩住的返回值或者反钩子动态库调用退出函数使应用退出。
本发明提供了一种iOS应用反钩子的装置,包括反钩子动态库模块:
反钩子动态库模块包括:
被加载单元,用于被应用加载反钩子动态库模块;
具有Objective-c函数钩子检测功能的第一接口单元,用于被应用调用,
获取单元,用于当反钩子动态库模块的具有Objective-c函数钩子检测功能的第一接口单元被应用调用时,获取单元用于获取应用的自定义Objective-c函数的函数名称,根据函数名称获取函数指针,根据所函数的指针获取应用的自定义Objective-c函数所在单元的单元路径;还用于获取预定的可执行文件的全路径;
判断单元,用于判断获取单元获取的应用的自定义Objective-c函数所在单元的单元路径和预定的可执行文件的全路径是否相同;
返回单元,用于当判断单元的判断结果为相同时,向应用返回应用未被钩住的返回值;还用于当判断单元的判断结果为不相同时,向应用返回应用被钩住的返回值或者调用退出函数使应用退出。
本发明的有益效果:本发明提供了一种iOS应用反钩子的方法及系统,通过调用反钩子动态库,有效的防止了iOS应用关键函数被钩住的问题,从而保证了iOS应用的安全使用。
附图说明
图1为本发明实施例一提供的一种iOS应用反钩子的方法流程图;
图2为本发明实施例二提供的一种iOS应用反钩子的方法流程图;
图3为本发明实施例三提供的一种iOS应用反钩子的装置框图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
本发明涉及的名词如下:
iOS:苹果公司的移动操作系统。
Objective-c: Objective-C 是一种简单的计算机语言,设计为可以支持真正的面向对象编程。
arm64:一种ARM 处理器指令集。
APP: 应用。
实施例一
本实施例提供了一种iOS应用反钩子的方法,如图1所示,包括:
步骤101,反钩子动态库被应用加载;
步骤102,当反钩子动态库的具有Objective-c函数钩子检测功能的第一接口被应用调用时,反钩子动态库获取应用的自定义Objective-c函数所在模块的模块路径和预定的可执行文件的全路径,判断应用的自定义Objective-c函数所在模块的模块路径和预定的可执行文件的全路径是否相同,如果相同,执行步骤103,如果不相同,执行步骤104;
步骤103,反钩子动态库向应用返回应用未被钩住的返回值;
步骤104,反钩子动态库向应用返回应用被钩住的返回值或者反钩子动态库调用退出函数使应用退出。
在本实施例中,步骤2或者为:
反钩子动态库获取应用的自定义Objective-c函数所在模块的模块基地址,判断应用的自定义Objective-c函数所在模块的模块基地址与预置函数所在模块的模块基地址是否相同,如果相同,执行步骤103,如果不相同,执行步骤104。
在本实施例中,步骤102中,当判断应用的自定义Objective-c函数所在模块的模块路径和预定的可执行文件的全路径相同时,还包括:反钩子动态库获取应用的自定义Objective-c函数所在模块的模块基地址,判断应用的自定义Objective-c函数所在模块的模块基地址与预置函数所在模块的模块基地址是否相同,如果相同,执行步骤103,如果不相同,执行步骤104。
在本实施例中,当判断应用的自定义Objective-c函数所在模块的模块基地址与预置函数所在模块的模块基地址相同时,还包括:
反钩子动态库获取应用的自定义Objective-c函数所在模块的模块路径和预定的可执行文件的全路径,判断应用的自定义Objective-c函数所在模块的模块路径和预定的可执行文件的全路径是否相同,如果相同执行步骤103,如果不相同执行步骤104。
在本实施例中,步骤102中反钩子动态库获取预定的可执行文件的全路径具体为:反钩子动态库根据预定的可执行文件映像在当前进程中的默认的索引号获得可执行文件的全路径。
在本实施例中,反钩子动态库获取应用的自定义Objective-c函数所在模块的模块路径具体为:反钩子动态库获取应用的自定义Objective-c函数的函数名称,根据函数名称获取函数指针,根据所函数的指针获取应用的自定义Objective-c函数所在模块的模块路径。
在本实施例中,预置函数所在模块的模块基地址为应用的自定义Objective-c函数所在类的任意一个函数所在模块的模块基地址。
在本实施例中,步骤102还包括:当反钩子动态库的具有C函数钩子检测功能的第二接口被应用调用时,反钩子动态库获取应用的C函数的函数地址反汇编机器码,根据应用的C函数的函数地址反汇编机器码和预置的跳转指令判断应用的C函数是否被钩住,如果是,执行步骤103,如果否,执行步骤104。
在本实施例中,步骤102中根据应用的C函数的函数地址反汇编机器码和预置的跳转指令判断应用的C函数是否被钩住具体为:将应用的C函数的函数地址反汇编机器码与反钩子动态库中预置的至少一组arm64跳转指令进行比对,判断两者的值是否相同,如果不相同,则执行步骤103,如果相同,则执行步骤104。
在本实施例中,步骤101具体为:反钩子动态库被应用加载,反钩子动态库将系统方法交换函数替换为具有方法判断功能的自定义函数,反钩子动态库根据应用的应用的自定义Objective-c函数的函数名称设置预置的白名单,反钩子动态库加载完成。
在本实施例中,步骤101之后还包括:反钩子动态库调用具有方法判断功能的自定义函数,获得系统方法交换函数的输入参数,判断输入参数所对应的函数名称是否在预置的白名单中,如果是,执行步骤104,如果否,执行步骤103。
实施例二
本实施例提供了一种iOS应用反钩子的方法,如图2所示,具体包括:
步骤200,反钩子动态库被APP加载,反钩子动态库将系统的方法交换函数替换为具有方法判断功能的自定义函数,反钩子动态库设置白名单;
本步骤具体为:反钩子动态库被APP加载,反钩子动态库运用fishhook将系统的方法交换函数替换为具有方法判断功能的自定义函数,反钩子动态库设置白名单;
具体的,在本实施例中,系统的方法交换函数具体为iOS系统的method_exchangeImplementations(Method m1,Method m2)函数;
替换过程以及具有方法判断功能的自定义函数举例如下:
struct rebinding bd1;
bd1.name = "method_exchangeImplementations";
bd1.replacement = myExchange;
bd1.replaced = (void *)&exchangeP;
struct rebinding rebindings[] = {bd1};
rebind_symbols(rebindings, 1);
void (*exchangeP)(Method _Nonnull m1, Method _Nonnull m2);
void myExchange(Method _Nonull m1,Method _Nonull m2)
{
If(m1)
{
Bool in_def = false;
SEl sel = method_getName(m1);
Char*selStr=(char*)[NSStringFromSelector(sel) UTF8String];
For(int i = 0;i< sizeof(DefendSelStrs)/sizeof(char*);i++)
{
If(0 == strcmp(strStr,DefendSelStrs[i])
{
In_def = true;
Break;
}
If(in_def){
Return;
}
} 。
在本实施例中,反钩子动态库设置白名单具体为:反钩子动态库将APP的应用的自定义Objective-c函数的函数名称设置在全局白名单字符串数组中。
例如,本实施例中,反钩子动态库将应用的自定义Objective-c函数的三个预设函数的函数名称 ocfunc1, ocfunc2 cfunc1设置在全局白名单字符串数组:static char *DefendSelStrs[]中,设置后的全局白名单字符串数组为:static char *DefendSelStrs[] = {“ocfunc1”,“ocfunc2”,“cfunc1”}。
步骤201,反钩子动态库调用具有方法判断功能的自定义函数,获得系统的方法交换函数的输入参数;
步骤202,反钩子动态库判断系统的方法交换函数的输入参数所对应的函数名称是否存在于白名单中,如果是,则反钩子动态库使APP退出,如果否,则反钩子动态库加载完成,当反钩子动态库的具有Objective-C函数 钩子检测功能的第一接口被APP调用时,执行步骤203;当反钩子动态库的具有C函数钩子检测功能的第二接口被APP调用时,执行步骤204;
具体的,步骤202中,反钩子动态库判断系统的方法交换函数的输入参数所对应的函数名称是否存在于白名单中,如果是,则反钩子动态库使APP退出,如果否,则反钩子动态库加载完成具体为:反钩子动态库将系统的方法交换函数的输入参数所对应的函数名称与全局白名单字符串数组中的函数名称进行逐一比较,判断系统的方法交换函数的输入参数所对应的函数名称是否存在在全局白名单数组中,如果是,则反钩子动态库使APP退出,如果否,则反钩子动态库加载完成。
具体的,反钩子动态库获得系统的方法交换函数的输入参数:m1, 将m1作为输入参数,调用系统的method_getName函数得到m1所对应的函数名称,将系统的方法交换函数的输入参数所对应的函数名称与全局白名单数组中的函数名称进行逐一比较,判断系统的方法交换函数的输入参数所对应的函数名称是否存在在全局白名单数组中,如果是,则反钩子动态库使APP退出,如果否,则反钩子动态库加载完成。
具体的,在本实施例中,反钩子动态库调用退出功能函数使APP退出。
具体的,在本实施例中,反钩子动态库调用exit函数使APP退出。
在本实施例中,反钩子动态库使APP退出还可以为:反钩子动态库向APP返回APP未被钩住的返回值。
步骤203,反钩子动态库获取APP的自定义Objective-C函数所在模块的模块路径和模块基地址,判断APP的自定义Objective-C函数是否被钩住,如果是,则反钩子动态库向APP返回APP被钩住的返回值,如果否, 则反钩子动态库向APP返回APP未被钩住的返回值;
具体的,当反钩子动态库的具有Objective-C函数 钩子检测功能的第一接口被APP调用时,步骤203包括如下步骤:
步骤203-1,反钩子动态库根据具有Objective-C函数 钩子检测功能的第一接口的输入参数获得APP的自定义Objective-C函数的函数名称和与函数名称所对应的类名;
例如,本实施中获得的APP的自定义Objective-C函数的函数名称为: ocfunc2 ,其对应的类名为: Person 。
步骤203-2,反钩子动态库将APP的自定义Objective-C函数的函数名称作为输入参数,调用具有Objective-c函数 钩子检测功能的第一接口中的sel_registerName(selName)函数得到第一值;将与函数名称所对应的类名作为输入参数调用objec_getClass(className)函数得到第二值;
例如,本实施例中得到的第一值为class cls, 第二值为 SEL name。
步骤203-3,反钩子动态库将第一值和第二值作为输入参数,调用具有Objective-C函数 钩子检测功能的第一接口中的 class_getMethodImplementation( ) 函数得到APP的自定义Objective-c函数的函数指针imp;
步骤203-4,反钩子动态库将APP的自定义Objective-C函数的函数指针作为输入参数调用反钩子动态库的具有Objective-C函数 钩子检测功能的第一接口中的dladdr函数,得到Objective-C函数所在模块的模块路径和模块基地址;
具体的,dladdr函数为:int dladdr(const void* imp, Dl_info* info) ;
例如,本实施例中,反钩子动态库将APP的自定义Objective-C函数:ocfunc2的函数指针:imp作为输入参数,得到Objective-C函数所在模块的模块路径: info.dli_fname和模块基地址:info.dli_fbase。
步骤203-5,反钩子动态库将可执行文件映像在当前进程中的默认的索引号作为输入参数调用反钩子动态库的具有Objective-C函数 钩子检测功能第一接口中的dyld_get_image_name函数,获得可执行文件的全路径;
例如,本实施例中,反钩子动态库将可执行文件映像在当前进程中的默认的索引号:0作为输入参数调用反钩子动态库的具有Objective-C函数 钩子检测功能第一接口中的dyld_get_image_name函数,获得可执行文件的全路径:“var/mobile/Containers/Bundle/Application/B63B375F-85EE-4C43-91FF-493E3T6R53C4/FTReader.app/FTReader”。
步骤203-6, 反钩子动态库判断得到的APP的自定义Objective-C函数所在的模块的模块信息中模块路径是否与获得的可执行文件的全路径是否相同,如果相同,则执行步骤203-7,如果不相同,反钩子动态库向APP返回APP被钩住的返回值。
步骤203-7,反钩子动态库调用反钩子动态库中具有Objective-c函数 钩子检测功能的第一接口中的int dladdr(const void* imp,Dl_info* info)函数,反钩子动态库将APP的自定义Objective-C函数所在类的预置函数的函数指针作为输入参数,得到APP的自定义Objective-C函数函数所在类的预置函数所在模块的模块基地址;
具体的,反钩子动态库调用具有Objective-C函数 钩子检测功能的第一接口中的dladdr函数,将APP的自定义Objective-C函数所在类的预置函数:ocfunc2的函数指针:imp作为输入参数,得到APP的自定义Objective-C函数所在类的预置函数所在模块的模块基地址: info.dli_base。
步骤203-8,反钩子动态库判断得到的APP的自定义Objective-C函数所在类的预置函数所在模块的模块基地址与得到的APP的自定义Objective-C函数所在模块的模块基地址是否相同,如果相同,则反钩子动态库向APP返回APP未被钩住的返回值;如果不相同,反钩子动态库向APP返回app被钩住的返回值。
具体的,在本步骤中,APP的自定义Objective-C函数所在类的预置函数可以被设置为应用的自定义Objective-c函数所在类的任意一个函数。
步骤204,反钩子动态库获取APP的C函数的函数地址反汇编机器码,判断APP的C函数的函数地址反汇编机器码是否合法,如果是,则反钩子动态库向APP返回APP未被钩住的返回值,如果否,反钩子动态库向APP返回APP被钩住的返回值。
步骤204具体为:反钩子动态库将APP的C函数的函数地址作为输入参数,获得APP的C函数的函数地址反汇编机器码,并将获得的APP的C函数的函数地址反汇编机器码与反钩子动态库中预置的两组arm64跳转指令进行比对,判断两者的值是否相同,如果不相同,则反钩子动态库向APP返回APP未被钩住的返回值,如果相同,则反钩子动态库向APP返回APP被钩住的返回值。
具体的,反钩子动态库的具有C函数钩子检测功能的第二接口的自定义检测函数:int inline_钩子_check(long long a1) 被APP调用,反钩子动态库将APP的自定义C函数的函数地址:&getcfunc作为输入参数,获得APP的自定义C函数的函数地址反汇编机器码:*(uint32*)a1 *(uint32*)(a1 + 4),并将获得的APP的自定义C函数的函数地址反汇编机器码与反钩子动态库中预置的两组arm64跳转指令进行比对,判断两者的值是否相同,如果不相同,则反钩子动态库向APP返回APP未被钩住的返回值,如果相同,则反钩子动态库向APP返回APP被钩住的返回值,其中,第一组arm64跳转指令为:0x058000050 0x0d61f0200;第二组arm64跳转指令为:0x058000051 0x0df1f0220
具体的,将获得的APP的C函数的函数地址反汇编机器码与反钩子动态库中预置的两组arm64跳转指令进行比对具体为:
步骤a1,反钩子动态库将获得的APP的C函数的函数地址反汇编机器码的前四个字节与反钩子动态库中预置的第一组arm64跳转指令的前四个字节进行比对,判断两者是否相同,如果不相同,执行步骤a2, 如果相同,则反钩子动态库向APP返回APP被钩住的返回值;
步骤a2, 反钩子动态库将获得的APP的C函数的函数地址反汇编机器码的后四个字节与反钩子动态库中预置的第一组arm64跳转指令的后四个字节进行比较,判断两者是否相同,如果不相同,执行步骤a3,如果相同,则反钩子动态库向APP返回APP被钩住的返回值;
步骤a3, 反钩子动态库将获得的APP的C函数的函数地址反汇编机器码的前四个字节与反钩子动态库中预置的第二组arm64跳转指令的前四个字节进行比较,判断是否相同,如果不相同,执行步骤a4, 如果相同,则反钩子动态库向APP返回APP被钩住的返回值;
步骤a4, 反钩子动态库将获得的APP的C函数的函数地址反汇编机器码的后四个字节与反钩子动态库中预置的第二组arm64跳转指令的后四个字节进行比较,判断是否相同,如果不相同,反钩子动态库向APP返回APP未被钩住的返回值, 如果相同,反钩子动态库向APP返回APP被钩住的返回值。
实施例三
本实施例提供了一种iOS应用反钩子的装置,如图3所示,包括:反钩子动态库模块30,
反钩子动态库模块30包括:
被加载单元301,用于被应用加载反钩子动态库模块30;
具有Objective-c函数钩子检测功能的第一接口单元302,用于被应用调用,
获取单元303,用于当反钩子动态库模块30的具有Objective-c函数钩子检测功能的第一接口单元302被应用调用时,获取应用的自定义Objective-c函数所在单元的单元路径和预定的可执行文件的全路径;
判断单元304,用于判断获取单元303获取的应用的自定义Objective-c函数所在单元的单元路径和预定的可执行文件的全路径是否相同;
返回单元305,用于当判断单元304的判断结果为相同时,向应用返回应用未被钩住的返回值;还用于当判断单元304的判断结果为不相同时,向应用返回应用被钩住的返回值。
在本实施例中,获取单元303或者用于当反钩子动态库模块30的具有Objective-c函数钩子检测功能的第一接口单元302被应用调用时,获取应用的自定义Objective-c函数所在单元的单元基地址;
判断单元304或者用于判断应用的自定义Objective-c函数所在单元的单元基地址与预置函数所在单元的单元基地址是否相同。
在本实施例中,当判断单元304判断应用的自定义Objective-c函数所在单元的单元路径和预定的可执行文件的全路径相同时,获取单元303还用于获取应用的自定义Objective-c函数所在单元的单元基地址;
判断单元304还用于判断应用的自定义Objective-c函数所在单元的单元基地址与预置函数所在单元的单元基地址是否相同;
返回单元305用于当判断单元304判断应用的自定义Objective-c函数所在单元的单元基地址与预置函数所在单元的单元基地址相同时,向应用返回应用未被钩住的返回值;还用于当判断单元304判断应用的自定义Objective-c函数所在单元的单元基地址与预置函数所在单元的单元基地址不相同时,向应用返回应用被钩住的返回值。
在本实施例中,当判断单元304用于判断应用的自定义Objective-c函数所在单元的单元基地址与预置函数所在单元的单元基地址相同时,获取单元303还用于获取应用的自定义Objective-c函数所在单元的单元路径和预定的可执行文件的全路径,
判断单元304,用于判断应用的自定义Objective-c函数所在单元的单元路径和预定的可执行文件的全路径是否相同;
返回单元305,用于当判断单元304判断应用的自定义Objective-c函数所在单元的单元路径和预定的可执行文件的全路径为相同时,向应用返回应用未被钩住的返回值;还用于当判断单元304判断应用的自定义Objective-c函数所在单元的单元路径和预定的可执行文件的全路径为不相同时,向应用返回应用被钩住的返回值。
在本实施例中,获取单元303获取预定的可执行文件的全路径具体为:获取单元303根据预定的可执行文件映像在当前进程中的默认的索引号获得可执行文件的全路径。
在本实施例中,反钩子动态库模块30还包括:调用单元,
返回单元305用于当判断单元304的判断结果为不相同时,向应用返回应用被钩住的返回值被替换为:调用单元用于当判断单元304的判断结果为不相同时调用退出函数使应用退出。
在本实施例中,获取单元303用于获取应用的自定义Objective-c函数所在单元的单元路径具体为:获取单元303用于获取应用的自定义Objective-c函数的函数名称,根据函数名称获取函数指针,根据所函数的指针获取应用的自定义Objective-c函数所在单元的单元路径。
在本实施例中,预置函数所在单元的单元基地址为应用的自定义Objective-c函数所在类的任意一个函数所在单元的单元基地址。
在本实施例中,反钩子动态库模块30还包括:具有C函数钩子检测功能的第二接口单元;
获取单元303还用于,当具有C函数钩子检测功能的第二接口单元被应用调用时,获取应用的C函数的函数地址反汇编机器码;
判断单元304,还用于根据应用的C函数的函数地址反汇编机器码和预置的跳转指令判断应用的C函数是否被钩住;
返回单元305,还用于当判断单元304的判断结果为是时,向应用返回应用未被钩住的返回值;还用于当判断单元304的判断结果为否时,向应用返回应用被钩住的返回值。
在本实施例中,判断单元304,还用于根据应用的C函数的函数地址反汇编机器码和预置的跳转指令判断应用的C函数是否被钩住具体为:判断单元304还用于将应用的C函数的函数地址反汇编机器码与反钩子动态库模块30中预置的至少一组arm64跳转指令进行比对,判断两者的值是否相同,如果不相同,则应用的C函数未被钩住,如果相同,则应用的C函数被钩住。
在本实施例中,反钩子动态库模块30还包括:替换单元,用于当被加载单元301用于被应用加载反钩子动态库模块30时,将装置方法交换函数替换为具有方法判断功能的自定义函数;
设置单元,用于根据应用的应用的自定义Objective-c函数的函数名称设置预置的白名单;
被加载单元301具体用于完成反钩子动态库模块30被应用加载。
在本实施例中,反钩子动态库模块30还包括:调用获得单元,用于调用具有方法判断功能的自定义函数,获得装置方法交换函数的输入参数;
判断单元304还用于,输入参数所对应的函数名称是否在预置的白名单中;
返回单元305,用于当判断单元304的判断结果为是时,向应用返回应用被钩住的返回值;还用于当判断单元304的判断结果为否时,向应用返回应用未被钩住的返回值。
以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应所述以权利要求的保护范围为准。
Claims (20)
1.一种iOS应用反钩子的方法,其特征在于,所述方法包括:
步骤1,反钩子动态库被应用加载;
步骤2,当所述反钩子动态库的具有Objective-c函数钩子检测功能的第一接口被所述应用调用时,所述反钩子动态库获取所述应用的自定义Objective-c函数的函数名称,根据所述函数名称获取函数指针,根据所所述函数的指针获取所述应用的自定义Objective-c函数所在模块的模块路径,所述反钩子动态库获取预定的可执行文件的全路径,判断所述应用的自定义Objective-c函数所在模块的模块路径和所述预定的可执行文件的全路径是否相同,如果相同,执行步骤3,如果不相同,执行步骤4;
步骤3,反钩子动态库向所述应用返回应用未被钩住的返回值;步骤4,反钩子动态库向所述应用返回应用被钩住的返回值或者所述反钩子动态库调用退出函数使所述应用退出。
2.根据权利要求1所述的方法,其特征在于,所述步骤2或者为:
所述反钩子动态库获取所述应用的自定义Objective-c函数所在模块的模块基地址,判断所述应用的自定义Objective-c函数所在模块的模块基地址与预置函数所在模块的模块基地址是否相同,如果相同,执行步骤3,如果不相同,执行步骤4。
3.根据权利要求1所述的方法,其特征在于,所述步骤2中,当判断所述应用的自定义Objective-c函数所在模块的模块路径和所述预定的可执行文件的全路径相同时,还包括:所述反钩子动态库获取所述应用的自定义Objective-c函数所在模块的模块基地址,判断所述应用的自定义Objective-c函数所在模块的模块基地址与预置函数所在模块的模块基地址是否相同,如果相同,执行步骤3,如果不相同,执行步骤4。
4.根据权利要求2所述方法,其特征在于,当判断所述应用的自定义Objective-c函数所在模块的模块基地址与预置函数所在模块的模块基地址相同时,还包括:
所述反钩子动态库获取所述应用的自定义Objective-c函数所在模块的模块路径和预定的可执行文件的全路径,判断所述应用的自定义Objective-c函数所在模块的模块路径和所述预定的可执行文件的全路径是否相同,如果相同执行步骤3,如果不相同执行步骤4。
5.根据权利要求1所述的方法,其特征在于,所述步骤2中所述反钩子动态库获取预定的可执行文件的全路径具体为:所述反钩子动态库根据预定的可执行文件映像在当前进程中的默认的索引号获得可执行文件的全路径。
6.根据权利要求2或3所述的方法,其特征在于,所述预置函数所在模块的模块基地址为所述应用的自定义Objective-c函数所在类的任意一个函数所在模块的模块基地址。
7.根据权利要求1所述的方法,其特征在于,所述步骤2还包括:当所述反钩子动态库的具有C函数钩子检测功能的第二接口被所述应用调用时,所述反钩子动态库获取所述应用的C函数的函数地址反汇编机器码,根据所述应用的C函数的函数地址反汇编机器码和预置的跳转指令判断所述应用的C函数是否被钩住,如果是,执行步骤3,如果否,执行步骤4。
8.根据权利要求6所述的方法,其特征在于,所述步骤2中所述根据所述应用的C函数的函数地址反汇编机器码和预置的跳转指令判断应用的C函数是否被钩住具体为:将所述应用的C函数的函数地址反汇编机器码与所述反钩子动态库中预置的至少一组arm64跳转指令进行比对,判断两者的值是否相同,如果不相同,则执行步骤3,如果相同,则执行步骤4。
9.根据权利要求1所述的方法,其特征在于,所述步骤1具体为:反钩子动态库被应用加载时,所述反钩子动态库将系统方法交换函数替换为具有方法判断功能的自定义函数,所述反钩子动态库根据所述应用的自定义Objective-c函数的函数名称设置预置的白名单,所述反钩子动态库被所述应用加载完成。
10.根据权利要求9所述的方法,其特征在于,所述步骤1之后还包括:所述反钩子动态库调用具有方法判断功能的自定义函数,获得所述系统方法交换函数的输入参数,判断所述输入参数所对应的函数名称是否在所述预置的白名单中,如果是,执行步骤4,如果否,执行步骤3。
11.一种iOS应用反钩子的装置,其特征在于,所述装置包括反钩子动态库模块:
所述反钩子动态库模块包括:
被加载单元,用于被应用加载所述反钩子动态库模块;
具有Objective-c函数钩子检测功能的第一接口单元,用于被应用调用,
获取单元,用于当所述反钩子动态库模块的具有Objective-c函数钩子检测功能的第一接口单元被所述应用调用时,所述获取单元用于获取所述应用的自定义Objective-c函数的函数名称,根据所述函数名称获取函数指针,根据所所述函数的指针获取所述应用的自定义Objective-c函数所在单元的单元路径;还用于获取预定的可执行文件的全路径;
判断单元,用于判断所述获取单元获取的所述应用的自定义Objective-c函数所在单元的单元路径和所述预定的可执行文件的全路径是否相同;
返回单元,用于当所述判断单元的判断结果为相同时,向所述应用返回应用未被钩住的返回值;还用于当所述判断单元的判断结果为不相同时,向所述应用返回应用被钩住的返回值或者调用退出函数使所述应用退出。
12.根据权利要求11所述的装置,其特征在于,所述获取单元或者用于当所述反钩子动态库模块的具有Objective-c函数钩子检测功能的第一接口单元被所述应用调用时,获取所述应用的自定义Objective-c函数所在单元的单元基地址;
所述判断单元或者用于判断所述应用的自定义Objective-c函数所在单元的单元基地址与预置函数所在单元的单元基地址是否相同。
13.根据权利要求11所述的装置,其特征在于,当所述判断单元判断所述应用的自定义Objective-c函数所在单元的单元路径和所述预定的可执行文件的全路径相同时,所述获取单元还用于获取所述应用的自定义Objective-c函数所在单元的单元基地址;
所述判断单元还用于判断所述应用的自定义Objective-c函数所在单元的单元基地址与预置函数所在单元的单元基地址是否相同;
所述返回单元用于当所述判断单元判断所述应用的自定义Objective-c函数所在单元的单元基地址与预置函数所在单元的单元基地址相同时,向所述应用返回应用未被钩住的返回值;还用于当所述判断单元判断所述应用的自定义Objective-c函数所在单元的单元基地址与预置函数所在单元的单元基地址不相同时,向所述应用返回应用被钩住的返回值。
14.根据权利要求12所述的装置,其特征在于,当所述判断单元用于判断所述应用的自定义Objective-c函数所在单元的单元基地址与预置函数所在单元的单元基地址相同时,所述获取单元还用于获取所述应用的自定义Objective-c函数所在单元的单元路径和预定的可执行文件的全路径,
所述判断单元,用于判断所述应用的自定义Objective-c函数所在单元的单元路径和所述预定的可执行文件的全路径是否相同;
所述返回单元,用于当所述判断单元判断所述应用的自定义Objective-c函数所在单元的单元路径和所述预定的可执行文件的全路径为相同时,向所述应用返回应用未被钩住的返回值;还用于当所述判断单元判断所述应用的自定义Objective-c函数所在单元的单元路径和所述预定的可执行文件的全路径为不相同时,向所述应用返回应用被钩住的返回值。
15.根据权利要求11所述的装置,其特征在于,所述获取单元获取预定的可执行文件的全路径具体为:所述获取单元根据预定的可执行文件映像在当前进程中的默认的索引号获得可执行文件的全路径。
16.根据权利要求13或者14所述的装置,其特征在于,所述预置函数所在单元的单元基地址为所述应用的自定义Objective-c函数所在类的任意一个函数所在单元的单元基地址。
17.根据权利要求12所述的装置,其特征在于,所述反钩子动态库模块还包括:具有C函数钩子检测功能的第二接口单元;
所述获取单元还用于,当所述具有C函数钩子检测功能的第二接口单元被所述应用调用时,获取所述应用的C函数的函数地址反汇编机器码;
所述判断单元,还用于根据所述应用的C函数的函数地址反汇编机器码和预置的跳转指令判断所述应用的C函数是否被钩住;
所述返回单元,还用于当所述判断单元的判断结果为是时,向所述应用返回应用未被钩住的返回值;还用于当所述判断单元的判断结果为否时,向所述应用返回应用被钩住的返回值。
18.根据权利要求17所述的装置,其特征在于,所述判断单元,还用于根据所述应用的C函数的函数地址反汇编机器码和预置的跳转指令判断所述应用的C函数是否被钩住具体为:所述判断单元还用于将所述应用的C函数的函数地址反汇编机器码与所述反钩子动态库模块中预置的至少一组arm64跳转指令进行比对,判断两者的值是否相同,如果不相同,则所述应用的C函数未被钩住,如果相同,则所述应用的C函数被钩住。
19.根据权利要求11所述的装置,其特征在于,
所述反钩子动态库模块还包括:替换单元,用于当所述被加载单元用于被所述应用加载所述反钩子动态库模块时,将装置方法交换函数替换为具有方法判断功能的自定义函数;
设置单元,用于根据所述应用的应用的自定义Objective-c函数的函数名称设置预置的白名单;
所述被加载单元具体用于完成所述反钩子动态库模块被所述应用加载。
20.根据权利要求19所述的装置,其特征在于,所述反钩子动态库模块还包括:调用获得单元,用于调用所述具有方法判断功能的自定义函数,获得所述装置方法交换函数的输入参数;
所述判断单元还用于,所述输入参数所对应的函数名称是否在所述预置的白名单中;
返回单元,用于当所述判断单元的判断结果为是时,向所述应用返回应用被钩住的返回值;还用于当所述判断单元的判断结果为否时,向所述应用返回应用未被钩住的返回值。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011342321.1A CN112149113B (zh) | 2020-11-26 | 2020-11-26 | 一种iOS应用反钩子的方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011342321.1A CN112149113B (zh) | 2020-11-26 | 2020-11-26 | 一种iOS应用反钩子的方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN112149113A true CN112149113A (zh) | 2020-12-29 |
CN112149113B CN112149113B (zh) | 2021-06-08 |
Family
ID=73887211
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202011342321.1A Active CN112149113B (zh) | 2020-11-26 | 2020-11-26 | 一种iOS应用反钩子的方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN112149113B (zh) |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101964026A (zh) * | 2009-07-23 | 2011-02-02 | 中联绿盟信息技术(北京)有限公司 | 网页挂马检测方法和系统 |
US9444832B1 (en) * | 2015-10-22 | 2016-09-13 | AO Kaspersky Lab | Systems and methods for optimizing antivirus determinations |
CN106970871A (zh) * | 2016-01-14 | 2017-07-21 | 阿里巴巴集团控股有限公司 | 一种外挂程序检测的方法及装置 |
CN109063481A (zh) * | 2018-07-27 | 2018-12-21 | 平安科技(深圳)有限公司 | 一种风险检测方法和装置 |
-
2020
- 2020-11-26 CN CN202011342321.1A patent/CN112149113B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101964026A (zh) * | 2009-07-23 | 2011-02-02 | 中联绿盟信息技术(北京)有限公司 | 网页挂马检测方法和系统 |
US9444832B1 (en) * | 2015-10-22 | 2016-09-13 | AO Kaspersky Lab | Systems and methods for optimizing antivirus determinations |
CN106970871A (zh) * | 2016-01-14 | 2017-07-21 | 阿里巴巴集团控股有限公司 | 一种外挂程序检测的方法及装置 |
CN109063481A (zh) * | 2018-07-27 | 2018-12-21 | 平安科技(深圳)有限公司 | 一种风险检测方法和装置 |
Also Published As
Publication number | Publication date |
---|---|
CN112149113B (zh) | 2021-06-08 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US8589889B2 (en) | Apparatus and method of detecting errors in embedded software | |
US20100211769A1 (en) | Concurrent Execution of a Smartphone Operating System and a Desktop Operating System | |
US10019598B2 (en) | Dynamic service discovery | |
WO2013101193A1 (en) | Method and device for managing hardware errors in a multi-core environment | |
US9606905B2 (en) | Systems, methods, and media for testing software patches | |
CN108717374B (zh) | Java虚拟机启动时预热的方法、装置、及计算机设备 | |
US20160246709A1 (en) | Source code unit testing using an indexing tool | |
CN112333246B (zh) | 一种ABtest实验方法、装置、智能终端及存储介质 | |
CN112084024B (zh) | 一种内存监控方法、装置、介质和电子设备 | |
CN110704303B (zh) | 一种测试覆盖度信息的获取方法及装置 | |
US20180288121A1 (en) | Streaming media play mode determination method and apparatus | |
CN112149113B (zh) | 一种iOS应用反钩子的方法及装置 | |
CN111367745B (zh) | 无操作系统支持的内存压力测试方法、系统及相关组件 | |
EP3566150B1 (en) | Data consistency check in distributed system | |
US6785883B1 (en) | Software system for tracing data | |
US11227052B2 (en) | Malware detection with dynamic operating-system-level containerization | |
CN115426286B (zh) | 产品自动测试方法、装置、设备及计算机可读存储介质 | |
CN110688320A (zh) | 全局变量的检测方法、装置及终端设备 | |
CN112685744B (zh) | 一种利用栈相关寄存器检测软件漏洞的方法及装置 | |
CN106775608A (zh) | 独立系统进程的实现方法和装置 | |
CN108810412A (zh) | 视频处理方法、视频处理装置及终端设备 | |
CN111159714B (zh) | 一种访问控制中主体运行时可信验证方法及系统 | |
CN110874729A (zh) | 电子红包识别策略的切换方法、切换装置及移动终端 | |
CN115048107A (zh) | 代码编译方法、系统、电子设备及存储介质 | |
CN114201413A (zh) | 自动化测试方法、系统及电子设备 |
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 | ||
GR01 | Patent grant | ||
GR01 | Patent grant |