armazenamento.md — persistência, modelos e código nativo

1. Resumo

Não há banco de dados, não há SharedPreferences, não há DataStore, não há Room, não há uso de Android Keystore e não há biblioteca .so. O estado vive em campos de objeto e morre com o processo.

Varredura (fontes JADX, excluindo bibliotecas):

API Ocorrências no código do app
SharedPreferences / getSharedPreferences 0
SQLiteDatabase / Room / @Entity / @Dao 0 (única menção: R.java, que é só a classe de recursos)
DataStore 0
KeyStore / Cipher / SecretKey / MessageDigest 0 no app (apenas em okio.*, uso interno de HTTP)
FileOutputStream / escrita em disco 0 no app
System.loadLibrary / DexClassLoader / InMemoryDexClassLoader 0 no app

2. O que persiste de fato

Mecanismo Onde Evidência Conteúdo
WebView DOM Storage webView.getSettings().setDomStorageEnabled(true) ReFragment.java:140 localStorage/sessionStorage da página remota, no diretório privado do app (app_webview/) — dados do servidor, não do app
Cache HTTP do OkHttp implícito (cliente padrão sem Cache configurado) vo5bwh.java → new OkHttpClient.Builder() sem .cache(...) não há cache em disco
Estado em memória ReFragment: sessionId, stepAtual, isDeviceReady, isDeviceConnected; vo5bwh: LinkedBlockingQueue, reconnectAttempts ReFragment.java:51-60, vo5bwh.java:17-24 sessão/etapa do relay; perdido ao fechar

Consequência prática: análise forense do aparelho após o uso rende pouco — não há trilha local do cartão nem do PIN. O que sobra é o app_webview/ (cache/localStorage da página do operador) e logs do sistema.

3. Modelo de dados (o que existiria se houvesse)

Não há esquema local. O "modelo" é o contrato JSON descrito em api-e-integracoes.md §3, com três entidades implícitas no servidor:

Sessão(id) ──1:N──> APDU(direction, data_hex, timestamp?)     -- só no servidor
Sessão(id) ──1:1──> PIN(valor)                               -- enviado em claro no TLS
Sessão(id) ──1:1──> deviceStatus(deviceReady, role="IsoDep")

Nada disso é materializado no aparelho — nem tabela, nem arquivo, nem chave.

4. Assets: dois blobs cifrados não utilizados

Arquivo Tamanho Entropia SHA-256 (prefixo) Referência no código
assets/nfc_config.dat 25.422 B 7,9917 bit/byte 5f7d129cc2260a8b09fd3488adfa6d3c nenhuma
assets/card_resources.bin 15.064 B 7,9876 bit/byte cbb8de4bc3e4767049cad364269648e3 nenhuma
assets/aids.txt 279 B 3,03 bit/byte a0489cf89fb48fc2f5e8f7845baf020e MainActivity.loadAidsFromAssets()

aids.txt (íntegra, 15 AIDs EMV de bandeiras reais — as mesmas 13 em DEFAULT_AIDS de MainActivity mais 2):

# config e69ea27c
# build 2363b211bfb1

A0000000032010   A0000000041010   A0000003330101   A000000000065
A0000000030000   A000000494201    A0000000651010   A00000002501
A0000003961010   A0000004942010   A0000003241010   A0000004941010
A0000001523010   A0000000043060   A0000000031010   (…)

São AIDs de aplicações de pagamento (Visa A0000000031010/2010, Mastercard A0000000041010/3060, Amex A00000002501, Elo A0000000651010, UnionPay/PBOC A0000003330101, Discover A0000001523010, etc.). O comentário # config … / # build … sugere geração automática por uma ferramenta do autor.

5. Código nativo

Item Resultado
lib/ no APK ausente (unzip -Z1 | grep '^lib/' → 0 arquivos)
android:extractNativeLibs false (declarado, sem efeito prático — não há .so)
System.loadLibrary 0 no código do app
Funções JNI nenhuma
Arquiteturas nenhuma (não há código nativo a desmontar)

Não há, portanto, camada nativa ofuscada, packer de .so ou VM de proteção. Toda a lógica está em DEX — o que facilita a análise: a única barreira real é a renomeação de símbolos dos pacotes (ver dependencias.md §4).

6. Limitações desta seção