新手分享一次使用MonkeyDev遇到的问题及排查过程

小弟初玩逆向,三天前突发奇想想逆向某app,查看一下布局实现、分析https证书以抓包之类。于是开始了解逆向。weread上看了一下iOS应用逆向与安全之道,了解了流程之后。通过frida-ios-dump砸壳,再通过MonkeyDev注入及运行起来。这个过程也踩了一些坑,比如python环境问题导致frida-ios-dump import失败等,这些暂且不细说了。

好,我们的app运行起来了,但是通过Reveal却无法看到布局,期待看到的!!!congratulations!!!🎉\n👍----------------insert dylib success----------------👍\n也没有出现。断点得知constructor函数也没有走进去。于是开始思考,是不是砸壳问题或者MonkeyDev的使用上有问题呢,还是该app进行了特别的防护?

为了验证,重新砸了俩app的壳运行,出于控制变量法的考虑,一个选择了几乎不可能进行的小众app,一个选择了比较流行的可能进行逆向防护的**音乐。结果是俩都成功运行了,可以通过Reveal看到布局,也可以通过CH或Logos进行hook。

所以砸壳或者MonkeyDev的使用姿势问题排除了。那么是目标app做了特别的防护?传说中的反调试?于是开始疯狂的搜索,此处大约卡了一天时间。

搜索无果。因为反调试也是需要注入动态库的,而网上也没有其他人遇到类似的case。

于是开始思考:逆向的前提就是注入动态库到宿主,如果这个做不到就不用谈hook了。

使用machoview查看目标和**音乐的macho,虽然两者底下Framework都有需要注入的动态库,但**音乐的LC中有MonkeyDevDyLib的信息而目标app没有。

那么问题就比较清楚了,LOAD COMMAND注入失败了,回过头来看monkey的Build Phase,其中有两个地方用了pack.sh,第一处就是注入,第二处是签名。查看Build信息可以发现,Run第一处脚本时报错

Showing All Messages
/opt/MonkeyDev/Tools/pack.sh: line 78:  3761 Segmentation fault: 11  "$MONKEYPARSER" install -c load -p "@executable_path/Frameworks/lib""${TARGET_NAME}""Dylib.dylib" -t "${BUILD_APP_PATH}/${APP_BINARY}"

现在问题就很明确了,是monkeyparser报错了。

于是google了how to insert load command into a macho,找到了optool(用系统的otool插入失败,不知为何),用./optool install -c load -p "@executable_path/Frameworks/lib""${TARGET_NAME}""Dylib.dylib" -t "${BUILD_APP_PATH}/${APP_BINARY}"替换原来的代码,运行,终于得到了期望的效果,也就是注入成功了。

发这个帖子,一个是分享一下问题的修复方式。这个问题通过搜索确实没有相同的case,熟悉逆向的人可能一下就知道问题根源在哪,但是新手可能会卡很久甚至直接放弃。其次是分享一下解决问题那一刻的愉悦(当然这种愉悦会随着层次的提升变得越来越难以获取)。

最后贴一下ipa的链接,已脱壳,in case如果有人想知道为什么insert失败的话。

3 Likes