Add boot timing and AVB/Play Integrity evasion

Boot timing system defers all modifications until after Play
Integrity first attestation completes. Monitors DroidGuard
(com.google.android.gms.unstable) CPU activity to detect
attestation window. PI watcher daemon auto-hides mods during
periodic re-checks — unmounts spoofs, removes non-stock props,
ensures boot state reads green/locked/enforcing, then re-applies
after check finishes. post-fs-data.sh cleaned to only set
stock-safe props during early boot. KernelSU version props
hidden. WebUI boot timing panel with hide/unhide controls.
This commit is contained in:
sssnake
2026-03-31 10:01:31 -07:00
parent b81de56601
commit d0061b82bb
6 changed files with 418 additions and 11 deletions

View File

@@ -357,6 +357,40 @@
</div>
</div>
<!-- Boot Timing -->
<div class="card">
<div class="card-title"><span class="dot" id="bootDot"></span> Boot Timing / AVB Evasion</div>
<div class="row">
<div>
<div class="row-label">Boot Timing</div>
<div class="row-desc">Defer mods until after Play Integrity passes</div>
</div>
<select class="sel" id="bootTiming" onchange="setConf('boot_timing', this.value)">
<option value="0">Disabled (apply immediately)</option>
<option value="1">Enabled (wait for PI)</option>
</select>
</div>
<div class="row">
<div>
<div class="row-label">PI Watcher</div>
<div class="row-desc">Auto-hide during re-attestation checks</div>
</div>
<div class="row-value" id="piWatcherStatus"></div>
</div>
<div class="row">
<div>
<div class="row-label">Boot State</div>
<div class="row-desc">Verified boot props</div>
</div>
<div class="row-value" id="bootState"></div>
</div>
<div class="btn-row">
<button class="btn" onclick="bootAction('hide')">Hide Now</button>
<button class="btn" onclick="bootAction('unhide')">Unhide</button>
<button class="btn" onclick="bootAction('status')">Check Status</button>
</div>
</div>
<!-- Driver Spoofing -->
<div class="card">
<div class="card-title"><span class="dot" id="spoofDot"></span> Driver Spoofing</div>
@@ -493,6 +527,37 @@
if (fmFreq) document.getElementById('fmFreq').value = fmFreq;
}
async function bootAction(action) {
log('Boot timing: ' + action);
const r = await exec('sh ' + MODDIR + '/scripts/boot_timing.sh ' + action);
log(r.stdout.trim() || action + ' done');
await loadBootStatus();
}
async function loadBootStatus() {
const timing = (await exec('cat ' + MODDIR + '/config/boot_timing 2>/dev/null')).stdout.trim();
document.getElementById('bootTiming').value = timing || '0';
const dot = document.getElementById('bootDot');
dot.className = 'dot' + (timing === '1' ? '' : ' off');
// PI watcher
const watcherPid = (await exec('cat ' + MODDIR + '/run/pi_watcher.pid 2>/dev/null')).stdout.trim();
if (watcherPid) {
const alive = (await exec('kill -0 ' + watcherPid + ' 2>/dev/null && echo running || echo dead')).stdout.trim();
document.getElementById('piWatcherStatus').textContent = alive === 'running' ? 'Active (PID ' + watcherPid + ')' : 'Dead';
} else {
document.getElementById('piWatcherStatus').textContent = timing === '1' ? 'Will start on boot' : 'Disabled';
}
// Boot state
const vb = await gp('ro.boot.verifiedbootstate');
const fl = await gp('ro.boot.flash.locked');
const vbm = await gp('ro.boot.vbmeta.device_state');
document.getElementById('bootState').textContent =
'vboot=' + (vb || '?') + ' flash=' + (fl || '?') + ' vbmeta=' + (vbm || '?');
}
async function spoofAction(action) {
log('Spoof: ' + action);
const r = await exec('sh ' + MODDIR + '/scripts/driver_spoof.sh ' + action);
@@ -676,6 +741,7 @@
await loadSdrInfo();
await loadControllerInfo();
await loadRtlStatus();
await loadBootStatus();
await loadSpoofStatus();
await loadStealthStatus();
log('Done');