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() |
- Entropia ≈ 8 bit/byte e ausência de cabeçalho reconhecível (
cf b5 91 77…,e8 0d 3d 2f…) → cifrado ou comprimido sem cabeçalho. Não há chave embutida no APK que permita decifrá-los (as únicas rotinas criptográficas presentes são deokio, para HTTP). - Verificação:
greppornfc_config/card_resourcesem todo oclasses.dex,smali/e fontes JADX → 0 ocorrências. Também não háAssetManager.list()/enumeração dinâmica. Portanto não são carregados nesta build. - Hipótese (não comprovada): sobras de uma versão em que a configuração de AIDs/recursos de cartão vinha cifrada;
aids.txté a versão em texto claro do mesmo papel.
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
nfc_config.datecard_resources.binnão foram decifrados (sem chave, sem contexto de uso).- Não foi feita análise de
app_webview/porque isso exige execução do app (não realizada). - Não há garantia de que versões futuras desse kit não usem storage local — a conclusão vale para este APK
(SHA-256
21ccef31…).