Итак, я изнасиловал новый
Alcatel 4033D.
eMMC
KMN5X000ZM-B209, OTP прописана и залочена.
Форматирую тело через FT, снимаю флеш, ставлю на колодку, читаю образ ROM1 EasyJTAG'ом.
Код:
eMMC Device Information
EMMC CID : 1501004E35585A4D4201A2B9DE55916C
EMMC CSD : D02701320F5903FFF6DBFFEF8E40400C
EMMC Manufacturer ID: 0015 , OEM ID: 0100
EMMC Date: 09/2014 Rev.0x1
EMMC NAME: N5XZMB , S/N: 2730090069
EMMC NAME (HEX): 4E35585A4D4200
EMMC ROM1 (Main User Data) Capacity: 3728 MB
EMMC ROM2 (Boot Partition 1) Capacity: 4096 kB
EMMC ROM3 (Boot Partition 2) Capacity: 4096 kB
EMMC RPMB (Replay Protected Memory Block) Capacity: 512 kB
EMMC Permanent Write Protection: No
EMMC Temporary Write Protection: No
Extended CSD rev 1.7 (MMC 5.0)
Boot configuration [PARTITION_CONFIG: 0x48] Boot from:ROM2 (Boot Partition 1)
Boot bus config [177]: 0x00 , width 1bit , Partition config [179]: 0x48.
H/W reset function [RST_N_FUNCTION]: 0x01
High-capacity W protect group size [HC_WP_GRP_SIZE: 0x00]
Partitioning Support [PARTITIONING_SUPPORT]: 0x07
Device support partitioning feature
Device can have enhanced tech.
Partitioning Setting [PARTITION_SETTING_COMPLETED]: 0x00
Backup saved: N5XZMB_2730090069_20161211_1550.extcsd
=============================================
Extended CSD rev 1.7 (MMC 5.0)
=============================================
Card Supported Command sets [S_CMD_SET: 0x01]
HPI Features [HPI_FEATURE: 0x01]:
implementation based on CMD13
Background operations support [BKOPS_SUPPORT: 0x01]
Max Packet Read Cmd [MAX_PACKED_READS: 0x3f]
Max Packet Write Cmd [MAX_PACKED_WRITES: 0x3f]
Data TAG support [DATA_TAG_SUPPORT: 0x01]
Data TAG Unit Size [TAG_UNIT_SIZE: 0x04]
Tag Resources Size [TAG_RES_SIZE: 0x00]
Context Management Capabilities [CONTEXT_CAPABILITIES: 0x05]
Large Unit Size [LARGE_UNIT_SIZE_M1: 0x07]
Extended partition attribute support [EXT_SUPPORT: 0x03]
Generic CMD6 Timer [GENERIC_CMD6_TIME: 0x0a]
Power off notification [POWER_OFF_LONG_TIME: 0x3c]
Cache Size [CACHE_SIZE] is 65536 KiB
Background operations status [BKOPS_STATUS: 0x00]
1st Initialisation Time after programmed sector [INI_TIMEOUT_AP: 0x1e]
Power class for 52MHz, DDR at 3.6V [PWR_CL_DDR_52_360: 0x00]
Power class for 52MHz, DDR at 1.95V [PWR_CL_DDR_52_195: 0x00]
Power class for 200MHz at 3.6V [PWR_CL_200_360: 0x00]
Power class for 200MHz, at 1.95V [PWR_CL_200_195: 0x00]
Minimum Performance for 8bit at 52MHz in DDR mode:
[MIN_PERF_DDR_W_8_52: 0x00]
[MIN_PERF_DDR_R_8_52: 0x00]
TRIM Multiplier [TRIM_MULT: 0x02]
Secure Feature support [SEC_FEATURE_SUPPORT: 0x55]
Boot Information [BOOT_INFO: 0x07]
Device supports alternative boot method
Device supports dual data rate during boot
Device supports high speed timing during boot
Boot partition size [BOOT_SIZE_MULTI: 0x20]
Access size [ACC_SIZE: 0x06]
High-capacity erase unit size [HC_ERASE_GRP_SIZE: 0x01]
High-capacity erase timeout [ERASE_TIMEOUT_MULT: 0x01]
Reliable write sector count [REL_WR_SEC_C: 0x01]
High-capacity W protect group size [HC_WP_GRP_SIZE: 0x10]
Sleep current (VCC) [S_C_VCC: 0x07]
Sleep current (VCCQ) [S_C_VCCQ: 0x07]
Sleep/awake timeout [S_A_TIMEOUT: 0x11]
Sector Count [SEC_COUNT: 0x00748000]
Minimum Write Performance for 8bit:
[MIN_PERF_W_8_52: 0x00]
[MIN_PERF_R_8_52: 0x00]
[MIN_PERF_W_8_26_4_52: 0x00]
[MIN_PERF_R_8_26_4_52: 0x00]
Minimum Write Performance for 4bit:
[MIN_PERF_W_4_26: 0x00]
[MIN_PERF_R_4_26: 0x00]
Power classes registers:
[PWR_CL_26_360: 0x00]
[PWR_CL_52_360: 0x00]
[PWR_CL_26_195: 0x00]
[PWR_CL_52_195: 0x00]
Partition switching timing [PARTITION_SWITCH_TIME: 0x01]
Out-of-interrupt busy timing [OUT_OF_INTERRUPT_TIME: 0x05]
I/O Driver Strength [DRIVER_STRENGTH: 0x1f]
Card Type [CARD_TYPE: 0x57]
CSD structure version [CSD_STRUCTURE: 0x02]
Command set [CMD_SET: 0x00]
Command set revision [CMD_SET_REV: 0x00]
Power class [POWER_CLASS: 0x00]
High-speed interface timing [HS_TIMING: 0x00]
Erased memory content [ERASED_MEM_CONT: 0x00]
Boot configuration bytes [PARTITION_CONFIG: 0x48]
No access to boot partition
Boot config protection [BOOT_CONFIG_PROT: 0x00]
Boot bus Conditions [BOOT_BUS_CONDITIONS: 0x00]
High-density erase group definition [ERASE_GROUP_DEF: 0x00]
Boot write protection status registers [BOOT_WP_STATUS]: 0x00
Boot Area Write protection [BOOT_WP]: 0x00
Power ReadOnly locking: possible
Permanent ReadOnly locking: possible
Read Only lock status: not locked
User area write protection register [USER_WP]: 0x00
FW configuration [FW_CONFIG]: 0x00
RPMB Size [RPMB_SIZE_MULT]: 0x04
Write reliability setting register [WR_REL_SET]: 0x1f
Write reliability parameter register [WR_REL_PARAM]: 0x04
Enable background operations handshake [BKOPS_EN]: 0x00
H/W reset function [RST_N_FUNCTION]: 0x01
HPI management [HPI_MGMT]: 0x00
Partitioning Support [PARTITIONING_SUPPORT]: 0x07
Device support partitioning feature
Device can have enhanced tech.
Max Enhanced Area Size [MAX_ENH_SIZE_MULT]: 0x00009b
Partitions attribute [PARTITIONS_ATTRIBUTE]: 0x00
Partitioning Setting [PARTITION_SETTING_COMPLETED]: 0x00
General Purpose Partition Size [GP_SIZE_MULT_4]: 0x000000
[GP_SIZE_MULT_3]: 0x000000
[GP_SIZE_MULT_2]: 0x000000
[GP_SIZE_MULT_1]: 0x000000
Enhanced User Data Area Size [ENH_SIZE_MULT]: 0x000000
Enhanced User Data Start Address [ENH_START_ADDR]: 0x000000
Bad Block Management mode [SEC_BAD_BLK_MGMNT]: 0x00
Periodic Wake-up [PERIODIC_WAKEUP]: 0x00
Program CID/CSD in DDR mode support [PROGRAM_CID_CSD_DDR_SUPPORT]: 0x01
Vendor Specific Fields [VENDOR_SPECIFIC_FIELD[127]]: 0x00
Vendor Specific Fields [VENDOR_SPECIFIC_FIELD[126]]: 0x00
Vendor Specific Fields [VENDOR_SPECIFIC_FIELD[125]]: 0x00
Vendor Specific Fields [VENDOR_SPECIFIC_FIELD[124]]: 0x00
Vendor Specific Fields [VENDOR_SPECIFIC_FIELD[123]]: 0x00
Vendor Specific Fields [VENDOR_SPECIFIC_FIELD[122]]: 0x00
Vendor Specific Fields [VENDOR_SPECIFIC_FIELD[121]]: 0x21
Vendor Specific Fields [VENDOR_SPECIFIC_FIELD[120]]: 0x19
Vendor Specific Fields [VENDOR_SPECIFIC_FIELD[119]]: 0x00
Vendor Specific Fields [VENDOR_SPECIFIC_FIELD[118]]: 0x00
Vendor Specific Fields [VENDOR_SPECIFIC_FIELD[117]]: 0x00
Vendor Specific Fields [VENDOR_SPECIFIC_FIELD[116]]: 0x00
Vendor Specific Fields [VENDOR_SPECIFIC_FIELD[115]]: 0x00
Vendor Specific Fields [VENDOR_SPECIFIC_FIELD[114]]: 0x01
Vendor Specific Fields [VENDOR_SPECIFIC_FIELD[113]]: 0x00
Vendor Specific Fields [VENDOR_SPECIFIC_FIELD[112]]: 0x00
Vendor Specific Fields [VENDOR_SPECIFIC_FIELD[111]]: 0x00
Vendor Specific Fields [VENDOR_SPECIFIC_FIELD[110]]: 0xa0
Vendor Specific Fields [VENDOR_SPECIFIC_FIELD[109]]: 0x00
Vendor Specific Fields [VENDOR_SPECIFIC_FIELD[108]]: 0x00
Vendor Specific Fields [VENDOR_SPECIFIC_FIELD[107]]: 0x00
Vendor Specific Fields [VENDOR_SPECIFIC_FIELD[106]]: 0x00
Vendor Specific Fields [VENDOR_SPECIFIC_FIELD[105]]: 0x00
Vendor Specific Fields [VENDOR_SPECIFIC_FIELD[104]]: 0x00
Vendor Specific Fields [VENDOR_SPECIFIC_FIELD[103]]: 0x00
Vendor Specific Fields [VENDOR_SPECIFIC_FIELD[102]]: 0x00
Vendor Specific Fields [VENDOR_SPECIFIC_FIELD[101]]: 0x00
Vendor Specific Fields [VENDOR_SPECIFIC_FIELD[100]]: 0x00
Vendor Specific Fields [VENDOR_SPECIFIC_FIELD[99]]: 0x00
Vendor Specific Fields [VENDOR_SPECIFIC_FIELD[98]]: 0x00
Vendor Specific Fields [VENDOR_SPECIFIC_FIELD[97]]: 0x00
Vendor Specific Fields [VENDOR_SPECIFIC_FIELD[96]]: 0x00
Vendor Specific Fields [VENDOR_SPECIFIC_FIELD[95]]: 0x00
Vendor Specific Fields [VENDOR_SPECIFIC_FIELD[94]]: 0x00
Vendor Specific Fields [VENDOR_SPECIFIC_FIELD[93]]: 0x00
Vendor Specific Fields [VENDOR_SPECIFIC_FIELD[92]]: 0x00
Vendor Specific Fields [VENDOR_SPECIFIC_FIELD[91]]: 0x00
Vendor Specific Fields [VENDOR_SPECIFIC_FIELD[90]]: 0x00
Vendor Specific Fields [VENDOR_SPECIFIC_FIELD[89]]: 0x00
Vendor Specific Fields [VENDOR_SPECIFIC_FIELD[88]]: 0x00
Vendor Specific Fields [VENDOR_SPECIFIC_FIELD[87]]: 0x00
Vendor Specific Fields [VENDOR_SPECIFIC_FIELD[86]]: 0x00
Vendor Specific Fields [VENDOR_SPECIFIC_FIELD[85]]: 0x00
Vendor Specific Fields [VENDOR_SPECIFIC_FIELD[84]]: 0x00
Vendor Specific Fields [VENDOR_SPECIFIC_FIELD[83]]: 0x00
Vendor Specific Fields [VENDOR_SPECIFIC_FIELD[82]]: 0x00
Vendor Specific Fields [VENDOR_SPECIFIC_FIELD[81]]: 0x00
Vendor Specific Fields [VENDOR_SPECIFIC_FIELD[80]]: 0x00
Vendor Specific Fields [VENDOR_SPECIFIC_FIELD[79]]: 0x00
Vendor Specific Fields [VENDOR_SPECIFIC_FIELD[78]]: 0x00
Vendor Specific Fields [VENDOR_SPECIFIC_FIELD[77]]: 0x00
Vendor Specific Fields [VENDOR_SPECIFIC_FIELD[76]]: 0x00
Vendor Specific Fields [VENDOR_SPECIFIC_FIELD[75]]: 0x00
Vendor Specific Fields [VENDOR_SPECIFIC_FIELD[74]]: 0x00
Vendor Specific Fields [VENDOR_SPECIFIC_FIELD[73]]: 0x00
Vendor Specific Fields [VENDOR_SPECIFIC_FIELD[72]]: 0x00
Vendor Specific Fields [VENDOR_SPECIFIC_FIELD[71]]: 0x00
Vendor Specific Fields [VENDOR_SPECIFIC_FIELD[70]]: 0x00
Vendor Specific Fields [VENDOR_SPECIFIC_FIELD[69]]: 0x00
Vendor Specific Fields [VENDOR_SPECIFIC_FIELD[68]]: 0x00
Vendor Specific Fields [VENDOR_SPECIFIC_FIELD[67]]: 0x00
Vendor Specific Fields [VENDOR_SPECIFIC_FIELD[66]]: 0x00
Vendor Specific Fields [VENDOR_SPECIFIC_FIELD[65]]: 0x00
Vendor Specific Fields [VENDOR_SPECIFIC_FIELD[64]]: 0x0f
Native sector size [NATIVE_SECTOR_SIZE]: 0x00
Sector size emulation [USE_NATIVE_SECTOR]: 0x00
Sector size [DATA_SECTOR_SIZE]: 0x00
1st initialization after disabling sector size emulation [INI_TIMEOUT_EMU]: 0x00
Class 6 commands control [CLASS_6_CTRL]: 0x00
Number of addressed group to be released[DYNCAP_NEEDED]: 0x00
Exception events control [EXCEPTION_EVENTS_CTRL]: 0x0000
Exception events status[EXCEPTION_EVENTS_STATUS]: 0x0000
Extended Partitions Attribute [EXT_PARTITIONS_ATTRIBUTE]: 0x0000
Context configuration [CONTEXT_CONF[51]]: 0x00
Context configuration [CONTEXT_CONF[50]]: 0x00
Context configuration [CONTEXT_CONF[49]]: 0x00
Context configuration [CONTEXT_CONF[48]]: 0x00
Context configuration [CONTEXT_CONF[47]]: 0x00
Context configuration [CONTEXT_CONF[46]]: 0x00
Context configuration [CONTEXT_CONF[45]]: 0x00
Context configuration [CONTEXT_CONF[44]]: 0x00
Context configuration [CONTEXT_CONF[43]]: 0x00
Context configuration [CONTEXT_CONF[42]]: 0x00
Context configuration [CONTEXT_CONF[41]]: 0x00
Context configuration [CONTEXT_CONF[40]]: 0x00
Context configuration [CONTEXT_CONF[39]]: 0x00
Context configuration [CONTEXT_CONF[38]]: 0x00
Context configuration [CONTEXT_CONF[37]]: 0x00
Packed command status [PACKED_COMMAND_STATUS]: 0x00
Packed command failure index [PACKED_FAILURE_INDEX]: 0x00
Power Off Notification [POWER_OFF_NOTIFICATION]: 0x00
Control to turn the Cache ON/OFF [CACHE_CTRL]: 0x00
Searching for partition tables...
Partitioning not detected...
Никаких GP-разделов, как видим, на ней нет. Таблицы софтовых разделов MBR тоже нет, она стерта. А вот OTP-область действительно есть и находится внутри ROM1 по адресам
0x0E5000000 - 0x0E57FFFFF, (8 мегабайт),
см. скриншоты 1-3. Там имеются IMEI платы и туда невозможно ничего стереть/записать -
Block verify fail! За пределами этого участка все пишется-читается,
см. скриншот 4.
Начинаю мучения:
1. Выполняю MoviNAND Format + Reset и читаю этот блок еще раз.
Данные из OTP пропали! Кроме того, теперь этот блок стал прописываться тестовым файлом без ошибок: вся OTP-область исчезла как не бывало. Стало быть,
с завода ее там не было, появилась позже.
2. Ставлю eMMC обратно на плату, вливаю фулл, считанный с нее до формата, читаю OTP через флештул - и вижу что IMEI на месте. Содержимое OTP влилось из фулла, а ее адреса флештул получил из scatter:
Код:
- partition_index: SYS21
partition_name: OTP
file_name: NONE
is_download: false
type: NORMAL_ROM
linear_start_addr: 0xFFFF0200
physical_start_addr: 0xFFFF0200
partition_size: 0x2B00000
region: EMMC_USER
storage: HW_STORAGE_EMMC
boundary_check: false
is_reserved: true
operation_type: RESERVED
reserve: 0x00
...однако, этот
0xFFFF0200 мало того что не соответствует
0xE5000000 даже близко, так еще и находится за пределами 3728Мб, имеющихся в ROM1. Равно как и размер 0x2B00000 (43Mb) не совпадает с экспериментально найденным 8Mb. Эти адреса в скаттере явно не прямые. Кстати,
OTP-область теперь не залочена и принимает файлы на запись.
3. Меняю этот адрес на 0xFFFF0100, выбираю в FT новый скаттер, пишу туда некий блок данных, читаю - совпадает. Кажись, я только что создал новую OTP-зону. "Старая" OTP при этом на месте и читается при выборе старого scatter.
4. Делаю Format Whole Flash - данные из обеих (незакрытых) OTP исчезли.
5. Повторяю пункты 3-4, но закрыв обе OTP после записи (закрывались они независимо друг от друга, то есть, после закрытия первой, вторая еще давала себя переписывать - похоже, создались две совершенно разные зоны). Теперь данные из обеих OTP остались.
6. Залил фулл, включил тело. IMEI на месте, то есть мусорные данные из "второй OTP" модемом игнорируются.
7. Проверяю эту ерунду с адресами. Снова снимаю eMMC и на колодку, посмотрим, где теперь окажутся обе OTP.
Первая - на прежнем месте и прежней длины. Вторая нашлась по адресам
0x0E7000000 - 0xE7800000 (снова 8 мегабайт). То есть, несмотря на то что я
уменьшил адрес второй OTP в скаттере на 0x100, по факту она оказалась на
32 мегабайта дальше первой. Похоже, тамошний адрес еще и инвертированный, отсчитывается от
конца ROM1.
8. Теперь посмотрим, не попадают ли эти зоны в какой-нибудь из логических разделов телефона. Адрес 0xE5000000 это 3664-й мегабайт, то есть самый конец ROM1, за 64 мегабайта до границы раздела. Последний раздел USERDATA по scatter имеет адрес 0x5D680000 и длину 0x88200000, то есть оканчивается на 0xE5880000. Однако, из этого числа нужно вычесть 8,5 мегабайт (0x880000) т.к. вначале идут ROM2(4Мб) + ROM3(4Мб) + RPMB(512к). 0xE5880000 - 0x880000 =
0xE500000. Получается,
OTP-зоны начинаются байт-в-байт сразу за Userdata и расположены дальше, в небольшом "зазоре" между ней и границей ROM1.
Итого выяснено:
1. OTP-зона является частью стандарта JEDEC и создается/читается флештулом по спецадресам в scatter-файле прошивки. Новые eMMC такой зоны не имеют.
2 У OTP-зоны отсутствуют какие-либо сигнатуры: она начинается сразу с записанных в нее данных. До и после этих данных сплошные нули.
3. Под нее отводится самый хвост раздела ROM1; логические разделы прошивок намеренно обходят это место.
4. OTP-зона может быть определена только в scatter и не создаваться в виде отдельного логического раздела, то есть отсутствовать в MBR/EBR/GPT/PMT аппарата.
5. На одной eMMC можно создать несколько OTP-зон с независимыми состояниями. Модем аппарата ищeт нужную по вшитым в него адресам, совпадающим с адресами в scatter.
6. Закрытая OTP-зона может быть стерта форматом либо обновлением прошивки контроллера на eMMC Samsung. Недавно введенный Universal Format для флешек других производителей еще предстоит проверить.
Осталось выяснить:
1. Как адрес 0xFFFF0200 из scatter переводится в "отступить 64 мегабайта от границы ROM1"?
2. Каким образом определяется размер создаваемой OTP-зоны? Длина в scatter не соответствует фактически создаваемой, равно как и формулe HC_WP_GRP_SIZE * 512k. Пока что встречались значения 4Мб и 8Мб.
3. Как и какими средствами внутри eMMC прописываются границы OTP-зоны? Какими регистрами и где? Можно ли их сбросить?
P.S. NoName, eMMC Tool Suite льет прошивку на основе scatter НЕПРАВИЛЬНО! Она пихает прелоадер в ROM1. Бокс на букву М отрабатывает такой же скаттер корректно, надо и иксам исправить.