美文网首页
解剖室一:BugTags的控制台日志收集

解剖室一:BugTags的控制台日志收集

作者: 冬季 | 来源:发表于2016-10-11 10:21 被阅读382次
    解剖也有美感

    BugTags 是目前最好的App运行时状态数据收集的第三方解决方案之一,官网上没有明显位置的简介,所以需要更多了解请移步到BugTags

    实验序号:001
    实验名称:解剖BugTags的控制台日志收集方式
    实验时间:2016年10月10日
    实验地点:学霸君(上海)办公室
    实验目的:调查BugTags对于控制台的日志收集方案


    实验原理、实验流程或装置示意图

    实验原理:通过反编译获取对应的逻辑块,对逻辑块代码进行分析


    实验流程示意图.jpg

    实验设备及材料

    实验材料:
    a、BugTags SDK Version:1.3.1

    实验设备:
    a、Hopper (反编译)
    b、Xcode (验证结论)


    实验方法步骤及注意事项

    1. 实验方法步骤
    • API观察:观察SDK公开API;
    • .o对象观察:观察dump之后获得的.o对象;
    • 伪代码观察:观察关键.o反编译得出的伪代码逻辑;
    1. 注意事项
    • 注意Hopper的伪代码生成在不同platform下可能有所不同;
    • 注意分析目标可能使用的系统API;
    • 注意分析目标可能存在的问题;

    实验过程记录

    首先,使用classdump或者hopper对BugTags.framework进行分析,如图:

    class-dump.png
    和大多数第三方提供的SDK一样,BugTags也提供了四种平台下静态库文件,其中x86_64和i386是提供给模拟器使用,ARM提供给真机使用。然后使用otool来查看静态库中的.o对象,如图: 真庆幸一个屏幕装得下

    根据上图的结果,我们可以找出疑似Log收集的类BTGLoggerCatcher。当然还可以看到一些SDK内部的其他功能。接着,我们用Hopper来进一步对这个类进行分析,如图:

    Function List 1 Function List 2

    相关方法很显然有setTrackingConsoleLog:和updateConsoleLogs两个。
    分析setTrackingConsoleLog:

    ARM7 Platform x86_64

    其余两个平台的截图由于没有更多有用的信息,在这里就不放出来了。

    接下来,我们可以在之前的function dump中找到对应的三个block:

    三个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);
    }
    

    感谢各位看官

    相关文章

      网友评论

          本文标题:解剖室一:BugTags的控制台日志收集

          本文链接:https://www.haomeiwen.com/subject/mwavyttx.html