SENHASE um pouco sobre menus ocultosComo descobrir os procedimentos de exibição da tela de versão e de escolha de regiões, incluindo senhas, da maioria dos aparelhos baseado em MT13x9 por análise do seu firmware.
O procedimento funcionou nos seguintes firmwares- Proview DVP-858
- Philips DVP5100
- Philips DVP3040K
- Philips DVP5965
- Philips DVP5980
- Philips DVP5140
- Lenoxx DV-406
Não funcionou nos seguintes- Pioneer 575 (possivelmente nenhum Pioneer)
- possivelmente, nenhum LG)
Também funciona com o Philips PET725, mas as strings de busca são diferentes
Eu tomei como ponto de partida o documento
MenusOcultos.rtf de Cachirulo
. Somente lendo o documento eu não entendi
nada, por isso baixei
o firmware em que ele se baseia e depois de abri-lo no IDA e rodar os scripts de análise, tudo ficou claro. O documento não fornece strings de busca, nem explica como localizar as rotinas em seu firmware. Eu vou preencher estas lacunas neste post.
Como exemplo, vou usar o firmware do Proview DVP-858, v20.07, cujas senhas eram um mistério até eu descobrir esse procedimento.
Tela de VersãoProcure por:
90 ? ? E0 64 ? 70 ? 90 ? ? E0 FF 54 0F FE 64 0F 60 ? EE C3 94 ? 50 ? EE 90 ? ? 93 FE 90 FB 00
Esta string só ocorre uma vez, na rotina que o Cachirulo batizou de CheckVersPass, mas que eu vou chamar aqui de CheckVersionPass (não faz diferença).
B2:D849 ; ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦ S U B R O U T I N E ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦
B2:D849
B2:D849
B2:D849 CheckVersionPass: ; CODE XREF: BankSw_593_B2_5195+16p
B2:D849 90 FD 74 mov DPTR, #XRAM_FD74 ; Número do menu corrente
B2:D84C E0 movx A, @DPTR
B2:D84D 64 01 xrl A, #1 ; Estamos no menu 1 (General)?
B2:D84F 70 5E jnz B2_D8AF
B2:D851 90 FC B7 mov DPTR, #XRAM_FCB7
B2:D854 E0 movx A, @DPTR
B2:D855 FF mov R7, A
B2:D856 54 0F anl A, #0xF
B2:D858 FE mov R6, A
B2:D859 64 0F xrl A, #0xF
B2:D85B 60 52 jz B2_D8AF
B2:D85D EE mov A, R6
B2:D85E C3 clr C
B2:D85F 94 04 subb A, #4 ; Número de dígitos da senha
B2:D861 50 1C jnc B2_D87F
B2:D863 EE mov A, R6
B2:D864 90 44 F4 mov DPTR, #VersionPass
B2:D867 93 movc A, @A+DPTR
B2:D868 FE mov R6, A
B2:D869 90 FB 00 mov DPTR, #XRAM_FB00 ; Buffer_Remoto
B2:D86C E0 movx A, @DPTR
B2:D86D 6E xrl A, R6
B2:D86E 70 0F jnz B2_D87F
B2:D870 EF mov A, R7
B2:D871 54 F0 anl A, #0xF0
B2:D873 FE mov R6, A
B2:D874 EF mov A, R7
B2:D875 04 inc A
B2:D876 54 0F anl A, #0xF
B2:D878 4E orl A, R6
B2:D879 90 FC B7 mov DPTR, #XRAM_FCB7
B2:D87C F0 movx @DPTR, A
B2:D87D 80 07 sjmp B2_D886
B2:D87F ; ---------------------------------------------------------------------------
B2:D87F
B2:D87F B2_D87F: ; CODE XREF: CheckVersionPass+18j
B2:D87F ; CheckVersionPass+25j
B2:D87F EF mov A, R7
B2:D880 54 F0 anl A, #0xF0
B2:D882 90 FC B7 mov DPTR, #XRAM_FCB7
B2:D885 F0 movx @DPTR, A
B2:D886
B2:D886 B2_D886: ; CODE XREF: CheckVersionPass+34j
B2:D886 90 FC B7 mov DPTR, #XRAM_FCB7
B2:D889 E0 movx A, @DPTR
B2:D88A FF mov R7, A
B2:D88B 54 0F anl A, #0xF
B2:D88D FE mov R6, A
B2:D88E BE 04 1E cjne R6, #4, B2_D8AF
B2:D891 EF mov A, R7
B2:D892 44 0F orl A, #0xF
B2:D894 F0 movx @DPTR, A
B2:D895 90 FD 69 mov DPTR, #XRAM_FD69
B2:D898 74 0A mov A, #0xA
B2:D89A F0 movx @DPTR, A
B2:D89B 90 FC C8 mov DPTR, #XRAM_FCC8
B2:D89E E0 movx A, @DPTR
B2:D89F 54 80 anl A, #0x80
B2:D8A1 44 07 orl A, #7
B2:D8A3 F0 movx @DPTR, A
B2:D8A4 90 FD 74 mov DPTR, #XRAM_FD74 ; Número do menu corrente
B2:D8A7 74 15 mov A, #0x15 ; Carrega com o novo menu (versão)
B2:D8A9 F0 movx @DPTR, A
B2:D8AA 7F 01 mov R7, #1
B2:D8AC 12 E6 DC lcall B2_E6DC
B2:D8AF
B2:D8AF B2_D8AF: ; CODE XREF: CheckVersionPass+6j
B2:D8AF ; CheckVersionPass+12j ...
B2:D8AF 22 ret
B2:D8AF ; End of function CheckVersionPass
O menu onde é preciso estar para que a senha seja válida está destacado em verde. Você precisa conferir os números dos menus no mtkRemaker, mas esse é um problema menor, porque sabendo a senha basta entrar em cada um dos menus principais e digitar a senha, até achar o menu correto. Normalmente, são os menus General e Preferences.
O endereço do offset no mesmo banco onde está a senha está destacado em azul (0x44F4) e o número de bytes está destacado em vermelho (4);
Olhando então no offset 0x44F4 do mesmo banco encontramos a senha:
B2:44F4 09 VersionPass:.byte 9 ; DATA XREF: CheckVersionPass+1Bo
B2:44F5 05 .byte 5
B2:44F6 09 .byte 9
B2:44F7 06 .byte 6
B2:44F8 01 .byte 1
B2:44F9 02 .byte 2
B2:44FA 03 .byte 3
B2:44FB 04 .byte 4
B2:44FC 0E .byte 0xE
B2:44FD 0E .byte 0xE
B2:44FE 0E .byte 0xE
B2:44FF 0F .byte 0xF
A senha é 9596
O offset está com o nome "VersionPass" porque eu dei esse nome a ele. No seu IDA ele vai aparecer com o número do endereço mesmo.
Tela de escolha de RegiãoProcure por:
90 ? ? E0 FF 64 ? 70 ? 90 ? ? E0 FE 54 0F FD 64 0F 60 ? ED C3 94 ? 50 ? ED 90 ? ? 93 FD 90 FB 00
Esta string só ocorre uma vez, na rotina que o Cachirulo batizou de CheckMenuPass, mas que eu vou chamar aqui de CheckRegionPass porque me parece bem mais descritivo.
B2:D1E2 ; ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦ S U B R O U T I N E ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦
B2:D1E2
B2:D1E2
B2:D1E2 CheckRegionPass: ; CODE XREF: BankSw_593_B2_5195+13p
B2:D1E2 90 FD 74 mov DPTR, #XRAM_FD74 ; Número do menu corrente
B2:D1E5 E0 movx A, @DPTR
B2:D1E6 FF mov R7, A
B2:D1E7 64 06 xrl A, #6 ; Página de Preferências
B2:D1E9 70 35 jnz B2_D220
B2:D1EB 90 FC B6 mov DPTR, #XRAM_FCB6
B2:D1EE E0 movx A, @DPTR
B2:D1EF FE mov R6, A
B2:D1F0 54 0F anl A, #0xF
B2:D1F2 FD mov R5, A
B2:D1F3 64 0F xrl A, #0xF
B2:D1F5 60 29 jz B2_D220
B2:D1F7 ED mov A, R5
B2:D1F8 C3 clr C
B2:D1F9 94 04 subb A, #4 ; Número de dígitos da senha
B2:D1FB 50 1C jnc B2_D219
B2:D1FD ED mov A, R5
B2:D1FE 90 44 F0 mov DPTR, #RegionPass
B2:D201 93 movc A, @A+DPTR
B2:D202 FD mov R5, A
B2:D203 90 FB 00 mov DPTR, #XRAM_FB00 ; Buffer_Remoto
B2:D206 E0 movx A, @DPTR
B2:D207 6D xrl A, R5
B2:D208 70 0F jnz B2_D219
B2:D20A EE mov A, R6
B2:D20B 54 F0 anl A, #0xF0
B2:D20D FD mov R5, A
B2:D20E EE mov A, R6
B2:D20F 04 inc A
B2:D210 54 0F anl A, #0xF
B2:D212 4D orl A, R5
B2:D213 90 FC B6 mov DPTR, #XRAM_FCB6
B2:D216 F0 movx @DPTR, A
B2:D217 80 07 sjmp B2_D220
B2:D219 ; ---------------------------------------------------------------------------
B2:D219
B2:D219 B2_D219: ; CODE XREF: CheckRegionPass+19j
B2:D219 ; CheckRegionPass+26j
B2:D219 EE mov A, R6
B2:D21A 54 F0 anl A, #0xF0
B2:D21C 90 FC B6 mov DPTR, #XRAM_FCB6
B2:D21F F0 movx @DPTR, A
B2:D220
B2:D220 B2_D220: ; CODE XREF: CheckRegionPass+7j
B2:D220 ; CheckRegionPass+13j ...
B2:D220 EF mov A, R7
B2:D221 64 06 xrl A, #6
B2:D223 70 3D jnz B2_D262
B2:D225 90 FC B6 mov DPTR, #XRAM_FCB6
B2:D228 E0 movx A, @DPTR
B2:D229 54 0F anl A, #0xF
B2:D22B 64 04 xrl A, #4
B2:D22D 70 33 jnz B2_D262
B2:D22F FD mov R5, A
B2:D230 7F 0A mov R7, #0xA
B2:D232 12 1B 82 lcall B2_BS_91_B5_E422
B2:D235 90 FD 73 mov DPTR, #XRAM_FD73
B2:D238 74 01 mov A, #1
B2:D23A F0 movx @DPTR, A
B2:D23B 90 FC B6 mov DPTR, #XRAM_FCB6
B2:D23E E0 movx A, @DPTR
B2:D23F 44 0F orl A, #0xF
B2:D241 F0 movx @DPTR, A
B2:D242 90 FD 69 mov DPTR, #XRAM_FD69
B2:D245 74 0B mov A, #0xB
B2:D247 F0 movx @DPTR, A
B2:D248 90 FC C8 mov DPTR, #XRAM_FCC8
B2:D24B E0 movx A, @DPTR
B2:D24C 54 80 anl A, #0x80
B2:D24E 44 04 orl A, #4
B2:D250 F0 movx @DPTR, A
B2:D251 90 FD 74 mov DPTR, #XRAM_FD74 ; Número do menu corrente
B2:D254 74 1A mov A, #0x1A ; Número do menu a exibir (Excolha de Região)
B2:D256 F0 movx @DPTR, A
B2:D257 7F 01 mov R7, #1
B2:D259 12 E6 DC lcall B2_E6DC
B2:D25C 90 FD 7B mov DPTR, #XRAM_FD7B
B2:D25F 74 06 mov A, #6
B2:D261 F0 movx @DPTR, A
B2:D262
B2:D262 B2_D262: ; CODE XREF: CheckRegionPass+41j
B2:D262 ; CheckRegionPass+4Bj
B2:D262 22 ret
B2:D262 ; End of function CheckRegionPass
Daqui, o procedimento para achar a senha é o mesmo. E temos:
B2:44F0 08 RegionPass:.byte 8 ; DATA XREF: CheckRegionPass+1Co
B2:44F1 03 .byte 3
B2:44F2 04 .byte 4
B2:44F3 03 .byte 3
B2:44F4 09 VersionPass:.byte 9 ; DATA XREF: CheckVersionPass+1Bo
B2:44F5 05 .byte 5
B2:44F6 09 .byte 9
B2:44F7 06 .byte 6
B2:44F8 01 .byte 1
B2:44F9 02 .byte 2
B2:44FA 03 .byte 3
B2:44FB 04 .byte 4
B2:44FC 0E .byte 0xE
B2:44FD 0E .byte 0xE
B2:44FE 0E .byte 0xE
B2:44FF 0F .byte 0xF
A senha é 8343
Aqui você também pode ver que as duas senhas ficam bem próximas. Foi a mesma coisa em todos os firmwares que eu verifiquei. Se você encontrar uma, basta olhar nas proximidades para encontrar a outra.
Notas:1) Apesar do Lenoxx DV-406 ter uma rotina de escolha de região, ela é orfã (nenhuma rotina a chama). Mesmo sabendo o procedimento você não vai conseguir entrar na tela de escolha. Para isso será necessário uma correção no firmware.
2) Para o Philips PET 725 as strings são:
Versão
90 ? ? E0 64 ? 70 ? 90 ? ? E0 54 0F FF 64 0F 60 ? EF C3 94 ? 50 ? EF 90 ? ? 93 FF 90 FB 00
Região
90 ? ? E0 FC 64 ? 70 ? 90 ? ? E0 54 0F FE 64 0F 60 ? EE C3 94 ? 50 ? EE 90 ? ? 93 FE 90 FB 00
3) Você não precisa do IDA. Se você souber usar qualquer editor hexadecimal que faça buscas de strings hexa você pode localizar as senhas adaptando as strings que vou fornecer para a sintaxe do editor. No XVI32, por exemplo, basta susbstituir todos os "?" das strings por "2E" para fazer a busca.