游戏安全之渲染检测
该检测分为三个模糊化验证阶段:
第一阶段通过遍历预设范围,收集某内核子系统中的活跃节点标识符,存入动态容器。节点存在性校验采用双重状态检测机制,排除瞬态干扰因素。
第二阶段通过广度扫描策略,提取用户级资源隔离系统中注册的身份标识符,采用高位阈值遍历确保覆盖率。
第三阶段执行跨维关联验证,对第一阶段获取的标识符进行生存状态判定。通过与第二阶段数据的正交匹配,筛选出未纳入监管体系的孤立节点。针对异常节点附加时效性校验,当节点存活时间超过预设阈值时触发告警机制,同时规避时间同步误差。
整个检测采用多层级交叉验证策略,结合内核态与用户态信息差异分析,实现对特定类型资源残留状态的识别。部分条件判断采用反向校验模式,增强对低权限环境的兼容性。时间窗口比较采用绝对值防回绕设计,确保异常判定的可靠性。
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);
}
}
}
}