首页
社区
课程
招聘
6
[分享]ios objc 方法调用记录插件:iTracer v1.0
发表于: 2012-12-11 11:51 14018

[分享]ios objc 方法调用记录插件:iTracer v1.0

2012-12-11 11:51
14018

如果你想逆向 某些app的调用流程 或者 系统app的一些功能的 私有framework class api 调用流程, 可以试试此工具



只需要 配置需要挂接的 类名和app名, 就可以实时追踪 相关功能的 调用流程。 支持批量 hook n多个类名



一、安装方法:



1.配置需要挂接的应用,相关参数:


在mac下通过xcode打开 iTracer.plist ,就改 filter 下 bundles 列表,设置需要挂接的app名,具体设置可以参考


mobilesubstrate的相关文档:

http://www.iphonedevwiki.net/index.php/MobileSubstrate



例如要挂接SpringBoard(挂接这个一般比较危险,做好会白苹果的准备 = =!, 真白了 也没事: 同时按开机键+home, 之后再按 开机+音量+, 进入无插件模式,用itools吧对应的插件删了重启就行了):



Filter = {


  Bundles = (com.apple.springboard);


};



2.配置需要挂接的 class 的 所有 api, 例如:


Trace = {


  item0 = (UIView),


  item1 = (UIViewController),


  item2 = (UIApplication),


};



3.配置是否开启 打印api详细参数值功能(这个还有些不稳定,打印某些值会挂掉,不过通常情况下 够用了,先凑活着用吧 = =)


TraceArgs = YES/NO



如果不巧打印的时候 真挂了,就把这个功能禁用,仅仅 trace api的调用流程, 还是很稳定的。。



2.利用itool等工具,讲 iTracer.dylib 和 iTracer.plist 放到系统 mobilesubstrate 插件目录:


/Library/MobileSubstrate/DynamicLibraries



3.然后重启SpringBoard(可以通过PPHelper注销、或者ssh登上去 killall -9 SpringBoard)



二、下面是我 trace PPHelper的 一些log, 注: log 的实际输出在: Xcode-Organizer-Console 中:



Dec 11 10:50:46 unknown PPHelper[3090] : [iTracer]: [UIView _addSubview:positioned:relativeTo:]:


Dec 11 10:50:46 unknown PPHelper[3090] : [iTracer]: [UIView superview]


Dec 11 10:50:46 unknown PPHelper[3090] : [iTracer]: [UIView window]


Dec 11 10:50:46 unknown PPHelper[3090] : [iTracer]: [UIView window]


Dec 11 10:50:46 unknown PPHelper[3090] : [iTracer]: [UIView _shouldTryPromoteDescendantToFirstResponder]


Dec 11 10:50:46 unknown PPHelper[3090] : [iTracer]: [UIView _isAncestorOfFirstResponder]


Dec 11 10:50:46 unknown PPHelper[3090] : [iTracer]: [UIView description]


Dec 11 10:50:46 unknown PPHelper[3090] : [iTracer]: [UIView frame]


Dec 11 10:50:46 unknown PPHelper[3090] : [iTracer]: [UIView transform]


Dec 11 10:50:46 unknown PPHelper[3090] : [iTracer]: [UIView clipsToBounds]


Dec 11 10:50:46 unknown PPHelper[3090] : [iTracer]: [UIView layer]


Dec 11 10:50:46 unknown PPHelper[3090] : [iTracer]: [UIView alpha]


Dec 11 10:50:46 unknown PPHelper[3090] : [iTracer]: [UIView isHidden]


Dec 11 10:50:46 unknown PPHelper[3090] : [iTracer]: [UIView isOpaque]


Dec 11 10:50:46 unknown PPHelper[3090] : [iTracer]: [UIView autoresizingMask]


Dec 11 10:50:46 unknown PPHelper[3090] : [iTracer]: [UIView autoresizesSubviews]


Dec 11 10:50:46 unknown PPHelper[3090] : [iTracer]: [UIView isUserInteractionEnabled]


Dec 11 10:50:46 unknown PPHelper[3090] : [iTracer]: [UIView tag]


Dec 11 10:50:46 unknown PPHelper[3090] : [iTracer]: [UIView willMoveToSuperview:]:


Dec 11 10:50:46 unknown PPHelper[3090] : [iTracer]: [UIView _unsubscribeToScrollNotificationsIfNecessary:]: null


Dec 11 10:50:46 unknown PPHelper[3090] : [iTracer]: [UIView _makeSubtreePerformSelector:withObject:]: : null


Dec 11 10:50:46 unknown PPHelper[3090] : [iTracer]: [UIView _makeSubtreePerformSelector:withObject:withObject:copySublayers:]: : null: null: 0


Dec 11 10:50:46 unknown PPHelper[3090] : [iTracer]: [UIView _invalidateSubviewCache]


Dec 11 10:50:46 unknown PPHelper[3090] : [iTracer]: [UIView actionForLayer:forKey:]: : sublayers


Dec 11 10:50:46 unknown PPHelper[3090] : [iTracer]: [UIView description]


Dec 11 10:50:46 unknown PPHelper[3090] : [iTracer]: [UIView frame]


Dec 11 10:50:46 unknown PPHelper[3090] : [iTracer]: [UIView transform]


Dec 11 10:50:46 unknown PPHelper[3090] : [iTracer]: [UIView clipsToBounds]


Dec 11 10:50:46 unknown PPHelper[3090] : [iTracer]: [UIView layer]


Dec 11 10:50:46 unknown PPHelper[3090] : [iTracer]: [UIView alpha]


Dec 11 10:50:46 unknown PPHelper[3090] : [iTracer]: [UIView isHidden]


Dec 11 10:50:46 unknown PPHelper[3090] : [iTracer]: [UIView isOpaque]


Dec 11 10:50:46 unknown PPHelper[3090] : [iTracer]: [UIView autoresizingMask]


Dec 11 10:50:46 unknown PPHelper[3090] : [iTracer]: [UIView autoresizesSubviews]


Dec 11 10:50:46 unknown PPHelper[3090] : [iTracer]: [UIView isUserInteractionEnabled]


Dec 11 10:50:46 unknown PPHelper[3090] : [iTracer]: [UIView tag]


Dec 11 10:50:46 unknown PPHelper[3090] : [iTracer]: [UIView _subscribeToScrollNotificationsIfNecessary:]:



再比如 我 trace iTunes-U的 一些log:



Dec 11 11:03:56 unknown iTunesU[3393] : [iTracer]: [SSAccountStore init]


Dec 11 11:03:56 unknown iTunesU[3393] : [iTracer]: [SSAccountStore activeAccount]


Dec 11 11:03:56 unknown iTunesU[3393] : [iTracer]: [SSAccountStore _reloadAccountsIfNeeded]


Dec 11 11:03:56 unknown iTunesU[3393] : [iTracer]: [SSAccountStore _setAccounts:]: (


            ": (1096041240, xxxxxx@gmail.com)",


            ": (1264698560, xxxxxx@gmail.com)"


        )


Dec 11 11:03:56 unknown iTunesU[3393] : [iTracer]: [SSAccountStore activeAccount]


Dec 11 11:03:56 unknown iTunesU[3393] : [iTracer]: [SSAccountStore _reloadAccountsIfNeeded]


Dec 11 11:03:56 unknown iTunesU[3393] : [iTracer]: [SSAccountStore activeAccount]


Dec 11 11:03:56 unknown iTunesU[3393] : [iTracer]: [SSAccountStore _reloadAccountsIfNeeded]


[注意]看雪招聘,专注安全领域的专业人才平台!

上传的附件:
收藏
免费 6
支持
分享
赞赏记录
参与人
雪币
留言
时间
伟叔叔
为你点赞~
2024-5-31 06:38
心游尘世外
为你点赞~
2024-5-31 03:30
QinBeast
为你点赞~
2024-5-31 03:21
飘零丶
为你点赞~
2024-4-1 04:52
shinratensei
为你点赞~
2024-2-3 01:16
PLEBFE
为你点赞~
2023-3-7 00:38
最新回复 (13)
雪    币: 107
活跃值: (424)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
牛逼啊...支持一个......
2012-12-11 13:00
0
雪    币: 596
活跃值: (1898)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
3
顶一个,
2012-12-11 21:27
0
雪    币: 1098
活跃值: (193)
能力值: (RANK:210 )
在线值:
发帖
回帖
粉丝
4
不错。对记录ObjectiveC函数调用有帮助。
我以前有这方面需要时是借鉴《Hacking and Securing iOS Applications》里的例子。

另需要hook不是ObjectiveC函数(如connect,send)的时候,可以参考这个例子:https://github.com/comex/inject_and_interpose
2012-12-12 10:39
0
雪    币: 183
活跃值: (568)
能力值: ( LV9,RANK:150 )
在线值:
发帖
回帖
粉丝
5
Hacking and Securing iOS Applications 里的那个 gdb 断 objc_msgSend 的 trace方式? 。。

那个我也试过, 可能我还不太会用, 用过几回 不过trace的时候 ui基本卡死没法操作了 = =, 而且一次性hook所有的调用 量太大,不太好做针对性的跟踪。。
2012-12-12 10:46
0
雪    币: 183
活跃值: (568)
能力值: ( LV9,RANK:150 )
在线值:
发帖
回帖
粉丝
6
inject_and_interpose 这个例子貌似不错。。我去试试。。谢谢哈。。
2012-12-12 10:49
0
雪    币: 1098
活跃值: (193)
能力值: (RANK:210 )
在线值:
发帖
回帖
粉丝
7
下条件断点就行。输出的信息和你这个的差不多。
2012-12-12 11:18
0
雪    币: 151
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
直接手机端操作方便阿。
2012-12-13 10:21
0
雪    币: 52
活跃值: (28)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
9
看了一下确实不错
2012-12-14 18:07
0
雪    币: 223
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
10
个人感觉这个东西还是有局限性
1》必须知道类名字
2》要知道类名字,直接class-dump出来就可以了,那样看头文件基本也知道差不多了,对于看不到类名的拿就要另提别论了
所以感觉楼主还需要增强。
2012-12-17 10:46
0
雪    币: 183
活跃值: (568)
能力值: ( LV9,RANK:150 )
在线值:
发帖
回帖
粉丝
11
这个主要是用来 :方便跟踪某功能的调用流程用的。

这个不是为了查看类名和原型用的。  如果只看class-dump出来的头文件, 是看不出具体的调用流程和如何传递参数数据的。

类名可以通过ida class-dump 等工具 直接可以看到, 我没必要动态解析符号表来trace所有类的调用,这样灵活性比较差,主要还是我暂时没这需求,我就没继续整。 = =

zhuliang给的那个例子很不错,我打算搞可以在mac 和 ios 上跟踪 objc 和 native funtion的新版本,并且支持hook非app的后台系统服务。到时候用起来就方便了。。
2012-12-17 21:06
0
雪    币: 617
活跃值: (1597)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
不知道这个条件断点,怎么弄??
2013-4-5 10:37
0
雪    币: 57
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
希望可以trace 类方法和参数, 现在只支持实例方法。

另,itrace.xml 能改下位置吗? /tmp 里的东西经常被系统清楚,很不方便。

itrace.xml只要和itracer 在一个目录下应该要优先读取。
2013-8-13 14:23
0
雪    币: 183
活跃值: (568)
能力值: ( LV9,RANK:150 )
在线值:
发帖
回帖
粉丝
14
放在 itracer 的 当前运行目录下。。也是可以的。。。优先会去读当前目录。。如果没有才会去读 /tmp下的

暂时还不支持 类方法和参数, 以后等有时间 可以考虑加上
2013-8-13 14:30
0
游客
登录 | 注册 方可回帖
返回

账号登录
验证码登录

忘记密码?
没有账号?立即免费注册