Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

Unidad 4 - Actividad 4

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 15

Centro Integrado de Formación Profesional

AVILÉS
Principado de Asturias

UNIDAD 4:
DETECCIÓN DE PROBLEMAS DE SEGURIDAD
EN APLICACIONES PARA DISPOSITIVOS
MÓVILES
ACTIVIDAD 4

PUESTA EN PRODUCCIÓN SEGURA

C.E. CIBERSEGURIDAD EN ENTORNOS DE LAS TECNOLOGÍAS DE LA INFORMACIÓN


Centro Integrado de Formación Profesional Avilés
Puesta en Producción Segura ACTIVIDAD 4
Unidad 4: Detección de problemas de seguridad en aplicaciones para dispositivos móviles

Enunciado de la actividad

1. PRIMER PROYECTO ANDROID STUDIO

En este apartado se pretende comenzar a trabajar con Android Studio con el fin de
familiarizarse con el entorno de desarrollo. Para ello, se va a realizar la aplicación estándar de
iniciación por excelencia: un “Hola, mundo”.

Como prerrequisito de esta actividad, es precioso que Android Studio esté instalado,
actualizado y configurado. A partir de aquí, se siguen los pasos que se enumeran a
continuación:

1. Seleccionar File > New Project...


2. Hay que especificar para qué plataforma se quiere desarrollar (Teléfonos y tabletas, Wear
OS, TV, etc...) y el tipo de actividad inicial de la aplicación. Se elige en este primer ejemplo
Phone and Tablet > Empty Views Activity.
Página 2
Centro Integrado de Formación Profesional Avilés
Puesta en Producción Segura ACTIVIDAD 4
Unidad 4: Detección de problemas de seguridad en aplicaciones para dispositivos móviles

2. Una vez pulsado Next, el asistente lleva a los detalles del proyecto, los cuales se describen a
continuación:

• Name: Es el nombre de la aplicación que aparecerá en el dispositivo Android. Tanto en


la barra superior, cuando esté en ejecución, como en el icono que se instalará en el menú
de programas. En el ejemplo, se llamará HolaMundoXX (siendo XX el número del
usuario ciberXX utilizado en otras actividades).
• Package name: Nombre de paquete de la aplicación. Las clases Java creadas
pertenecerán a este paquete. Además, el nombre del paquete también es utilizado por
Android para múltiples funciones; por ejemplo, para determinar en qué directorio se
instala la aplicación. El paquete debe ser nombrado como es.usuario.holamundo
(usuario representa al de dominio de informatica.cifpaviles.pa).
• Nota sobre Java/Kotlin: El nombre del paquete debe ser único en todos los paquetes
instalados en un sistema. Por ello, cuando se quiera distribuir una aplicación, es muy
importante utilizar un dominio que no puedan estar utilizando otras empresas. El
espacio de nombres “com.example” está reservado para la documentación de ejemplos
y nunca puede ser utilizado para distribuir aplicaciones. De hecho, Google Play no
permite publicar una aplicación si su paquete comienza por “com.example”.
• Save location: Permite configurar el directorio donde se almacenarán todos los ficheros
del proyecto.
• Language: Se selecciona Java o Kotlin, según el lenguaje con el que se quiera programar
la aplicación. En este caso, Java.
• Minimum SDK: Este valor especifica el mínimo nivel de la API que requiere la
aplicación. Por lo tanto, la aplicación no podrá ser instalada en dispositivos con una
versión inferior. Es conveniente escoger valores pequeños para que la aplicación pueda
instalarse en la mayoría de los dispositivos. Un valor adecuado puede ser el nivel de
API 16 (v4.1), dado que cubriría prácticamente el 100% de los dispositivos. O el nivel de
API 24 que es el que recomienda por defecto (v7.0) y que se escogerá para este ejemplo.
Escoger valores pequeños para este parámetro tiene un inconveniente: no se podrá
utilizar ninguna de las mejoras que aparezcan en los siguientes niveles de API. Para
ayudar a tomar esta decisión se indica en negrita el porcentaje de dispositivo donde se
podrá instalar la aplicación. En Help Me choose se puede visualizar una gráfica donde
se muestra los diferentes niveles de API y el porcentaje de usuarios que podrán
instalarla la aplicación. Además, si se pulsa sobre un nivel te mostrará un resumen con
las nuevas características introducidas en este nivel.
3. Dejar el resto de los valores por defecto y pulsar Finish para crear el proyecto. Debería
estar visible el explorador del proyecto (Project) a la izquierda (nota: el proceso de
creación de proyecto puede llevar varios minutos). Una vez terminada la creación del
proyecto, abrir el fichero MainActivity (en app > java > es.usuario.holamundo). Se
puede observar que la clase MainActivity extiende AppCompactActivity que a su vez
es un descendiente de Activity. Una actividad es una entidad de aplicación que se
utiliza para representar cada una de las pantallas de la aplicación. Es decir, el usuario
Página 3
Centro Integrado de Formación Profesional Avilés
Puesta en Producción Segura ACTIVIDAD 4
Unidad 4: Detección de problemas de seguridad en aplicaciones para dispositivos móviles

interactúa con solo una de estas actividades y va navegando entre ellas. El sistema
llamará al método onCreate() cuando comience su ejecución. Es donde se debe realizar
la inicialización y la configuración de la interfaz del usuario. Las actividades van a ser
las encargadas de interactuar con el usuario.
4. Lo primero que hay que hacer al sobrescribir un método suele ser llamar al método de
la clase de la que hemos heredado. Para referirnos a la clase padre se usa la palabra
reservada super. El método termina indicando que la actividad va a visualizarse en una
determinada vista. Esta vista está definida en los recursos.

Antes de continuar, se van a enumerar y describir una serie de elementos clave que resultan
imprescindibles para desarrollar aplicaciones en Android.

Vista (View)

Las vistas son los elementos que componen la interfaz de usuario de una aplicación: por
ejemplo, un botón o una entrada de texto. Todas las vistas van a ser objetos descendientes
de la clase View, y, por tanto, pueden ser definidas utilizando código Java. Sin embargo, lo
habitual será definir las vistas utilizando un fichero XML y dejar que el sistema cree los
objetos a partir de este fichero. Esta forma de trabajar es muy similar a la definición de una
página web utilizando código HTML.

Layout

Un layout es un conjunto de vistas agrupadas de una determinada forma. Se va a disponer


de diferentes tipos de layouts para organizar las vistas de forma lineal, en cuadrícula o
indicando la posición absoluta de cada vista. Los layouts también son objetos descendientes
de la clase View. Igual que las vistas, los layouts pueden ser definidos en código, aunque la
forma habitual de definirlos es utilizando código XML.

Actividad (Activity)

Una aplicación en Android va a estar formada por un conjunto de elementos básicos de


visualización, coloquialmente conocidos como pantallas de la aplicación. En Android cada
uno de estos elementos, o pantallas, se conoce como actividad. Su función principal es la
creación de la interfaz de usuario. Una aplicación suele necesitar varias actividades para
crear la interfaz de usuario. Las diferentes actividades creadas serán independientes entre
sí, aunque todas trabajarán para un objetivo común. Una actividad se define en una clase
descendiente de Activity y utiliza un layout para que defina su apariencia.
Página 4
Centro Integrado de Formación Profesional Avilés
Puesta en Producción Segura ACTIVIDAD 4
Unidad 4: Detección de problemas de seguridad en aplicaciones para dispositivos móviles

Fragmentos (Fragment)

La llegada de las tabletas vino con el problema de que las aplicaciones de Android ahora
deben soportar pantallas más grandes. Si se diseña una aplicación pensada para un
dispositivo móvil y luego se ejecuta en una tableta, el resultado no suele resultar
satisfactorio.

Para ayudar al diseñador a resolver este problema, en la versión 3.0 de Android aparecen
los fragments. Un fragment está formado por la unión de varias vistas para crear un bloque
funcional de la interfaz de usuario. Una vez creados los fragments, se pueden combinar uno
o varios dentro de una actividad, según el tamaño de pantalla disponible. El uso de
fragments puede ser algo complejo, por lo que es recomendable dominar primero conceptos
como actividad, vista y layout antes de abordar su aprendizaje. No obstante, es un concepto
importante en Android y todo programador en esta plataforma ha de saber utilizarlos.

Servicio (Service)

Un servicio es un proceso que se ejecuta “detrás”, sin la necesidad de una interacción con el
usuario. Es algo parecido a un demonio en Unix o a un servicio en Windows. Se utilizan
cuando se necesita tener en ejecución un código de manera continua, aunque el usuario
cambie de actividad. En Android existen dos tipos de servicios: servicios locales, que son
ejecutados en el mismo proceso, y servicios remotos, que son ejecutados en procesos
separados.

Intención (Intent)

Una intención representa la voluntad de realizar alguna acción; como realizar una llamada
de teléfono, visualizar una página web. Se utiliza cada vez que se necesite:

• Lanzar una actividad


• Lanzar un servicio
• Enviar un anuncio de tipo broadcast
• Comunicarnos con un servicio

Los componentes lanzados pueden ser internos o externos a nuestra aplicación. También
utilizaremos las intenciones para el intercambio de información entre estos componentes.

Receptor de anuncios (Broadcast Receiver)

Un receptor de anuncios recibe anuncios broadcast y reacciona ante ellos. Los anuncios
broadcast pueden ser originados por el sistema (por ejemplo: Batería baja, Llamada
entrante) o por las aplicaciones. Las aplicaciones también pueden crear y lanzar nuevos
Página 5
Centro Integrado de Formación Profesional Avilés
Puesta en Producción Segura ACTIVIDAD 4
Unidad 4: Detección de problemas de seguridad en aplicaciones para dispositivos móviles

tipos de anuncios broadcast. Los receptores de anuncios no disponen de interfaz de usuario,


aunque pueden iniciar una actividad si lo estiman oportuno.

Proveedores de Contenido (Content Provider)

En muchas ocasiones, las aplicaciones instaladas en un terminal Android necesitan


compartir información. Android define un mecanismo estándar para que las aplicaciones
puedan compartir datos sin necesidad de comprometer la seguridad del sistema de
ficheros. Con este mecanismo podremos acceder a datos de otras aplicaciones, como la lista
de contactos, o proporcionar datos a otras aplicaciones.

Creación de dispositivos virtuales (AVD)

Un dispositivo virtual Android (AVD) permite emular en el ordenador diferentes tipos de


dispositivos basados en Android. De esta forma, es posible probar las aplicaciones en una
gran variedad de teléfonos, tabletas, relojes o TV con cualquier versión de Android, tamaño
de pantalla o tipo de entrada.

Para ello, se siguen los pasos a continuación:

1. Pulsar el botón Device Manager.

2. Pulsar a continuación el botón Create Virtual Device para crear un nuevo dispositivo
virtual. Aparecerá una ventana similar a la siguiente:
Página 6
Centro Integrado de Formación Profesional Avilés
Puesta en Producción Segura ACTIVIDAD 4
Unidad 4: Detección de problemas de seguridad en aplicaciones para dispositivos móviles

En la primera columna se puede seleccionar el tipo de dispositivo a emular (Google TV,


móvil, dispositivo wearable, tableta o Auto). A la derecha, se muestran distintos
dispositivos que emulan dispositivos reales de la familia Pixel y también otros
genéricos. Junto al nombre de cada dispositivo, se indica si tiene la posibilidad de
incorporar Google Play, el tamaño de la pantalla en pulgadas, la resolución y el tipo de
densidad gráfica.

3. Pulsar Next para pasar a la siguiente ventana, donde se podrá seleccionar la imagen del
sistema que tendrá el dispositivo y el tipo de procesador (Nexus 5 R API 30 en este
ejemplo):

4. Pulsar Next para pasar a la última ventana. Se mostrará un resumen con las opciones
seleccionadas, permitiendo además seleccionar la orientación inicial del Virtual Device,
si se quiere usar el coprocesador gráfico (GPU) del computador anfitrión o si se dibuja
un marco alrededor del emulador simulando un dispositivo real.
5. En Show Advanced Settings pueden verse configuraciones adicionales.
Página 7
Centro Integrado de Formación Profesional Avilés
Puesta en Producción Segura ACTIVIDAD 4
Unidad 4: Detección de problemas de seguridad en aplicaciones para dispositivos móviles

Es posible hacer que el emulador utilice la cámara o teclado del ordenador además de
limitar la velocidad y latencia en el acceso a la red. También se puede ajustar la memoria
utilizada: RAM total del dispositivo, memoria dinámica usada por Java y memoria para
almacenamiento, tanto interna como externa.
6. Una vez introducida la configuración deseada, pulsar el botón Finish. Aparecerá el
dispositivo creado en la lista.
7. Para arrancarlo, pulsar el botón con forma de triángulo verde que se encuentra en la
columna de la derecha. Es posible que pregunte por la entrada de vídeo para emular la
cámara del AVD.
8. Para modificar el texto por defecto, hay que acudir a la zona de recursos del proyecto,
res > layout y al archivo activity_main.xml
Página 8
Centro Integrado de Formación Profesional Avilés
Puesta en Producción Segura ACTIVIDAD 4
Unidad 4: Detección de problemas de seguridad en aplicaciones para dispositivos móviles

Para ver una imagen similar a la de la figura, hay que abrir la vista de diseño (Design).
Se modifica la propiedad text ignorando el mensaje que muestra sobre que la cadena
está hardcoded (este mensaje deriva de que no es una buena práctica poner el texto tal
cual, pero no es el objetivo de este primer proyecto).
9. Ejecutar el proyecto en el emulador es tan simple como seleccionar primeramente aquel
y lanzar el botón de Run app, tal como se ve en la figura.

Este proceso suele ser muy largo y costoso ya que tiene que lanzar Gradle con una
buena cantidad de subprocesos. Hay que ser muy paciente con ello y en ocasiones, si el
proceso se bloquea, reiniciar Android Studio. Al terminar, el emulador debe mostrar
una salida similar a la de la siguiente figura:
Página 9
Centro Integrado de Formación Profesional Avilés
Puesta en Producción Segura ACTIVIDAD 4
Unidad 4: Detección de problemas de seguridad en aplicaciones para dispositivos móviles

2. LLAMADA A SERVICIO WEB RESTFUL DESDE APP ANDROID

En esta actividad se muestra cómo se puede llamar a un servicio web desde una aplicación
Android desarrollada en Android Studio.

Los servicios web consisten en un sistema de software diseñado para permitir


interoperabilidad entre máquinas dentro de una red. En definitiva, se basan en APIs que son
publicadas, localizadas e invocadas a través de la web; es decir, una vez desarrolladas, son
instaladas en un servidor y otras aplicaciones (u otros servicios web) pueden consumir sus
servicios.

Como norma general, el transporte de los datos se realiza a través del protocolo HTTP y la
representación de los datos mediante sistemas como XML/JSON. Sin embargo, no hay reglas
fijas en los servicios web y en la práctica no tiene por qué ser así.

Al apoyarse sobre el protocolo HTTP, se puede utilizar https además de no presentar


problemas con cortafuegos, ya que utilizan puertos que suelen estar abiertos como el 80, 8080
o 443.

Se pueden dar tres enfoques diferentes a la hora de definir un servicio web. En ellos
precisamente se basa lo que se conocen como arquitecturas orientadas a servicios (SOA –
Service Oriented Arquitecture). Los tres enfoques corresponden a:

• Llamadas a procedimiento remotos (RPC): Se enfoca el servicio web como una colección
de operaciones o procedimientos que pueden ser invocados desde una máquina diferente
de donde se ejecutan.
• SOAP. Protocolo de acceso a objetos sencillos (Simple Object Access Protocolo). Mientras
que, en RPC la unidad básica de interacción es la operación, en SOAP, la unidad de
interacción pasa a ser el mensaje. Por lo tanto, en muchos casos se conocen como servicios
orientados a mensaje. Cada uno de los mensajes que se va a utilizar ha de ser definido
siguiendo una estricta sintaxis expresada en XML.
• Transferencia de estado representacional (REST). En REST se utiliza directamente el
protocolo HTTP, por medio de sus operaciones GET, POST, PUT y DELETE. En
consecuencia, esta arquitectura se centra en la solicitud de recursos, en lugar de las
operaciones o los mensajes de las alternativas anteriores.

Servicios web basados en REST

Este planteamiento supone seguir los principios de la aplicación WWW, pero, en lugar de
solicitar páginas web, se solicitan servicios web.
Página 10
Centro Integrado de Formación Profesional Avilés
Puesta en Producción Segura ACTIVIDAD 4
Unidad 4: Detección de problemas de seguridad en aplicaciones para dispositivos móviles

Los principios básicos de REST son:

• Transporte de datos mediante HTTP, utilizando las operaciones de este protocolo (GET,
POST, PUT y DELETE).
• Los diferentes servicios son invocados mediante una URI que identifica un recurso en
Internet.
• La codificación de datos es identificada mediante tipos MIME (text/html, image/gif, etc.)

Las ventajas más significativas del uso de REST son:

• Mejores tiempos de respuesta y disminución de sobrecarga, tanto en el cliente como en el


servidor.
• Mayor estabilidad frente a futuros cambios.
• Sencillez en el desarrollo de clientes, que sólo han de ser capaces de realizar interacciones
HTTP y codificar información en sistemas tipo XML/JSON.

Ejemplo de llamada a servicio web RESTFUL

En la web https://any-api.com/ se pueden encontrar multitud de servicios en su gran


mayoría de este tipo. Muchos de ellos requieren un token o registro previo. Entre los que
tienen un acceso abierto, está la API de OceanDrivers (https://www.oceandrivers.com/) a la
que se accede mediante el siguiente enlace:
https://api.oceandrivers.com/

Al entrar en la API Documentation y desplegar la lista, se pueden encontrar una serie de


servicios REST que tienen un uso muy sencillo:

Entre los distintos servicios, el primero permite obtener datos sobre una estación
meteorológica de la Aemet en un período dado:
Página 11
Centro Integrado de Formación Profesional Avilés
Puesta en Producción Segura ACTIVIDAD 4
Unidad 4: Detección de problemas de seguridad en aplicaciones para dispositivos móviles

Cuando se pulsa “Try it out!”, la web da una URL de petición de ejemplo preparada para ser
llamada y su correspondiente respuesta. En este caso, esta última está construida en JSON y
tiene un formato muy sencillo.

Ahora viene la parte más compleja, elaborar una aplicación Android que llame al servicio para
obtener los datos de temperatura del aeropuerto de Palma.
Página 12
Centro Integrado de Formación Profesional Avilés
Puesta en Producción Segura ACTIVIDAD 4
Unidad 4: Detección de problemas de seguridad en aplicaciones para dispositivos móviles

Para ello, se va a crear un proyecto con una Empty Views Activity llamado
TestAemetServiceXX (donde XX es el número correspondiente al usuario ciberXX) y sobre
lenguaje Java. Se siguen los pasos a continuación:

1. Eliminar de la activity principal el texto “Hola Mundo” (en layout / activity_main.xml)


2. Añadir un LinearLayout (vertical).
3. Añadir tres Plain Text y un botón con los siguientes identificadores:
a. txtTemp
b. txtPres
c. txtHum
d. btnSubmit (con el texto “Enviar”).

Con estas operaciones queda ajustado el interfaz de usuario, el cual básicamente va a servir
para mostrar tres datos propios del Aeropuerto de Palma: temperatura, presión y humedad.
Todos ellos serán obtenidos del servicio Web mediante una llamada desde el cliente Android
cuando se pulse el botón enviar.

Puesto que para hacer llamadas a los servicios RESTful lo principal es lanzar peticiones HTTP,
para este ejemplo se utilizará una biblioteca para tal fin disponible en Android llamada Volley:
https://developer.android.com/training/volley

Para poder utilizarla, es preciso acudir a los Gradle Scripts en Android Studio y dentro de
build.gradle.kts (Module app) introducir la siguiente línea en el apartado dependencies:

implementation("com.android.volley:volley:1.2.1")

Por lo general, Android Studio utilizará el autocompletado para proporcionar la versión


disponible más actualizada de Volley. A continuación, dentro de la MainActivity, hay que
declarar los tres cuadros de texto y el botón con el fin de hacer referencia posteriormente a
estos controles (hay que realizar los imports propuestos por Android Studio):

public class MainActivity extends AppCompatActivity {

EditText txtTemp, txtPres, txtHum;


Button btnSubmit;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
Dentro del método onCreate, se asocia cada control con el que se ha incluido mediante el
interfaz de usuario de Android Studio (después de las líneas propuestas por el IDE):
Página 13
Centro Integrado de Formación Profesional Avilés
Puesta en Producción Segura ACTIVIDAD 4
Unidad 4: Detección de problemas de seguridad en aplicaciones para dispositivos móviles

txtTemp = findViewById(R.id.txtTemp);
txtPres = findViewById(R.id.txtPres);
txtHum = findViewById(R.id.txtHum);
btnSubmit = findViewById(R.id.btnSubmit);

A continuación, se codifica un método que será el que se encargue de la llamada al servicio


para obtener su información. También en este caso hay que hacer varios imports.

private void getFromService()


{
// URL de llamada al servicio
String url =
"https://api.oceandrivers.com/v1.0/getAemetStation/aeropuertopalma/lastdata/";
// Petición HTTP. Hay que realizar los imports correspondientes a las
clases requeridas.
StringRequest postRequest = new StringRequest(Request.Method.GET, url, new
Response.Listener<String>() {
// Evento lanzado al llegar la respuesta
@Override
public void onResponse(String response) {
try {
// Se crea un objeto de tipo JSON con la respuesta
JSONObject jsonObject = new JSONObject(response);
// A cada texto se le asocia una de los elementos JSON
elegidos.
// En este caso, temperatura, presión y humedad.
txtTemp.setText(jsonObject.getString("TEMPERATURE"));
txtPres.setText(jsonObject.getString("PRESSURE"));
txtHum.setText(jsonObject.getString("HUMIDITY"));
} catch (JSONException e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
// En caso de error, se manda al log.
Log.e("Error", error.getMessage());
}
});
// Se añade la petición a la cola gestionada por Volley.
Volley.newRequestQueue(this).add(postRequest);
}

En el método se explica mediante comentarios el funcionamiento de la llamada y posterior


colocación de la información en cada cuadro de texto. Ahora solo queda que el botón realice
una llamada al método de invocación del servicio, para lo cual se programa su evento clic.

Se introduce el siguiente código en el cuerpo de OnCreate:

btnSubmit.setOnClickListener(new View.OnClickListener() {
@Override
Página 14
Centro Integrado de Formación Profesional Avilés
Puesta en Producción Segura ACTIVIDAD 4
Unidad 4: Detección de problemas de seguridad en aplicaciones para dispositivos móviles

public void onClick(View view) {


getFromService();
}
});

Por último, solo queda darle permisos a la aplicación para conectarse a Internet, lo cual se hace
en el Manifiesto con la siguiente línea anterior a application:
<uses-permission android:name="android.permission.INTERNET" />

3. INGENIERÍA INVERSA CON APKTOOL

Apktool (https://apktool.org/) es una herramienta pare hacer ingeniería inversa con


aplicaciones Android. Es capaz de decodificar recursos acercándose a su formato original y
reconstruirlo después de hacer varias modificaciones. También permite depurar código Smali
paso a paso.

Las aplicaciones Android contienen ficheros .dex (Dalvik EXecutable). Estos ficheros se
pueden decompilar para obtener un código de bajo nivel llamado Dalvik Bytecode. Con
smali/baksmali (ensamblador/desensamblador) se puede obtener una representación en un
lenguaje de bajo nivel con el que se puede trabajar más fácilmente, el cual podría llamarse
código Smali. El código Smali recuerda al código del lenguaje ensamblador, pero en este caso
se ven los nombres de las clases de Java y Android, así como los nombres de los métodos. Pero
a nivel de seguridad, el fichero que más interesa consultar es el Android Manifest, el cual
puede conseguirse en texto plano utilizando la herramienta Apktool. Básicamente su uso más
básico se resume en dos operaciones:
apktool d app.apk

Mediante esta orden se descompila una aplicación en el directorio en el que se lance el


comando. Esta se ubicará en un directorio con el mismo nombre del archivo .apk. Si se realiza
algún cambio en los archivos obtenidos mediante el proceso anterior, se puede recompilar
para obtener un nuevo .apk con las variaciones realizadas (por ejemplo, cambios en el
manifiesto o en los recursos asociados). Esto se realiza mediante la siguiente orden:
apktool b app

Para probar la herramienta, se puede descompilar la aplicación fedex.apk que se utilizó en los
primeros temas para comprobar que no era segura. Se puede descargar del siguiente enlace:
https://github.com/CiberSPEPSAviles/apks/blob/main/fedex.apk

En este caso, se prestará atención al contenido de AndroidManifest.xml para ver sobre qué
elementos tiene permiso la aplicación teniendo en cuenta especialmente aquellos que sean más
críticos.
Página 15

También podría gustarte