I recently purchased a cheap, dedicated hand-held translation phone in Shenzhen. Given the nature of low-cost, off-brand hardware, I wanted to audit the device to see how it handled data and whether it exposed any undocumented access points.
After dumping the MT6737 firmware and decompiling the pre-installed system APKs, I found that the translator app logs every translation locally and periodically uploads that log — tagged with the device's hardware serial number — to the vendor's server. I also found a pair of undocumented tap-gestures in the Settings app that unlock hidden system access behind a hardcoded passcode. Here is the step-by-step technical breakdown of how I reversed it.
The device presents itself as a generic language translation smartphone. Looking under the hood at the system configuration (build.prop), I extracted the actual specifications:
ro.shcy.* (Shenzhen Hengchao Yuan technology config)As is common with low-cost Shenzhen clones, the device is configured to report inflated memory and storage capacity in Android settings, regardless of the actual hardware installed. In build.prop, I found custom OEM override configs hardcoded to display these numbers:
ro.shcy.ram.custom_total = 2 — reports RAM as 2GBro.shcy.data.custom_total = 16 — reports flash storage as 16GBro.shcy.home.name = link.zhidou.translator/link.zhidou.translator.ui.activity.HomeActivity — locks the boot sequence directly to the translator UI rather than the standard Android home screenOnline translation inherently requires sending audio/text to a server — that's not unusual on its own, and isn't evidence of anything malicious by itself. What stood out during my audit of the main translator package (link.zhidou.translator) is how the data is handled after the fact. I found a local database table called correct_report persisting the following fields: the original speech transcription, the translated text result, the device's hardware serial number, and the source/target languages.
The class link.zhidou.correct.a periodically performs a batch synchronization, uploading this stored translation history as raw JSON via HTTP POST to https://translate.zhidou.link/correct/reportBatch.
In other words: rather than treating each translation as a one-off, stateless request, the app is persisting a running log locally and shipping it upstream tied to a specific device identifier, with no visible user-facing opt-out.
To inspect the device's running processes and network calls live, I needed ADB/USB debugging access. However, standard Android settings were completely overridden and locked down by the custom launcher (LauncherLight.apk, link.zhidou.launcher).
By auditing AboutActivity.smali in the Settings activity, I uncovered two custom click listeners:
com.android.launcher3.Launcher) or fallback Settings app, giving access to the underlying Android 7.0 system.adb_enabled in the system settings database, turning on USB debugging.Both prompts required a passcode returned by the JNI method SecretProvider.logCmd(Context).
The SecretProvider Java class dynamically loads a native companion library called libddgif.so (extracted from lib/armeabi-v7a/libddgif.so in the APK).
Before releasing the passcode, logCmd performs signature and package integrity validation. It programmatically queries the Android package manager, hashing the app's signatures to ensure they match:
link.zhidou.translatorF1A54A3F024A8D1B74D1FF1F74D3BE66ED79312EIf validation checks succeed, it returns a hardcoded passcode from its read-only data (.rodata) section. By disassembling the Thumb-2 instruction stream of the logCmd function, I resolved the PC-relative string loads — tracing the instruction ldr r1, [pc, #0x54] loading a pointer offset relative to PC. In the .rodata section, I found a collection of candidate strings, including MD5 hashes and a 6-digit number: 959023.
Entering 959023 into both prompts successfully unlocked the device:
959023 dropped me into the native Android Launcher.959023 enabled USB debugging/ADB.To be clear about what this does and doesn't show: I have no evidence this device is deliberately spying on users, and sending translation requests to a server is expected behavior for an online translator. What's worth flagging is (1) translations are persisted locally and uploaded tied to the device's serial number, with no visible way to opt out, and (2) there's an undocumented hidden menu gated by a hardcoded PIN rather than a disclosed service/debug mode. Neither is proof of malicious intent, but both are worth knowing if you're using or reselling this hardware.
Always take a look under the hood — especially with hardware bought off the shelf in electronics markets!