找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 2306|回复: 1

实现纪录oc消息

[复制链接]

307

主题

228

回帖

7319

积分

用户组: 真·技术宅

UID
2
精华
76
威望
291 点
宅币
5569 个
贡献
253 次
宅之契约
0 份
在线时间
945 小时
注册时间
2014-1-25
发表于 2017-1-9 13:59:46 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
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
回复

使用道具 举报

1109

主题

1649

回帖

7万

积分

用户组: 管理员

一只技术宅

UID
1
精华
244
威望
743 点
宅币
24180 个
贡献
46222 次
宅之契约
0 份
在线时间
2294 小时
注册时间
2014-1-26
发表于 2017-1-28 04:30:25 | 显示全部楼层
是“记录”的“记”,不是“纪”
回复 赞! 靠!

使用道具 举报

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-3-29 22:00 , Processed in 0.037322 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表