某银行iOS frida检测(例一)
某银行iOS版本,现象是在安装frida的设备中运行时闪退,通过移动/usr/sbin/frida-server文件或修改文件名,均可正常启动,应该是有对“/usr/sbin/frida-server”固定路径文件名的检查,搜索字符串会发现有如下函数使用:
hook修改返回值,启动仍然闪退。字符串可能是动态生成的,要么拼接,要么解密。没有确定目标的搜索效率太低。看一下有没有崩溃信息:
以上崩溃信息说明应用运行至一个非法地址0xb5a98000,搜索该DWORD,发现大量函数中存在该值,且代码相似。
1 | __text:000000010050DED4 loc_10050DED4 ; CODE XREF: -[ImageDownloadTool loadCacheImageForUrl:]+2C0↓j |
_v78数组上文无关,do-while循环执行后必定执行调整指定导致崩溃,必须在上方跳转至LABEL32。
这里有四个检测点:
- 检查某个函数符号是否被替换,通过判断其是否出自“/Library/MobileSubstrate/DynamicLibraries/”目录下的动态库;
- 检查”/usr/sbin/frida-server“是否可调用(该处就是检测frida文件,字符串经过异或运算还原)
- 检查是否存在“gum-js-loop”线程(该处的字符串同样经过异或运算还原)
- 检查某函数是否被hook 通过判断第一条指令是否为adrp,第二条指令是否为br指令:
ADRP Xd, ±rel33
BR Xn
以上检测点可以通过修改检测开始时对某个全局变量的判断,将其修改为满足跳转至LABEL32条件的值即可:
由于被插桩的函数过多,而且不同函数使用的全局变量不同,需要修改的点过多。
如果需要hook的函数存在以上检测,修改其使用的全局变量即可,其余未hook的函数通过以下方式绕过检测:
检测frida-server文件可以通过修改frida-server路径或文件名绕过;
检测gum-js-loop可以通过hook strstr函数绕过;
由于未hook当前函数,函数起始指令的检测和符号所属库的检测可忽略。