hzqst
雪 币: 8207
活跃值: (182)
能力值:
( LV9,RANK:240 )
在线值:
这里分析的是6月18号的版本,由于某些原因这里隐去敏感内容
目前静态分析跟踪到7个系统线程创建,线程创建过程如下:
先判断hv是否存在
如果hv不存在则搜索SeSetAuditParameter中的FF E1特征码
根据如果成功搜索到上述fake thread entry则把线程入口指向上述entry,线程参数指向原真实线程入口(也就是rcx=真实线程入口,并且jmp rcx)
然后调用pscreatesysthrd创建系统线程
目前分析到的7个线程分别是:
CheckKSharedUserDataKdDebuggerEnabledThread
AntiKdDebuggerThread
CheckGameProcessDebuggedThread
CheckKeTimeAcceleratedThread
GameCommonCheckThread
sub_xxxxxxxx(作用不明,可能代码被注释或功能暂未实装)
判断KSHARED_USER_DATA->KdDebuggerEnabled & 1或 & 2 ?
每5秒检测一次,如果判断为true则蓝屏
如果系统版本大于等于win7则执行int2D指令触发SEH(由于静态分析无法分析SEH所以exception之后不知道发生了什么)
否则调用KdDisableDebugger
每5秒执行一次上述功能
ExecuteForGameProcess(AntiProcessDebug);对所有受XX保护的GameProcess执行AntiProcessDebug回调
如果EPROCESS.DebugPort != 0则触发蓝屏
上述检测每10秒执行一次
检测系统时间是否被加速,导致KeDelayExecutionThread的等待时间结果跟HalQueryRealTimeClock时间差不一致
如果时间不一致:
如果某开关开启,则上报服务器,否则蓝屏
上述检测每1秒执行一次
检测cr4.tsd bit是否为1
如果为1:
如果某开关开启,则上报服务器,否则强制结束游戏(对g_game_process数组里的所有进程ZwTerminateProcess)
除此之外还对所有游戏进程检测SHARED_USER_DATA
ExecuteForGameProcess(CheckSharedUserData);
检测如下:
判断R3和R0的KSHARED_USER_DATA的物理地址是否一致
如果物理地址不一致:
如果某开关开启,则上报服务器,否则强制结束游戏
上述检测每10秒执行一次
对PID为16~0x40000的所有进程枚举句柄表
如果句柄ObjectType==*PsProcessType且 拥有该句柄的进程不是受保护的游戏进程 且 进程句柄指向的进程是受保护的游戏进程
则进行句柄降权
遍历PID为16~0x40000的所有进程,遍历其内部的从8~0x2000的所有句柄,如果是SECTION类型且名称包含
L"\\TX_SSO_SHARE_INFO_SIZE"
L"\\TENPROTECT3_SHARE_DATA_"
L"\\TENPROTECT6_SHARE_DATA_"
则
如果该进程是受保护的游戏进程,则什么都不做
如果该进程不是受保护的游戏进程,且该进程仍然存活(未退出),则上报服务器
如果上述条件都不满足,则强制蓝屏
(猜测:此举可能是为了防止有人强制清空受保护的游戏数组g_game_process)
上述检测每10秒执行一次