Pixel 9 โ€” Mobile Security Research Setup

๐Ÿ“ฑ Pixel 9 โ€” Mobile Security Research Setup

Legal Notice

This guide is for authorized red team engagements and security research only. Unlocking bootloaders and rooting voids warranty. NAS/protocol testing must be performed within engagement scope and applicable law. Never test against live networks without explicit written authorization.


Hardware Reality Check โ€” Tensor G4 vs Qualcomm

Critical: Pixel 9 Uses Tensor G4, NOT Qualcomm Snapdragon

This changes your toolchain significantly. Many telecom research tools (SCAT, QXDM) target Qualcomm modems only.

graph LR
    subgraph "Pixel 9 โ€” Tensor G4"
        T1["Google Tensor G4 SoC"]
        T2["Samsung Exynos\nModem 5400"]
        T3["Diagnostic: Samsung\nDiag protocol โ€” partial\nSCAT support (limited)"]
    end

    subgraph "Qualcomm Devices (Better for NAS Research)"
        Q1["Snapdragon 8 Gen 3"]
        Q2["Qualcomm X75 Modem"]
        Q3["SCAT full support\nQXDM ยท QPST ยท full\nNAS decode"]
    end

    subgraph "Pixel 9 Capabilities"
        C1["โœ… Bootloader unlock\nsupported"]
        C2["โœ… Magisk root\nfull support"]
        C3["โœ… ADB modem\ndiagnostic access"]
        C4["โœ… NAS state\nmanipulation via\ncustom RIL/AT cmds"]
        C5["โš ๏ธ Full NAS decode\nlimited vs Qualcomm"]
        C6["โœ… UERANSIM\nclient mode\nvia Termux + USB"]
    end

    style T2 fill:#E36209,color:#fff
    style Q3 fill:#1F3864,color:#fff
    style C1 fill:#2E75B6,color:#fff
    style C5 fill:#E36209,color:#fff

Bottom line: Pixel 9 is excellent for app-layer, API, and subscriber-identity testing. For deep NAS packet capture, pair it with a Qualcomm-based second device or use UERANSIM on a laptop connected via the Pixel 9's hotspot.


Setup Flow

flowchart TD
    A["๐Ÿ›’ Start: Pixel 9\nAndroid 15"] --> B["โš™๏ธ Phase 1\nDeveloper Mode &\nADB Setup"]
    B --> C{"Device Type?"}
    C -->|"Telecom-Joined\n(MDM enrolled โ€” this setup)"| D1["๐Ÿ”’ Phase 3\nNo-Root Path\nNetHunter Rootless"]
    C -->|"Clean Device\n(unlocked from Google Store)"| E["๐Ÿ”“ Phase 2\nBootloader Unlock"]
    E --> F["๐Ÿช„ Phase 3A/B\nMagisk Root\nor GrapheneOS"]
    D1 --> G["๐Ÿ“ฆ Phase 4\nCore Tool Install\nTermux ยท Frida Rootless ยท HTTP Toolkit"]
    F --> G
    G --> H["๐Ÿ“ก Phase 5\nModem Diagnostic\nSetup"]
    H --> I["๐Ÿงช Phase 6\nTesting Validation\n& Capability Check"]

    style A fill:#1F3864,color:#fff
    style C fill:#E36209,color:#fff
    style D1 fill:#2E75B6,color:#fff
    style F fill:#C00000,color:#fff
    style I fill:#2E75B6,color:#fff
Which Path Applies to This Device?

This guide is written for a telecom-joined Pixel 9 (carrier MDM enrolled). The primary path skips bootloader unlock entirely. The Magisk and GrapheneOS paths are documented for reference โ€” they apply to a second, clean unlocked device. See Device Strategy at the end.

Do you need Phase 3 and 3A?

No. Treat them as alternative paths, not sequential required steps.

Situation Necessary path
This current telecom-joined Pixel 9 Phase 3
Second clean unlocked Pixel for root-only testing Phase 3A
You only need app testing, ADB telecom inspection, cell info, and non-destructive workflow Phase 3 only
You need system cert injection, full Frida, full tcpdump, or deeper modem access Add Phase 3A on a separate device

Phase 1 โ€” Developer Mode & ADB

# On Pixel 9:
# Settings โ†’ About Phone โ†’ Build Number (tap 7x) โ†’ Developer Options enabled

# Enable in Developer Options:
# โœ… USB Debugging
# โœ… OEM Unlocking  โ† required before bootloader unlock
# โœ… Wireless Debugging (for wireless ADB)

# On your workstation:
adb devices                          # verify device recognized
adb shell getprop ro.product.model   # should return "Pixel 9"
adb shell getprop ro.build.version.release  # Android version
adb shell getprop gsm.version.baseband      # modem firmware version

Phase 2 โ€” Bootloader Unlock

This WIPES the device. Back up everything first.
# Reboot to bootloader
adb reboot bootloader

# Verify fastboot sees device
fastboot devices

# Unlock bootloader (requires OEM unlock enabled in Developer Options)
fastboot flashing unlock

# Device will show warning โ†’ use volume keys to confirm โ†’ power to accept
# Device wipes and reboots โ†’ re-enable Developer Options + USB debugging
Carrier-Locked Pixels

If purchased from a carrier (Verizon, AT&T, T-Mobile), OEM unlock may be grayed out for 60-180 days or permanently disabled. Always buy unlocked directly from Google Store for research devices.


Phase 3 โ€” No-Root Path (Telecom-Joined Device โ€” This Setup)

Do NOT Unlock the Bootloader on This Device

This Pixel 9 is carrier MDM-enrolled. Bootloader unlock triggers Play Integrity failure โ†’ MDM detects it and may wipe/lock the device. You also lose the carrier SIM binding that makes this device valuable. Verify MDM status first.

Necessity

Phase 3 is the necessary path for the current telecom-joined device. If this is the handset you are actually carrying into an engagement, stop here and build your workflow around the no-root path.

# Check if OEM unlock is available:
# Settings โ†’ Developer Options โ†’ OEM Unlocking
# If GREYED OUT โ†’ MDM is active. Stop here. Use the no-root path.

# Verify MDM enrollment:
adb shell dumpsys device_policy | grep -i "admin\|mdm\|enrolled"
adb shell pm list packages | grep -i "mdm\|dpc\|enterprise"

NetHunter Rootless โ€” Kali Tools Without Any OS Change

# NetHunter Rootless runs a full Kali chroot inside Termux โ€” no root needed.
# Official guide: https://www.kali.org/docs/nethunter/nethunter-rootless/

# Step 1: Install Termux from F-Droid (NOT Google Play)
# Step 2: Install NetHunter Store APK from:
#   https://store.nethunter.com/
# Step 3: From NetHunter Store โ†’ install:
#   โ€ข Kali NetHunter App
#   โ€ข KeX (Kali desktop if needed)
# Step 4: Open NetHunter app โ†’ install Kali chroot (rootfs download ~1GB)

# You now have a full Kali CLI:
# kali   โ† launches Kali shell in NetHunter app
# Inside Kali: apt install <any-kali-tool>

Capability map โ€” no-root Pixel 9:

Capability Available Method
Kali toolchain โœ… NetHunter Rootless chroot
ADB modem diagnostics โœ… dumpsys telephony, dumpsys phone
Cell info harvesting โœ… NetMonster, dumpsys telephony.registry
App-layer MITM โœ… (non-pinned apps) HTTP Toolkit or Packet Capture VPN app
Frida hooks โš ๏ธ Limited Rootless attach (user procs) or frida-gadget APK repack
Burp CA injection โš ๏ธ User cert only Works for non-pinned apps; not system store
Network scanning โœ… Termux nmap, tshark
AT command access โš ๏ธ Partial ADB shell debug paths
Burp CA โ†’ system store โŒ Needs root
Frida on system/carrier apps โŒ Needs root
tcpdump all interfaces โŒ Needs root
Full modem diag port โŒ Needs root

If this is your only device, what do you lose?

If you stay on the safe Phase 3-only path, you do not lose the core value of the phone for telecom research. You still keep:

What you do lose is the deeper root-only layer:

Note

Since you only have one device, the practical tradeoff is simple: you keep the authentic carrier handset use case, but give up the destructive or root-heavy research use case unless you later add a second clean unlocked device.


Phase 3A โ€” Magisk Root on Stock Android (Clean Device Only)

Clean Unlocked Device Only

Do NOT attempt this on the telecom-joined Pixel 9. This path is for a second device purchased unlocked directly from the Google Store and never enrolled in a carrier/corporate MDM.

Necessity

Phase 3A is optional. Use it only when you have a separate clean unlocked device and you specifically need root-only capabilities such as system trust-store injection, full Frida coverage, full-interface packet capture, or deeper modem access.

Where patched_init_boot.img comes from

You do not download patched_init_boot.img directly.

Use this flow:

  1. Download the official Google Pixel 9 factory image or full OTA for the exact build currently on the phone
  2. Extract the stock init_boot.img from the matching factory image
  3. Copy init_boot.img to the Pixel
  4. Patch it in Magisk
  5. Copy the resulting patched_init_boot.img back to your laptop
  6. Flash that patched image with fastboot
Important

Match the image to your exact current build number from:
adb shell getprop ro.build.fingerprint
or
adb shell getprop ro.build.id

Do not patch a random Pixel 9 image from a different monthly build.

Official sources

Practical guidance

flowchart LR
    A["Download stock\nPixel 9 factory image\nfrom Google"] --> B["Extract init_boot.img\nfrom factory zip"]
    B --> C["Copy init_boot.img\nto Pixel 9 storage"]
    C --> D["Install Magisk APK\non device"]
    D --> E["Magisk โ†’ Install\nโ†’ Select init_boot.img\nโ†’ Patch"]
    E --> F["Copy patched_init_boot.img\nback to workstation"]
    F --> G["fastboot flash init_boot_\npatched_init_boot.img"]
    G --> H["โœ… Rooted Pixel 9\nStock Android preserved"]

    style H fill:#2E75B6,color:#fff
# On laptop: identify current build first
adb shell getprop ro.build.id
adb shell getprop ro.build.fingerprint
adb shell getprop ro.boot.slot_suffix

# Download the matching official Pixel 9 image from Google
# Then extract init_boot.img from the factory image package

# Copy stock init_boot.img to the phone
adb push init_boot.img /sdcard/Download/

# On the phone:
# Open Magisk โ†’ Install โ†’ Select and Patch a File โ†’ choose /sdcard/Download/init_boot.img
# Magisk writes a patched image, typically under /sdcard/Download/

# List the patched file first; quote the remote wildcard so your local shell does not expand it
adb shell 'ls -lt /sdcard/Download/magisk_patched*.img'

# Pull the exact patched image back to the laptop
adb pull /sdcard/Download/magisk_patched-<id>.img patched_init_boot.img

# Reboot from Android into the bootloader
adb reboot bootloader
fastboot devices

# Flash patched init_boot to the active slot
# Example: if ro.boot.slot_suffix returned _b, flash init_boot_b
fastboot flash init_boot_<slot> patched_init_boot.img
fastboot reboot

# Verify root
adb shell su -c "id"   # should return uid=0(root)

# Recommended Magisk modules for research:
# โ€ข MagiskHide / Shamiko       โ€” hide root from banking/telco apps
# โ€ข LSPosed                    โ€” Xposed framework for app hooking
# โ€ข MoveCA / TrustMeAlready   โ€” inject Burp CA into system store

Unlocks on a rooted clean device:


Phase 3B โ€” GrapheneOS (Clean Device, OPSEC Focus)

When to Choose GrapheneOS Over Magisk

GrapheneOS is the right call when OPSEC matters more than deep carrier API compatibility โ€” e.g., you're researching what a privacy-hardened device leaks to carrier infrastructure, or you need near-zero telemetry during a physical red team where device seizure is possible. Trade-off: some carrier apps lose deep OS integration (VoLTE auto-config, RCS).

# Install via web installer at grapheneos.org/install/web
# Requires Chrome/Edge with WebUSB support โ€” Pixel 9 is fully supported

# Post-install:
# Settings โ†’ System โ†’ Developer Options โ†’ enable ADB
# Install sandboxed Google Play for carrier app compatibility
# Note: some carrier provisioning flows need native Google Services โ€”
# test per-carrier before using this as primary research platform

GrapheneOS vs Magisk for telecom research:

Factor Magisk (Stock) GrapheneOS
RIL / AT command access โœ… Native โœ… Works
Carrier app deep integration โœ… Full โš ๏ธ Sandboxed
VoLTE / RCS provisioning โœ… โš ๏ธ May require workaround
Telemetry to Google โš ๏ธ Present โœ… Near-zero
Device seizure OPSEC โš ๏ธ โœ… Strong
Network fingerprint Standard Pixel Slightly hardened
Root access โœ… Magisk โš ๏ธ Root via ADB only

Phase 4 โ€” Core Tool Installation

Where Phase 4 actually happens

Phase 4 is split between your laptop and the Pixel, not done in only one place.

Component Where you do it
Install desktop tooling like adb, frida-tools, Burp, HTTP Toolkit, jadx, MobSF helpers Laptop
Install Termux / NetHunter Rootless / target apps Pixel 9
Push, pull, inspect packages, and launch workflows From laptop over ADB
Run on-device CLI tools such as pkg, pip, termux-setup-storage Inside Termux on the Pixel

Practical answer

Yes โ€” you start Phase 4 from your laptop, but some steps finish on the phone itself.

Use this order:

  1. Laptop: connect ADB and verify the phone.
  2. Pixel: install Termux and any Android-side apps.
  3. Pixel / Termux: install the on-device packages.
  4. Laptop: use ADB, Frida, Burp, or HTTP Toolkit to drive the workflow.
# Laptop side
adb devices
adb shell getprop ro.product.model

# Install APKs from the laptop when needed
adb install termux.apk
adb install httptoolkit.apk

# Open a shell from the laptop
adb shell

# Then, inside Termux on the Pixel, run:
# pkg update && pkg upgrade
# pkg install python3 git curl wget nmap tcpdump openssl tshark netcat-openbsd dnsutils
# pip install scapy requests frida-tools impacket
# termux-setup-storage
Important

Think of Phase 4 as laptop-orchestrated, phone-executed. Your laptop is the control station; the Pixel is where the Android and Termux-side tooling actually lives.

In this setup, keep the persistent Frida tooling on the laptop under ~/Documents/mobility/frida/:

  • Server binary: ~/Documents/mobility/frida/frida-server
  • Client CLI: ~/Documents/mobility/frida/venv/bin/frida-ps
  • Interactive CLI: ~/Documents/mobility/frida/venv/bin/frida

4.1 Termux (Linux Environment on Device)

# Install from F-Droid (NOT Google Play โ€” Play version is outdated)
# https://f-droid.org/packages/com.termux/

# In Termux:
pkg update && pkg upgrade
pkg install python3 git curl wget nmap tcpdump openssl \
            tshark netcat-openbsd dnsutils

# Install Python security libs
pip install scapy requests frida-tools impacket

# Enable Termux storage access
termux-setup-storage

4.2 Frida (Dynamic Instrumentation)

Rootless Mode (Telecom-Joined Device โ€” this setup)

# On workstation:
pip install frida-tools

# Option A: Frida via Termux (rootless โ€” attaches to user processes)
# In Termux:
pkg install python
pip install frida-tools
# Run frida directly in Termux โ€” can attach to own Termux processes
# Cannot attach to system/carrier processes without root

# Option B: Frida Gadget (repackage target APK)
# 1. Pull APK from device:
adb shell pm path com.carrier.app
adb pull /data/app/.../base.apk carrier.apk
# 2. Inject frida-gadget with apk-mitm or objection patcher:
pip install objection
objection patchapk --source carrier.apk
# 3. Install patched APK โ€” Frida connects automatically on launch
# Works without root. Best for targeting specific carrier app.

# Verify (rootless attach):
frida-ps -U   # lists user-accessible processes
frida -U -l bypass-ssl-pinning.js -f com.carrier.app --no-pause

Rooted Mode (Clean Device Only)

# Download frida-server for arm64:
# https://github.com/frida/frida/releases โ€” frida-server-<version>-android-arm64.xz

# Persistent laptop-side paths used in this workflow:
# ~/Documents/mobility/frida/frida-server
# ~/Documents/mobility/frida/venv/bin/frida-ps

adb push frida-server /data/local/tmp/
adb shell su -c 'chmod 755 /data/local/tmp/frida-server && /data/local/tmp/frida-server &'

~/Documents/mobility/frida/venv/bin/frida-ps -U   # all processes visible
# Full access: carrier apps, system processes, modem RIL

4.3 SSL Interception โ€” Burp Suite / HTTP Toolkit

Rootless โ€” User Certificate (Telecom-Joined Device โ€” this setup)

# โ”€โ”€ Option A: HTTP Toolkit (easiest, no root) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
# https://httptoolkit.com/android/
# Install HTTP Toolkit app โ†’ one-click HTTPS interception
# Auto-injects CA for its own VPN session โ€” works on non-pinned apps
# Best for: REST APIs, non-hardened carrier web views

# โ”€โ”€ Option B: Burp as user cert โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
# Export Burp CA cert (.der): Proxy โ†’ Options โ†’ CA Certificate
openssl x509 -inform DER -in cacert.der -out burp-ca.pem

# Install via Settings โ†’ Security โ†’ Encryption & Credentials โ†’ Install cert
# Installs as USER cert โ€” trusted by apps that respect user cert store
# NOT trusted by apps with network_security_config pinning

# Which apps trust user certs?
# Pull app's network security config:
adb shell run-as com.carrier.app cat /data/data/com.carrier.app/... # varies per app
# Or: jadx decompile and search for network_security_config.xml
Rootless Limitation

User certs do NOT intercept apps that pin certificates or set cleartextTrafficPermitted=false with a custom network security config. For full MITM against hardened carrier apps, you need root (system cert store) or Frida gadget to bypass pinning.

Rooted Path โ€” System Certificate Store (Clean Device Only)

# Export and convert Burp CA:
openssl x509 -inform DER -in cacert.der -out cacert.pem
cert_hash=$(openssl x509 -inform PEM -subject_hash_old -in cacert.pem | head -1)
cp cacert.pem ${cert_hash}.0
adb push ${cert_hash}.0 /sdcard/

# Inject into system store (root required):
adb shell su -c "mount -o remount,rw /system"
adb shell su -c "cp /sdcard/${cert_hash}.0 /system/etc/security/cacerts/"
adb shell su -c "chmod 644 /system/etc/security/cacerts/${cert_hash}.0"
adb shell su -c "mount -o remount,ro /system"
adb reboot

# Android 14+: use Magisk module "MoveCA" or "TrustMeAlready" instead
# โ€” avoids remount (bypasses dm-verity issues)

Phase 5 โ€” Modem Diagnostic Setup (Tensor G4)

5.1 Built-in Diagnostic Access

# Engineering menu โ€” field test mode
# Dial on Pixel 9: *#*#4636#*#*
# โ†’ Phone Information โ†’ Run Ping / Network type override

# ADB modem info dump
adb shell dumpsys telephony.registry
adb shell dumpsys phone
adb shell dumpsys connectivity | grep -i "5G\|NR\|LTE"

# Current cell info
adb shell dumpsys telephony.registry | grep -iE "mcc|mnc|cid|signal|band"

# Force network type (for downgrade testing)
adb shell settings put global preferred_network_mode 0  # GSM only
adb shell settings put global preferred_network_mode 9  # LTE only
adb shell settings put global preferred_network_mode 20 # NR/5G preferred

5.2 Modem Logging โ€” Tensor (Samsung Diag)

# Enable modem logging via hidden menu
# Dial: *#9900# โ†’ Sysdump โ†’ modem logging

# Or via ADB:
adb shell su -c "setprop persist.vendor.ril.log.diag 1"
adb reboot

# Pull modem logs
adb bugreport /tmp/pixel9_bugreport.zip
unzip /tmp/pixel9_bugreport.zip -d /tmp/bugreport/
# Look in: FS/data/vendor/radio/ for modem logs

# Parse with:
# โ€ข Wireshark (with NAS dissector) for protocol analysis
# โ€ข Samsung Modem Log Analyzer (limited public availability)

5.3 SCAT on Tensor (Limited Support)

SCAT Compatibility Note

SCAT (Smartphone Communication Analysis Tool from Seoul National University) has partial Tensor/Samsung modem support. Full NAS decode works better on Qualcomm devices.

# SCAT repo: https://github.com/fgsect/scat
pip3 install scat

# Try Samsung diag mode
scat -t samsung -a /dev/ttyUSB0 -D samsung -F output_dir/

# If modem exposes serial diag interface:
adb shell ls /dev/ttyUSB* /dev/smd*   # look for diag port

5.4 Better NAS Capture โ€” Laptop + Pixel 9 Hotspot

flowchart LR
    PIX["๐Ÿ“ฑ Pixel 9\n(Subscriber UE)\nReal SIM"] -->|"Mobile Hotspot"| LAP["๐Ÿ’ป Laptop\nUERANSIM client\nor packet capture"]
    LAP -->|"Wireshark capture\non hotspot interface"| CAP["NAS/GTP\nprotocol analysis"]
    PIX -->|"ADB bridge"| LAP

    style PIX fill:#2E75B6,color:#fff
    style CAP fill:#1F3864,color:#fff
# On laptop โ€” capture Pixel 9 hotspot traffic
# Find hotspot interface
ip link show | grep -i usb  # USB tethering interface

# Wireshark with NAS dissector
tshark -i <hotspot_if> -f "not port 22" -w pixel9_capture.pcapng

# For NAS decode โ€” filter in Wireshark:
# nas-5gs   (5G NAS messages)
# nas-eps   (4G/LTE NAS messages)
# gtpv2     (GTP-C control plane)

Phase 6 โ€” Testing Capabilities Matrix

graph TD
    subgraph "โœ… Pixel 9 Can Do Well"
        G1["App-layer MITM\nBurp + cert pinning bypass"]
        G2["Subscriber identity\ntesting (IMSI/IMEI)\nvia AT commands"]
        G3["Network type forcing\n5G SA / NSA / LTE / 3G"]
        G4["Cell info harvesting\nMCC/MNC/CID/Band/RSRP"]
        G5["VoLTE/IMS testing\nSIP stack probing"]
        G6["API testing\nNEF/BSS via apps"]
        G7["Carrier app reversing\nFrida hooks"]
        G8["eSIM RSP probing\nSM-DP+ requests"]
    end

    subgraph "โš ๏ธ Pixel 9 โ€” Limited / Workaround Needed"
        W1["Full NAS decode\nUse Qualcomm device\nor UERANSIM on laptop"]
        W2["Deep modem logging\nSCAT partial only"]
        W3["Rogue gNB simulation\nNeed srsRAN on laptop\n+ RF hardware"]
    end

    subgraph "โŒ Pixel 9 Cannot Do"
        B1["QXDM / QPST logging\nQualcomm-only"]
        B2["Run srsRAN gNB\nneeds RF hardware"]
    end

    style G1 fill:#2E75B6,color:#fff
    style G2 fill:#2E75B6,color:#fff
    style G3 fill:#2E75B6,color:#fff
    style W1 fill:#E36209,color:#fff
    style B1 fill:#C00000,color:#fff

AT Command Access โ€” Modem Control

# Find modem AT port
adb shell su -c "ls /dev/ttyACM* /dev/ttyUSB* /dev/smd*"

# Connect to modem AT interface (via Termux with root)
# In Termux:
su
cat /dev/ttyACM0 &
echo "AT" > /dev/ttyACM0       # basic test
echo "AT+CIMI" > /dev/ttyACM0  # read IMSI
echo "AT+CGSN" > /dev/ttyACM0  # read IMEI
echo "AT+COPS?" > /dev/ttyACM0 # current operator
echo "AT+CEREG?" > /dev/ttyACM0 # LTE/NR registration status

# Force RAT (Radio Access Technology)
echo "AT+CNMP=38" > /dev/ttyACM0   # LTE only
echo "AT+CNMP=109" > /dev/ttyACM0  # 5G NR preferred
echo "AT+CNMP=2" > /dev/ttyACM0    # automatic

# Supplementary services (for testing SS registration)
echo "AT+CCFC=0,2" > /dev/ttyACM0  # query call forwarding

Key Apps for Mobile Security Research

App Source Purpose
CellMapper Play Store / cellmapper.net Live tower map, PCI/eNB/gNB correlation, crowdsourced site lookup
NetMonster Play Store Detailed cell info: band, EARFCN, ARFCN, NR-ARFCN, CID
Network Cell Info Play Store Signal maps, neighboring cells
Network Survey F-Droid / GitHub Detailed LTE/NR logging, exports CSV/GeoPackage, good for field collection
Tower Collector F-Droid / GitHub Collect and export GSM/UMTS/LTE/NR cell observations for OpenCellID/BeaconDB
IMSI Tool Termux/ADB Read IMSI/ICCID from SIM
Packet Capture Play Store No-root traffic capture (VPN-based)
HTTP Toolkit httptoolkit.com HTTPS intercept, cert pinning bypass
jadx GitHub APK decompile (run on laptop, APKs from device)
Drozer GitHub Android app attack framework
MobSF GitHub Mobile Security Framework (static+dynamic)
Termux:API F-Droid Bridge Termux to Android APIs
RootBeer Sample GitHub Test root detection bypass
Note

For tower / 4G / 5G monitoring on this Pixel, the most useful app mix is:

  • CellMapper for tower/site mapping and crowdsourced cell correlation
  • NetMonster for quick on-device band, EARFCN, NR-ARFCN, PCI, and serving/neighbor cell inspection
  • Network Survey for richer exportable logging
  • Tower Collector for long-running collection and export to OpenCellID/BeaconDB

Downloaded APKs are stored on the laptop under ~/Documents/mobility/apks/:

  • network-survey_111.apk
  • tower-collector_2170120.apk

Operational Setup for an Engagement

flowchart TD
    subgraph "Research Station"
        LAP["๐Ÿ’ป Laptop\nWireshark ยท UERANSIM\nBurp Suite\nfrida-tools ยท SCAT"]
    end

    subgraph "Device Stack"
        PIX["๐Ÿ“ฑ Pixel 9 (Rooted)\nPrimary UE\nReal carrier SIM"]
        QC["๐Ÿ“ฑ Qualcomm Device\n(Pixel 6a / Samsung)\nDeep NAS logging\nSCAT/QXDM"]
        ESIM["๐Ÿ’ณ Test SIMs\nMVNO SIMs for\nisolated testing"]
    end

    subgraph "Connectivity"
        USB["USB-C โ†’ Laptop\nADB + tethering"]
        HOT["Mobile Hotspot\nโ†’ Laptop NIC\nfor traffic capture"]
        VPN["WireGuard VPN\nto lab C2\nfor result exfil"]
    end

    PIX --> USB
    PIX --> HOT
    QC --> USB
    LAP --> VPN

    style PIX fill:#2E75B6,color:#fff
    style QC fill:#1F3864,color:#fff

To fill the Tensor G4 gaps โ€” pair with these
Hardware Purpose Cost
Google Pixel 6a Tensor G1 โ€” better SCAT support than G4; cheap secondary device ~$200 used
Samsung Galaxy A series (Exynos) Exynos modem SCAT, good for NAS research ~$150-300
USRP B205mini / HackRF One SDR for passive monitoring, rogue cell simulation (with srsRAN on laptop) $300-700
Faraday bag / box Isolate UE during testing โ€” prevent accidental live network interference $30-80
MVNO test SIMs Multiple ISPs for roaming test scenarios $10-20/mo each
USB-C hub with Ethernet ADB + tethering + Ethernet to lab simultaneously $40

Security Hardening for the Research Device

# Prevent telemetry leakage during ops
adb shell settings put global auto_time 0
adb shell settings put global send_usage_stats 0
adb shell settings put secure send_usage_stats 0

# Disable Google backup (keeps data off cloud)
adb shell bmgr enable false

# Airplane mode + Wifi only when doing passive recon
# SIM in when doing active UE testing only

# Use separate Google account (burner) for Play Store apps
# Use Shelter app (work profile) to sandbox carrier apps

Quick Command Reference

# โ”€โ”€ Device Info โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
adb shell getprop ro.product.model          # device model
adb shell getprop gsm.version.baseband      # modem firmware
adb shell getprop gsm.operator.numeric      # MCC+MNC

# โ”€โ”€ Cell Info โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
adb shell dumpsys telephony.registry | grep -E "CellInfo|Signal|Band"
adb shell service call phone 39             # get neighboring cells

# โ”€โ”€ Network State โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
adb shell dumpsys connectivity | grep -i "5G\|NR\|LTE\|connected"
adb shell cat /proc/net/dev                 # interface stats

# โ”€โ”€ SIM Info โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
adb shell service call iphonesubinfo 1      # device IMEI
adb shell service call iphonesubinfo 7      # IMSI (may need root)
adb shell service call iphonesubinfo 12     # ICCID

# โ”€โ”€ Frida Quick Hooks โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
frida-ps -U | grep -i "carrier\|tel\|sim"  # find carrier processes
frida -U -l bypass-ssl-pinning.js -f com.carrier.app --no-pause

# โ”€โ”€ Traffic Capture โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
adb shell su -c "tcpdump -i any -w /sdcard/capture.pcap"
adb pull /sdcard/capture.pcap ./

Cross-References

Related Notes


Follow-Up Tasks


Device Strategy

Single Device โ€” Telecom-Joined Pixel 9 (Current Setup)

graph TD
    subgraph "โœ… Strengths"
        S1["Authentic carrier enrollment\nโ†’ real MDM/provisioning context"]
        S2["Real SIM binding\nโ†’ genuine subscriber identity tests"]
        S3["Clean network fingerprint\nโ†’ blends in during engagements"]
        S4["Cell info, NAS state, AT cmds\nโ†’ ADB access without root"]
    end

    subgraph "โš ๏ธ Constraints"
        C1["No root\nโ†’ no system cert store, limited Frida"]
        C2["No bootloader unlock\nโ†’ no Magisk, no GrapheneOS"]
        C3["App MITM partial\nโ†’ user cert only, pinning not bypassed"]
    end

    subgraph "๐Ÿ› ๏ธ Best Tools for This Setup"
        T1["NetHunter Rootless\nโ†’ Kali chroot without any OS change"]
        T2["HTTP Toolkit\nโ†’ no-root HTTPS interception"]
        T3["Frida Gadget\nโ†’ repackage target APK for hooking"]
        T4["Termux + nmap/tshark/scapy\nโ†’ network tooling"]
        T5["NetMonster / Cell Info\nโ†’ cell data harvesting"]
    end

    style S1 fill:#2E75B6,color:#fff
    style C1 fill:#E36209,color:#fff
    style T1 fill:#1F3864,color:#fff

Best used for:

Workarounds for root-required capabilities:

Need Rootless Workaround
MITM against pinned apps Frida gadget (repackage APK)
System-level packet capture ADB + tcpdump via adb shell in debug mode
Kali toolchain NetHunter Rootless chroot
Carrier app hooking Objection patchapk + Frida gadget
Deep modem logging ADB bugreport + *#9900# sysdump

Two-Device โ€” Ideal Research Setup

graph LR
    subgraph "Device 1 โ€” Telecom-Joined Pixel 9"
        D1A["๐Ÿ“ฑ Stock Android\nCarrier MDM enrolled\nReal SIM / eSIM"]
        D1B["โ†’ Carrier research\nโ†’ Subscriber identity\nโ†’ Authentic UE context"]
    end

    subgraph "Device 2 โ€” Clean Unlocked Pixel 9 or 6a"
        D2A["๐Ÿ“ฑ Magisk Rooted\nUnlocked, Google Store\nMVNO test SIM"]
        D2B["โ†’ Full Frida server\nโ†’ Burp system cert\nโ†’ Deep modem AT access\nโ†’ LSPosed hooks"]
    end

    subgraph "Laptop"
        LAP["๐Ÿ’ป Wireshark ยท UERANSIM\nBurp Suite ยท frida-tools\nSCAT ยท jadx ยท MobSF"]
    end

    D1A -->|"ADB + hotspot"| LAP
    D2A -->|"ADB + tethering"| LAP

    style D1A fill:#2E75B6,color:#fff
    style D2A fill:#1F3864,color:#fff
    style LAP fill:#E36209,color:#fff
Role Device 1 (Telecom-Joined Pixel 9) Device 2 (Clean Unlocked Pixel 9/6a)
OS Stock Android, no unlock Stock + Magisk root (or GrapheneOS)
SIM Real carrier SIM MVNO test SIM or secondary carrier
Root โŒ None โœ… Full via Magisk
Burp CA User cert only System store (all apps)
Frida Gadget / rootless Full server, all processes
Modem AT Partial via ADB Full /dev/ttyACM0 access
Best for Authentic carrier context Deep tool testing, app reversing
OPSEC profile Clean โ€” blend in Research/lab only
Cost to replace High (carrier bond) Low (~$200 used Pixel 6a)

Recommended split:


Sources: Google Pixel 9 Documentation ยท Android Open Source Project ยท Magisk GitHub ยท SCAT (fgsect/scat) ยท GrapheneOS Project ยท Kali NetHunter Rootless Docs ยท 3GPP TS 24.501