Olá a todos.
Neste vídeo, queremos dar uma olhada mais profunda na depuração.
Portanto, tentaremos resolver o desafio do nosso autor com a abordagem de depuração do Jdg.
E então encontraremos alguns problemas ou, digamos, algumas limitações desse tipo de configuração.
Mas, pessoal, não se preocupem, pois consegui uma configuração de depuração com esteroides que vai deixá-los boquiabertos e lidar facilmente
com todos os problemas que temos com o Jd-x.
Então, se você estiver pronto para isso, vamos lá.
Certo, de volta à VM do Ubuntu, vamos primeiro dar uma olhada na configuração do Jdg e ver qual é o problema.
Portanto, entramos em nossos aplicativos.
E um desafio para recapitular tudo.
E aqui temos o nosso APK que vamos instalar, pois temos uma versão nova nele, certo?
Portanto, não há conexão ADB.
Podemos tentar reiniciar o servidor e ver se isso funciona.
Não.
Em seguida, preciso ir até o dispositivo e selecionar.
Em vez da transferência de arquivos por carregamento USB.
Então vamos ver.
O telefone aparece e, sim, agora temos acesso ao adb, ok, adb install as apk test only.
Portanto, precisamos fornecer esse parâmetro com uma assinatura incompleta.
Portanto, talvez tenhamos uma versão lá.
E, portanto, sim, vamos.
Desinstale esta versão.
Portanto, o adb uninstall calm app hacking está ok e, em seguida, vamos instalá-lo.
Mais uma vez, não quero excluir essas coisas porque você também pode se deparar com todos esses problemas
e saber como resolvê-los.
Temos uma versão para iOS, este leia-me, se você puder.
Depois, temos este texto aqui.
E essa é uma chave única.
Portanto, toda vez que a abrimos novamente, vamos ver.
Sim, isso muda.
Certifique-se também de que não estamos tendo uma versão corrigida aqui.
Sim.
Está bem.
Portanto, esta é a versão limpa.
Perfeito, tudo bem.
Agora vamos tentar resolver isso com a abordagem do Jdc.
Portanto, estamos usando Jdc's.
Estamos analisando esse caso.
Tudo bem.
Está carregando.
E temos uma série de coisas.
Então vamos ver.
Com app hacking, pois assim temos a atividade principal.
E apenas uma rápida recapitulação.
Temos o texto, mas não estamos interessados no texto criptografado ou descriptografado.
Estamos interessados na chave que está sendo usada para a criptografia.
Então, entramos na função de criptografia AES.
Hum, uma aula, esta.
E então podemos ver que, ok, aqui temos a instância as.
Aqui, geramos uma nova chave.
E aqui temos agora essa chave que está sendo usada na função de inicialização da cifra.
Está bem.
Vamos tentar definir o ponto de interrupção e retirar a chave desse objeto aqui, ok.
E vamos ver.
Para realizar esse tipo de configuração de depuração, você precisa seguir algumas etapas.
Primeiro, precisamos nos certificar de que esse aplicativo seja passível de depuração.
Então, vamos para os recursos do Androidmanifest.
E vamos ver.
Sim.
E é.
Um debuggable.
Se isso não estiver sendo definido, precisaremos decodificá-lo.
Adicione esse sinalizador aqui, recompile-o e instale-o.
Se isso não estiver disponível, não há problema.
Podemos definir isso por nós mesmos.
Está bem.
Essa parte está concluída.
Em seguida, precisamos entrar nas configurações do smartphone.
E então precisamos dizer wait for debugger.
Aguarde o depurador.
E também precisamos informar o aplicativo que você deseja depurar.
Ele já foi selecionado como este aqui.
Está bem.
Agora, se iniciarmos esse aplicativo.
Ele está aguardando o depurador e abrindo a porta.
Então, vamos colocar isso aqui à esquerda.
Tudo bem, ok.
Agora, podemos usar o depurador JDE, mas não neste aqui, pois se trata de uma versão antiga.
Caso você não tenha essa opção, vamos atualizar rapidamente o tipo do JDE.
Então, vamos fazer isso.
Portanto, entramos nas ferramentas jd-x e usamos um git pull.
Está bem.
Ótima lista.
Em seguida, ele fará o download de uma atualização e eu avançarei rapidamente.
Tudo bem.
Levou apenas cinco minutos.
Mas, como já mencionei, gosto de manter essas coisas neste vídeo porque recebo muitas perguntas sobre
ferramentas ou problemas que foram resolvidos em versões mais recentes.
Portanto, mantenha suas ferramentas sempre atualizadas, a menos que encontre problemas em suas versões, como,
por exemplo, na Frida, então lembre-se da versão que funciona para você.
Tudo bem.
Agora, vamos voltar ao nosso diretório de aplicativos.
Um desafio para recapitular tudo e usar a nova versão do Jade.
Vejamos.
Sim.
Está bem.
Agora temos esse depurador.
Talvez seja necessário descompilá-lo novamente.
Não.
Parece bom.
Ok, então vamos ver o código-fonte.
Com hacking de aplicativos como.
E sim.
Criptografia.
Sim.
Está bem.
Portanto, agora queremos depurar esse aplicativo com o Jdbc.
E queremos definir nosso ponto de interrupção.
Digamos, por exemplo, nesta linha, porque assim podemos ler essa chave.
Portanto, pelo menos essa é a suposição aqui, ok.
Então, como podemos fazer isso.
Precisamos usar esse símbolo de depurador aqui, ok.
E essa é uma parte complicada.
Se você instalou a cópia de tela, ela vem com a nossa versão ou com a sua própria versão do ADB.
E não é essa que queremos usar.
Queremos usar o seguinte: vou lhe mostrar isso rapidamente.
Portanto, esse é o que a cópia de tela está usando.
Mas queremos usar o que está nas ferramentas da plataforma Android SDK.
Sim, esta versão.
Portanto, precisamos pegar essa parte desse caminho aqui.
Está bem.
Hum, porque, caso contrário, não funcionará.
Então, vamos ver e atualizar.
Atualizar?
Não.
Em seguida, usamos o servidor start adb.
Falha ao iniciar.
Podemos ver que a cópia da tela foi fechada.
Agora podemos ver que sim, reiniciamos o servidor adb com essa cópia da tela da versão
que foi desconectada.
Mas aqui podemos ver agora nosso processo de depuração.
E isso não é problema algum, pois podemos executar a cópia de tela novamente e tudo deve estar de volta.
Vejamos.
Está bem.
Então, agora começamos ou clicamos duas vezes para iniciar a depuração.
Erro desconhecido.
Vamos fazer uma atualização.
Está bem.
Parece que temos algum problema com relação a essas duas versões do ADB.
Vamos reiniciá-lo.
Atualize e vamos fazer isso sem a cópia de tela primeiro.
Então, vamos dar um clique duplo nisso, ok.
Não, não vou reiniciar.
Cópia da tela.
Vamos fazer desta forma.
Você.
Não precisamos ver a tela neste momento.
Está bem.
Não posso classificá-lo em uma posição inferior?
Aqui está.
Está bem.
Portanto, vamos manter as coisas assim.
Certo, agora estamos na atividade principal, mas não queremos depurar a atividade principal.
Queremos depurar o as crypto.
Neste caso, só podemos definir pontos de interrupção na parte somali.
E aqui talvez seja necessário mudar para o bytecode Dalvik.
Mas vamos ver.
Podemos definir o ponto de interrupção.
Não.
Então, vamos voltar a mostrar o bytecode Dalvik, ok.
Este funciona.
E agora vamos ver.
E esta é a linha 21.
Aqui estamos obtendo a chave secreta.
Aqui estamos recebendo.
Um.
Esse objeto em V1.
E aqui ele será usado no Cypher init, que está na linha 23.
Podemos dar uma olhada nisso, mas esta é a parte que queremos enganchar.
Isso é cypher init.
E aqui temos nosso objeto de chave secreta.
No entanto, vejamos a linha 23.
Sim, Cypher init.
Aqui está nosso objeto-chave, ok.
Portanto, é esta parte aqui.
Um.
No momento, estou enfrentando outro problema porque ainda não consigo definir nenhum ponto de interrupção aqui.
Temos que fazer isso dessa forma, portanto, precisamos parar aqui.
Ou talvez possamos clicar duas vezes?
Não.
Está bem.
Então paramos por aqui.
Assim, seguimos em frente até chegarmos a este ponto.
Está bem.
Agora adicionamos esse ponto de interrupção e podemos ver um erro.
Uau.
Hum, sim, eu sugeriria que reiniciássemos a Jade bem rápido, ok.
Portanto, podemos ver que ele também está estável para mim no momento.
Mas podemos lidar com isso.
Então, voltamos para esse, ok.
Vamos aumentar um pouco o tamanho.
Está bem.
Portanto, a atividade principal.
Aqui entramos na função de criptografia do AAS.
Definimos nosso ponto de interrupção.
Vamos avançar rapidamente para esta parte.
Está bem.
Chegamos ao nosso ponto de ruptura, no qual estamos entrando.
Desculpe, mas ainda não chegamos ao nosso ponto de ruptura.
Estamos nessa fila agora, então podemos passar por cima e ver isso.
Ok, então vamos continuar até chegarmos ao nosso ponto de parada.
Está bem.
Estamos agora em nosso ponto de ruptura.
Agora podemos entrar nela.
Aqui temos a chave secreta.
Aqui temos isso como.
Então, temos a cifra nele.
Aqui está tudo bem.
Então, definimos nosso ponto de interrupção aqui.
Sim.
Muito bem, vamos avançar até este ponto.
Agora, adicionamos esse ponto e vemos que temos esse parâmetro inteiro e a chave secreta.
Essa chave secreta está dentro.
Ganhamos.
Portanto, ganhamos está segurando nosso objeto de chave secreta.
Podemos ver isso aqui, mas não vou marcá-lo.
Então não podemos ver isso.
Portanto, agora temos a referência a esse objeto.
Mas esse objeto tem métodos para recuperar a chave.
Não podemos chamar esses métodos no momento.
Portanto, estamos vendo apenas o endereço desse objeto.
Portanto, neste caso, isso não é muito útil para obtermos a chave real que está sendo usada para a função
de criptografia de chaves.
O que precisamos é de algum tipo de interação com esse objeto para imprimir determinados
métodos ou para obter esses campos de instância dele.
E, pelo que sei até o momento, isso não é possível com a Jade.
Então, Jade, é bom ter uma configuração rápida e, sim, talvez verificar alguns valores de registro.
Mas não podemos lidar com esse problema no momento.
Portanto, precisamos de uma abordagem diferente.
E essa abordagem diferente é capaz de lidar com tudo isso.
E isso requer apenas um pouco mais de configuração, mas não muito.
Então, vamos dar uma olhada na configuração de depuração em esteroides.
Vamos fazer isso, ok.
Então, fechamos tudo.
Não precisamos mais disso.
Tudo bem.
E agora o que precisamos fazer é limpar o ponto de interrupção.
Jason.
Precisamos tirar o código do smiley disso.
Porque o que vamos fazer agora é carregar o código do smiley no Android Studio.
Em seguida, estamos usando um plug-in que faz com que o Android Studio identifique o código do smiley para que possamos
definir pontos de interrupção e depurar o código do smiley no Android Studio.
Mas aqui temos alguns recursos avançados.
Quero dizer, recursos realmente incríveis.
Portanto, vamos dar uma olhada.
Vou usar a ferramenta APK para decodificar isso.
Portanto, este está em meu diretório de downloads.
Também acho que este deve ser atualizado.
Hum, mas não agora.
E, no momento, acho que é bom para esta versão.
Pronto, agora temos esses dois diretórios de smiley.
Temos as classes smiley e smiley dois, então vamos abrir o Android Studio.
Ok, esse é um projeto antigo, portanto, vamos encerrá-lo.
Aqui podemos ver muitos projetos.
Então, nós criamos.
Não, não estamos criando em um.
Estamos abrindo em projeto e agora estamos abrindo.
Vejamos.
Em aplicativos domésticos.
Um desafio para recapitular todos, já que estamos abrindo o primeiro diretório somali.
Confiamos nesse projeto.
Está bem.
E agora o que precisamos fazer é ter todos esses arquivos Marley aqui.
Portanto.
Com, vejamos.
Sim.
Hum, o segundo diretório de smiley está faltando.
Portanto, basta arrastá-los e soltá-los aqui.
Está bem.
Então, agora temos tudo aqui e vamos ver o que temos agora com o hacking de aplicativos.
Tão perfeito quanto.
Portanto, agora temos a função as crypto.
Em somali.
Mas, neste momento, não podemos definir nenhum ponto de interrupção porque o Android Studio não está ciente da sintaxe.
O que precisamos fazer agora é instalar um plug-in incrível, que é o smiley idea.
Espero que seja pronunciado dessa forma.
Então vamos ver.
Certo, então estamos procurando uma ideia de sorriso neste caso.
E então, vejamos, temos lançamentos.
Não.
Ok, então temos que ler.
Faça o download.
Parece bom.
Vamos clicar nessa parte.
Sim.
Este aqui.
Está bem.
Então, vamos fazer o download aqui.
Precisa ser desse cara aqui.
Este aqui.
É o autor oficial desse plug-in.
Está bem.
Ele foi baixado.
E o que precisamos fazer agora é acessar as configurações do arquivo.
E então vamos ver.
Plugins.
E depois.
Instalar o plug-in a partir do disco.
Portanto, precisamos clicar nesta roda aqui e, em seguida, instalar o plug-in do plug-in a partir do disco.
Downloads.
E então vamos ver.
Este aqui.
Tudo bem.
Sim.
Parece que eu já o instalei antes, mas agora ele está sendo atualizado e precisamos
reiniciar o IDE.
Portanto, o Android Studio está sendo reiniciado.
Está bem.
E agora, depois de instalar esse plug-in, devemos poder definir pontos de interrupção aqui e a atualização do plug-in está instalada.
Está bem.
E vamos ver.
Voltamos a esse caso.
Aqui podemos ver o gerador de chaves nele.
Não, não é essa parte.
Aqui, estamos obtendo o objeto de cifra.
Aqui temos a cifra.
Aqui está a nossa chave secreta.
E aqui temos dois finais.
Vamos tentar definir um ponto de interrupção aqui.
Sim.
Perfeito.
Funciona.
Muito bem, o que precisamos fazer agora é reiniciar o aplicativo.
Não tenho certeza se posso mostrar isso a você.
Talvez tenhamos uma bagunça mais uma vez, mas vamos tentar.
Então, é assim que ele se parece.
Vamos diminuir um pouco o tamanho.
Está bem.
E agora clicamos no canto superior direito.
Anexar depurador.
Em seguida, selecionamos mostrar todos os processos.
E aqui temos nosso processo As.
Então, vamos clicar em ok.
E podemos ver.
Sim, já estamos aqui.
Perfeito.
E agora podemos ver.
Agora temos todos esses objetos e objetos.
Incrível, não é?
Portanto, podemos ver que o texto simples.
E aqui temos as chaves secretas de volta.
Portanto, também parece que é apenas o endereço.
Mas se você abrir este, será incrível.
Podemos ver todos esses campos de instância agora mesmo.
E aqui temos essa chave.
Portanto, agora também podemos modificar essa chave.
Por exemplo, podemos definir um novo valor.
Definir valor.
Hum, sim.
Entraremos nesse assunto em um instante.
Vamos fazer desta forma.
Abrimos isso e, em seguida, podemos definir um novo valor apenas para esse.
Por exemplo, o primeiro.
Agora é um zero.
E se agora prosseguirmos com essa operação, essa chave estará sendo usada.
Portanto, agora podemos extrair esse um na memória, o que é bastante impressionante, certo?
Mas não estamos limitados apenas a essa parte aqui.
Agora também podemos avaliar expressões.
E isso é realmente incrível.
Agora podemos chamar nossos próprios métodos na memória.
Assim, por exemplo, se quisermos criar um novo objeto gerador de chaves, podemos fazer isso aqui, mas primeiro precisamos descobrir
como isso está sendo feito.
Então, vamos abrir a documentação.
Então, estamos procurando o gerador de chaves do Android.
Aqui está.
E vamos ver.
Sim.
Portanto, simplesmente chamamos o gerador de chaves e depois geramos a chave.
Isso retornará nosso objeto de chave secreta.
Então, vamos fazer isso da seguinte maneira.
Um.
Coloque isso.
Talvez.
Vamos encerrar o assunto aqui.
Está bem.
Portanto, não podemos manter isso no topo.
Portanto, simplesmente fechamos isso aqui.
Está bem.
Portanto, já temos nosso objeto gerador de chaves aqui, que é key gen.
E agora podemos chamar esse método de gerar chave.
Portanto, isso retornará um novo objeto de chave secreta.
Vamos ver 321.
Funciona?
3 para 1.
Sim.
Está bem.
Aqui podemos ver o resultado.
Portanto, agora temos um novo gerador de chaves.
Desculpe um novo objeto de chave secreta.
E está ficando ainda melhor porque, quero dizer, isso já é bom, mas prometi ter uma configuração
de depuração com esteroides agora mesmo.
Vou lhe mostrar uma coisa muito legal, pois agora também podemos inspecionar a memória.
Por exemplo, podemos dizer que obtivemos o objeto gerador de chaves aqui, ou digamos que obtivemos o objeto chave
secreta aqui.
Agora podemos clicar com o botão direito do mouse e dizer, hum.
Show secret key objects, e isso agora navegará pela memória desse processo e mostrará todos os objetos
desse tipo.
Então, vamos fazer isso.
321.
Sim, podemos ver que temos dois objetos aqui na memória.
Este e este.
Este é o que criamos por conta própria.
Portanto, agora criamos um objeto na memória.
E este é o que estamos usando quando queremos substituir esses valores.
E só um momento.
Então, vamos provar isso.
Se ligarmos novamente para o número 321, tudo bem.
Agora temos que pesquisar.
Parece que sim.
Portanto, temos dois objetos, mas criamos um novo.
Portanto, o resultado foi mostrado aqui.
Sim.
Portanto, vamos fazer isso mais uma vez, entrando na chave.
Não.
Desculpe.
Entramos na chave secreta.
Em seguida, clicamos com o botão direito do mouse em mostrar objetos de especificação de chave secreta.
E lá vamos nós.
Agora temos três objetos na memória.
Incrível, certo.
Agora também podemos reatribuir isso.
Por exemplo, podemos usar o endereço deste aqui.
E, em seguida, reutilizaremos um objeto que acabamos de criar.
Se você quiser sobrescrever essa chave, é um pouco incômodo fazer isso manualmente.
Assim, por exemplo, para definir um novo valor.
Mas clicamos com o botão direito do mouse para definir o valor.
Está bem.
Agora podemos selecionar um, por exemplo.
Isso é um pouco inconveniente.
Portanto, para fazer isso melhor, podemos usar a seguinte abordagem.
Podemos ver esse aqui.
Ele está em um objeto de byte.
E o que podemos fazer para sobrescrever essa parte aqui é torná-la um pouco maior.
Agora podemos definir esse valor e podemos, por exemplo, usar o ace.
Em seguida, chamamos o método get bytes.
Portanto, isso retornará os bytes dessa string aqui e nós a atribuiremos à chave.
Vamos fazer isso na proporção de 3 para 1.
E podemos ver que sim, sobrescrevemos esse objeto com todos os nossos A's.
Portanto, é assim que podemos modificar e completar a matriz com facilidade.
Podemos reatribuir objetos.
Podemos criar novos.
Então, acho que essa é uma configuração realmente incrível, certo?
Com certeza.
Portanto, se continuarmos com este.
Um.
Vejamos.
Vamos ouvir.
Coloquei isso de volta na frente.
Sempre no topo.
Está bem.
Se você continuar agora, ele poderá travar porque substituímos esse objeto-chave
por um valor de 32 bytes.
Portanto, não tenho certeza do que acontece.
Mas vamos ver 321.
O aplicativo está em execução e, tudo bem, ele está usando os A's e talvez esteja preenchendo-os com um byte zero
no final.
Portanto, essa configuração não leva muito mais tempo do que a abordagem do Jdc, mas nos dá muito mais poder
para lidar com esse aplicativo ou criar objetos, atribuir um novo e coisas desse tipo.
Portanto, espero que você goste tanto quanto eu.
E sim, estou ansioso para vê-lo no próximo vídeo.