Bem-vindo de volta.
Caso você consiga resolver esse desafio, isso é incrível.
E espero que você tenha se divertido muito.
Caso não tenha feito isso, espero que você tenha pelo menos tentado resolver esse desafio.
Se tiver, não há problema algum se você não puder resolvê-lo agora.
Então, aqui estamos de volta à VM do Ubuntu e este é o nosso desafio.
Podemos ver isso se iniciarmos esse aplicativo.
Está bem.
O dispositivo está sendo sinalizado como enraizado.
Vamos reverter isso e descobrir como isso está sendo feito.
Portanto, estamos fazendo o root em nosso dispositivo.
Então, temos três métodos: método de verificação de raiz, um método de verificação de raiz dois e também método de verificação de
raiz três.
O valor de retorno dessas opções é booleano.
Portanto, isso significa verdadeiro se o dispositivo tiver sido enraizado, falso.
Se esse não for o caso, podemos aplicar nossas correções a tudo no método aqui, de modo que possamos
substituir cada método para que sempre retorne falso.
Mas todos eles estão sendo resumidos em Este aqui tem raiz no dispositivo, portanto, é muito mais fácil simplesmente
aplicar nosso patch aqui.
Quero dizer, se você resolveu o problema substituindo esses métodos, isso é absolutamente perfeito.
Muito bem.
Sou um pouco mais preguiçoso e, por isso, opto por essa abordagem.
Mas também mostrarei os outros.
É claro que sim.
Está bem.
Então, vamos dar uma olhada neste aqui.
Portanto, este também está retornando um valor booleano e podemos ver se o dispositivo está enraizado.
E esse chama três métodos.
E, com base nesse caso, ele está retornando verdadeiro ou falso.
Portanto, o que precisamos fazer aqui é simplesmente conectar esse método ao device rooted e substituir
o valor de retorno dentro de um valor fixo, um valor fixo de false.
Tudo bem.
Está bem.
Então, vamos fazer isso.
Estamos abrindo esse editor de código e, em seguida, usamos o JavaScript e colocamos isso à direita.
Está bem.
A primeira coisa que precisamos fazer é dizer ao Frieda para se conectar à máquina virtual Java, Java
dot perform.
E aqui estamos fornecendo uma função anônima.
Está bem?
Agora precisamos obter a referência para esse utilitário raiz da classe.
Essa referência pode ser obtida a partir do nome do pacote e do nome da classe.
Portanto, vamos manter isso em primeiro plano.
Está bem.
Portanto, também nomeei esse utilitário raiz e, em seguida, estamos obtendo a referência por meio de exibições Java.
Em seguida, temos esse nome de pacote aqui.
E, em seguida, o ponto e precisamos do nome da classe root util.
Tudo bem.
E essa é a nossa referência.
Certo, agora precisamos dizer à Frieda para substituir esse método.
Qual método dessa classe?
Utilizador raiz.
O método de enraizamento do dispositivo.
Aqui queremos definir uma nova implementação de implementação.
Estamos fornecendo uma nova função para isso.
Também podemos ver que não há nenhum parâmetro ali.
Isso significa que também não precisamos fornecer nada aqui.
Tudo bem.
E tudo o que precisamos fazer é o seguinte.
Se essa função for chamada, simplesmente retorne false.
Isso é tudo.
Quero dizer, se este funcionar, será incrível, certo?
Vejamos.
Então, salvamos esse arquivo e, sim, o salvamos em nosso desafio de verificação raiz.
Ignorar rota ponto JS.
Tudo bem.
Portanto, a única coisa que precisamos fazer agora é reiniciar esse aplicativo com o Frida já anexado
a ele.
Se fecharmos este aqui, poderemos ver se agora estamos usando nosso script e anexando-o a esse processo.
Isso não funciona.
Quero dizer, esse aplicativo já foi sinalizado, o smartphone como estando enraizado.
Portanto, não podemos mais alterar esse resultado neste momento.
Portanto, precisamos aplicar nosso patch antes que esse método seja chamado, e isso pode ser feito com nossa abordagem
de tempo.
Portanto, ao iniciar esse aplicativo com o Frida, a única coisa de que precisamos é o nome do pacote, e podemos obtê-lo
simplesmente no gerenciador de pacotes.
Portanto, se você estiver abrindo um novo shell ADB, poderemos fazer a lista de pacotes do PM e, em seguida, buscar o root.
Ah, sim, eu sinto muito.
A falta de educação não é uma opção no Grab.
Aqui está.
E agora vamos completar nosso quebra-cabeça.
Vamos juntar todas as coisas.
Então, primeiro entro no diretório onde o script está localizado.
Está dentro do controle absoluto.
Agora, queremos reiniciar o aplicativo.
Portanto, para que você possa usar a conexão ADB, é necessário reiniciá-la.
Portanto, o parâmetro f do traço e, em seguida, o pacote.
Dê o nome deste aqui.
E agora também queremos aplicar nosso script por meio da rota de desvio do Dash L.
Vamos ver se isso funciona.
Parece que preciso reiniciar o servidor rapidamente e colocá-lo em segundo plano.
Este está correndo aqui e agora vamos fazer isso mais uma vez e veremos.
Aqui está.
Portanto, agora o aplicativo está sendo iniciado, mas está sendo transportado diretamente depois.
Agora, podemos retomar este e nosso patch deve estar sendo aplicado automaticamente.
Isso significa que, se o aplicativo estiver chamando o método de rota de verificação, ele deverá ser sobrescrito diretamente
nesse ponto.
Vejamos.
Currículo em três, dois, um.
Aqui está.
Perfeitamente agradável.
Por isso, corrigimos esse aplicativo com esse one liner aqui.
Está bem.
É um pouco mais do que uma única linha, mas é a única coisa que precisamos aplicar para ter 100% de certeza.
Também podemos verificar o que está acontecendo aqui.
Por exemplo, podemos imprimir o valor do resultado original e, em seguida, modificar ou aplicar nosso patch.
Assim, temos um pouco mais de controle.
O que está acontecendo em segundo plano?
Se quisermos fazer isso, basta entrar em nosso script e dizer "send the original return value is" (enviar o valor de retorno original)
e, aqui, estamos armazenando o valor de retorno original e podemos buscá-lo simplesmente chamando esse método originalmente.
Portanto, este é o dispositivo enraizado e agora ele chamará o método, obterá o valor de retorno e o armazenará no valor de retorno
original.
Tudo bem.
Agora estamos imprimindo isso.
E, no entanto, qual é o valor de retorno original?
Estamos substituindo-o pelo valor padrão aqui.
Salvamos esse, e então simplesmente voltamos para o nosso.
Pressionamos exit e, em seguida, simplesmente pressiono a tecla de seta superior para obter o último comando e executá-lo novamente.
Desta vez.
Ah, eu também.
Ah, mais uma vez tenho que aplicar esse currículo manualmente.
Isso é algo que será corrigido na próxima versão.
Vejamos.
Aqui está.
Agora também temos nossa instrução de depuração e ela diz que o valor de retorno original é verdadeiro.
Isso significa que o dispositivo foi sinalizado como enraizado, portanto, o valor de retorno é verdadeiro.
No entanto, estamos substituindo-o por um falso.
Tudo bem.
Para ter também um one liner em nosso comando aqui, basta aplicar essa passagem nula e, então, sim, esse aplicativo
será inicializado perfeitamente.
Portanto, agora nos livramos dessa detecção de roteamento e desta.
Para ser honesto, na maioria das vezes, isso nada mais é do que substituir um método para se livrar da detecção de
roteamento.
Isso é tudo o que eu corrigi em muitas detecções de roteamento apenas aplicando essa função da ferramenta de correção
aqui.
Está bem.
Portanto, essa é a solução para esse caso.
Mas, mesmo assim, vamos também fazer o modo hardcore.
Portanto, vamos também substituir todos os outros métodos nesse método raiz de verificação um, dois e três.
Essa também é uma solução inválida, mas requer um pouco mais de trabalho.
No entanto, é bom para praticar.
Então, como podemos fazer isso?
Não é necessário que outro Java atue.
Portanto, este está conectado à nossa máquina virtual Java.
Portanto, podemos reutilizar este aqui.
Talvez.
Está bem.
Talvez escrevamos isso em um novo roteiro e encontremos algo novo.
Está bem.
Por isso, mudamos para o JavaScript.
E agora vamos fazer isso também para todos os outros métodos.
E primeiro precisamos usar o Java use sorry, Java dot perform.
Fiquei confuso por um segundo.
E então estamos fornecendo nossa função anônima.
Está bem.
Agora, nos conectamos à máquina virtual Java e aplicamos todos os nossos patches a essa função.
Portanto, o primeiro patch diz respeito à verificação do método um.
Portanto, vamos criar uma nova rota de referência util java dot use.
E este aqui mais o nome da classe.
Portanto, agora temos uma referência a essa classe e podemos usar essa referência para todos os três métodos.
Portanto, este aqui está recebendo uma referência à classe util da rota.
Está bem.
E agora vamos sobrescrevê-las.
Portanto, utilitário de rota.
O primeiro é o método de verificação um.
Marque o método um.
Queremos fornecer uma nova implementação com essa função e, aqui, queremos retornar false.
Certo, então, o patching.
Verifique o método raiz um.
E agora podemos simplesmente copiar e colar isso.
E é um pouco confuso, mas podemos consertar isso.
Está bem.
E agora temos que aplicar o método de verificação da raiz e também este aqui, três, e isso também deve funcionar.
Mas, mesmo assim, vamos imprimir algumas declarações de depuração que temos ou que sabemos o que está acontecendo.
Estamos no método de raiz de controle um.
Bem.
Portanto, este aqui está no método de rota de verificação dois e, sim, copiar e colar é realmente perigoso.
E Frida, eu cometi muitos erros com relação a isso, portanto, tenha cuidado se você fizer "oops" ao copiar
e colar tanto assim.
Oh.
Está bem.
Por isso, corrijo rapidamente os comentários.
E, em seguida, esta foi a caixa de diálogo de salvamento.
Fiquei um pouco confuso e verifiquei os métodos de rota.
Tudo bem.
Este aqui também deve funcionar perfeitamente.
Portanto, se essa foi sua solução, está tudo bem.
Com relação a este, é só um pouco mais de trabalho.
Mas acho que você só quer praticar mais, certo?
Muito bem.
Vejamos.
Portanto, vamos encerrar esse caso.
Colocamos o smartphone de volta na frente, e agora precisamos fornecer nosso outro script, não a rota de desvio.
Dê uma olhada neste aqui.
E vamos ver.
Tudo bem.
Podemos ver mais uma vez que isso parece funcionar.
E também podemos ver que estamos no método de rota de verificação um, no método de rota de verificação dois e no método de rota de verificação
três.
Também podemos imprimir os extratos originais quando eles forem devolvidos.
E vamos fazer isso rapidamente.
Quero dizer, isso é incrível.
Podemos observar o que o aplicativo está chamando, quais parâmetros e quais são os valores de retorno.
Vamos nos divertir muito neste curso com relação a isso, também com relação à funcionalidade criptográfica, fixação
de certificados e outras coisas.
Quero dizer, este aqui é realmente impressionante e o valor de retorno do método um é que acho que já podemos inseri-lo dessa forma
aqui, então podemos fazer isso aqui.
Desmarque o método raiz um.
Sim, acho que esse deve funcionar.
Quero dizer, é.
É.
É muito desleixado e um pouco sujo, mas estamos no JavaScript, então não tem problema.
Também tome cuidado com os erros de copiar e colar e ainda tenho este aqui.
Esse é o segundo método.
Este é o método três.
Vamos executá-lo mais uma vez.
Aqui está.
Está bem.
Isso foi um pouco interessante.
Eu não fiz nada.
E, sim, ele seguiu em frente.
Não tenho certeza do que causou esse atraso no momento, mas sim, parece funcionar.
E podemos ver isso aqui.
Estamos no método de raiz de controle.
Um método retornaria falso.
Isso também é incrível.
Quero dizer, se você der uma olhada nesse método aqui, parece que nosso dispositivo não tem nenhuma chave
de teste, portanto, esse método não teria sinalizado que nosso dispositivo estava sendo roteado.
Isso é falso aqui.
Então.
Vejamos.
Esta é verdadeira e esta é falsa mais uma vez.
Portanto, parece que esse único sistema no qual você não está retornando um caminho inválido
aqui.
Portanto, a única coisa que foi sinalizada como verdadeira nesse dispositivo é esta aqui.
Portanto, se apenas o método de verificação de patches para o dispositivo parecer não ser mais roteado, podemos tentar isso
neste momento.
Quer dizer, estamos exagerando na engenharia neste momento, mas eu me divirto muito fazendo isso e espero que vocês
também.
E sim, acho que também aprendemos coisas lá.
Portanto, vamos comentar este e também este.
E sim, isso não é verdade.
Esse é o caminho.
Certo, então agora estamos apenas corrigindo o método de root para verificar o método de root, porque esse é o único método que
foi sinalizado como sendo de root nesse dispositivo.
E vejamos, talvez devêssemos iniciar esse aplicativo sem que nosso script gratuito esteja anexado para verificar
se ele realmente está detectando essa raiz.
Então, vamos fazer isso.
Está bem.
Podemos ver que ainda está funcionando.
Muito bem, agora vamos aplicar nossos métodos raiz de verificação de patches.
Vou salvá-lo mais uma vez para ter certeza de que somente o método root será usado.
O utilitário de rota não está definido.
Sim, é isso mesmo.
Eu comentei.
Ops, eu comentei isso.
E precisamos fazer comentários neste momento.
Está bem.
Agora vamos fazer isso mais uma vez.
Aqui está.
Somente o método raiz de verificação de gancho dois.
Podemos ver que é novamente, esse atraso.
E vamos ver o que esse aplicativo está respondendo.
Quero dizer, temos tempo para esperar por esse, certo?
Somos atacantes.
Temos tempo para isso.
Aqui está.
O dispositivo não está enraizado.
Esse foi o único método que foi sinalizado, pois esse dispositivo foi enraizado.
Incrível, não é?
Com certeza.
Portanto, isso é tudo para este vídeo no momento.
Sinta-se à vontade para brincar com isso e experimentar um pouco.
E então, estou ansioso para vê-lo no próximo vídeo.