批量追踪objc的方法调用记录

ios objc 方法调用记录插件: itracer v1.2

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

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

特性:

  • 批量跟踪ios下指定class对象的所有调用流程
  • 支持ios for armv6,armv7,arm64 以及mac for x86, x64
  • 自动探测参数类型,并且打印所有参数的详细信息

更新内容:

  • 增加对arm64的支持,刚调通稳定性有待测试。
    arm64进程注入没时间做了,暂时用了substrate的hookprocess, 所以大家需要先装下libsubstrate.dylib
    armv7的版本是完全不依赖substrate的。
  • arm64的版本对参数的信息打印稍微做了些增强。

注:此项目已不再维护,仅供参考。

  1. 配置需要挂接的class

    修改itrace.xml配置文件,增加需要hook的类名:

    <SSDevice/>
    <SSDownload/>
    <SSDownloadManager/>
    <SSDownloadQueue/>
    <CPDistributedMessagingCenter/>
    <CPDistributedNotificationCenter/>
    <NSString args="0"/>

    注: 尽量不要去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] : [itrace]: [3edc9d98]: [SSDownloadQueue downloads]
    Jan 21 11:12:58 unknown SpringBoard[5706] : [itrace]: [3edc9d98]: [SSDownloadManager downloads]
    Jan 21 11:12:58 unknown SpringBoard[5706] : [itrace]: [3edc9d98]: [SSDownloadManager copyDownloads]
    Jan 21 11:12:58 unknown SpringBoard[5706] : [itrace]: [3edc9d98]: [SSDownloadQueue
    sendDownloadStatusChangedAtIndex:]: 0
    Jan 21 11:12:58 unknown SpringBoard[5706] : [itrace]: [3edc9d98]: [SSDownloadQueue messageObserversWithFunction:context:]: 0x334c5d51: 0x2fe89de0
    Jan 21 11:12:58 unknown SpringBoard[5706] : [itrace]: [3edc9d98]: [SSDownloadQueue downloads]
    Jan 21 11:12:58 unknown SpringBoard[5706] : [itrace]: [3edc9d98]: [SSDownloadManager downloads]
    Jan 21 11:12:58 unknown SpringBoard[5706] : [itrace]: [3edc9d98]: [SSDownloadManager
    copyDownloads]
    Jan 21 11:12:58 unknown SpringBoard[5706] : [itrace]: [3edc9d98]: [SSDownload cachedApplicationIdentifier]
    Jan 21 11:12:58 unknown SpringBoard[5706] : [itrace]: [3edc9d98]: [SSDownload status]
    Jan 21 11:12:58 unknown SpringBoard[5706] : [itrace]: [3edc9d98]: [SSDownload cachedApplicationIdentifier]
    Jan 21 11:12:58 unknown SpringBoard[5706] : [itrace]: [3edc9d98]: [CPDistributedNotificationCenter postNotificationName:userInfo:]: SBApplicationNotificationStateChanged: {

    SBApplicationStateDisplayIDKey = "com.apple.AppStore";
      SBApplicationStateKey = 2;
      SBApplicationStateProcessIDKey = 5868;
      SBMostElevatedStateForProcessID = 2;

    }
    Jan 21 11:12:58 unknown SpringBoard[5706] : [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] : [itrace]: [105d7000]: [SSDownloadManager handleMessage:fromServerConnection:]: 0xe6920b0: 0xe007040
    Jan 21 11:12:59 unknown SpringBoard[5706] : [itrace]: [105d7000]: [SSDownloadManager
    handleDownloadStatesChanged:]: 0xe6920b0
    Jan 21 11:12:59 unknown SpringBoard[5706] : [itrace]: [105d7000]: [SSDownloadManager copyDownloads]
    Jan 21 11:12:59 unknown SpringBoard[5706] : [itrace]: [105d7000]: [SSDownload persistentIdentifier]
    Jan 21 11:12:59 unknown SpringBoard[5706] : [itrace]: [105d7000]: [SSDownload
    addCachedPropertyValues:]: {

    I = SSDownloadPhaseDownloading;

    }
    Jan 21 11:12:59 unknown SpringBoard[5706] : [itrace]: [105d7000]: [SSDownload _applyPhase:toStatus:]: SSDownloadPhaseDownloading:
    Jan 21 11:12:59 unknown SpringBoard[5706] : [itrace]: [105d7000]: [SSDownloadQueue downloadManager:downloadStatesDidChange:]: : (

    "<SSDownload: 0xe6bd970>: -4085275246093726486"

    )

源码:https://github.com/waruqi/itrace

时间: 2024-08-29 03:44:18

批量追踪objc的方法调用记录的相关文章

Atitit &#160;记录方法调用参数上下文arguments

Atitit  记录方法调用参数上下文arguments 1.1. java  java8  新的对象Parameter LocalVariableTable 本地变量表 MethodParameters 方法参数表1 1.2. Js arguments1 1.3. 1 1.4. C#1 2. Php的解决方案2 2.1. func_num_args() 返回传递给该函数参数的个数  2 2.2. func_get_arg(int $arg_num) 取得指定位置的参数值 2 2.3.  3.f

aop日志(记录方法调用日志)

一,使用aop记录方法调用日志 1)使用注解与aop做方法调用日志,只需要把注解添加在要记录的方法上就可以,不会影响代码结构 2)实现思路 数据库表建立>>配置需要环境>>自定义注解>>定义切点与操作(包含处理逻辑)>>添加注解 二,配置环境 1)在原来的项目pom文件中添加以下aop需要的依赖 <springframework>4.0.5.RELEASE</springframework> <aspectj>1.8.5&

方法调用指令

在JDK7之前方法调用的字节码指令共有四条,invokeinterface.invokespecial.invokestatic.invokevirtual.由这四条指令完成Java中所有类型方法的调用. invokeinterface(调用接口方法) 无符号数indexbyte1和indexbyte2共同组件一个当前类常量池索引(index),该索引值为(indexbyte1<<8)|indexbyte2,即高位在前的两个字节无符号值.在常量池中索引为index的数据项必须为一个接口方法的符

Rails::Application中的一个方法调用

Ruby语言的动态性使得想仅仅通过查找相关API文档来学习Rails是完全不够的,因为API文档只记录了静态代码定义的方法,而Rails中有很多的方法都是在加载时或运行时动态生成的,想要了解这些方法必须要阅读源代码.本文以Rails工程下的config/application.rb文件中的一个方法调用为例,分析方法调用的具体过程. 1. 问题描述 假设Rails工程叫做Sample,那么在config/application.rb中会定义Sample::Application,并可以在其中调用c

Hibernate批量处理海量数据的方法

本文实例讲述了Hibernate批量处理海量数据的方法.分享给大家供大家参考,具体如下: Hibernate批量处理海量其实从性能上考虑,它是很不可取的,浪费了很大的内存.从它的机制上讲,Hibernate它是先把符合条件的数据查出来,放到内存当中,然后再进行操作.实际使用下来性能非常不理想,在笔者的实际使用中采用下面的第三种优化方案的数据是:100000条数据插入数据库, 需要约30分钟,呵呵,晕倒.(本人10分钟插入1000000条数据(字段比较小)) 总结下来有三种来处理以解决性能问题:

spring声明式事务 同一类内方法调用事务失效

只要避开Spring目前的AOP实现上的限制,要么都声明要事务,要么分开成两个类,要么直接在方法里使用编程式事务 [问题] Spring的声明式事务,我想就不用多介绍了吧,一句话“自从用了Spring AOP啊,事务管理真轻松啊,真轻松:事务管理代码没有了,脑不酸了,手不痛了,一口气全配上了事务:轻量级,测试起来也简单,嘿!”.不管从哪个角度看,轻量级声明式事务都是一件解放生产力的大好事.所以,我们“一直用它”. 不过,最近的一个项目里,却碰到了一个事务管理上的问题:有一个服务类,其一个声明了事

4 int.parse方法调用问题和同行评审

1 关于int.parse 的方法调用问题 我们知道int.parse用于数据类型的转换,int.parse(object obj)这个可以将填入的参数obj转换为int的数据类型. 我们在使用int.parse()时回遇到一系列问题. 例如:int.parse(null)会返回异常,另外int.Parse("4.5") 直接报错:"输入字符串的格式不正确" int.Parse是转换String为int,得到一个object对象,你想把double转换为int,用i

一种延迟方法调用的实现

原文:一种延迟方法调用的实现 需求场景 最近遇到一种场景,需要延迟某个步骤的实现,以便在延迟的过程中能够及早处理,从而取消任务. 比如,现在的服务器CPU过高了,则系统记录下来,然后开始发送邮件通知用户,但是如果在10秒之内CPU恢复了:或者我不希望用户得知这个CPU的信息,因为我就在现场,我可以及时知道怎么处理这种情况,这个时候准备拨打电话的这个方法的调用就不能被执行,需要延迟一段时间,以便能够被取消——以上场景仅供参考. 代码实现 以下是我的一个实现方式,供大家讨论,或者有更好的方式可以改进

多层 iframe 嵌套 js 方法调用

一下午一个这破问题,浪费了不少时间,怎么也实现不了我的上上级iframe 刷新.NND. 实现了,记录一下下吧: window.parent.parent.document.getElementById("content_frame").contentWindow.location.reload(); window.parent.parent.document.getElementById("content_frame").js方法. 多层 iframe 嵌套 js