A 1-day reverse-engineering story
Lorenzo Rizzotti · dreaming.codes

Who am I?
21 · full-stack dev · CS @ UC Riverside
The problem
Molekule's purifiers used to work fully with any filter.
A firmware update added an NFC check that locked the smart features behind first-party filters.
My question
Where is the
"is this filter counterfeit?"
decision actually made?
Hypothesis
Plan: verify
Part 1
Step 1: open it
What I found

photo: FCC filing
A suspiciously clean 10-pin header.
ARM Cortex SWD
Improvise
↓ aside: there's a second flash chip
Aside — two chips, not one
Sitting right next to the MCU. Not needed for the attack. But I was curios to know what was inside
Reading external flash through the MCU
So from SWD's perspective, the second chip looks like regular memory.
Halt → dump_image → done
What was inside
A second copy of the internal flash.
Almost certainly the OTA staging slot.
What was inside
AWS IoT Core
Part 2
Goal: see the traffic
The device speaks MQTT over TLS.
I want to be the man in the middle.
TLS interception
↓ how each step was done
Locate the trust anchor
That's the trust anchor.
Forge + splice
Device's root of trust is now mine.
Write it back
Boots clean. My CA is now a root of trust.
Rogue AP + redirect
Same CA in the firmware and in the proxy → handshake succeeds → we read every request in plaintext.
What I saw
The cloud doesn't refuse. It just labels.
The pivot
| Patch firmware | Patch app | |
|---|---|---|
| Where | device MQTT handler | the enforcer itself |
| User effort | crack open + SWD | sideload an APK |
| Bounty | ✗ | ✓ |
Part 3
Same rig, new target
I already had the MITM stack from before.
Install my CA on the phone.
Connect the phone to the network.
App says no
MITM up. Phone routed. App refuses to connect.
Fix: Frida gadget — injectable Frida, no root.
↓ how
Frida gadget — step by step
Two lines of smali. Gadget runs in-process with the app's own permissions.
The hook
Gadget is in-process. Now replace pinning methods with no-ops — before the first HTTPS call.
TLS handshake against my CA succeeds → app traffic in httptoolkit.
What the app talks to
Not a Molekule API. The broker, directly.
What's in the messages
The verdict, in clear JSON, on every shadow update.
Try the cheapest patch first
httptoolkit rewrite rule
It works!
Now make it permanent
Fearing for Hermes.
Inside
Plain minified JS. Not Hermes.
Make it readable
Still obfuscated. But after enough reversals, you learn to track the flow.
Find the boolean in the bundle
Repack APK · sign · install. Done.
Demo
Outcome
Patch never released — DMCA §1201.
Relevant skills
Sole author.
What I'd do differently
Avoid assuming proper implementation — check the easiest path first.
Why Neuralink?
August 2020. Italy, past midnight.
15 years old, watching spikes light up on a screen every time someone touched a pig's nose.
I still remember the feeling. That was the night I knew where I wanted to end up.
I love pulling apart systems to understand how they work —
and there is no system more worth reverse engineering than the human brain.
I don't want to build features.
I want to build things that change what's possible.
Hardware · MQTT · trust boundaries · §1201