首页
社区
课程
招聘
[原创]ios objc 方法调用记录插件更新:itracer v1.1
发表于: 2013-1-21 11:41 13339

[原创]ios objc 方法调用记录插件更新:itracer v1.1

2013-1-21 11:41
13339
ios objc 方法调用记录插件:itracer v1.1

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

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

更新内容:
1. 增强程序稳定性, 但是偶尔trace某些method的参数信息还是会挂(比以前好多了 = =)
2. 增加对ios 系统服务进程的支持, 不再依赖mobilesubstrate插件,采用直接注入方式进行hook
3. 可配置需要挂接的class, 配置文件以xml格式描述
4. mac 上 x86/x64 支持(x64上暂时还不稳定,所以mac上版本暂时先不透露了。)
5. 挂接过程中无需重启springboard, 更加方便

1.配置需要挂接的class

修改itrace.xml配置文件,增加需要hook的类名:
<?xml version="1.0" encoding="utf-8"?>
<itrace>
        <class>
                <SSDevice/>
                <SSDownload/>
                <SSDownloadManager/>
                <SSDownloadQueue/>
                <CPDistributedMessagingCenter/>
                <CPDistributedNotificationCenter/>
                <NSString args="0"/>
        </class>
</itrace>

注: 尽量不要去hook, 频繁调用的class, 比如 UIView NSString, 否则会很卡,操作就不方便了。
注: 如果挂接某个class, 中途打印参数信息挂了, 可以在对应的类名后面 加上 args="0" 属性, 来禁止打印参数信息, 这样会稳定点。
     如果要让所有类都不打印参数信息, 可以直接设置: <class args="0">

2.安装文件
将整个itracer目录下的所有文件用手机助手工具,上传到ios系统上的 /tmp 下面:
/tmp/itracer
/tmp/itrace.dylib
/tmp/itrace.xml

3. 进行trace

进入itracer所在目录:        cd /tmp
修改执行权限:                chmod 777 ./itracer
运行程序:                ./itracer springboard (spingboard 为需要挂接的进程名, 支持简单的模糊匹配)

4. 查看 trace log, 注: log 的实际输出在: Xcode-Windows菜单-Organizer-Console 中:

Jan 21 11:12:58 unknown SpringBoard[5706] <Warning>: [itrace]: [3edc9d98]: [SSDownloadQueue downloads]
Jan 21 11:12:58 unknown SpringBoard[5706] <Warning>: [itrace]: [3edc9d98]: [SSDownloadManager downloads]
Jan 21 11:12:58 unknown SpringBoard[5706] <Warning>: [itrace]: [3edc9d98]: [SSDownloadManager _copyDownloads]
Jan 21 11:12:58 unknown SpringBoard[5706] <Warning>: [itrace]: [3edc9d98]: [SSDownloadQueue _sendDownloadStatusChangedAtIndex:]: 0
Jan 21 11:12:58 unknown SpringBoard[5706] <Warning>: [itrace]: [3edc9d98]: [SSDownloadQueue _messageObserversWithFunction:context:]: 0x334c5d51: 0x2fe89de0
Jan 21 11:12:58 unknown SpringBoard[5706] <Warning>: [itrace]: [3edc9d98]: [SSDownloadQueue downloads]
Jan 21 11:12:58 unknown SpringBoard[5706] <Warning>: [itrace]: [3edc9d98]: [SSDownloadManager downloads]
Jan 21 11:12:58 unknown SpringBoard[5706] <Warning>: [itrace]: [3edc9d98]: [SSDownloadManager _copyDownloads]
Jan 21 11:12:58 unknown SpringBoard[5706] <Warning>: [itrace]: [3edc9d98]: [SSDownload cachedApplicationIdentifier]
Jan 21 11:12:58 unknown SpringBoard[5706] <Warning>: [itrace]: [3edc9d98]: [SSDownload status]
Jan 21 11:12:58 unknown SpringBoard[5706] <Warning>: [itrace]: [3edc9d98]: [SSDownload cachedApplicationIdentifier]
Jan 21 11:12:58 unknown SpringBoard[5706] <Warning>: [itrace]: [3edc9d98]: [CPDistributedNotificationCenter postNotificationName:userInfo:]: SBApplicationNotificationStateChanged: {
            SBApplicationStateDisplayIDKey = "com.apple.AppStore";
            SBApplicationStateKey = 2;
            SBApplicationStateProcessIDKey = 5868;
            SBMostElevatedStateForProcessID = 2;
        }
Jan 21 11:12:58 unknown SpringBoard[5706] <Warning>: [itrace]: [3edc9d98]: [CPDistributedNotificationCenter postNotificationName:userInfo:toBundleIdentifier:]: SBApplicationNotificationStateChanged: {
            SBApplicationStateDisplayIDKey = "com.apple.AppStore";
            SBApplicationStateKey = 2;
            SBApplicationStateProcessIDKey = 5868;
            SBMostElevatedStateForProcessID = 2;
        }: null
Jan 21 11:12:59 unknown SpringBoard[5706] <Warning>: [itrace]: [105d7000]: [SSDownloadManager _handleMessage:fromServerConnection:]: 0xe6920b0: 0xe007040
Jan 21 11:12:59 unknown SpringBoard[5706] <Warning>: [itrace]: [105d7000]: [SSDownloadManager _handleDownloadStatesChanged:]: 0xe6920b0
Jan 21 11:12:59 unknown SpringBoard[5706] <Warning>: [itrace]: [105d7000]: [SSDownloadManager _copyDownloads]
Jan 21 11:12:59 unknown SpringBoard[5706] <Warning>: [itrace]: [105d7000]: [SSDownload persistentIdentifier]
Jan 21 11:12:59 unknown SpringBoard[5706] <Warning>: [itrace]: [105d7000]: [SSDownload _addCachedPropertyValues:]: {
            I = SSDownloadPhaseDownloading;
        }
Jan 21 11:12:59 unknown SpringBoard[5706] <Warning>: [itrace]: [105d7000]: [SSDownload _applyPhase:toStatus:]: SSDownloadPhaseDownloading: <SSDownloadStatus: 0xe6b8e80>
Jan 21 11:12:59 unknown SpringBoard[5706] <Warning>: [itrace]: [105d7000]: [SSDownloadQueue downloadManager:downloadStatesDidChange:]: <SSDownloadManager: 0x41ea60>: (
            "<SSDownload: 0xe6bd970>: -4085275246093726486"
        )

5. 下面是我trace mac上 迅雷的一些log:
Jan 21 10:41:10 ruki-3.local Thunder[23354] <Warning>: [itrace]: [ac7c3a28]: [NSURL description]
Jan 21 10:41:10 ruki-3.local Thunder[23354] <Warning>: [itrace]: [ac7c3a28]: [NSURL baseURL]
Jan 21 10:41:10 ruki-3.local Thunder[23354] <Warning>: [itrace]: [ac7c3a28]: [NSURL _cfurl]
Jan 21 10:41:10 ruki-3.local Thunder[23354] <Warning>: [itrace]: [ac7c3a28]: [NSURL relativeString]
Jan 21 10:41:10 ruki-3.local Thunder[23354] <Warning>: [itrace]: [ac7c3a28]: [NSURL _cfurl]
Jan 21 10:41:10 ruki-3.local Thunder[23354] <Warning>: [itrace]: [ac7c3a28]: [NSURLRequest initWithURL:cachePolicy:timeoutInterval:]: http://liveupdate.mac.sandai.net/MacThunderLiveUpdate.xml: 1: 15.000000
Jan 21 10:41:10 ruki-3.local Thunder[23354] <Warning>: [itrace]: [ac7c3a28]: [NSURLRequest description]
Jan 21 10:41:10 ruki-3.local Thunder[23354] <Warning>: [itrace]: [ac7c3a28]: [NSURLRequest URL]
Jan 21 10:41:10 ruki-3.local Thunder[23354] <Warning>: [itrace]: [ac7c3a28]: [NSURL description]
Jan 21 10:41:10 ruki-3.local Thunder[23354] <Warning>: [itrace]: [ac7c3a28]: [NSURL baseURL]
Jan 21 10:41:10 ruki-3.local Thunder[23354] <Warning>: [itrace]: [ac7c3a28]: [NSURL _cfurl]
Jan 21 10:41:10 ruki-3.local Thunder[23354] <Warning>: [itrace]: [ac7c3a28]: [NSURL relativeString]
Jan 21 10:41:10 ruki-3.local Thunder[23354] <Warning>: [itrace]: [ac7c3a28]: [NSURL _cfurl]
Jan 21 10:41:10 ruki-3.local Thunder[23354] <Warning>: [itrace]: [ac7c3a28]: [NSURLDownload initWithRequest:delegate:]: <NSURLRequest http://liveupdate.mac.sandai.net/MacThunderLiveUpdate.xml>: <LiveUpdate: 0x15b8c0>
Jan 21 10:41:10 ruki-3.local Thunder[23354] <Warning>: [itrace]: [ac7c3a28]: [NSURLDownload init]
Jan 21 10:41:10 ruki-3.local Thunder[23354] <Warning>: [itrace]: [ac7c3a28]: [NSURLRequest _CFURLRequest]
Jan 21 10:41:10 ruki-3.local Thunder[23354] <Warning>: [itrace]: [ac7c3a28]: [NSURLDownload _setDelegate:]: <LiveUpdate: 0x15b8c0>
Jan 21 10:41:10 ruki-3.local Thunder[23354] <Warning>: [itrace]: [ac7c3a28]: [NSURL path]
Jan 21 10:41:10 ruki-3.local Thunder[23354] <Warning>: [itrace]: [ac7c3a28]: [NSURL _cfurl]
Jan 21 10:41:10 ruki-3.local Thunder[23354] <Warning>: [itrace]: [b03c9000]: [NSURLRequest _initWithCFURLRequest:]: 0x186eca0
Jan 21 10:41:10 ruki-3.local Thunder[23354] <Warning>: [itrace]: [ac7c3a28]: [NSURLDownload setDestination:allowOverwrite:]: /Users/ruki/Library/Application Support/Thunder/MacThunderLiveUpdate.xml: 1
Jan 21 10:41:10 ruki-3.local Thunder[23354] <Warning>: [itrace]: [b03c9000]: [NSURLRequest _URLHasScheme:]: about
Jan 21 10:41:10 ruki-3.local Thunder[23354] <Warning>: [itrace]: [ac7c3a28]: [NSURLRequest dealloc]
Jan 21 10:41:10 ruki-3.local Thunder[23354] <Warning>: [itrace]: [b03c9000]: [NSURL scheme]
Jan 21 10:41:10 ruki-3.local Thunder[23354] <Warning>: [itrace]: [ac7c3a28]: [NSURL release]
Jan 21 10:41:10 ruki-3.local Thunder[23354] <Warning>: [itrace]: [b03c9000]: [NSURL _cfurl]
Jan 21 10:41:10 ruki-3.local Thunder[23354] <Warning>: [itrace]: [b03c9000]: [NSURLRequest dealloc]
Jan 21 10:41:10 ruki-3.local Thunder[23354] <Warning>: [itrace]: [ac7c3a28]: [NSURLDownload _downloadActive]
Jan 21 10:41:10 ruki-3.local Thunder[23354] <Warning>: [itrace]: [ac7c3a28]: [NSURLDownload _delegate]
Jan 21 10:41:10 ruki-3.local Thunder[23354] <Warning>: [itrace]: [ac7c3a28]: [NSURLDownload sendDidStart:]: 0x185d0c0
Jan 21 10:41:10 ruki-3.local Thunder[23354] <Warning>: [itrace]: [ac7c3a28]: [NSURLDownload _downloadActive]

后记:
由于最近空闲时间少,这个工具暂时就先弄到这了, 后续有时间在加上 native funtion 的 支持和 参数配置功能。

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 0
支持
分享
最新回复 (14)
雪    币: 151
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
前排支持。。。。希望能开下源,或者说下原理。感谢!
2013-1-21 15:19
0
雪    币: 24
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
赞更新,不错~

加一个Xcode中记录的技巧

printf "[%s %s]\n", (char *)object_getClassName(*(long*)($esp+4)),*(long *)($esp+8)
2013-2-19 11:13
0
雪    币: 30
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
[QUOTE=ipfans;1144171]赞更新,不错~

加一个Xcode中记录的技巧

printf "[%s %s]\n", (char *)object_getClassName(*(long*)($esp+4)),*(long *)($esp+8)[/QUOTE]

嗯,这个应该效果是相当不错的
2013-2-19 14:08
0
雪    币: 183
活跃值: (563)
能力值: ( LV9,RANK:150 )
在线值:
发帖
回帖
粉丝
5
这种方式我试过。太卡。。而且不太好获取所有调用的 参数数据。。所以后来我不用了。
2013-2-19 23:34
0
雪    币: 239
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
工具比较好用,你这是对objc_msgsend做了hook吗?为什么我分析IAP交互的时候,有的NSURL这些类没记录,而后面又有记录了?
2013-3-22 16:18
0
雪    币: 466
活跃值: (1377)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
ekkteki-iPod:/tmp root# ./itracer SysInfoPlus
[itrace]: name: SysInfoPlus, pid: 473
[itrace]: cputype: arm
[itrace]: ok

xcode oragnize console 中基本没什么东西,怎么看日志? 目录下也没有。。
2013-3-25 11:42
0
雪    币: 183
活跃值: (563)
能力值: ( LV9,RANK:150 )
在线值:
发帖
回帖
粉丝
8
没有对objc_msgsend进行hook, 这个效率太低。。

/tmp/itrace.xml  里面需要配置你需要hook的class才行。。

而且如果程序没有调用相关的class,那么也是没有输出的。(在Xcode-Windows菜单-Organizer-Console中看)
2013-3-25 21:19
0
雪    币: 204
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
5. 下面是我trace mac上 迅雷的一些log:

waruqi,你这个xml怎么写,我没弄明白, MobileSMS怎么弄,谢谢

我写

<?xml version="1.0" encoding="utf-8"?>

<itrace>
        <!-- tracing arguments is enabled default-->
        <class>
                <CKMessagesController/>
                <SMSApplication/>
                <CKTranscriptComposeDelegate/>
                <IMSystemMonitorListener/>
        </class>
</itrace>

zhus-iPhone:/tmp root# ./itracer MobileSMS
[itrace]: name: MobileSMS, pid: 1202
[itrace]: cputype: arm
[itrace]: ok

然后什么都没有

--------

搞定了, 在系统日志里看到了
很好用,感谢waruqi.

剩下一个疑问, XPC通讯内容怎么看?非objc的调用怎么trace?
2013-4-15 13:42
0
雪    币: 183
活跃值: (563)
能力值: ( LV9,RANK:150 )
在线值:
发帖
回帖
粉丝
10
这些暂时还不支持。。以后有时间再加上  = =
2013-4-16 21:21
0
雪    币: 204
活跃值: (1668)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
请问怎么关闭?
2013-8-20 15:56
0
雪    币: 14
活跃值: (26)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
12
国外一个哥们实现的相同功能,开源:https://github.com/emeau/itrace
2014-3-10 15:41
0
雪    币: 2323
活跃值: (4113)
能力值: ( LV12,RANK:530 )
在线值:
发帖
回帖
粉丝
13
支持一下
2014-3-10 16:57
0
雪    币: 183
活跃值: (563)
能力值: ( LV9,RANK:150 )
在线值:
发帖
回帖
粉丝
14
国外这个是hook了 objc_msgSend , 这样效率较低, 我只hook了 需要关注的那些 class
2014-3-12 09:53
0
雪    币: 57
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
能否编译支持64位呢?
2014-4-17 15:18
0
游客
登录 | 注册 方可回帖
返回
//