01Invisible payload
index.php looked almost normal in an editor. The code was encoded into Unicode variation selectors, invisible codepoints interleaved through the file, so to decode it I walked the source codepoint by codepoint and mapped each selector back to a byte. The decoded loader wrote itself to a temp file, included it, then removed it on shutdown, leaving nothing on disk to find.
02Skip the plugins
The real persistence was a fake security plugin that recreated a hidden administrator on every admin request, then filtered that account out of the user list, the REST API and the user counts alike. It hid itself from the plugin screen and threw a fake deactivation error to block its own removal. I only ever saw it because I ran every user query in the investigation with wp --skip-plugins, which bypasses the filter, and that single flag is the difference between finding it and declaring the site clean.
03Plugin recovery
The attacker had deleted every plugin, page builder included, so the restored site rendered as raw shortcodes. The only pre-compromise copy was an April migration archive, which the owner's own hosting restore then deleted; it survived solely inside the pre-clean tar I had taken thirty minutes earlier. Reverse-engineering that container format by inspection took me two wrong guesses about the field padding before my parser was right, and it pulled 20,509 files across 39 plugins, every one of which I scanned against the full indicator set before anything went near the live site.
04Staged re-clean
Every host backup predating the cleanup still contained the backdoor, so I staged an idempotent re-clean script on the server before the owner restored anything. His restore deleted index.php outright and brought the backdoor back. My script caught it, and the reintroduced files were what finally surfaced the cloaking plugin my first pass had never seen.
05Keys, not passwords
The owner opened by pasting his WordPress username and password into chat. I never used them. I generated a keypair up front instead, so the ask was a single paste into the hosting panel, and I ran the whole job with full file access and no password typed into a form.