Funcionalidad de edición de la emulación de tarjeta host en Android
kernel nfc (2)
La pila NFC de Android se divide básicamente en cinco partes:
-
El controlador del dispositivo de interfaz NFC. Esto es parte del núcleo. En pocas palabras, este controlador simplemente tuneliza tramas de datos (por ejemplo, tramas de protocolo NCI) entre un archivo de dispositivo de caracteres y el hardware del controlador NFC. No tendrá que tocar esa parte para su proyecto.
-
La biblioteca de interfaz de bajo nivel escrita en C ( libnfc-nci , o libnfc-nxp para dispositivos con controlador NFC PN544 NFC). Esta biblioteca proporciona un conjunto de funciones de alto nivel para interactuar con el controlador NFC. Por lo tanto, básicamente traduce la funcionalidad de alto nivel (por ejemplo, "iniciar el sondeo de las tecnologías X, Y y Z") en comandos NCI que se envían al controlador NFC a través del controlador del núcleo. Este es ciertamente un lugar donde necesitará agregar modificaciones. Como es parte de AOSP, puede compilarlo usando el sistema de compilación normal de AOSP.
-
La biblioteca de la interfaz JNI escrita en C ++ ( libnfc_nci_jni ). Esta capa conecta la biblioteca libnfc-nci C con código Java de alto nivel. Si desea modificar el UID emulado de las aplicaciones de Android, este es sin duda un lugar donde deberá agregar modificaciones. Como es parte de AOSP, puede compilarlo usando el sistema de compilación normal de AOSP.
-
El servicio del sistema Android NFC escrito en Java. Este servicio toma el control de toda la pila NFC e implementa la funcionalidad de alto nivel basada en los recursos proporcionados por libnfc-nci. Si desea modificar el UID emulado de las aplicaciones de Android, este es sin duda un lugar donde deberá agregar modificaciones. Como es parte de AOSP, puede compilarlo usando el sistema de compilación normal de AOSP.
-
El marco central de Android proporciona una API para la funcionalidad del servicio del sistema NFC al que pueden acceder las aplicaciones de Android.
Con respecto a la configuración / modificación del UID emulado, seguramente querrá echar un vistazo a estos proyectos que publiqué recientemente en GitHub (aunque todavía están en progreso):
Actualmente estoy en el proceso de desarrollar un proyecto para mi curso universitario en el que espero editar la funcionalidad de la función HCE de Android para permitirme configurar mi propio UID al emular una tarjeta.
Ahora, descargué la fuente de AOSP, construí una imagen personalizada sin código editado y la instalé en mi Nexus 7 (esto incluye la descarga e incluye los controladores de hardware específicos del proveedor), y estoy atascado en la siguiente parte.
Físicamente no puedo encontrar el código del dispositivo que rige las funciones NFC de Android, y no estoy seguro de cómo hacerlo a) Buscarlo, yb) Cómo debería editar este código.
¿Está el código para NFC en Android en el Kernel base? y si es así, ¿cómo editaría eso antes de ejecutar "make" nuevamente y espero que se desarrolle? o es en otra parte? Me di cuenta de que los archivos en la carpeta del proveedor que descargué y extraje están en formato .ncd, lo que no creo que sea editable.
Cualquier ayuda que pueda obtener sobre esto sería muy apreciada.
Okay ! ¡Así que he encontrado una solución al problema que estaba teniendo!
En el Nexus 7, cuando se enciende el NFC, obtiene su información de un archivo de configuración en "/ etc /" llamado "libnfc-brcm-20791b05.conf"
Dentro de este archivo hay un parámetro llamado "NFA_DM_START_UP_CFG"
Por defecto, se ve así:
NFA_DM_START_UP_CFG={42:CB:01:01:A5:01:01:CA:14:00:00:00:00:0E:C0:D4:01:00:0F:00:00:00:00:C0:C6:2D:00:14:0A:B5:03:01:02:FF:80:01:01:C9:03:03:0F:AB:5B:01:00:B2:04:E8:03:00:00:CF:02:02:08:B1:06:00:20:00:00:00:12:C2:02:01:C8}
Para editar el UID que se genera en la emulación, debe agregar algunos bytes al final de este parámetro.
El primer byte que agrega es 0x33 (Esto significa que va a configurar manualmente el UID)
El segundo byte que se agrega es la longitud del UID que desea establecer (puede ser 4,7 o 10 bytes, por lo que este segundo byte puede ser 0x04, 0x07 o 0x0A)
¡Los siguientes bytes son la ID que desea establecer! (NOTA: Dependiendo de cuántos Bytes agregue, debe cambiar el primer byte de la matriz para reflejar el nuevo tamaño de la matriz; comienza en 42, por lo que si agrega 6 bytes, debería cambiar a 48)
Por ejemplo, si desea establecer una ID de 7 bytes de 01 02 03 04 05 06 07, la nueva línea de configuración se vería así:
NFA_DM_START_UP_CFG={4B:CB:01:01:A5:01:01:CA:14:00:00:00:00:0E:C0:D4:01:00:0F:00:00:00:00:C0:C6:2D:00:14:0A:B5:03:01:02:FF:80:01:01:C9:03:03:0F:AB:5B:01:00:B2:04:E8:03:00:00:CF:02:02:08:B1:06:00:20:00:00:00:12:C2:02:01:C8:33:07:01:02:03:04:05:06:07}
Luego puede enviar este archivo de configuración a su dispositivo nexus usando adb:
-> adb root
-> adb remount
-> adb push libnfc-brcm-20791b05.conf /etc/
-> adb reboot
Esto restablecerá el Nexus con el nuevo archivo de configuración y, tras la emulación, el UID ahora se establecerá en 01 02 03 04 05 06 07
Espero que esto ayude a cualquiera que lea mi pregunta.