看雪论坛
发新帖

[原创]实现纪录oc消息

lichaolich 2017-1-7 20:59 1513
oc的函数调用采用消息机制,会视情况调用objc_msgSend/objc_msgSendSuper/objc_msgSendStr等函数,因此如果要跟踪ios app的运行过程,最直接的方式是跟踪这些函数调用。这存在2个方面:
1.监视所有消息,也就需要用hook框架hook msgsend函数,染后做过滤
2.使用runtime机制对某些函数做过滤,这方面使用method swizzilig/frida都可以
这里讨论第一种情况:
                github上有若干用于纪录objc_msgSend消息的仓库,然而均存在一定问题
                1.使用dyld_insertlibrary方式启动,不适用于ios app
                2.使用substrate框架是常理,然而在new_objc_msgSend回调中做了太多事情以致效率很低(这包括Snoop-it)
                3.将new_objc_msgSend回调实现在.m/.mm文件中,导致递归(因为编译器会生成局部变量构造析构代码,里面也调用的objc_msgSend)(这包括InspectiveC),而实现在c/cpp中则不会有递归问题
                4.未能解析objc_msgSend参数
                对于此问题,提供的解决方案:
                https://github.com/lichao890427/IOSDebug/tree/master/msglogger
                1.使用cydia substrate框架实现msgsend hook以及Cydia提供的MobileLoader自动加载dylib模块(注意ios设备上存在的substrate头文件是最全的)
                2.new_objc_msgSend回调做成异步任务式,检查selector的地址空间是否位于该模块,这样比匹配id和selector快得多
                3.在.c/.cpp中实现new_objc_msgSend回调
                4.从signature解析出参数类型(由于匹配要class+selector,开启该功能则不可避免的耗时)
               
                msglogger使用方式:
                ./utilityserver --app_inject "com.?"
                /tmp/msglog.txt查看结果
               
                存在的问题:
                对于大的可执行文件由于msgSend相当频繁,因此不推荐hook msgSend方式,可以考虑使用frida或cycript hook某些selector
本主题帖已收到 0 次赞赏,累计¥0.00
最新回复 (2)
moroko 2017-2-17 20:28
2
为什么没人顶,刚好用到
xerxers 2017-3-10 17:04
3
很好
返回



©2000-2017 看雪学院 | Based on Xiuno BBS | 知道创宇带宽支持 | 微信公众号:ikanxue
Time: 0.013, SQL: 11 / 京ICP备10040895号-17