开始入坑 iOS 逆向了,碰到了一个应用有越狱检测。
越狱检测
应用在启动的时候就检测了设备的越狱情况,如果是越狱设备,只能点击弹窗中的“退出应用”。故考虑先通过frIDA-ios-dump获取应用ipa包,然后找到检测点,进而对越狱检测进行绕过。
ps:进行frida-ios-dump失败,原因未知,dump进程一直卡住,用了绕过越狱检测的KernBypass + LibertyLite也未能成功,但是同事的设备环境就没问题,这里用的是同事dump获得的ipa
frida-iOS-dump失败
拿到ipa后直接将ipa包中的可执行程序丢入 ida,在 Function Window 窗口中过滤 “jail” 字段,可以找到在 AppDelegate 类中的 [- checkJailbreaking] 和 [- showJailbreakingAlert] 方法。
根据方法名判断,我们接下来需要绕过越狱检测的目标函数就是 [- checkJailbreaking] 了(顺带学习一下,常见的越狱检测会检测哪些内容)
百度搜罗了一下越狱检测,对应到这个应用,这个应用一共检测了三个地方:
1、Cydia.app
2、stat是否出自系统库,如果不是 /usr/lib/system/libsystem_kernel.dylib 就表示越狱
3、当前程序的运行环境,getenv("DYLD_INSERT_LIBRARIES"),未越狱设备返回 Null
ida查找jail函数
编写frida hook代码,需要注意的是越狱检测是在应用启动时进行的,如果直接attach的话,很难执行到我们修改返回值的位置。
所以这里需要先spawn进程,再attach并注入js代码,最后resume让程序继续运行
[Python] 纯文本查看 复制代码 import frida
import sys
if __name__ == '__main__':
device = frida.get_usb_device()
pid = device.spawn(['xxx.xxxx'])
session = device.attach(pid)
JSFile = open('xxxx.js')
JsCodeFromfile = JSFile.read()
script = session.create_script(JsCodeFromfile)
script.load()
device.resume(pid)
sys.stdin.read()
[JavaScript] 纯文本查看 复制代码 if (ObjC.available){
console.log("[i] ObjC available!")
var class_name = 'AppDelegate'
var method_name = '- checkJailbreaking'
var hook = eval('ObjC.classes.' + class_name + '["' + method_name + '"]');
Interceptor.attach(hook.implementation, {
onEnter:function(args){
console.log("==== onEnter ====")
},
onLeave:function(retval){
console.log("==== onLeave ====")
console.log("Return: " + retval)
retval.replace(0x0); //修改 checkJailbreaking 函数的返回值
}
});
}
最后我们成功将 checkJailbreaking 函数的返回值从 0x1 修改为 0x0,绕过了越狱检测,可以进入应用并继续后续的测试了。
绕过越狱
|