Редактирование функций эмуляции хост-карты в Android

В настоящее время я разрабатываю проект для своего университетского курса, в котором, надеюсь, буду редактировать функциональность функции HCE Android, чтобы позволить мне установить свой собственный UID при эмуляции карты.

Теперь я загрузил исходный код AOSP, создал собственный образ без отредактированного кода и установил его на свой Nexus 7 (это включает в себя загрузку и включение аппаратных драйверов конкретного поставщика), и я застрял на следующей части.

Я физически не могу найти код устройства, управляющий функциями NFC в Android, и я не знаю, как это сделать: а) искать его и б) как мне следует редактировать этот код.

Есть ли код для NFC в Android в базовом ядре? и если да, то как бы я отредактировал это, прежде чем снова запустить «make» и надеяться, что он соберется? или это в другом месте? Я заметил, что файлы в папке Vendor, которые я загрузил и распаковал, имеют формат .ncd, который, как мне кажется, нельзя редактировать.

Любая помощь, которую я могу получить, будет принята с благодарностью.


person Jay Allen    schedule 09.02.2015    source источник
comment
установить свой собственный UID при эмуляции карты Я некоторое время ищу хороший эмулятор карты, но не нашел ничего действительно полезного. Какое приложение вы используете для эмуляции карты?   -  person Alexandre T.    schedule 06.12.2018


Ответы (2)


В порядке ! Итак, я нашел решение своей проблемы!

На Nexus 7, когда NFC включен, он получает информацию из файла конфигурации в «/etc/» под названием «libnfc-brcm-20791b05.conf».

Внутри этого файла есть параметр NFA_DM_START_UP_CFG.

По умолчанию это выглядит так:

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}

Чтобы отредактировать UID, сгенерированный при эмуляции, вам нужно добавить несколько байтов в конец этого параметра.

Первый байт, который вы добавляете, это 0x33 (это означает, что вы собираетесь вручную установить UID)

Второй добавляемый байт - это длина UID, который вы хотите установить (это может быть 4,7 или 10 байт, поэтому этот второй байт может быть 0x04, 0x07 или 0x0A)

Следующие байты - это идентификатор, который вы хотите установить! (ПРИМЕЧАНИЕ. В зависимости от того, сколько байтов вы добавляете, вы должны изменить первый байт массива, чтобы отразить новый размер массива — он начинается с 42, поэтому, если вы добавили 6 байтов, он должен измениться на 48)

Например, если вы хотите установить 7-байтовый идентификатор 01 02 03 04 05 06 07, новая строка конфигурации будет выглядеть так:

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}

Затем вы можете отправить этот файл конфигурации на ваше устройство Nexus, используя adb:

-> adb root
-> adb remount
-> adb push libnfc-brcm-20791b05.conf /etc/
-> adb reboot

Это сбросит Nexus с новым файлом конфигурации, и после эмуляции UID теперь будет установлен на 01 02 03 04 05 06 07.

Надеюсь, это поможет любому, кто читает мой вопрос!

person Jay Allen    schedule 25.02.2015
comment
Привет, я попытался исправить UID моего OnePlus One в файле libnfc-brcm.conf, но, похоже, это не работает... :( У вас есть идеи о правильной конфигурации для OnePlus? - person Spawnrider; 22.06.2015
comment
Может ли Android сделать это с эмуляцией карты? - person muyiou; 13.06.2017

Стек Android NFC в основном разделен на пять частей:

  • Драйвер устройства с интерфейсом NFC. Это часть ядра. В двух словах, этот драйвер просто туннелирует кадры данных (например, кадры протокола NCI) между файлом символьного устройства и оборудованием контроллера NFC. Вам не придется прикасаться к этой части для вашего проекта.

  • Библиотека низкоуровневого интерфейса, написанная на C (libnfc-nci или libnfc-nxp для устройств с NFC-контроллером NXP PN544) . Эта библиотека предоставляет набор высокоуровневых функций для взаимодействия с контроллером NFC. Таким образом, он в основном переводит функциональность высокого уровня (например, «начать опрос для технологий X, Y и Z») в команды NCI, которые отправляются на контроллер NFC через драйвер ядра. Это, безусловно, то место, где вам нужно будет добавить модификации. Поскольку это часть AOSP, вы можете скомпилировать его, используя обычную систему сборки AOSP.

  • Библиотека интерфейса JNI, написанная на C++ (libnfc_nci_jni) . Этот слой соединяет библиотеку C libnfc-nci с высокоуровневым кодом Java. Если вы хотите изменить эмулируемый UID из приложений Android, это, безусловно, то место, где вам нужно будет добавить модификации. Поскольку это часть AOSP, вы можете скомпилировать его, используя обычную систему сборки AOSP.

  • системная служба NFC для Android, написанная на Java. Эта служба берет на себя управление всем стеком NFC и реализует высокоуровневую функциональность на основе ресурсов, предоставляемых libnfc-nci. Если вы хотите изменить эмулируемый UID из приложений Android, это, безусловно, то место, где вам нужно будет добавить модификации. Поскольку это часть AOSP, вы можете скомпилировать его, используя обычную систему сборки AOSP.

  • базовая платформа для Android предоставляет API для функциональности системной службы NFC, к которой могут обращаться приложения Android.

Что касается настройки/изменения эмулируемого UID, вам наверняка захочется взглянуть на эти проекты, которые я недавно опубликовал на GitHub (хотя они все еще находятся в стадии разработки):

person Michael Roland    schedule 09.02.2015