BugTags 是目前最好的App运行时状态数据收集的第三方解决方案之一,官网上没有明显位置的简介,所以需要更多了解请移步到BugTags
实验序号:001
实验名称:解剖BugTags的控制台日志收集方式
实验时间:2016年10月10日
实验地点:学霸君(上海)办公室
实验目的:调查BugTags对于控制台的日志收集方案
实验原理、实验流程或装置示意图
实验原理:通过反编译获取对应的逻辑块,对逻辑块代码进行分析
实验设备及材料
实验材料:
a、BugTags SDK Version:1.3.1
实验设备:
a、Hopper (反编译)
b、Xcode (验证结论)
实验方法步骤及注意事项
- 实验方法步骤
- API观察:观察SDK公开API;
- .o对象观察:观察dump之后获得的.o对象;
- 伪代码观察:观察关键.o反编译得出的伪代码逻辑;
- 注意事项
- 注意Hopper的伪代码生成在不同platform下可能有所不同;
- 注意分析目标可能使用的系统API;
- 注意分析目标可能存在的问题;
实验过程记录
首先,使用classdump或者hopper对BugTags.framework进行分析,如图:
和大多数第三方提供的SDK一样,BugTags也提供了四种平台下静态库文件,其中x86_64和i386是提供给模拟器使用,ARM提供给真机使用。然后使用otool来查看静态库中的.o对象,如图:
根据上图的结果,我们可以找出疑似Log收集的类BTGLoggerCatcher。当然还可以看到一些SDK内部的其他功能。接着,我们用Hopper来进一步对这个类进行分析,如图:
相关方法很显然有setTrackingConsoleLog:和updateConsoleLogs两个。
分析setTrackingConsoleLog:
其余两个平台的截图由于没有更多有用的信息,在这里就不放出来了。
接下来,我们可以在之前的function dump中找到对应的三个block:
接着,我们在其中一个block反编译出来的伪代码中找到了蛛丝马迹:
显然,我们直接去看一看updateConsoleLog的逻辑应该就可以找到我们需要的结果了:
从这段伪代码中,我们大概可以看到Bugtags中用到了几个叫asl_xxx的API,于是我在Xcode中搜索了一下找到了asl.h这个头文件,并且查看了一些函数说明,得出猜想,BugTags使用了这些API完成对控制台日志的收集。于是我仿照伪代码写了一段代码来进行了验证。
- (void)query {
pid_t pid = getpid();
asl_object_t query = asl_new(ASL_TYPE_QUERY);
asl_object_t searched = asl_search(nil, query);
asl_object_t msgObj = aslresponse_next(searched);
while (msgObj) {
if (pid == atol(asl_get(msgObj, "PID"))) {
long mid = atoll(asl_get(msgObj, "ASLMessageID"));
long time = atol(asl_get(msgObj, "Time"));
long timeNano = atol(asl_get(msgObj, "TimeNanoSec"));
const char *msg = asl_get(msgObj, ASL_KEY_MSG);
printf("pid: %d ASLMessageID: %ld Time: %ld TimeNanoSec: %ld Message: %s\n", pid, mid, time, timeNano, msg);
}
msgObj = aslresponse_next(searched);
}
aslresponse_free(searched);
asl_free(query);
}