游戏安全之渲染检测

该检测分为三个模糊化验证阶段:

第一阶段通过遍历预设范围,收集某内核子系统中的活跃节点标识符,存入动态容器。节点存在性校验采用双重状态检测机制,排除瞬态干扰因素。

第二阶段通过广度扫描策略,提取用户级资源隔离系统中注册的身份标识符,采用高位阈值遍历确保覆盖率。

第三阶段执行跨维关联验证,对第一阶段获取的标识符进行生存状态判定。通过与第二阶段数据的正交匹配,筛选出未纳入监管体系的孤立节点。针对异常节点附加时效性校验,当节点存活时间超过预设阈值时触发告警机制,同时规避时间同步误差。

整个检测采用多层级交叉验证策略,结合内核态与用户态信息差异分析,实现对特定类型资源残留状态的识别。部分条件判断采用反向校验模式,增强对低权限环境的兼容性。时间窗口比较采用绝对值防回绕设计,确保异常判定的可靠性。

pid_t pid_max = 32768;
        std::vector<uint32_t> pids;
        std::vector<uint32_t> uids;

        struct stat st{};
        if (!stat("/sys/class/kgsl/kgsl/pagetables", &st)) {
            for (int i = 0; i < pid_max; ++i) {
                if (!access(("/sys/class/kgsl/kgsl/pagetables/" + std::to_string(i)).c_str(),
                            F_OK)) {
                    //LOGD("%d",i);
                    pids.push_back(i);
                }
            }
        }

        for (int i = 0; i < 100000; ++i) {
            if (access(("/sys/fs/cgroup/uid_" + std::to_string(i)).c_str(), F_OK) == 0) {
                uids.push_back(i);
            }
        }

        for (auto pid: pids) {
            bool normal = false;
            for (auto uid: uids) {
                auto path =
                        "/sys/fs/cgroup/uid_" + std::to_string(uid) + "/pid_" + std::to_string(pid);
                if (!access(path.c_str(), F_OK)) {
                    normal = true;
                    //LOGD("%d,%d",uid,pid);
                    break;
                }
            }
            if (!normal) {
                struct stat t{};
                if (!stat(("/sys/class/kgsl/kgsl/pagetables/" + std::to_string(pid)).c_str(),
                          &st)) {
                    //LOGD("%ld,%ld", t.st_ctim.tv_sec,st.st_ctim.tv_sec);
                    if (abs(t.st_ctim.tv_sec - st.st_ctim.tv_sec) > 20) {
                        printf("pid: %d\n", pid);
                    }
                }
            }
        }