Está bem.
Então, aqui estamos de volta.
E sim, espero que você consiga resolver isso de outra forma.
Além disso, não se preocupe muito com isso.
Faremos isso agora.
Juntos, a tarefa era substituir esse método para sempre usar quatro dados com os números entre
um e três.
Sim, essa era a tarefa.
Então, vamos ver como podemos aplicar isso aqui.
A solução para isso.
Está bem.
Para chegar à solução, precisamos descobrir o que fizemos até agora.
Portanto, substituímos o método road dice e aqui temos esses dois parâmetros que foram
passados para esse método e os estamos imprimindo aqui e aqui.
E, em seguida, estamos chamando o método original de lançamento de dados com esses dois parâmetros, e esse método
está retornando a pilha que está sendo impressa.
Portanto, o ponto em que precisamos fazer o ajuste é nesta linha aqui, porque aqui estamos apenas
imprimindo esses valores.
Mas aqui estamos chamando o método original e esse é o ponto em que podemos influenciar o resultado.
Portanto, o primeiro parâmetro, e vamos descobrir qual é esse.
Se voltarmos, o primeiro parâmetro é o tamanho do pool.
Isso significa a quantidade de thisis.
Tudo bem.
Está bem.
Se quisermos manipular esse valor, tudo o que precisamos fazer é criar uma
variável aqui, logo antes da variável dice, por exemplo, qual é o número do dado e podemos aplicar esse valor.
Mas com relação a tipos básicos, como inteiros ou cadeias de caracteres, também podemos aplicar diretamente esses valores de forma estática
aqui, de modo que podemos simplesmente escrever quatro ali.
E então essa função, essa função original, será sempre chamada com o valor do parâmetro para.
Tudo bem, então podemos fechar ou excluir este aqui.
Em seguida, a tarefa era fornecer números entre um e três.
E vamos dar uma olhada.
Aqui temos o número da fase e este.
Esse número está sendo calculado no próximo final.
Precisamos descobrir como essa função final seguinte funciona para aplicar esse patch aqui.
Quero dizer, nesse caso, também poderíamos adivinhar o valor.
Por exemplo, se você fornecer dois, três e quatro, poderemos descobrir qual é o correto.
Mas essa não é a abordagem que gostamos de fazer.
Gostamos de entender tudo o que está acontecendo aqui e depois aplicar nossos patches com precisão.
Tudo bem.
E então vamos ver o que essa próxima extremidade aleatória está fazendo.
Portanto, estou simplesmente procurando o ponto aleatório java no próximo int.
E estão recebendo documentação da Oracle.
Vejamos.
Não queremos aplicar todos esses cookies.
Portanto, aqui temos a documentação da Oracle.
Vejamos.
Próximo fim.
E então temos isso.
Temos que encerrar as funções em seguida.
Portanto, essa é uma função sobrecarregada.
Podemos ter o next end sem parâmetro e podemos ter o next end dentro do parâmetro.
Vejamos.
E este aqui retorna o próximo tipo de valor int aleatório uniformemente distribuído dessa sequência de gerador
de números aleatórios.
Está bem.
Vamos ver se estamos tendo um próximo fim sem parâmetro.
Não.
Estamos tendo o próximo fim com esse parâmetro inteiro.
Portanto, podemos ignorar completamente o que acabamos de ler.
Está bem.
Em seguida, temos este com um parâmetro inteiro.
Retorna o valor int aleatório uniformemente distribuído entre zero inclusive.
Isso é importante e um valor específico exclusivo.
Isso é ainda mais importante, a execução dessa sequência do gerador de números aleatórios.
Tudo bem.
Isso significa que se voltarmos ao nosso código original aqui, este, se você substituir esse número de fase por
nenhum valor estático.
Vamos fazer isso no papel para descobrir o que acontece aqui.
Tudo bem.
Quero dizer, você não tem escolha em relação a isso, porque eu vou fazer isso de qualquer maneira.
Portanto.
Sim, desculpe-me por essa.
Digamos que estamos substituindo esse valor pelo valor estático três, o que significa que nosso número de fase
também será três.
Isso significa que agora temos os valores de zero a dois porque o próximo int fornece essa sequência
de gerador de números aleatórios entre zero inclusive e esse número OC exclusivo.
E isso significaria que nossos dados retornariam valores entre zero e dois.
E isso é um pouco problemático, porque acho que em toda a minha vida nunca joguei zero
nos dados. No meu caso, sim, porque já brinquei com a manipulação do tempo de execução em relação a geradores
de números aleatórios, mas não no mundo real.
Portanto, isso não é possível e é também o que o autor mencionou.
Portanto, eles fornecem esse "mais um" no final.
Se agora você estiver fornecendo o número três para este, podemos ver que estamos tendo esse gerador
de números aleatórios, que está retornando um valor entre zero e dois.
Mas agora estamos adicionando mais um ao resultado deste.
Isso significa que, no caso de retornarmos ao zero, o valor será zero.
Portanto, se esse um for zero, o resultado será um.
No caso de você estar retornando em dois, o resultado seria três.
Talvez.
Vamos fazer desta forma.
Acho que isso é matematicamente mais correto.
Tudo bem.
E esse é o valor que está sendo colocado nessa matriz de dados aqui.
Isso significa que, se quisermos ter valores entre um e três, precisaremos realmente aplicar o número
três a toda essa função.
Também poderíamos ter adivinhado isso, mas nunca teríamos descoberto esse caso extremo
aqui.
E isso também pode nos ajudar mais tarde se não estivermos completamente familiarizados com o que essa função está fazendo.
Está bem, tudo bem.
Portanto, agora temos nossos dois valores.
Vamos aplicar essas correções.
Ok, então vamos limpar a tela e pronto.
E então vamos para este.
Isso certamente está correto dessa forma.
Portanto, isso deve funcionar agora mesmo.
Portanto, vamos abrir esse aplicativo.
Ele já se foi mais uma vez.
Então, vamos abrir nossa cópia de tela.
E vamos ver também se esse aplicativo ainda está em execução.
Não.
Ok, então você está abrindo.
Está bem.
Lance os dados.
Sim, ele está funcionando regularmente.
Também posso aumentar isso.
Sim, ainda está funcionando.
Agora, vamos dar uma olhada nesse processo e aplicar nosso patch.
Portanto, estou abrindo um novo terminal.
Portanto, estamos usando.
Frida.
Aqui está você.
Muito bem, então.
Copiamos e colamos nosso script aqui neste aqui e, em seguida, pressionamos o botão Enter e, então, devemos ter aplicado
nosso patch e vamos ver.
Portanto, independentemente do que estivermos selecionando no momento, ele deverá ser substituído por quatro e três.
Mas também estamos imprimindo os parâmetros originais que foram inseridos anteriormente,
o que também é incrível, certo?
Podemos observar todo esse método, sobrescrevê-lo e manipulá-lo dessa forma.
Acho isso absolutamente incrível.
Mas, primeiro, vamos ver se realmente está funcionando.
Portanto, jogue os dados.
Aqui está.
O parâmetro original era um era seis, dois era cinco.
Mas estamos retornando apenas esses valores aqui e parece funcionar independentemente do que selecionamos.
Sim, estamos sempre retornando essa função.
Desculpe, mas esses valores, esses quatro dados e valores são um e três.
Isso é bom, mas fica ainda melhor porque a parte mais incrível da liberdade é que podemos alterar esse código
dinamicamente.
Então, digamos que estamos entediados com esses valores aqui.
Depois, podemos pegar este aqui e digamos que queremos ter cinco e seis.
Podemos copiar e colar esse código diretamente neste console aqui.
Mas colocamos nosso primeiro script e agora Frida está conectada a esse método mais uma vez e o substituiu por esses
valores neste momento.
Portanto, isso pode ser ajustado dinamicamente se clicarmos em Roll Dice e pudermos ver que, sim,
agora temos cinco valores, cinco dados com os valores um e seis.
Essa é a parte mais incrível do Frida, porque se você estiver depurando alguma coisa, precisará
anexar e, se quiser alterar algumas coisas, precisará desconectar o depurador, anexá-lo novamente
e coisas assim.
E Frida, podemos fazer esse plug quente.
Podemos corrigir diretamente esse aplicativo em nosso terminal aqui.
E se você quiser usar todo esse script, tudo o que precisamos fazer é o seguinte.
Digamos que não queiramos copiar e colar isso o tempo todo.
Também podemos iniciar essa interação do leitor com esse script que salvamos aqui.
Portanto, esse script está localizado em aplicativos e, em seguida, em um design amigável à privacidade, e agora estamos
usando a mesma liberdade e o mesmo comando para fazer uma conexão via ADB com esse processo de aplicativo.
Vejamos.
Está bem.
Agora estamos tendo de volta o método original depois de desanexar a Frida e, se você não quiser copiar e colar isso,
podemos simplesmente usar o traço L e fornecer o nome do script.
Agora, o Frida está carregando todo esse material e substituindo-o pelo script definido aqui.
Se você clicar em Roll the Dice (Lançar os dados), poderemos ver que, sim, nosso script está ativo novamente e o substituímos
mais uma vez.
E agora podemos, por exemplo, manter isso aqui e aplicar nossos patches aqui.
Também mantenho isso em primeiro plano e lá vamos nós, por exemplo, para depois simplesmente salvar o script e ele ser
aplicado automaticamente a esse processo.
Portanto, se clicarmos em Roll the dice (Lançar os dados), veremos que estamos jogando os dados.
Legal, Frida.
Absolutamente incrível.
E é assim que podemos manipular esses valores.
Ou seja, também podemos escrever em JavaScript completo, que recebe nossos parâmetros em algum tipo de formulário
e os aplica a essa função aqui.
E faremos isso mais tarde, porque essa é a maneira de escrever e treinar com a Frida.
Faremos isso no aplicativo espacial e simplesmente escreveremos nossos scripts de liberdade para
que possamos ativar e desativar determinados recursos, ser invisíveis, invencíveis, ter vários disparos, metade
e escudo, coisas como essas.
E na próxima seção, aprenderemos mais sobre essa função de sobrecarga e, depois, também aprenderemos
a manipular esse valor de retorno aqui, fornecendo e, a propósito, portanto, estou realmente ansioso para vê-lo
na próxima seção.