解剖室二:BugTags的设备信息收集
2016-10-18 本文已影响46人
冬季
![](https://img.haomeiwen.com/i121266/d3dc3131fcd47ac0.jpg)
BugTags 是目前最好的App运行时状态数据收集的第三方解决方案之一,官网上没有明显位置的简介,所以需要更多了解请移步到BugTags
实验序号:002
实验名称:解剖BugTags的设备信息收集方式
实验时间:2016年10月18日
实验地点:学霸君(上海)办公室
实验目的:调查BugTags对于设备信息收集方案
实验原理、实验流程或装置示意图
实验原理:通过反编译获取对应的逻辑块,对逻辑块代码进行分析
![](https://img.haomeiwen.com/i121266/8d178054238cae4b.jpg)
实验设备及材料
实验材料:
a、BugTags SDK Version:1.3.1
实验设备:
a、Hopper (反编译)
b、Xcode (验证结论)
实验方法步骤及注意事项
- 实验方法步骤
- .o对象观察:观察dump之后获得的.o对象;
- 伪代码观察:观察关键.o反编译得出的伪代码逻辑;
- 注意事项
- 注意Hopper的伪代码生成在不同platform下可能有所不同;
- 注意分析目标可能使用的系统API;
- 注意分析目标可能存在的问题;
实验过程记录
根据上一篇文章,我们获取了BugTags的.o对象列表
![](https://img.haomeiwen.com/i121266/66169f59eb78057a.png)
我们可以找出唯一一个疑似关于设备信息的对象就是BTGDeviceInfo。接着,我们用Hopper来进一步对这个类进行分析,如图:
![](https://img.haomeiwen.com/i121266/f18cc6f30e3d8a1c.png)
![](https://img.haomeiwen.com/i121266/19317c1e69b80149.png)
相关方法很显然有setTrackingConsoleLog:和updateConsoleLogs两个。
分析setTrackingConsoleLog:
![](https://img.haomeiwen.com/i121266/4e62b03487eec417.png)
![](https://img.haomeiwen.com/i121266/1712fe217f77098a.png)
其余两个平台的截图由于没有更多有用的信息,在这里就不放出来了。
接下来,我们可以在之前的function dump中找到对应的三个block:
![](https://img.haomeiwen.com/i121266/3825976e9d895dd9.png)
接着,我们在其中一个block反编译出来的伪代码中找到了蛛丝马迹:
![](https://img.haomeiwen.com/i121266/f81cf023527b40d2.png)
显然,我们直接去看一看updateConsoleLog的逻辑应该就可以找到我们需要的结果了:
![](https://img.haomeiwen.com/i121266/1fc3586135e62618.png)
从这段伪代码中,我们大概可以看到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);
}