Skip to main content
TlsLibHunter Logo

Identifying TLS Libraries Within Processes

TLSLibHunter

version PyPI version Publish status Lint

Identify and extract TLS/SSL libraries from running processes using dynamic instrumentation.

Installation

pip install tlsLibHunter

Quick Start

CLI Usage

# List TLS libraries in a local process
tlsLibHunter firefox -l

# Scan and extract TLS libraries
tlsLibHunter firefox

# Android device
tlsLibHunter com.example.app -m -l

# JSON output
tlsLibHunter firefox -l -f json

# Full, unfiltered diagnostic scan (show known false positives + low-confidence hits)
tlsLibHunter com.example.app -m -l --scan-everything

# Debug run — also writes everything shown in the terminal to a log file
tlsLibHunter com.example.app -m -l -d

Example output:

tlslibhunter -m -l Chrome
INFO: Platform: android
INFO: Found 324 loaded modules
INFO: Pattern match in libssl.so: 1 hits
INFO: Detected: libssl.so (boringssl, system)
INFO: Pattern match in libmonochrome_64.so: 1 hits
INFO: Fingerprint: libmonochrome_64.so identified as boringssl
INFO: Detected: libmonochrome_64.so (boringssl, app)
INFO: Scan complete: 2 TLS libraries found in 298 modules (8.06s)
        				TLS Libraries in 'Chrome' (android)                    
┏━━━━━━┳━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ #    ┃ Library             ┃ Type      ┃ Class  ┃      Size ┃ Path                       ┃
┡━━━━━━╇━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩
│ 1     libssl.so            boringssl  system  376.0 KiB  /apex/com.…                │
│ 2     libmonochrome_64.so  boringssl  app     119.1 MiB  /data/app/~~NlI…           │
└──────┴─────────────────────┴───────────┴────────┴───────────┴────────────────────────────┘

Scanned 298 modules in 8.06s

Python API

from tlslibhunter import TLSLibHunter

# Scan a local process
hunter = TLSLibHunter("firefox")
result = hunter.scan()
for lib in result.libraries:
    print(f"{lib.name} ({lib.library_type}) - {lib.path}")

# Scan and extract
result = hunter.scan()
extractions = hunter.extract(result, output_dir="./extracted_libs")

Features

  • Memory scanning for TLS string patterns
  • Supports OpenSSL, BoringSSL, GnuTLS, wolfSSL, mbedTLS, NSS, SChannel, SecureTransport
  • Multi-platform: Android, iOS, Windows, Linux, macOS
  • Multiple extraction methods: disk copy, ADB pull, APK extraction, memory dump
  • Clean Python API for programmatic use
  • Backend abstraction (currently only frida but might be extended to other frameworks in the future)

Result filtering & scan depth

By default the results table is curated to show only genuine, hookable TLS stacks so the output stays actionable:

  • Confidence threshold — only medium- and high-confidence detections are shown. The long tail of low-confidence hits (coincidental 4-byte ASCII fragments) is hidden.
  • Known false positives — crypto-primitive and JNI-wrapper libraries that carry TLS strings (and may even re-export SSL_* symbols) but are not independently hookable TLS stacks are skipped during scanning. This currently covers libcrypto.so / stable_cronet_libcrypto.so (BoringSSL/OpenSSL primitives) and libjavacrypto.so (the Conscrypt JNI bridge). The real key-extraction targets — libssl.so, libcronet*, stable_cronet_libssl.so — are kept.

Hidden detections are never lost silently: the scan summary logs how many were hidden, and the names are recorded in pipeline_stats (hidden_low_confidence_names, hidden_false_positive_names, false_positive_skipped_names).

To see everything (known false positives, low-confidence rows, and the verbose weak-evidence breakdown), run a full scan with --scan-everything. This is the only flag that disables the default filters.

What memory gets scanned

A module is scanned over the ranges it actually owns. Module.enumerateRanges('r') is the starting point, but on Apple platforms it reports — for every dyld-shared-cache image — one enormous read-only range belonging to the cache as a whole rather than to the module (measured on macOS 26.3: the same 587 MB region for all of them). Scanning that once per module per pattern made a six-module macOS scan read ~106 GB and take ~113 s, with a 6 KB module scanning 587 MB.

moduleScanRegions in tlslibhunter/scripts/scanner_agent.js therefore drops ranges that are implausibly large for the module in question, keeping everything else. A skipped range is always logged with its size — coverage decisions are never silent. Detection is unaffected: the shared region is by definition not attributable to any one module, and scanning it actually produced false fingerprints, since every image "matched" strings that merely lived in the cache.

If a pattern scan does not finish within its safety-net window, the affected modules are listed in ScanResult.errors — an incomplete scan is reported as incomplete rather than as "no TLS library found".

Debug log file

Passing -d / --debug additionally tees all terminal output (the results table plus every log line) into a timestamped, ANSI-stripped file in the current directory, named tlslibhunter_<target>_<YYYYmmdd-HHMMSS>.log.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

tlslibhunter-0.2.8.tar.gz (87.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

tlslibhunter-0.2.8-py3-none-any.whl (82.7 kB view details)

Uploaded Python 3

File details

Details for the file tlslibhunter-0.2.8.tar.gz.

File metadata

  • Download URL: tlslibhunter-0.2.8.tar.gz
  • Upload date:
  • Size: 87.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for tlslibhunter-0.2.8.tar.gz
Algorithm Hash digest
SHA256 ca5ba05c5f4725e56df6c8aaef95ca38d154fadfbe5dbf49f0faec60b7dd6d3f
MD5 d645d1a53566b7f29fb50d701fe4c7a8
BLAKE2b-256 a550992a440a33a057c9201d075412636bc407e00a7d8552f173cce66b5b24f7

See more details on using hashes here.

Provenance

The following attestation bundles were made for tlslibhunter-0.2.8.tar.gz:

Publisher: publish.yml on monkeywave/tlsLibHunter

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tlslibhunter-0.2.8-py3-none-any.whl.

File metadata

  • Download URL: tlslibhunter-0.2.8-py3-none-any.whl
  • Upload date:
  • Size: 82.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for tlslibhunter-0.2.8-py3-none-any.whl
Algorithm Hash digest
SHA256 c7dc9b524531344e6ce6edcd64e9ba1a84a0ebbf788813da417847bd6dd3ade6
MD5 033f820e85c25682c3c04382b5268639
BLAKE2b-256 1d37640463b20a3daa502f97f48bec5b82bc2d78cf0441f3c0e95162de81a5b0

See more details on using hashes here.

Provenance

The following attestation bundles were made for tlslibhunter-0.2.8-py3-none-any.whl:

Publisher: publish.yml on monkeywave/tlsLibHunter

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

0.2.9

2 files

This release

0.2.8 This release

2 files

0.2.7

2 files

0.2.6

2 files

0.2.1

2 files

0.2.0

2 files

0.1.7

2 files

0.1.5

2 files

0.1.4

2 files

0.1.2

2 files

0.1.0

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page