首页
社区
课程
招聘
[原创]ios objc 方法调用记录插件(支持arm64+devlog):itracer v1.2
发表于: 2014-5-7 16:28 11896

[原创]ios objc 方法调用记录插件(支持arm64+devlog):itracer v1.2

2014-5-7 16:28
11896

ios objc 方法调用记录插件(支持arm64+devlog):itracer v1.2

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

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

更新内容:
1. 增加对arm64的支持,刚调通稳定性有待测试。
   arm64进程注入没时间做了,暂时用了substrate的hookprocess, 所以大家需要先装下libsubstrate.dylib
   armv7的版本是完全不依赖substrate的。
2. arm64的版本对参数的信息打印稍微做了些增强。
3. armv7的暂时没做更新,还是v1.1的版本。
4. 附赠自己之前写的mac终端上直接查看ios设备log的工具:devlog, 这样可以直接用grep 进行log过滤,比起
   用xcode看更方便些。

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. 你也可以直接用附件带的devlog命令行工具直接在mac终端下查看log
终端下执行:
./devlog
或者:
./devlog | grep itrace

后记:
之后就没啥时间维护啦,如果跑挂了就试着加上 args="0" 禁用参数打印,凑合凑合着用吧。


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 4
支持
分享
最新回复 (6)
雪    币: 2887
活跃值: (3919)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
顶起,不错的说
2014-5-7 16:31
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
3
顶一下,收藏了~
2014-5-7 20:15
0
雪    币: 546
活跃值: (1657)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
4
效果还不错。
2014-5-11 21:32
0
雪    币: 183
活跃值: (563)
能力值: ( LV9,RANK:150 )
在线值:
发帖
回帖
粉丝
5
这个代码我开源了,放在github上,有兴趣的朋友可以参考下,写的有点烂,呵呵。。

源码:https://github.com/waruqi/itrace
编译:https://github.com/waruqi/tbox/wiki/%E7%BC%96%E8%AF%91
2014-9-1 11:01
0
雪    币: 14345
活跃值: (3934)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
意思是可以知道没有app内部调用api的参数。不错。
2014-9-7 15:14
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
牛人啊,学习学习
2014-12-5 15:14
0
游客
登录 | 注册 方可回帖
返回
//