一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

一种函数被hook时的处理方法及装置与流程

2022-02-20 07:33:22 来源:中国专利 TAG:


1.本技术涉及信息安全领域,尤其涉及一种函数被hook时的处理方法及装置。


背景技术:

2.钩子(hook)技术用于挂钩程序中的目标函数,以改变程序的原执行流程。在系统调用目标函数之前,利用hook技术将目标函数替换为自定义函数,使程序执行自定义函数逻辑,达到函数“掉包”目的;内联钩子(inline hook)则是通过修改目标函数里面的指令,利用跳转指令使挂钩点的指令发生变化,以此达到挂钩目标函数的目的。
3.ios系统下,待调用的函数被钩时,函数逻辑会发生改变,设备调用被钩函数后无法获得真实运行结果,系统安全性低。


技术实现要素:

4.本技术实施例提供了一种函数被hook时的处理方法及装置,所述技术方案如下:第一方面,本技术实施例提供了一种函数被hook时的处理方法,所述方法应用于ios系统,包括:利用自定义hook检测函数对待调用的被检测函数进行hook检测,确定所述被检测函数中是否存在目标框架的inline hook;若所述被检测函数中存在目标框架的inline hook,获取所述被检测函数的起始地址,向所述被检测函数的起始地址增加第一指定长度,获得目标地址;遍历所述被检测函数所在程序占用的内存,循环查找区域地址,其中,向所述区域地址增加第二指定长度获得跳转指令地址,所述跳转指令地址存储的地址与所述目标地址相同,所述第二指定长度大于所述第一指定长度;若查找到所述区域地址,则通过预置函数接收所述区域地址,所述预置函数为自定义函数,且与所述被检测函数类型相同;调用接收所述区域地址的预置函数,执行所述被检测函数未被hook时的函数逻辑。
5.第二方面,本技术实施例提供了一种函数被hook时的处理装置,所述装置应用于ios系统,包括:hook检测模块,用于利用自定义hook检测函数对待调用的被检测函数进行hook检测,确定所述被检测函数中是否存在目标框架的inline hook;目标地址获取模块,用于若所述被检测函数中存在目标框架的inline hook,获取所述被检测函数的起始地址,向所述被检测函数的起始地址增加第一指定长度,获得目标地址;区域地址查找模块,用于遍历所述被检测函数所在区域,循环查找区域地址,其中,向所述区域地址增加第二指定长度获得跳转指令地址,所述跳转指令地址存储的地址与所述目标地址相同,所述第二指定长度大于所述第一指定长度;
区域地址接收模块,用于若查找到所述区域地址,则通过预置函数接收所述区域地址,所述预置函数为自定义函数,且与所述被检测函数类型相同;环境检测模块,用于调用接收所述区域地址的预置函数,执行所述被检测函数未被hook时的函数逻辑。
6.第三方面,本技术实施例提供了一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现上述任一项方法的步骤。
7.第四方面,本技术实施例提供了一种执行函数被hook时的处理方法的设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现上述任一项方法的步骤。
8.本技术一些实施例提供的技术方案带来的有益效果至少包括:本技术实施例提供的函数被hook时的处理方法,在待调用的被检测函数被hook的情况下,通过内存搜索获得区域地址,利用与被检测函数类型相同的预置函数接收区域地址从而执行被检测函数的原函数逻辑,该方式使得被检测函数在被hook的情况下,依然能够执行被检测函数的原函数逻辑,ios设备可以获得真实运行结果,系统安全性高。
附图说明
9.为了更清楚地说明本技术实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本技术的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
10.图1是本技术实施例提供的一种函数被hook时的处理方法的流程示意图;图2-图3是本技术实施例提供的一种函数被hook时的处理方法的流程示意图;图4-图5是本技术实施例提供的一种函数被hook时的处理方法的流程示意图;图6是本技术实施例提供的一种函数被hook时的处理装置的结构示意图。
具体实施方式
11.为使本技术的目的、技术方案和优点更加清楚,下面将结合附图对本技术实施例方式作进一步地详细描述。
12.下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本技术相一致的所有实施方式。相反,它们仅是如所附权利要求书中所详述的、本技术的一些方面相一致的装置和方法的例子。
13.在本技术的描述中,需要理解的是,术语“第一”、“第二”等仅用于描述目的,而不能理解为指示或暗示相对重要性。对于本领域的普通技术人员而言,可以具体情况理解上述术语在本技术中的具体含义。此外,在本技术的描述中,除非另有说明,“多个”是指两个或两个以上。“和/或”,描述关联对象的关联关系,表示可以存在三种关系,例如,a和/或b,可以表示:单独存在a,同时存在a和b,单独存在b这三种情况。字符“/”一般表示前后关联对象是一种“或”的关系。
14.下面将结合附图1-附图5,对本技术实施例提供的函数被hook时的处理方法进行
详细介绍。
15.请参见图1,为本技术实施例提供的一种函数被hook时的处理方法的流程示意图。
16.如图1所示,本技术实施例的所述方法可以包括以下步骤:s101,利用自定义hook检测函数对待调用的被检测函数进行hook检测,确定被检测函数中是否存在目标框架的inline hook。
17.目标框架包括cydia框架与dobby框架。
18.上述两种框架使用的hook检测函数不同,假设第一hook检测函数用于检测cydia框架的inline hook,第二hook检测函数用于检测dobby框架的inline hook,则存在:一种可能的方式中,先利用第一hook检测函数检测cydia框架的inline hook,另一种可能的方式中,则是先利用第二hook检测函数检测dobby框架的inline hook,本实施例对检测顺序不作限定。要指出的是,当第一hook检测函数未检测出cydia框架的inline hook时,则需继续利用第二hook检测函数检测dobby框架的inline hook。
19.s102,若被检测函数中存在目标框架的inline hook,获取被检测函数的起始地址,向被检测函数的起始地址增加第一指定长度,获得目标地址。
20.被检测函数被hook时,被检测函数的部分字节被替换掉,在被检测函数的起始地址的基础上增加第一指定长度可获得被检测函数未被hook时的执行地址。第一指定长度即为被替换掉的部分字节函数头长度,且根据hook框架的不同,第一指定长度会有所不同。
21.具体的,当被检测函数中存在cydia框架的inline hook时,第一指定长度为16字节函数头长度;当被检测函数中存在dobby框架的inline hook时,第一指定长度为12字节函数头长度。
22.s103,遍历被检测函数所在程序占用的内存,循环查找区域地址,其中,向区域地址增加第二指定长度获得跳转指令地址,跳转指令地址存储的地址与目标地址相同,第二指定长度大于第一指定长度。
23.其中,第二指定长度=被替换掉的部分字节函数头长度 8字节跳转指令长度。
24.s104,若查找到区域地址,则通过预置函数接收区域地址,预置函数为自定义函数,且与被检测函数类型相同。
25.通过相同类型的预置函数的指针接收区域地址,以执行与被检测函数未被hook时相同的函数逻辑。
26.s105,调用接收区域地址的预置函数,执行被检测函数未被hook时的函数逻辑。
27.上述方法应用于运行ios系统的设备上,包括但不限于苹果手机、ipad等。
28.本技术实施例提供的函数被hook时的处理方法,在待调用的被检测函数被hook的情况下,通过内存搜索获得区域地址,利用与被检测函数类型相同的预置函数接收区域地址从而执行被检测函数的原函数逻辑,该方式使得被检测函数在被hook的情况下,依然能够执行被检测函数的原函数逻辑,ios设备可以获得真实运行结果,系统安全性高。
29.请参见图2-图3,为本技术实施例提供的一种函数被hook时的处理方法的流程示意图。
30.如图2-图3所示,本技术实施例的所述方法可以包括以下步骤:s201,利用第一hook检测函数对待调用的被检测函数进行hook检测,确定被检测函数中是否存在cydia框架的inline hook,若是,执行步骤s202,否则,执行步骤s206。
31.被检测函数为自定义的c函数。
32.在调用被检测函数前,利用自定义的hook检测函数确定被检测函数是否被hook。
33.自定义的第一hook检测函数具体为:int inline_hook_check(__int64 a1)。
34.确定被检测函数中是否存在cydia框架的inline hook的具体实现方式可以是:将被检测函数的函数地址:&function0传入int inline_hook_check(__int64 a1)中,若int inline_hook_check(__int64 a1)的返回值为1,则确定被检测函数中存在cydia框架的inline hook,即被检测函数的原函数逻辑已被更改,执行步骤s202。
35.s202,获取被检测函数的起始地址,向被检测函数的起始地址增加第一长度,获得第一目标地址。
36.待调用的被检测函数的起始地址具体为:&function0,其中,function0为被检测函数。
37.所增加的第一长度具体为:16字节的函数头长度。
38.cydia框架下的inline hook替换的是被检测函数的前16个字节,在被检测函数的起始地址的基础上增加16字节的函数头的长度可获得被检测函数未被hook时的执行地址。
39.s203,遍历被检测函数所在程序占用的内存,循环查找第一区域地址,其中,向第一区域地址增加第二长度获得第一跳转指令地址,第一跳转指令地址存储的地址与第一目标地址相同。
40.所增加的第二长度具体为:16字节函数头长度加8字节跳转指令长度。
41.遍历被检测函数所在程序占用的内存,查找是否存在第一区域地址,第一区域地址应满足其在增加16字节函数头长度和8字节跳转指令长度后与被检测函数未被hook时的执行地址相同。
42.s204,若查找到第一区域地址,则通过预置函数接收第一区域地址,预置函数为自定义函数,且与被检测函数类型相同。
43.预置函数与被检测函数类型相同:参数和返回值相同。
44.待检测到被检测函数已被hook时设置预置函数。
45.通过相同类型的预置函数的指针接收第一区域地址,以执行与原被检测函数相同的函数逻辑。
46.一种可能的实现方式中,预置函数具体为:typedef int antidebug(int,int)。
47.s205,调用接收第一区域地址的预置函数,执行被检测函数未被hook时的函数逻辑。
48.接收第一区域地址的预置函数执行的是被检测函数未被hook时的原函数逻辑。
49.上述方法实现了被检测函数中存在cydia框架的inline hook时系统仍可执行原函数的函数逻辑。
50.s206,利用第二hook检测函数对被检测函数进行hook检测,确定被检测函数中是否存在dobby框架的inline hook,若是,执行步骤s207,否则,执行步骤s211。
51.当待调用的被检测函数中不存在cydia框架的inline hook时,通过第二hook检测函数进一步确定被检测函数中是否存在dobby框架的inline hook。
52.自定义的第二hook检测函数具体为:int inline_dobbyhook_check(__int64 a1)。
53.将被检测函数的函数地址传入int inline_dobbyhook_check(__int64 a1)中,若int inline_dobbyhook_check(__int64 a1)的返回值为1,则表示被检测函数中存在dobby框架的inline hook,即被检测函数的原函数逻辑已被更改,执行步骤s207。
54.s207,获取被检测函数的起始地址,向被检测函数的起始地址增加第三长度,获得第二目标地址。
55.所增加的第三长度具体为:12字节的函数头长度。
56.dobby框架下的inline hook替换的是被检测函数的前12个字节,在被检测函数的起始地址的基础上增加12字节的函数头的长度可获得被检测函数未被hook时的执行地址,执行下一步骤。
57.s208,遍历被检测函数所在程序占用的内存,循环查找第二区域地址,其中,向第二区域地址增加第四长度获得第二跳转指令地址,第二跳转指令地址存储的地址与第二目标地址相同。
58.所增加的第四长度具体为:12字节的函数头长度加8字节的跳转指令长度。
59.遍历被检测函数所在程序占用的内存,查找是否存在第二区域地址,第二区域地址应满足其在增加12字节函数头长度和8字节跳转指令长度后与被检测函数未被hook时的执行地址相同。
60.s209,若查找到第二区域地址,则通过预置函数接收第二区域地址。
61.s210,调用接收第二区域地址的预置函数,执行被检测函数未被hook时的函数逻辑。
62.s211,调用被检测函数,执行被检测函数未被hook时的函数逻辑。
63.当被检测函数中既不存在cydia框架的inline hook,也不存在dobby框架的inline hook时,视作被检测函数未被hook,调用被检测函数,执行被检测函数未被hook时的函数逻辑。
64.要指出的是,上述实施例仅是提供了一种可能的检测顺序,在其他实施例中,还可能是先检测dobby框架的inline hook后检测cydia框架的inline hook。
65.本技术提供的所述方法在调用被检测函数前,先确定该函数是否被hook了:若被检测函数未被hook,则执行被检测函数逻辑;若被检测函数被hook了,则在内存中搜索第一区域地址/第二区域地址,并通过一个与被检测函数类型相同的预置函数接收第一区域地址/第二区域地址,执行该预置函数逻辑。其中,接收了第一区域地址/第二区域地址的预置函数与原函数(指未被hook的被检测函数)具备相同的函数逻辑。
66.通过上述方法,在被检测函数被hook的情况下,ios系统依然能够通过接收了第一区域地址/第二区域地址的预置函数执行原函数逻辑。
67.请参见图4-图5,为本技术实施例提供的一种函数被hook时的处理方法的流程示意图。
68.如图4-图5所示,本技术实施例的所述方法可以包括以下步骤:s301,利用第一hook检测函数对待调用的被检测函数进行hook检测,确定待调用的被检测函数中是否存在cydia框架的inline hook,若是,执行步骤s302,否则,执行步骤s306。
69.本步骤具体可包括:
s301-a,获取待调用的被检测函数的地址,基于被检测函数的地址以及第一hook检测函数,获取被检测函数的地址对应的第一反汇编。
70.s301-b,将第一反汇编的第一机器码与预置的第一目标机器码进行比较,若相同,执行步骤s301-c,否则,执行步骤s301-d。
71.第一反汇编的第一机器码具体为:第一反汇编的第一条指令的机器码。
72.预置的第一目标机器码具体可以是:0x058000050。
73.s301-c,将第一反汇编的第二机器码与预置的第二目标机器码进行比较,若相同,则确定被检测函数中存在cydia框架的inline hook,执行步骤s302,否则,执行步骤s301-d。
74.第一目标机器码与第二目标机器码是预置的第一组跳转指令下的不同机器码。
75.预置的第二目标机器码具体可以是:0xd61f0220。
76.s301-d,将第一反汇编的第一机器码与预置的第三目标机器码进行比较,若相同,执行步骤s301-e,若不相同,则确定被检测函数中不存在cydia框架的inline hook,执行步骤s306。
77.第一反汇编的第二机器码具体为:第一反汇编的第二条指令的机器码。
78.预置的第三目标机器码具体可以是:0x058000051。
79.s301-e,将第一反汇编的第二机器码与预置的第四目标机器码进行比较,若相同,则确定被检测函数中存在cydia框架的inline hook,执行步骤s302,若不相同,则确定被检测函数中不存在cydia框架的inline hook,执行步骤s306。
80.第三目标机器码与第四目标机器码是预置的第二组跳转指令下的不同机器码。
81.预置的第四目标机器码具体可以是:0x0d61f0221。
82.s302,获取被检测函数的起始地址,向被检测函数的起始地址增加第一长度,获得第一目标地址。
83.本步骤同s202,此处不再赘述。
84.s303,遍历被检测函数所在程序占用的内存,循环查找第一区域地址,其中,向第一区域地址增加第二长度获得第一跳转指令地址,第一跳转指令地址存储的地址与第一目标地址相同。
85.本步骤具体可包括:s303-a,调用内存搜索函数,根据内存搜索函数以及第一传入地址,获取第一传入地址所在区域的起始地址与区域长度。
86.进一步的,步骤s303-a包括:s303-a1,调用vm_region_64()函数,将第一传入地址传入vm_region_64()函数中的第二个参数,执行vm_region_64()函数,第一传入地址为零。
87.vm_region_64()函数具体为:vm_region_64(vm_map_t target_task,vm_address_t *address,vm_size_t *size, vm_region_flavor_t flavor,vm_region_info_t info, mach_msg_type_number_t *infocnt, mach_port_t *object_name ),其中,vm_address_t *address为该函数中的第二个参数。
88.向系统函数vm_region_64()传入的地址从0开始。
89.s303-a2,当vm_region_64()函数执行成功时,返回第一传入地址所在区域的起始地址与区域长度。
90.此外,若vm_region_64()函数执行失败(即该函数返回null时),则视被检测函数未被hook,调用被检测函数执行被检测函数未被hook时的函数逻辑。
[0091] s303-b,向第一传入地址所在区域的起始地址增加第二长度获得第一子跳转指令地址,判断第一子跳转指令地址存储的地址是否与第一目标地址相同,若不相同,执行步骤s303-c,若相同,则将第一传入地址所在区域的起始地址作为第一区域地址,执行步骤s304。
[0092]
第一传入地址所在区域的起始地址在增加16字节的函数头的长度和8字节的跳转指令的长度后与第一目标地址相同时,将该起始地址作为第一区域地址进行返回,执行步骤s304。
[0093]
s303-c,向第一传入地址增加区域长度,获得第二传入地址,重复步骤s303-a至步骤s303-b。
[0094]
将第二传入地址传入vm_region_64()函数,继续循环执行vm_region_64()函数,查找第一区域地址。
[0095]
当vm_region_64()函数传入第二传入地址后返回的起始地址在增加16字节函数头长度和8字节跳转指令长度后仍不等于第一目标地址时,则向第二传入地址增加第二传入地址所在区域的长度,获得第三传入地址,将第三传入地址传入vm_region_64()函数中,重复执行上述步骤查找第一区域地址,直至遍历完被检测函数所在程序占用的内存。
[0096]
若遍历完被检测函数所在程序占用的内存未查找到第一区域地址,执行步骤s311。
[0097]
s304,通过预置函数接收第一区域地址,预置函数为自定义函数,且与被检测函数类型相同。
[0098]
s305,调用接收第一区域地址的预置函数,执行被检测函数未被hook时的函数逻辑。
[0099]
s306,利用第二hook检测函数对被检测函数进行hook检测,确定被检测函数中是否存在dobby框架的inline hook,若是,执行步骤s307,否则,执行步骤s311。
[0100]
本步骤具体可包括:s306-a,基于被检测函数的地址以及第二hook检测函数,获取被检测函数的地址对应的第二反汇编。
[0101]
s306-b,将第二反汇编的第一机器码与预置的第五目标机器码进行比较,若相同,执行步骤s306-c,否则,确定被检测函数中不存在dobby框架的inline hook,执行步骤s311。
[0102]
第二反汇编的第一机器码具体为:第二反汇编的第一条指令的机器码。
[0103]
预置的第五目标机器码具体可以是:0x90000011。
[0104]
s306-c,将第二反汇编的第二机器码与预置的第六目标机器码进行比较,若相同,则确定被检测函数中存在dobby框架的inline hook,执行步骤s307,否则,确定被检测函数中不存在dobby框架的inline hook,执行步骤s311。
[0105]
第二反汇编的第二机器码具体为:第二反汇编的第三条指令的机器码。
[0106]
跳过第二反汇编的前两条指令,利用第三条指令的机器码与第六目标机器码进行比较。
[0107]
第五目标机器码与第六目标机器码是预置的第三组跳转指令下的不同机器码。
[0108]
检测dobby框架的inline hook时,仅预置一组跳转指令,本步骤中的第三组跳转指令旨在与上述第一组跳转指令、第二组跳转指令进行区分。
[0109]
s307,获取被检测函数的起始地址,向被检测函数的起始地址增加第三长度,获得第二目标地址。
[0110]
本步骤同s207,此处不再赘述。
[0111]
s308,遍历被检测函数所在程序占用的内存,循环查找第二区域地址,其中,向第二区域地址增加第四长度获得第二跳转指令地址,第二跳转指令地址存储的地址与第二目标地址相同。
[0112]
本步骤具体可包括:s308-a,调用内存搜索函数,根据内存搜索函数以及第一传入地址,获取第一传入地址所在区域的起始地址与区域长度。
[0113]
进一步的,步骤s308-a包括:s308-a1,调用vm_region_64()函数,将第一传入地址传入vm_region_64()函数中的第二个参数,执行vm_region_64()函数,第一传入地址为零。
[0114]
与步骤s303-a一致,本步骤中的传入地址也从0开始。
[0115]
s308-a2,当vm_region_64()函数执行成功时,返回第一传入地址所在区域的起始地址与区域长度。
[0116]
s308-b,向第一传入地址所在区域的起始地址增加第四长度获得第二子跳转指令地址,判断第二子跳转指令地址存储的地址是否与第二目标地址相同,若不相同,执行步骤s308-c,若相同,则将第一传入地址所在区域的起始地址作为第二区域地址,执行步骤s309。
[0117]
第一传入地址所在区域的起始地址在增加12字节的函数头的长度和8字节的跳转指令的长度后与第二目标地址相同时,将该起始地址作为第二区域地址进行返回,执行步骤s309。
[0118]
s308-c,向第一传入地址增加区域长度,获得第二传入地址,重复步骤s308-a至步骤s308-b。
[0119]
将第二传入地址传入vm_region_64()函数,继续循环执行vm_region_64()函数,查找第二区域地址。
[0120]
在判断结果为不相同的情况下,向第一传入地址增加区域长度,获得第二传入地址,本步骤中的第二传入地址与步骤s304-f中的第二传入地址相同。
[0121]
循环过程具体可参考步骤s303-c。
[0122]
若遍历完被检测函数所在程序占用的内存未查找到第二区域地址,执行步骤s311。
[0123]
s309,通过预置函数接收第二区域地址。
[0124]
s310,调用接收第二区域地址的预置函数,执行被检测函数未被hook时的函数逻辑。
[0125]
s311,调用被检测函数,执行被检测函数未被hook时的函数逻辑。
[0126]
可能的实施例中,上述被检测函数用于对ios运行环境进行异常检测。
[0127]
异常运行环境包括越狱环境、模拟器环境以及渗透调试环境。
[0128]
可选实施例中,若被检测函数用于检测越狱环境,执行被检测函数未被hook时的函数逻辑具体可包括如下步骤:s311-a1,获取被检测函数中的数组,遍历数组,获取越狱文件字符串,数组为预置的自定义数组且包含至少两条越狱文件路径。
[0129]
s311-a2,通过c字符指针接收越狱文件字符串,将接收越狱文件字符串的c字符指针放入内联汇编的输入操作列表中。
[0130]
s311-a3,在内联汇编中读取sys_access函数、sys_stat64函数、sys_open函数中任意一函数对应的编号至寄存器。
[0131]
s311-a4,基于所读取的编号,调用内联汇编触发中断。
[0132]
s311-a5,将被检测函数的调用结果写入内联汇编的输出操作列表中,获取输出操作列表的变量。
[0133]
s311-a6,获取针对输出操作列表变的判断结果。
[0134]
s311-a7,若判断结果不为零,则确定当前运行环境为越狱环境。
[0135]
可选实施例中,若被检测函数用于检测越狱环境,执行被检测函数未被hook时的函数逻辑具体可包括如下步骤:s311-b1,基于dyld_insert_libraries以及getenv系统c函数,获取返回值。
[0136]
s311-b2,若返回值不为零,则确定当前运行环境为越狱环境。
[0137]
可选实施例中,若被检测函数用于检测模拟器环境,执行被检测函数未被hook时的函数逻辑具体可包括如下步骤:s311-c1,通过nsprocessinfo获取进程信息,在进程信息中读取运行参数。
[0138]
s311-c2,确定运行参数中是否包含coresimulator字段。
[0139]
s311-c3,若运行参数中包含coresimulator字段,则确定当前运行环境为模拟器环境。
[0140]
可选实施例中,若被检测函数用于检测渗透调试环境,执行被检测函数未被hook时的函数逻辑具体可包括如下步骤:s311-d1,建立socket连接,并判断socket连接是否成功。
[0141]
s311-d2,若socket连接成功,则确定通信端口27042处于开放状态、frida调试框架中包含frida client,当前运行环境为渗透调试环境。
[0142]
可选实施例中,若被检测函数检测出ios的app运行环境不安全,可通过弹框、震动、语音等形式对用户进行提示。
[0143]
本技术实施例提供的函数被hook时的处理方法,当用于检测异常运行环境的被检测函数存在cydia框架的inline hook或者dobby框架的inline hook时,通过内存搜索获得第一区域地址/第二区域地址,利用与被检测函数类型相同的预置函数接收第一区域地址/第二区域地址,并执行该预置函数逻辑对当前运行环境进行异常检测。该方式使得被检测函数在被hook的情况下,被检测函数的原逻辑依然能够被执行,所述方法切实保证了运行环境检测结果的真实性,保证了app的运行安全;此外,针对越狱环境的检测,上述方法是在
被检测函数内部通过内联汇编进行越狱文件检测,进一步提高了越狱环境的检测准确度。
[0144]
下述为本技术装置实施例,可以用于执行本技术方法实施例。对于本技术装置实施例中未披露的细节,请参照本技术方法实施例。
[0145]
请参见图6,为本技术一个示例性实施例提供的函数被hook时的处理装置的结构示意图。该函数被hook时的处理装置可以通过软件、硬件或者两者的结合实现成为设备的全部或一部分,还可以作为独立的模块集成于服务器上。
[0146]
本技术实施例中的函数被hook时的处理装置应用于ios系统,函数被hook时的处理装置1包括hook检测模块11、目标地址获取模块12、区域地址查找模块13、区域地址接收模块14和函数调用模块15,其中:hook检测模块11,用于利用自定义hook检测函数对待调用的被检测函数进行hook检测,确定所述被检测函数中是否存在目标框架的inline hook;目标地址获取模块12,用于若所述被检测函数中存在目标框架的inline hook,获取所述被检测函数的起始地址,向所述被检测函数的起始地址增加第一指定长度,获得目标地址;区域地址查找模块13,用于遍历所述被检测函数所在区域,循环查找区域地址,其中,向所述区域地址增加第二指定长度获得跳转指令地址,所述跳转指令地址存储的地址与所述目标地址相同,所述第二指定长度大于所述第一指定长度;区域地址接收模块14,用于若查找到所述区域地址,则通过预置函数接收所述区域地址,所述预置函数为自定义函数,且与所述被检测函数类型相同;函数调用模块15,用于调用接收所述区域地址的预置函数,执行所述被检测函数未被hook时的函数逻辑。
[0147]
可选的,所述函数被hook时的处理装置1中的hook检测模块11具体用于:利用所述第一hook检测函数对所述被检测函数进行hook检测,确定所述被检测函数中是否存在cydia框架的inline hook;所述目标地址获取模块12具体用于:若所述被检测函数中存在cydia框架的inline hook,获取所述被检测函数的起始地址,向所述被检测函数的起始地址增加第一长度,获得第一目标地址;所述区域地址查找模块13具体用于:遍历所述被检测函数所在程序占用的内存,循环查找第一区域地址,其中,向所述第一区域地址增加第二长度获得第一跳转指令地址,所述第一跳转指令地址存储的地址与所述第一目标地址相同;所述区域地址接收模块14具体用于:若查找到所述第一区域地址,则通过所述预置函数接收所述第一区域地址;所述函数调用模块15具体用于:调用接收所述第一区域地址的预置函数,执行所述被检测函数未被hook时的函数逻辑。
[0148]
可选的,所述函数被hook时的处理装置1中的hook检测模块11具体还用于:若所述被检测函数中不存在cydia框架的inline hook,则利用所述第二hook检测函数对所述被检测函数进行hook检测,确定所述被检测函数中是否存在dobby框架的
inline hook;所述目标地址获取模块12具体还用于:若所述被检测函数中存在dobby框架的inline hook,则获取所述被检测函数的起始地址,向所述被检测函数的起始地址增加第三长度,获得第二目标地址;所述区域地址查找模块13具体还用于:遍历所述被检测函数所在程序占用的内存,循环查找第二区域地址,其中,向所述第二区域地址增加第四长度获得第二跳转指令地址,所述第二跳转指令地址存储的地址与所述第二目标地址相同;所述区域地址接收模块14具体还用于:若查找到所述第二区域地址,则通过所述预置函数接收所述第二区域地址;所述函数调用模块15具体还用于:调用接收所述第二区域地址的预置函数,执行所述被检测函数未被hook时的函数逻辑。
[0149]
可选的,所述区域地址查找模块13具体包括:参数获取单元,用于调用内存搜索函数,根据所述内存搜索函数以及第一传入地址,获取所述第一传入地址所在区域的起始地址与区域长度;地址判断单元,用于向所述第一传入地址所在区域的起始地址增加所述第二长度获得第一子跳转指令地址,判断所述第一子跳转指令地址存储的地址是否与所述第一目标地址相同;地址确定单元,用于若所述第一子跳转指令地址存储的地址与所述第一目标地址相同,则将所述第一传入地址所在区域的起始地址作为所述第一区域地址;循环查找单元,用于若所述第一子跳转指令地址存储的地址与所述第一目标地址不相同,则向所述第一传入地址增加所述区域长度,获得第二传入地址,调用所述内存搜索函数,根据所述内存搜索函数以及所述第二传入地址,继续在所述被检测函数所在程序占用的内存中查找所述第一区域地址。
[0150]
可选的,所述区域地址查找模块13具体包括:所述参数获取单元,用于调用内存搜索函数,根据所述内存搜索函数以及第一传入地址,获取所述第一传入地址所在区域的起始地址与区域长度;所述地址判断单元,用于向所述第一传入地址所在区域的起始地址增加所述第四长度获得第二子跳转指令地址,判断所述第二子跳转指令地址存储的地址是否与所述第二目标地址相同;所述地址确定单元,用于若所述第二子跳转指令地址存储的地址与所述第二目标地址相同,则将所述第一传入地址所在区域的起始地址作为所述第二区域地址;循环查找单元,用于若所述第二子跳转指令地址存储的地址与所述第二目标地址不相同,则向所述第一传入地址增加所述区域长度,获得第二传入地址,调用所述内存搜索函数,根据所述内存搜索函数以及所述第二传入地址,继续在所述被检测函数所在程序占用的内存中查找所述第二区域地址。
[0151]
可选的,所述函数调用模块15具体用于:若遍历完所述被检测函数所在程序占用的内存未查找到所述第一区域地址或所
述第二区域地址,则调用所述被检测函数,执行所述被检测函数未被hook时的函数逻辑。
[0152]
可选的,所述hook检测模块11具体用于:获取所述被检测函数的地址,基于所述被检测函数的地址以及所述第一hook检测函数,获取所述被检测函数的地址对应的第一反汇编;将所述第一反汇编的第一机器码与预置的第一目标机器码进行比较;若所述第一反汇编的第一机器码与所述第一目标机器码相同,则将所述第一反汇编的第二机器码与预置的第二目标机器码进行比较;若所述第一反汇编的第二机器码与所述第二目标机器码相同,则确定所述被检测函数中存在cydia框架的inline hook;若所述第一反汇编的第一机器码与所述第一目标机器码不相同,或者,所述第一反汇编的第二机器码与所述第二目标机器码不相同,则将所述第一反汇编的第二机器码与预置的第三目标机器码进行比较;若所述第一反汇编的第一机器码与所述第三目标机器码相同,则将所述第一反汇编的第二机器码与预置的第四目标机器码进行比较;若所述第一反汇编的第二机器码与所述第四目标机器码相同,则确定所述被检测函数中存在cydia框架的inline hook;若所述第一反汇编的第一机器码与所述第三目标机器码不相同,或者,所述第一反汇编的第二机器码与所述第四目标机器码不相同,则确定所述被检测函数中不存在cydia框架的inline hook。
[0153]
可选的,所述hook检测模块11具体用于:获取所述被检测函数的地址,基于所述被检测函数的地址以及所述第二hook检测函数,获取所述被检测函数的地址对应的第二反汇编;将所述第二反汇编的第一机器码与预置的第五目标机器码进行比较;若所述第二反汇编的第一机器码与所述第五目标机器码相同,则将所述第二反汇编的第二机器码与预置的第六目标机器码进行比较;若所述第二反汇编的第二机器码与所述第六目标机器码相同,则确定所述被检测函数中存在dobby框架的inline hook;若所述第二反汇编的第一机器码与所述第五目标机器码不相同,或者,所述第二反汇编的第二机器码与所述第六目标机器码不相同,则确定所述被检测函数中不存在dobby框架的inline hook。
[0154]
可选的,所述函数调用模块15具体用于:若所述被检测函数中不存在cydia框架的inline hook,也不存在dobby框架的inline hook,则调用所述被检测函数,执行所述被检测函数未被hook时的函数逻辑。
[0155]
可选的,若所述被检测函数用于检测越狱环境,函数调用模块15包括:函数调用单元,用于调用接收所述区域地址的预置函数或用于调用所述被检测函数;环境检测单元,用于:获取所述被检测函数中的数组,遍历所述数组,获取越狱文件字符串,所述数组为自定义数组,且包含至少两条越狱文件路径;
通过c字符指针接收所述越狱文件字符串,将接收所述越狱文件字符串的c字符指针放入内联汇编的输入操作列表中;在所述内联汇编中读取sys_access函数、sys_stat64函数、sys_open函数中任意一函数对应的编号至寄存器;基于所读取的编号,调用所述内联汇编触发中断;调用所述内联汇编,将所述被检测函数的调用结果写入所述内联汇编的输出操作列表中,获取所述输出操作列表的变量;获取针对所述输出操作列表变量的判断结果;若所述判断结果不为零,则确定当前运行环境为越狱环境。
[0156]
可选的,所述环境检测单元用于:基于dyld_insert_libraries以及getenv系统c函数,获取返回值。
[0157]
若所述返回值不为零,则确定当前运行环境为越狱环境。
[0158]
可选的,所述环境检测单元用于:通过nsprocessinfo获取进程信息,在所述进程信息中读取运行参数;确定所述运行参数中是否包含coresimulator字段;若所述运行参数中包含coresimulator字段,则确定当前运行环境为模拟器环境。
[0159]
可选的,所述环境检测单元用于:建立socket连接,并判断socket连接是否成功;若socket连接成功,则确定通信端口27042处于开放状态、frida调试框架中包含frida client,当前运行环境为渗透调试环境。
[0160]
需要说明的是,上述实施例提供的函数被hook时的处理装置在执行函数被hook时的处理方法时,仅以上述各功能模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能模块完成,即将设备的内部结构划分成不同的功能模块,以完成以上描述的全部或者部分功能。另外,上述实施例提供的函数被hook时的处理装置与函数被hook时的处理方法实施例属于同一构思,其体现实现过程详见方法实施例,这里不再赘述。
[0161]
上述本技术实施例序号仅仅为了描述,不代表实施例的优劣。
[0162]
本技术实施例提供的函数被hook时的处理装置,在待调用的被检测函数被hook的情况下,通过内存搜索获得区域地址,利用与被检测函数类型相同的预置函数接收区域地址从而执行被检测函数的原函数逻辑,该方式使得被检测函数在被hook的情况下,依然能够执行被检测函数的原函数逻辑,ios设备可以获得真实运行结果,系统安全性高。
[0163]
本技术实施例还提供了一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现前述任一实施例方法的步骤。其中,计算机可读存储介质可以包括但不限于任何类型的盘,包括软盘、光盘、dvd、cd-rom、微型驱动器以及磁光盘、rom、ram、eprom、eeprom、dram、vram、闪速存储器设备、磁卡或光卡、纳米系统(包括分子存储器ic),或适合于存储指令和/或数据的任何类型的媒介或设备。
[0164]
本技术实施例还提供了一种执行函数被hook时的处理方法的设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,处理器执行程序时实现上述任一实施例方法的步骤。
[0165]
该设备包括有:处理器和存储器。
[0166]
本技术实施例中,处理器为计算机系统的控制中心,可以是实体机的处理器,也可以是虚拟机的处理器。处理器可以包括一个或多个处理核心,比如4核心处理器、8核心处理器等。处理器可以采用dsp(digital signal processing,数字信号处理)、fpga(field-programmable gate array,现场可编程门阵列)、pla(programmable logic array,可编程逻辑阵列)中的至少一种硬件形式来实现。处理器也可以包括主处理器和协处理器,主处理器是用于对在唤醒状态下的数据进行处理的处理器,也称cpu(central processing unit,中央处理器);协处理器是用于对在待机状态下的数据进行处理的低功耗处理器。
[0167]
存储器可以包括一个或多个计算机可读存储介质,该计算机可读存储介质可以是非暂态的。存储器还可包括高速随机存取存储器,以及非易失性存储器,比如一个或多个磁盘存储设备、闪存存储设备。在本技术的一些实施例中,存储器中的非暂态的计算机可读存储介质用于存储至少一个指令,该至少一个指令用于被处理器所执行以实现本技术实施例中的方法。
[0168]
一些实施例中,该设备还包括有:外围设备接口和至少一个外围设备。处理器、存储器和外围设备接口之间可以通过总线或信号线相连。各个外围设备可以通过总线、信号线或电路板与外围设备接口相连。具体地,外围设备包括:显示屏、摄像头和音频电路中的至少一种。
[0169]
外围设备接口可被用于将i/o(input/output,输入/输出)相关的至少一个外围设备连接到处理器和存储器。在本技术的一些实施例中,处理器、存储器和外围设备接口被集成在同一芯片或电路板上;在本技术的一些其他实施例中,处理器、存储器和外围设备接口中的任意一个或两个可以在单独的芯片或电路板上实现。本技术实施例对此不作具体限定。
[0170]
显示屏用于显示ui(user interface,用户界面)。该ui可以包括图形、文本、图标、视频及其它们的任意组合。当显示屏是触摸显示屏时,显示屏还具有采集在显示屏的表面或表面上方的触摸信号的能力。该触摸信号可以作为控制信号输入至处理器进行处理。此时,显示屏还可以用于提供虚拟按钮和/或虚拟键盘,也称软按钮和/或软键盘。在本技术的一些实施例中,显示屏可以为一个,设置设备的前面板;在本技术的另一些实施例中,显示屏可以为至少两个,分别设置在设备的不同表面或呈折叠设计;在本技术的再一些实施例中,显示屏可以是柔性显示屏,设置在设备的弯曲表面上或折叠面上。甚至,显示屏还可以设置成非矩形的不规则图形,也即异形屏。显示屏可以采用lcd(liquid crystaldisplay,液晶显示屏)、oled(organic light-emitting diode,有机发光二极管)等材质制备。
[0171]
摄像头用于采集图像或视频。可选地,摄像头包括前置摄像头和后置摄像头。通常,前置摄像头设置在设备的前面板,后置摄像头设置在设备的背面。在一些实施例中,后置摄像头为至少两个,分别为主摄像头、景深摄像头、广角摄像头、长焦摄像头中的任意一种,以实现主摄像头和景深摄像头融合实现背景虚化功能、主摄像头和广角摄像头融合实现全景拍摄以及vr(virtualreality,虚拟现实)拍摄功能或者其它融合拍摄功能。在本技术的一些实施例中,摄像头还可以包括闪光灯。闪光灯可以是单色温闪光灯,也可以是双色温闪光灯。双色温闪光灯是指暖光闪光灯和冷光闪光灯的组合,可以用于不同色温下的光线补偿。
[0172]
音频电路可以包括麦克风和扬声器。麦克风用于采集用户及环境的声波,并将声波转换为电信号输入至处理器进行处理。出于立体声采集或降噪的目的,麦克风可以为多个,分别设置在设备的不同部位。麦克风还可以是阵列麦克风或全向采集型麦克风。
[0173]
电源用于为设备中的各个组件进行供电。电源可以是交流电、直流电、一次性电池或可充电电池。当电源包括可充电电池时,该可充电电池可以是有线充电电池或无线充电电池。有线充电电池是通过有线线路充电的电池,无线充电电池是通过无线线圈充电的电池。该可充电电池还可以用于支持快充技术。
[0174]
本技术实施例中示出的设备结构框图并不构成对设备的限定,设备可以包括比图示更多或更少的组件,或者组合某些组件,或者采用不同的组件布置。
[0175]
在本技术中,术语“第一”、“第二”等仅用于描述的目的,而不能理解为指示或暗示相对重要性或顺序;术语“多个”则指两个或两个以上,除非另有明确的限定。术语“安装”、“相连”、“连接”、“固定”等术语均应做广义理解,例如,“连接”可以是固定连接,也可以是可拆卸连接,或一体地连接;“相连”可以是直接相连,也可以通过中间媒介间接相连。对于本领域的普通技术人员而言,可以根据具体情况理解上述术语在本技术中的具体含义。
[0176]
本技术的描述中,需要理解的是,术语“上”、“下”等指示的方位或位置关系为基于附图所示的方位或位置关系,仅是为了便于描述本技术和简化描述,而不是指示或暗示所指的装置或单元必须具有特定的方向、以特定的方位构造和操作,因此,不能理解为对本技术的限制。
[0177]
以上所述,仅为本技术的具体实施方式,但本技术的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本技术揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本技术的保护范围之内。因此,依本技术权利要求所作的等同变化,仍属本技术所涵盖的范围。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献