Bueno volver después de enganchar las funciones antiguas de la manera fácil.
Ahora echemos un vistazo por las malas.
Exactamente.
Este de aquí.
Así que tenemos que lidiar con toneladas de cosas si quieres enganchar función nativa.
Y para ser sinceros, ahora mismo no sacamos ninguna ventaja de esto.
Sin embargo, lo estamos haciendo.
¿Por qué?
Porque más adelante nos ocuparemos de una función en la que todos estos conocimientos de ahora nos vendrán súper bien.
Muy bien.
De acuerdo.
Así que por favor vean esto como una especie de práctica para un desafío que haremos más adelante.
Y por lo tanto, vamos a averiguar cómo podemos enganchar una función no en el mundo Java, dentro del mundo Cplusplus.
Vámonos.
De acuerdo.
Así que aquí tenemos nuestro código cplusplus, y lo primero que tenemos que hacer es identificar la función
que queremos enganchar.
Podríamos haber hecho ingeniería inversa de esta aplicación, pero haciendo esto, nos perderíamos muchas
cosas.
Por ejemplo, no obtenemos cosas como el puntero de función u otras cosas.
Por lo tanto, estamos utilizando Frieda porque Frieda también tiene la capacidad de enumerar todas estas funciones.
Frieda no sólo puede enumerarlas, sino que también proporciona los punteros de función correspondientes.
Así que tenemos todas las direcciones de estas funciones aquí.
Y digamos que estamos interesados en lo siguiente en este de aquí.
Entonces podemos simplemente listar todas estas direcciones y entonces podemos seleccionar la dirección que está relacionada con
esta, con esta función.
Queremos enganchar este de aquí.
Tener la dirección, es todo lo que necesitamos.
Así que ahora podemos utilizar nuestro interceptor dot attach para adjuntar a esta dirección.
Y esto significa que estamos observando todo lo que ocurre aquí.
Y aquí estamos proporcionando ahora nuestros dos callbacks, nuestro on enter y también nuestro on leave callback.
El callback on enter será llamado cuando estemos entrando a esta función dentro del on enter, estamos
teniendo acceso a los parámetros.
El callback al salir será llamado y justo antes de que estemos regresando fuera de este, esto significa que todavía
estamos teniendo acceso al valor de retorno.
Así que esto es directamente antes de salir de esta función por aquí y por lo tanto todavía podemos observar
el valor de retorno y también podemos aplicar un parche en este.
Así que podríamos modificar este de aquí.
De acuerdo.
En total, quedaría así por aquí.
Así que este es el resumen de nuestro punto interceptor adjuntar.
Adjuntamos a este puntero de función y cada vez que estamos entrando en esta función, podemos aplicar nuestros parches.
Y cada vez que salgamos de esta función, también podremos aplicar nuestros parches.
Muy bien.
De acuerdo.
La única pregunta que nos queda es la siguiente ¿Cómo conseguimos estas funciones y todas estas direcciones?
Y Frieda tiene un montón de capacidades increíbles para hacer esto.
Así que mis tres favoritos son los siguientes módulo punto.
Y luego podemos enumerar importaciones, exportaciones y símbolos.
Vamos a echar un vistazo a cada uno de ellos y también vamos a averiguar cuál es la diferencia entre ellos
en la tableta gráfica más adelante.
Y por ahora, sugeriría que simplemente empecemos de nuevo aquí, así nos adentraremos en este tema
paso a paso.
Muy bien.
Bien, vamos.
Cambiemos a la VM de Ubuntu y veamos cómo podemos enganchar una función nativa con Frieda.
Vámonos.
Muy bien, aquí estamos de vuelta en Ubuntu VM y ahora vamos a echar primero un vistazo a esta aplicación
una vez más.
Así que volvemos a la pantalla del smartphone y aquí podemos ver que esta es nuestra aplicación.
Si hacemos oops, lo siento.
Si pulsamos el botón criptar podemos ver que está criptando este texto de aquí y vamos a cambiarlo.
Frieda es increíble.
Y veamos.
Sí, sigue funcionando.
De acuerdo.
Ahora vamos a abrir esta aplicación con Jade y vamos a averiguar el nombre de la función que queremos enganchar.
Muy bien.
Vale, cerramos este, abrimos un nuevo terminal y entramos en apps y.
Frida.
Toma.
Le puse otro nombre.
Indica Frida.
Y ahí lo tenemos.
Y ahora vamos a abrir este.
De acuerdo.
Vamos al manifiesto de Android.
Y hacemos clic en la actividad principal.
Muy bien.
Veamos.
Ya está.
Este de aquí.
Sí.
Y este es el método que queremos enganchar ahora.
Por lo tanto, vamos a encender Frida y vamos a echar un vistazo a cómo enumerar este método con Frida.
Así que abrimos una nueva terminal.
Estamos conectando a nuestro dispositivo privilegios de root, y luego arrancamos el servidor Frida.
Muy bien.
Tres hace corriendo.
Pon esto a la derecha.
Este de delante.
Cerramos este y ponemos este a la izquierda.
De acuerdo.
Ahora adjuntamos simplemente a este proceso.
Así que gratis para ti.
Y luego com app hacking.
Y ésta es la libertad.
Ahora estamos conectados.
Así que lo primero que tenemos que hacer es identificar la dirección de esta función aquí.
Descifrar cadena, y podemos hacerlo de la siguiente manera.
Así que Frida tiene esta característica módulo agradable, y si hace clic o introduzca punto módulo, entonces tenemos todos estos métodos
que están disponibles.
Tenemos uno que es enumerar las exportaciones, importaciones, y adivinar los símbolos.
Enumerar símbolos.
De acuerdo.
Ahora la pregunta es ¿dónde está la diferencia entre todos ellos?
¿Qué son las importaciones?
¿Qué son las exportaciones y qué son los símbolos?
Averigüémoslo ahora mismo.
Empezamos por las exportaciones.
De acuerdo.
Si simplemente pulsa enter, entonces podemos ver que esta en función.
Así que tenemos que proporcionar un sí en función de éste.
Así que necesitamos nuestros soportes.
Si lo haces de esta manera, entonces podemos ver que está esperando una cadena.
Así que aquí tenemos que decirle a Frieda en qué biblioteca tiene que buscar todas estas exportaciones y esta biblioteca
se puede encontrar.
Y veamos, aquí dentro de Lib, tenemos esta lib nativa dash lib.
Así que...
Así que esta es la biblioteca donde queremos enumerar todas estas exportaciones porque esta es la biblioteca que
se está cargando aquí como lib nativa y esta es la biblioteca que contiene nuestro método.
Muy bien.
Bueno, vamos a ver enumerar las exportaciones y tenemos que entrar.
Lo siento, esto a la derecha, tenemos que conseguir este nombre lib nativo guión lib punto.
Así que bien, si ahora hacemos clic en enter entonces podemos ver todo lo que estamos recibiendo de vuelta una matriz y esta matriz tiene
tres entradas para cada función.
La dirección, el nombre y el tipo.
De acuerdo.
Así que aquí podemos ver que no sólo está relacionado con las funciones, sino también con las variables.
Y perdón por esta redacción.
Esto se refiere a todas las exportaciones, no sólo a las funciones, todas a las variables.
Muy bien.
Y veamos qué tenemos aquí dentro.
Así que estas son las exportaciones y esta lista es enorme, supongo.
Sí, tenemos muchas cosas aquí.
Pero si nos desplazamos hacia arriba, vale, eso no es vamos a ver.
De acuerdo.
Así que aquí añadimos el principio y ahora vamos a bajar un poco.
De acuerdo.
Y aquí ya lo tenemos.
Java com app hacking y tres la actividad principal descifrar cadena.
Esta es exactamente la función que queremos enganchar.
Increíble.
Así que este de aquí.
Esa es la dirección.
Absolutamente agradable.
Ahora tenemos la dirección de esta función en la que nos encontramos.
Veamos, enumera las exportaciones.
Entonces, ¿dónde está la diferencia entre exportaciones e importaciones?
Y vamos a hacer esto para las importaciones y tal vez entonces se vuelve un poco más claro enumerar las importaciones.
Sí.
Así que aquí podemos ver que imprimimos f tres mem set mem copy malloc vars print, f mem move string compare y
cosas así.
Así que vamos a echar un vistazo rápido en la tableta gráfica y averiguar lo que nuestras importaciones, exportaciones y símbolos
de este archivo aquí de esta biblioteca nativa.
Muy bien.
Bien, hagámoslo rápido.
Bien, aquí tenemos nuestra biblioteca y esta ha sido escrita en C o en C plus plus.
Ahora supongamos que tenemos la siguiente línea de código.
Tenemos impresión F y estamos imprimiendo.
Hola, Frieda.
En este momento, esta función de aquí es desconocida para el programa y por lo tanto será
marcada como roja.
De acuerdo.
Si desea utilizar este fuera de la norma Lipsey, entonces tenemos que hacer lo siguiente.
Tenemos que incluir.
El archivo estándar IO dot h.
Así que este archivo de cabecera estándar IO se incluirá en nuestro programa aquí en este.
Y ahora el programa sabe, bien, este, que es la función de impresión fuera del archivo de cabecera estándar.
Ahora lo sé y esta función ya no se marcará en rojo.
Así que esto significa que estamos teniendo aquí ahora nuestra biblioteca estándar lib y este es nuestro estándar lib, ver.
Y éste define ahora todas estas funciones.
Por ejemplo, imprimir f f abierto.
Y mucho más.
Así que todas estas funciones se definen en esta biblioteca y ahora se pueden importar a nuestro programa.
Y esto significa que todas estas funciones de aquí, son importaciones para nuestro programa en este momento.
Así que vamos a importar estas funciones en nuestro programa.
Mientras que este de aquí.
Muy bien.
De acuerdo.
Por lo tanto, las importaciones son simplemente funciones que provienen de una biblioteca diferente.
Muy bien, entonces digamos que tenemos este de aquí.
Así que tenemos nuestra cadena de descifrado.
Y éste tiene que estar disponible fuera de esta biblioteca.
Por ejemplo, en nuestro código Java.
Por lo tanto, necesitamos exportar esta función para que esté disponible en otro programa.
Así que éste está ahora fuera.
Por lo tanto, exportar significa simplemente tomar una función definida por nosotros.
Así que esto ha sido definido por nosotros y ponerlo a disposición del exterior.
Así que si alguien está incluyendo este archivo aquí.
Así que esto se incluirá.
Entonces esta función también está disponible para este programa ahora mismo.
De acuerdo.
Así que esto sería una exportación, este de aquí.
De acuerdo.
Por último, pero no menos importante, tenemos símbolos y los símbolos son sólo funciones o variables que se han definido
en nuestro programa.
Así que funciones o variables.
En nuestro programa no se ha exportado a otros ni se ha importado de otros.
Así que esto es sólo, por ejemplo, algo como esta cadena p w es igual a secreto.
De acuerdo.
Y este de aquí.
Esto sería un símbolo.
Teniendo esos tres ahora mismo, podemos acceder a todo lo que queramos.
Por ejemplo, si buscas algo que se ha importado de otra biblioteca, podemos comprobar
las importaciones.
Si estamos buscando algo que estamos exportando a otras bibliotecas, entonces podemos comprobar las exportaciones.
Y si usted está buscando algo que se ha definido en nuestro código y este, por ejemplo, entonces
podemos buscar símbolos.
De acuerdo.
Así que ahora.
De acuerdo.
Así que este de aquí, esta es la diferencia entre las importaciones.
Funciones en nuestro programa.
Exporta la función fuera de nuestro programa y los símbolos cosas sólo disponibles en nuestro programa de aquí.
Bien, ahora los entendemos.
Y esto nos ayudará mucho a identificar lo que buscamos.
Y por lo tanto, volvamos a Frida.
Bien, aquí estamos de vuelta en Ubuntu VM.
Ahora echemos un vistazo a éste.
Una vez más tenemos memset mem copy malloc.
¿Todavía recuerda si ahora son exportaciones o importaciones?
Claro que sí.
Son de importación y puede que ya lo hayas visto por aquí.
Estos están siendo importados desde el punto s0 de lipsi.
Muy bien.
Así que si estás buscando métodos como copiar cadena, cadena, comparar mem copiar mem comparar y cosas por el estilo,
tenemos que mirar en las importaciones.
Vale, perfecto.
Ahora volvamos a las exportaciones.
Así que vamos a cambiar este de aquí.
¿De acuerdo?
Y aquí podemos ver estas son ahora todas nuestras exportaciones en nuestra biblioteca, en nuestra lib nativa.
Así que si volvemos a la parte superior por aquí, así que entonces podemos ver estos son un montón y es absolutamente ridículo encontrar
nuestro método allí.
Así que si nos desplazamos hacia abajo, entonces podríamos identificarlo por aquí y aquí también tenemos esta dirección, esta pieza,
lo que estamos buscando.
Pero, para ser sinceros, no es un buen planteamiento.
No quiero buscar manualmente a través de todo esto y por lo tanto vamos a crear un nuevo archivo dentro de nuestro editor
de código de Visual Studio y luego vamos a ver cómo podemos hacer esto de forma automática cada vez que estamos empezando
esta aplicación, vamos a buscar esta dirección.
Muy bien.
Hagámoslo.
Así que abrimos el código de Visual Studio.
Bien, ahí lo tenemos.
Y esta vez no tenemos nuestro enfoque Java dot perform porque ya no estamos en el mundo Java.
Ya hemos descubierto el comando.
Queremos usar este de aquí.
Pongamos esto a la derecha y esto a la izquierda.
Vale, pulso la flecha de arriba y me sale el último comando.
Este de aquí.
Esto devolverá un array con todos.
Sí, con todos estos valores, dirección, nombre y tipo.
Copiemos esta.
Y pégalo aquí.
De acuerdo.
Ahora vamos a crear un nuevo array.
Pero antes de hacerlo, volvemos a JavaScript.
Bien, ahora estamos creando un nuevo array y le damos el nombre de exportado.
Es un poco lag en mi lado, supongo.
Cierro.
En pantalla.
Recibido.
De acuerdo.
¿Funciones exportadas?
Sí.
Si está ejecutando este de aquí, entonces tenemos ahora esta funciones exportadas.
Y este es un array que contiene todas las cosas que podemos utilizar esto para acceder a un campo, por ejemplo, de
esta manera.
Y entonces podemos decir, por ejemplo, dirección.
Esta es ahora la dirección del primer elemento.
También podemos imprimir el nombre, y haciendo esto, ahora podemos buscar nuestra función.
Así que la función que buscamos es.
Descifrar cadena.
Por lo tanto, escribimos un bucle for each en nuestro array.
Quizá comentemos esto rápidamente.
Estoy recibiendo todas las exportaciones de la lib nativa dash lib, así.
Iterando sobre esta matriz, tratando de encontrar la cadena de descifrado para que podamos iterar sobre esta.
Permítanme poner esto a la derecha por defecto cada bucle.
Sí, ésta es una matriz.
Por lo tanto, tenemos esta función.
De acuerdo.
Así que tenemos dos parámetros, un elemento y un índice.
No sé si estás utilizando este índice ahora mismo, pero es bueno tenerlo.
Bien, ahora podemos usar simplemente nuestra sentencia if.
Así que si elemento. nombre y en JavaScript no es contiene es supongo incluye.
Sí.
De acuerdo.
Si se incluye esta palabra clave.
Así que la palabra clave que estamos buscando es descifrar cadena.
Entonces veamos.
Queremos imprimirlo y queremos imprimir el nombre del elemento.
Copiemos esto.
La dirección del elemento punto.
De acuerdo.
Y probemos si este funciona.
Perfecto.
Tenemos esto dentro de la arena, que no es tan agradable.
También podemos sustituirlo por el registro de la consola.
De acuerdo.
Y hagámoslo una vez más.
Ya está.
Este es nuestro nombre.
Y esta es la dirección.
Sí, la dirección debe ser correcta.
De acuerdo.
Bonito.
Ahora también podemos crear una nueva dirección.
Llamemos a esta cadena descifrar dirección.
De acuerdo.
Dirección de la función que queremos enganchar.
Ahora vamos a hacer esto un poco más agradable.
Así que este es el nombre.
Y aquí estamos teniendo el puntero.
Y ahora también estamos llenando este array perdón, este array, esta variable de aquí.
Así que este es ahora elemento punto dirección.
Sí.
Sin soporte.
De acuerdo.
Esto debería funcionar.
Hagámoslo una vez más.
Muy bien.
Esto significa descifrar la dirección de la cadena.
Aquí tenemos ahora nuestra dirección.
Perfecto.
Ahora podemos usar esto dentro de nuestro interceptor dot attach.
Así que este es el último plano, la tercera parte de nuestra sintaxis libre.
Necesitamos memorizar.
Y para ser honesto, es bastante idéntico a Java. zapatos.
Así que en lugar de java. zapatos, estamos teniendo interceptor punto adjuntar y aquí estamos teniendo ahora nuestra
dirección, que es este de aquí.
Y luego tenemos una coma y tenemos nuestros callbacks.
De acuerdo.
Estos callbacks, doble clic.
Paréntesis rizado y enter.
Exactamente como lo hemos hecho en Java.
Elige el punto.
Muy bien.
Ahora vamos a definirlos.
Tenemos nuestra n en la devolución de llamada de entrada.
Proporcionamos una función anónima.
Y esta vez sólo tenemos una discusión.
Y esto es una serie de argumentos.
Esto se hará automáticamente.
Si tiene dos elementos, entonces tenemos nuestro cero arg1.
Si tenemos cinco, entonces tenemos nuestro cero hasta cuatro.
De acuerdo.
Así que imprimamos esto y enviémoslo.
Estamos dentro.
Allá vamos.
Descifrar dirección de cadena.
Bien, entonces tenemos nuestra devolución de llamada en licencia y el mismo enfoque.
Y este tiene también esta vez en parámetro, que es el valor de retorno.
Nombro esto normalmente rojo y nosotros también imprimiendo fuera mero dejando el decrypt cadena y función ahora mismo.
Lo siento por éste.
Eso es un poco confuso.
Descifrar cadena.
Veamos si este es el nombre correcto.
Sí.
De acuerdo.
Y así es como podemos entrar y salir de una función o enganchar la entrada y salida de una función.
Y combinemos todo esto ahora mismo.
Así que limpié la pantalla y volví a solicitarlo.
De acuerdo.
Y ahora volvamos a nuestra pantalla.
Activemos esta función y veamos qué ocurre.
Golpeé cripta en tres, dos, uno.
Ya está.
Estamos en la cadena de criptos.
Estamos dejando la cadena de la cripta en este momento.
Perfecto.
Así que podemos ver que esto funciona.
Ya no parece tan complicado, ¿verdad?
Con respecto a éste, quiero decir.
Sí.
Vale, tenemos que memorizar algunas cosas nuevas, pero en cuanto al planteamiento, es bastante idéntico.
Desgraciadamente, no.
Y esto ni siquiera está cerca de ser idéntico.
Así que hemos visto esta cosa hilarante typecast en nuestro código cplusplus.
Y si ahora quieres acceder a estos parámetros, esto será un lío.
Intentemos acceder a ellos.
Así, por ejemplo, queremos imprimir tal vez vamos a hacer esto por debajo.
Así que por aquí, sí, tengo que cerrarlo.
Sigue siendo lento.
Y allá vamos.
De acuerdo.
No queremos enviar esto, por lo que queremos imprimir el primer parámetro y el primer parámetro.
Y entonces este debería ser el eje cero.
De acuerdo.
Y también queremos imprimir el segundo parámetro.
Y este de aquí es el segundo parámetro.
Así que estos son nuestros dos parámetros.
Vamos a poner esto un poco más a la izquierda y el pasaporte y cuatro.
Así que hay que imprimirlas ahora mismo, ¿no?
Veamos.
Copiemos esto.
Y volvamos a nuestro guión libre.
Mantengamos esto en primer plano.
De acuerdo.
Saquemos también nuestra pantalla de aquí.
Así que aquí tenemos nuestra pantalla.
Y ahora veamos.
Estoy insertando esto y le doy a script en tres, dos, uno.
De acuerdo.
Parece que funciona, pero estos se ven un poco extraños.
Así que esto parecen direcciones, ¿verdad?
Y sí, supongo que son direcciones.
Parece que he olvidado algo.
Volvamos a las diapositivas y averigüemos qué hice mal aquí.
De acuerdo.
Así que aquí estamos, de vuelta en las diapositivas y sí, tenemos cuatro parámetros.
Así que los dos primeros se refieren a nuestro puntero de entorno de cadena.
El segundo es este objeto.
El tercero es este parámetro uno, y el cuarto es el parámetro dos.
De acuerdo.
Así que la culpa es absolutamente mía.
Tenemos que enganchar arco a y arco tres.
Así que contando desde cero.
Y este de aquí es R0, R1, R2 y R3.
Muy bien, simplemente arreglemos esto por aquí.
Así que volvamos a éste.
Este es el arco dos y este de aquí es el arco tres.
Y hagámoslo una vez más.
De acuerdo.
Lo siento.
Y traigámoslo aquí.
Así que golpeé cripta en y dos, uno.
Vámonos.
Hay algo interesante.
Todavía tenemos primero, segundo, primero, segundo.
Así que además de olvidarnos de renombrar esto, ahora lo tenemos dos veces.
Y esto es algo con lo que me encuentro a menudo.
Por lo tanto, sobrescribir un método con respecto a interceptor dot attach no es una buena idea.
La anularemos y en el segundo intento anularemos la primera anulación.
Y luego tenemos este lío aquí.
Por lo tanto, simplemente cerremos esta aplicación y reiniciémosla.
Es decir, también podemos guardar esto y proporcionarlo a un archivo.
Pero sí, por ahora, vamos a hacerlo en la línea de comandos.
Supongo que eso es un poco más fácil.
Bien, ahora estamos reiniciando esta aplicación y supongo que este ya no es necesario, este jQuery.
Por lo tanto, permítanme cambiar esto muy rápido porque mi Java parece lag mucho en este momento.
De acuerdo.
Así que aquí estamos recuperando nuestra pantalla.
Bien, probemos esto aquí.
Así que pulsé cripta y dos, uno.
Allá vamos.
El primer parámetro es ¿qué es esto?
El segundo parámetro es para.
Por último, tenemos un valor allí.
Así que este es nuestro valor para.
Muy bien, esto es increíble, pero esto es ridículo.
¿Qué es esto de aquí?
Bien, por aquí, parece que estamos teniendo una dirección una vez más.
Y esto podría ser en cadena, pero podría ser en diferentes tipos de cadena.
Así que no podemos simplemente imprimirlo de esta manera.
Podríamos intentar algo como, veamos.
Y Jason.
Un stringify.
Veamos si esto funciona.
Vale, pues le doy a salir.
Corremos esto una vez más.
Yo lo proporciono.
Y.
Aquí lo tenemos.
Bien, veamos.
Sí, incluso JSON stringify no es capaz de obtener la cadena real de esta dirección.
Así que el único enfoque que conozco ahora es convertir esto en una cadena Java real y esto se puede hacer
con Java dot cast.
Así que si estás echando un vistazo a la documentación de Frida.
Así que este de aquí dentro de docs.
Tenemos el JavaScript y aquí tenemos algo Java dot cast.
Pero lo tenemos aquí y crear una envoltura de JavaScript.
Dada la instancia existente en la manija de la clase dada clase como devuelto de Java uso.
Así que primero tenemos que utilizar el uso de puntos Java.
Por aquí.
Sí, perfecto.
Podemos ver esto aquí.
Estamos utilizando el uso de Java para la clase string.
Y entonces estamos typecasting este, esta dirección a esta cadena.
Y después estamos siendo capaces de.
Para imprimir la cadena.
De acuerdo.
Supongo que ahora ya sabes por qué a este se le llama por las malas.
Muy bien, hagámoslo.
Veamos, ¿qué es la clase de cadenas de Java?
Y por lo tanto, estoy buscando para Android desarrollador Java String.
Y aquí tenemos el desarrollador Android.
Com la documentación.
Y podemos ver que la cadena es de la clase JAVA. IDIOMA. STRING.
De acuerdo.
Y hagámoslo ahora mismo.
Así que este de aquí, veamos este.
Esto necesita ahora un tipo de fundición.
Así que tenemos que hacerlo de la siguiente manera.
En primer lugar, necesitamos obtener la referencia de clase de la cadena.
Y clase de cadena ref.
Podemos hacerlo con java dot use y pongamos esto a la derecha.
Así que tendrá.
Ahí lo tenemos en Java. lang. cadena.
De acuerdo.
Así que ahora tenemos esta referencia.
Oh, esto tiene que estar dentro del método on enter.
De acuerdo.
Y ahora podemos crear una nueva instancia, una instancia de cadena, y podemos typecast ahora mismo de la siguiente manera.
Podemos echar un vistazo a la documentación y es exactamente esta de aquí.
Así que podemos utilizar Java Cast.
Entonces proporcionamos este puntero que se asegura de que este que estamos proporcionando aquí es un puntero.
Así que estamos proporcionando este eje tres y queremos typecast ahora mismo a nuestra referencia de clase, la referencia
de clase de cadena.
De acuerdo.
Ahora tenemos por fin una cadena que se puede imprimir, esperemos.
Veamos.
De acuerdo.
Por lo tanto, volvamos a ésta.
Cierra ésta.
Lo insertamos.
De acuerdo.
Y ahora estamos usando la copia de pantalla.
Veamos si este de aquí funciona ahora.
Así que le di a encriptar.
Y tres, dos, uno.
De acuerdo.
Se estrelló.
Eso es lamentable.
Veamos.
Hay un problema con este puntero.
Y aquí podemos ver decrypt cadena de error detectado, el uso de objeto no válido y cero cuatro.
De acuerdo.
Déjame comprobarlo.
¿Qué he hecho mal?
Sí, lo siento mucho por éste.
Este no es nuestro entero.
Este es nuestro valor de cadena.
Así que tenemos que cambiarlo de 3 a 2.
Y veamos.
Sí, este es nuestro primer parámetro.
Sí.
Así que no estoy seguro de en qué estaba pensando ahora.
De acuerdo.
Pero es bueno verlo.
Sí.
El manejo de esos tres encasillamientos funciona correctamente.
Muy bien, este es nuestro argumento Arg2.
Y el primero es el puntero de entorno de cadena.
Entonces estamos teniendo el este objeto, entonces estamos teniendo nuestra contraseña, que es este.
Y luego tenemos nuestro, nuestro parámetro entero.
Muy bien, vamos a intentarlo una vez más.
Lo siento.
Aquí no.
Por aquí.
El proceso ha muerto por completo.
Bien, entonces tenemos que reiniciarlo.
Estamos utilizando Frida para reiniciarlo.
Bien, aquí lo tenemos.
Y sí, estamos unidos.
Así que ahora lo pego.
Y ahora veamos si esto funciona.
Así que tres, dos, uno.
Ya está.
Udemy App Hacking.
Y esta es nuestra cadena que estamos proporcionando a esta función.
Sí.
Así que ahora podemos ver que estamos teniendo una cadena y nuestro valor entero, quiero decir que es en hexadecimal, pero esto está bien para nosotros
en este momento.
También podríamos typecast esto a un valor entero, o también podríamos utilizar una función como dos int
32 supongo.
Y déjame, déjame comprobar esto.
Si no fuera de esta manera a INT Sí, a int 32 tal vez.
Hagámoslo rápido.
Supongo que así es como podemos convertir esto en un valor entero.
De acuerdo.
Así que empezamos de nuevo.
Y luego veamos.
Sí.
De acuerdo.
Así que ahora también lo tenemos aquí.
Este es nuestro valor entero.
De acuerdo.
Puede consultar esta documentación aquí.
Eso es un tesoro.
Hay muchas cosas aquí.
Y sí, recomiendo encarecidamente leer sobre esto.
Hay muchas cosas y la mayoría son muy complejas.
Soy absolutamente honesto contigo en este punto.
Pero a veces también se pueden tener algunas tomas rápidas como esta, por ejemplo, typecasting y puntero
nativo a un entero.
De acuerdo.
Ahora, yo sabía que este se nombra a entero, pero al menos podríamos encontrar esto en la documentación.
Muy bien.
Derechista.
Bien, ahora también podemos intentar imprimir el valor de retorno aquí en este.
Y vamos a ver esta vez, vamos a hacerlo de esta manera.
Primero imprimámoslo y veamos de qué se trata.
De acuerdo.
Y luego intentamos imprimirlo.
O tal vez no.
Veamos.
Aplicación reiniciada.
Estamos entrando en esto.
Estamos cumpliendo el guión.
Y podemos ver que el valor de retorno es hex 71.
Esto no es ni siquiera parece un puntero más.
¿Verdad?
Y sí, imprimir el valor de retorno es un tema en sí mismo, que trataremos en el próximo vídeo.
Por ahora, nos quedamos con ésta.
Vale, ya hemos visto lo complejo que es imprimir esos valores respecto a la cadena la mayor parte del tiempo, supongo
que apenas todo el tiempo.
Tenemos que encasillarlo, pero podemos ver cómo hacerlo de la siguiente manera.
Impresión de valores enteros.
Ok, esta funciona en una base hexadecimal, pero si, tambien podemos usar esta funcion a entero 32 para imprimir
esto.
De acuerdo.
Por ahora, esto es todo por este vídeo.
En caso de duda.
Como siempre, no dudes en escribirme un mensaje y, por lo demás, espero verte en el próximo
vídeo.
Nos vemos allí.