某银行iOS frida检测(例一)

某银行iOS frida检测(例一)

某银行iOS版本,现象是在安装frida的设备中运行时闪退,通过移动/usr/sbin/frida-server文件或修改文件名,均可正常启动,应该是有对“/usr/sbin/frida-server”固定路径文件名的检查,搜索字符串会发现有如下函数使用:

Untitled

hook修改返回值,启动仍然闪退。字符串可能是动态生成的,要么拼接,要么解密。没有确定目标的搜索效率太低。看一下有没有崩溃信息:

Untitled

以上崩溃信息说明应用运行至一个非法地址0xb5a98000,搜索该DWORD,发现大量函数中存在该值,且代码相似。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
__text:000000010050DED4 loc_10050DED4                           ; CODE XREF: -[ImageDownloadTool loadCacheImageForUrl:]+2C0↓j
__text:000000010050DED4 LDR X11, [X29,X8]
__text:000000010050DED8 EOR X11, X11, X10
__text:000000010050DEDC ADD X9, X9, X11
__text:000000010050DEE0 ADD X9, X9, #1
__text:000000010050DEE4 LSR X11, X9, #9
__text:000000010050DEE8 STR X11, [X29,X8]
__text:000000010050DEEC ADD X8, X8, #8
__text:000000010050DEF0 CMP X8, #0xC0
__text:000000010050DEF4 B.NE loc_10050DED4
__text:000000010050DEF8 CBZ X9, loc_10050DF18
__text:000000010050DEFC MOV X0, #0
__text:000000010050DF00 MOV SP, X0
__text:000000010050DF04 MOV X30, X0
__text:000000010050DF08 LDR X9, =0xB5A98000
__text:000000010050DF0C BR X9
__text:000000010050DF0C ; ---------------------------------------------------------------------------
__text:000000010050DF10 qword_10050DF10 DCQ 0xB5A98000 ; DATA XREF: -[ImageDownloadTool loadCacheImageForUrl:]+2D4↑r
__text:000000010050DF18 ; ---------------------------------------------------------------------------
__text:000000010050DF18
__text:000000010050DF18 loc_10050DF18 ; CODE XREF: -[ImageDownloadTool loadCacheImageForUrl:]+84↑j
__text:000000010050DF18 ; -[ImageDownloadTool loadCacheImageForUrl:]+B0↑j ...
__text:000000010050DF18 MOV X25, #0

Untitled

_v78数组上文无关,do-while循环执行后必定执行调整指定导致崩溃,必须在上方跳转至LABEL32。

这里有四个检测点:

  1. 检查某个函数符号是否被替换,通过判断其是否出自“/Library/MobileSubstrate/DynamicLibraries/”目录下的动态库;

Untitled

  1. 检查”/usr/sbin/frida-server“是否可调用(该处就是检测frida文件,字符串经过异或运算还原)

Untitled

  1. 检查是否存在“gum-js-loop”线程(该处的字符串同样经过异或运算还原)

Untitled

  1. 检查某函数是否被hook 通过判断第一条指令是否为adrp,第二条指令是否为br指令:

    ADRP Xd, ±rel33

    BR Xn

以上检测点可以通过修改检测开始时对某个全局变量的判断,将其修改为满足跳转至LABEL32条件的值即可:

Untitled

由于被插桩的函数过多,而且不同函数使用的全局变量不同,需要修改的点过多。

如果需要hook的函数存在以上检测,修改其使用的全局变量即可,其余未hook的函数通过以下方式绕过检测:

检测frida-server文件可以通过修改frida-server路径或文件名绕过;

检测gum-js-loop可以通过hook strstr函数绕过;

由于未hook当前函数,函数起始指令的检测和符号所属库的检测可忽略。