Bem-vindo de volta.
No último vídeo, vimos como podemos trabalhar com objetos existentes.
Isso nos dá muita capacidade e agora podemos finalmente fazer alguns exercícios práticos nesta seção
aqui.
Portanto, agora voltaremos ao nosso aplicativo de ping espacial e, mais tarde, escreveremos um treinador completo
para ele.
Portanto, teremos um programa que pode alternar ou ativar determinados recursos.
Por exemplo, ser invisível, ser invencível, ter vários tiros e coisas do gênero.
E agora vamos ver quantos recursos já podemos ativar ou manipular com liberdade com o que aprendemos
até agora.
Tudo bem.
E vamos dar uma olhada.
E este aqui é o nosso aplicativo de pagamento de espaço.
E agora vamos falar apenas sobre esses recursos aqui e ver quais deles já podemos ativar ou manipular
com a leitura com o que aprendemos até agora.
Vejamos, manipular a pontuação máxima.
Já podemos fazer isso.
Legal.
Manipular as vidas também é possível rapidamente.
E esse também é possível.
Chuva de moedas invisível.
Invisível.
Tudo bem.
Incrível.
Essas são agora todas as coisas que já podemos fazer.
A única coisa que está faltando no momento é criar um novo jogador e trabalhar com a chance de vários jogadores.
Portanto, não apenas uma dose dupla, mas um sim e, digamos, cuatro penta octa, o que você quiser.
Portanto, esses são os únicos dois recursos relacionados ao nosso instrutor que não podemos fazer no momento,
mas todo o resto aqui é possível, de modo que já podemos corrigir esse aplicativo para que ele tenha vidas infinitivas,
seja invisível, tenha reinado de moedas e coisas desse tipo.
Incrível, não é?
Com certeza.
Neste vídeo, estamos juntos e analisamos a pontuação máxima de nossas vidas.
Um deles, não tenho certeza de qual deles, mas teremos que dar uma olhada nele.
Faremos alguns exercícios e praticaremos juntos.
Depois disso, você poderá fazer a engenharia reversa desse aplicativo em relação
a todos os outros recursos, caso se acumule em um determinado ponto.
E sim, haverá todos esses nomes de classe, mas não qual classe está relacionada a qual recurso
aqui.
Tudo bem.
Ok, vamos fazer isso.
Vamos voltar para a VM do Ubuntu e, em seguida, daremos uma olhada em nossas vidas.
Ainda não tenho certeza de qual deles vamos analisar.
Vamos lá.
Tudo bem.
Então, aqui estamos de volta à nossa VM do Ubuntu e agora vamos dar uma olhada no nosso aplicativo de planejamento de espaço.
Acho que em todo esse capítulo sobre liberdade, não demos uma olhada nesse capítulo agora.
Portanto, vamos fazer isso agora juntos, caso você tenha pulado diretamente para o capítulo Liberdade.
Portanto, dentro dos aplicativos, temos nosso aplicativo de ping espacial e o ping espacial.
E este aqui.
Acho que essa é a versão original.
Sim.
Então, instalamos este.
E também anexei isso na seção aqui para que você possa fazer o download.
Eu o baixei da App Store, portanto, você também pode dar uma olhada nele.
Mas para ter certeza de que estamos todos na mesma versão, eu recomendaria usar esta aqui.
Tudo bem.
Está bem.
Então, agora vamos pegar nosso smartphone de volta e ver.
Sim, temos o aplicativo de ping espacial e vamos abrir esse aplicativo.
Aqui está o início.
E, caso você não conheça a escala.
Familiarize-se com ele.
Portanto, divirta-se.
Acho que você pode jogar até o nível cinco e, então, já deve ter visto a maior parte do jogo.
Há muitos insights aqui.
Temos nosso jogador, temos alguns alienígenas e, se formos atingidos, perderemos uma vida.
Caso esteja usando um escudo, estamos bem e aqui podemos ver essas moedas.
Fornece alguns recursos, por exemplo, dessa foto dupla.
Está bem.
Há ainda mais moedas nesta aqui.
Acho que essa é a vida lá em cima.
Nós a temos.
E há outra moeda que é verde, o que nos dá um escudo.
Este é o.
Todo o aplicativo espacial.
É isso aí.
Temos um bom alcance aqui.
Agora temos que ver.
Tudo bem.
Além desta postagem, você já viu de tudo agora.
Muito bem, vamos terminar esta.
Este aplicativo está funcionando.
Parece ser o original.
Agora, vamos dar uma olhada nesse caso.
Vamos experimentar a tela e ver o painel de espaço do aplicativo.
Vamos dar uma olhada nesse caso, se você estiver trabalhando mais nisso, por exemplo, se quiser também
escrever seu comércio agora por conta própria ou identificar todos esses outros recursos, recomendo que você
descompile isso e, sim, abra-o em outra ferramenta, por exemplo, o eclipse ou o que mais tivermos ao lado do gráfico.
Sim, ao lado do gráfico.
Como trabalho com projetos maiores, acho que é mais fácil para eles.
Mas, por enquanto, vamos nos ater a este.
Então, aqui está.
Temos um monte de coisas aqui e, sim, dentro do manifesto.
Vejamos.
E podemos ver que conseguimos isso com uma permissão brilhante e apenas uma atividade.
Sim.
Isso é tudo.
Está bem.
Agora, digamos que queremos manipular algo e vamos abrir isso mais uma vez.
Se clicarmos em iniciar, poderemos ver que temos o ensino médio e algumas vidas, e vamos nos
concentrar nas vidas.
Sim, vamos brincar com essas vidas.
E então você pode realizar todo o resto por conta própria.
A pontuação mais alta, invencível, invisível.
Coisas como essa.
Tudo bem.
Está bem.
Portanto, encerramos o assunto mais uma vez.
Está bem.
Portanto, agora estamos procurando as vidas dos jogadores e, por isso, estamos usando essa pesquisa e só ativamos
esse campo de código aqui.
Talvez tenhamos que esperar um pouco até que todo o aplicativo seja compilado.
Está bem.
Então, acho que agora o carregamento foi concluído e, portanto, estamos procurando vidas e aqui a temos.
Temos uma classe de jogadores e esta tem algumas vidas.
Tudo bem.
Vamos dar uma olhada nesse caso.
Então, aqui está e podemos ver o primeiro.
Esse é o valor padrão da vida e é um campo estático.
Incrível.
E essa será nossa primeira tentativa, pois trabalhar ou acessar campos estáticos é absolutamente fácil.
Portanto, tentaremos se essa opção der certo.
Se este não funcionar, podemos ver que temos este aqui.
Público em vidas iguais a cinco.
Este agora é um campo de instância.
Portanto, esse campo está vinculado a um objeto existente se voltarmos ao nosso aplicativo espacial.
Aqui está.
Se você clicar agora em Iniciar, poderemos ver este aqui.
Essa é agora a nossa instância de jogador.
E essa instância de jogador tem vidas definidas como cinco.
Portanto, se a abordagem estática com o campo estático não funcionar, teremos que verificar toda a memória do aplicativo.
Temos que identificar nossa instância de jogador e, em seguida, podemos usar essa instância para acessar esse campo
ativo aqui.
Tudo bem.
Portanto, vamos encerrar esse caso.
Esse é o nosso campo de instância.
Vamos dar uma olhada mais detalhada.
Está bem.
Substituir ou conectar métodos parece não ser uma abordagem no momento, porque não há nenhum método que
esteja modificando esse campo de fatia aqui.
Mas esse aplicativo deve ter esse método porque, se formos atingidos, poderemos ver que nossas vidas estão
diminuindo.
Portanto, se essa tentativa falhar e essa tentativa falhar.
E deixe-me encerrar esse aplicativo rapidamente.
Se ambos falharem, poderemos procurar esse método, que está brincando com essas vidas.
Tudo bem.
Está bem.
Legal.
Vamos fazer essa abordagem primeiro.
Estamos conectando isso ou modificando esse campo estático.
Vamos entrar em nosso código do Visual Studio e, em seguida, criaremos um novo arquivo e colocaremos essa saída à
direita.
Está bem.
Também estamos selecionando JavaScript e, agora, a primeira abordagem diz respeito ao campo estático.
Não sabemos se isso vai dar certo.
Teríamos que reverter essa aplicação cada vez mais para identificar o que acontece com essas vidas
padrão aqui.
Mas, ao conectá-lo com a Rita, não é preciso muito tempo.
Portanto, podemos simplesmente usar a abordagem de tentativa e erro.
Tudo bem.
Vou encerrar esta questão.
Agora, vamos ver o que precisamos fazer.
A primeira coisa é que precisamos contar à Frieda.
Anexe ao shader.
E é isso que esse formulário JavaScript é.
E então estamos tendo aqui nossa função anônima nesta aqui.
E é aqui que ocorrerá nossa primeira tentativa de trabalhar ou modificar um valor estático.
Temos que obter a última referência desse valor estático.
Portanto, a referência de classe, nesse caso, é a classe do jogador.
Portanto, a referência à classe do jogador é igual ao uso.
Aqui estamos obtendo a referência da classe.
Esse é o nome do pacote.
Jogador de pontos.
Agora temos a referência da classe e podemos simplesmente acessar o campo aesthetic.
Por exemplo, podemos imprimi-lo.
Acho que essa é a melhor abordagem.
Primeiro, vamos imprimi-lo e depois modificá-lo.
Está bem.
Então, estamos usando o send e depois vamos ver.
O padrão vive essa igualdade.
Então, temos essa referência de classe.
Não é o nosso campo.
Padrão.
A vida não é um valor.
Está bem.
E então estamos modificando este.
Portanto, definimos isso agora como.
999.
Tudo bem.
Vamos testar se esse script aqui funciona.
Portanto, no ADB Shell, precisamos iniciar nosso servidor Freedom, com privilégios de root e, em seguida, com os dados locais temporários e, então, iniciar
nosso servidor Freedom.
E esse agora está sendo executado em segundo plano no smartphone.
Agora vamos nos conectar a esse processo e.
Sim.
Vamos iniciar esse aplicativo com o Frida e já anexar nosso script a este, porque não tenho certeza
de quando este aqui será executado e, definitivamente, não queremos perdê-lo.
Se o aplicativo tiver sido iniciado e estivermos anexando-o posteriormente a este, poderemos perder esse
ponto aqui.
Tudo bem.
Está bem.
Então, estamos copiando isso e eu também estou recebendo de volta a cópia da tela, e aí está.
E agora vamos ver.
Liberte você.
Precisamos do nome do pacote.
O primeiro desse aplicativo.
Portanto, dentro do manifesto do Android.
Aqui está.
E agora também queremos iniciar esse aplicativo.
Parece que tenho pernas em relação a todos esses aplicativos Java.
Está bem.
Então, aqui podemos ver.
Sim, a cópia verde foi encerrada mais uma vez.
Portanto, acho que é uma boa ideia usar esse aplicativo de planejamento espacial para descompilá-lo e carregá-lo
no eclipse.
Isso não exige muitos recursos, como é o caso da desculpa aqui.
Mas, por enquanto, vamos tentar pelo menos esse primeiro gancho.
Portanto, estamos encerrando esse caso.
Está bem.
Em seguida, abriremos nossa cópia de tela mais uma vez.
Tudo bem.
Ainda a tenho em minha área de transferência?
Sim.
Está bem.
Portanto, agora pedimos desculpas à Frieda por todo esse problema.
Estamos dizendo à Frieda para se conectar via ADB ao smartphone com o EFF.
Estamos dizendo à Frieda para iniciar esse aplicativo com esse identificador de pacote.
E agora, sim, precisamos começar dessa forma.
Agora podemos ver Frida iniciando essa aplicação e mantendo-a depois.
Agora podemos aplicar nosso script.
E este aqui.
E agora podemos retomar este.
Tudo bem.
Se esse código estiver sendo executado ou acionado, devemos ver nossa saída de depuração aqui.
Vejamos.
É isso aí.
A vida padrão foi definida como cinco noites, o que significa que, no momento, nosso valor de vida padrão está
sendo definido como 99.
Vamos simplesmente copiar e colar isso mais uma vez aqui.
Essa é a leitura de saída e começou mais uma vez.
Estamos imprimindo o novo valor padrão das vidas depois.
Essa é uma abordagem melhor.
Ok, agora podemos continuar.
Aqui está.
Agora, nosso novo valor de lista padrão está sendo definido como 999.
Vamos ver se estamos tendo tantas vidas agora e começar, ok, na interface do usuário, isso pode não estar atualizado agora,
portanto, não podemos ter certeza até que o obtenhamos e tenhamos apenas quatro vidas.
Portanto, infelizmente, essa abordagem não funciona.
Está bem.
Nada de mais.
Podemos encerrar esse caso e seguir para a segunda abordagem.
Agora podemos examinar a memória do aplicativo em busca de objetos de jogadores e acessar o valor de vidas de pontos de
jogadores.
Tudo bem.
Está bem.
Então, primeiro, vamos abrir esse aplicativo mais uma vez.
Estamos mais uma vez em busca de vida e a encontramos aqui.
Colocamos este à direita e este à esquerda.
Está bem.
A primeira abordagem relacionada ao campo estático não funciona.
No entanto, vamos manter esse código aqui.
Muito bem, vamos fazer a abordagem de varredura.
Mais uma vez, estamos trabalhando com código Java, portanto, precisamos do nosso desempenho Java e, em seguida, da nossa função anônima.
Desta vez, não estamos usando o Java.
Estamos usando calçados Java porque não queremos ter referência na classe.
Queremos examinar essa memória.
Então, o Java pensou em calçados que agora têm dois parâmetros.
O primeiro diz respeito ao nome da classe.
E a segunda diz respeito aos retornos de chamada.
E esta aqui é a referência da classe em que a memória é pesquisada.
Portanto, estamos pesquisando toda a memória desse aplicativo para essa classe específica.
No nosso caso, é este aqui.
Dot player, a classe do jogador.
E, caso encontremos um, agora temos nossos dois retornos de chamada aqui.
Clico duas vezes neste, aplico esses colchetes e pressiono Enter.
Essa é a maneira mais fácil de não bagunçar todos esses suportes aqui.
Tudo bem.
O primeiro callback é o nosso callback de correspondência e a TV que define agora a nossa função anônima.
Caso esteja encontrando uma instância.
Portanto, esse é um parâmetro que foi fornecido a esse retorno de chamada.
Vamos comentar esse código pesquisando diretamente na memória as instâncias da classe player.
Aqui está nosso callback de correspondência, caso encontremos um, encontremos um, encontremos um.
E agora vamos ver.
Primeiro, queremos ter uma saída de depuração e encontrar a instância do jogador.
Quero dizer, deve haver apenas um disponível no momento.
Por exemplo.
E também vamos imprimir as vidas.
O ponto de vida do jogador é.
E então podemos acessar essas vidas de jogadores aqui simplesmente usando instance, dot lives, dot value.
Ou seja, também podemos nomear isso, por exemplo, jogador.
Acho que isso pode ser um pouco mais fácil de ler, então.
E, em seguida, estamos mudando esse valor de gado de um ponto de jogador que agora é igual a 999.999.
E esta é nossa primeira chamada de retorno.
A próxima será separada por uma vírgula e agora estamos completando a nossa.
Portanto, uma função completa não tem um parâmetro ou é uma função anônima.
Desculpe, não há colchetes aqui.
Está bem.
E agora podemos.
Sim, podemos imprimir uma declaração de que terminamos a varredura porque, assim, saberemos que
esse script foi executado em toda a memória.
Portanto, terminei de examinar a memória do aplicativo em busca de instâncias de jogadores.
Está bem.
Este é o nosso segundo script.
Vamos tentar essa abordagem agora mesmo.
Portanto, estamos levando este.
Mais uma vez, estamos iniciando a cópia da tela.
E com nossa liberdade lá, temos nossa liberdade.
Vou organizar isso rapidamente.
Och, och.
Agora estamos usando o freedom mais uma vez e aplicando nosso script, e você verá alguma diferença.
Portanto, agora estamos aplicando este e, em seguida, estamos usando o currículo e aqui podemos ver.
Não temos nenhum objeto de jogador no momento porque esse objeto de jogador não foi criado.
Portanto, se estivermos procurando instâncias, a melhor ideia é iniciar esse aplicativo primeiro e entrar
nesse aplicativo e agora procurar essa instância, porque agora podemos ter certeza de que
essa aqui existe.
Tudo bem.
Deixe-me limpar isso no lado esquerdo, pois temos alguns.
Esse mecanismo é insano.
Que temos algum espaço aqui.
Agora estamos usando esse script mais uma vez.
Então, eu o colo mais uma vez.
E aqui está.
Uma instância de jogador legal e encontrada e esta aqui.
E isso tem acontecido.
Ops.
Desculpe-me por ter me empolgado demais com esse caso.
E este tem vidas de jogadores que estão sendo ditas para cinco incríveis não para 9999.
Eu nem sabia que a interface do usuário já havia sido alterada.
Ok, isso é incrível.
É assim que podemos simplesmente acessar as vidas desses jogadores e manipulá-las.
Vamos ver se essas são realmente nossas vidas de jogador.
Sim, podemos ver que eles estão diminuindo.
Eu nem sabia que a interface do usuário já havia sido atualizada em relação a esta.
Está bem.
Incrível.
Vamos recapitular isso um pouco.
Nós digitalizamos ou revertemos nosso código em relação às vidas dos jogadores.
Vimos isso no valor da lista padrão aqui em relação ao campo estático.
Mas este aqui.
Mas, sim, a manipulação desse não tem efeito sobre esse aplicativo, portanto, parece não ser usado
em nosso aplicativo.
Absolutamente nenhum problema.
Nós o modificamos.
Não funcionou.
Temos que adotar uma abordagem diferente.
A segunda abordagem foi examinar toda a memória do aplicativo em relação a esse objeto de
jogador aqui, e esse foi encontrado nessa instância.
É isso aí.
Em seguida, simplesmente imprimimos as vidas reais dos jogadores, que estão sendo definidas
como cinco, e as manipulamos depois, e isso é tudo.
É assim que poderíamos manipular a vida dessa instância de jogador aqui e fazer essa abordagem
nesta.
Com relação às instâncias, isso o ajuda muito.
Portanto, todas essas funcionalidades que vimos anteriormente nos slides dizem respeito apenas ao trabalho com instâncias
aqui.
É um pouco mais complicado no início, mas se você continuar configurando-o repetidamente
sozinho, o script aqui, você aprenderá como tudo funciona.
E não é nada demais se você fizer isso três ou quatro vezes depois.
Assim, você se acostuma com essa sintaxe aqui.
Tudo bem.
No próximo vídeo, examinaremos todos os outros recursos.
Portanto, sinta-se à vontade para fazer a engenharia reversa desse aplicativo e brincar com ele.
Dê uma olhada nisso por conta própria.
Tente identificar onde estão essas moedas?
Como podemos gerá-los?
Coisas invisíveis, invisíveis como essa.
Se você estiver tendo os mesmos problemas que eu, ou seja, se a desculpa de mudança e a cópia de tela e coisas desse
tipo não funcionarem bem juntas, simplesmente opte pela abordagem do eclipse.
Eles combinam esse aplicativo com o shady x e dão uma olhada em tudo carregado em um projeto do eclipse.
Isso funcionará muito melhor.
Tudo bem.
Agora, por favor, divirta-se.
Brinque com isso.
E então, espero vê-lo na próxima seção.