Сниффер — специальная программа для анализа и перехвата сетевого трафика, передачи данных через интерфейсы
и многого другого. В данном случае мы будем мониторить операции (чтение и запись) с портами ввода-вывода
на примере телефона линейки Siemens SGold и я постараюсь объяснить, как это всё работает.
Предисловие
У многих сразу вопрос о целесообразности и полезности данной затеи, ведь эти телефоны давно устарели.
Во-первых, давайте будем рассматривать телефон как просто некое устройство, которое имеет микроконтроллер на базе ARM926EJ-S (без документации) и нам хочется сделать свою прошивку для своих нужд, используя полученные данные. Во-вторых, научный интерес!
Теория
Так-с, что мы имеем? А мы имеем микроконтроллер PMB 8875 S-GoldLite на базе процессора Intel, то есть, ARM9. И как у любого нормального микроконтроллера, внутри него сидят устройства и готовые интерфейсы, такие как USART, SSC, I2C, PLL, RTC, таймеры, простите за выражение, EBU (External Bus Unit), и прочие страшные буржуйские аббревиатуры.
I/O порты
Как отмечалось ранее, есть какие-то там устройства и интерфейсы. И в 4-гигабайтном (32 бит же) адресном пространстве им уделены свои диапазоны. Да, адресное пространство нашего микроконтроллера физически разбито на:
0x00000000-0x00003FFF — SRAM #1
0x00080000-0x00097FFF — SRAM #2
0x00400000-0x0040FFFF — BootROM
0xF0000000-0xFFFFFFFF — Порты ввода/вывода, регистры встроенных устройств
А внешнюю оперативную память и ROM можно всунуть на свободный физический адресок c помощью пресловутого EBU.
Так вот, например, для устройства USART0 выделен диапазон F1000000-F1000084.
Выглядит это в рабочем состоянии как-то так:
Каждый WORD (в ARM равен 4 байтам) в этом диапазоне является регистром для управления этим интерфейсом.
То есть, записывая определённые значения в определённые регистры, мы передаём команды или данные устройству,
а считывая с них — получаем данные и проверяем состояния.
Я забыл сказать, что USART0 (Универсальный Синхронный Асинхронный Приёмник и Передатчик) у нас используется как передатчик и приёмник по кабелю, грубо говоря, COM-порт, но с заниженным напряжением.
И давайте подробнее рассмотрим процесс по передаче 1 байта в простейшем случае:
#define USART_REG(a) * ( (unsigned int *) ( a ) )
#define USART0_BASE 0xF1000000
#define USART0_CLC USART0_BASE /* Clock Control Register */
#define USART0_ID USART0_BASE + 0x08 /* Module Identification Register */
#define USART0_CON USART0_BASE + 0x10 /* Control Register */
#define USART0_BG USART0_BASE + 0x14 /* Baudrate Timer Reload Register */
#define USART0_FDV USART0_BASE + 0x18 /* Fractional Divider Register */
#define USART0_TXB USART0_BASE + 0x20 /* Transmit Buffer */
#define USART0_RXB USART0_BASE + 0x24 /* Receive Buffer */
#define USART0_FCSTAT USART0_BASE + 0x68 /* Flowcontrol status register */
#define USART0_ICR USART0_BASE + 0x70
void USART0_InitAndTransmit()
{
unsigned char tx = 0xDD;
// Включаем интерфейс
USART_REG(USART0_CLC) = 0x200;
// Устанавливаем баудрейт с помощью делителей
USART_REG(USART0_BG) = 0x05;
USART_REG(USART0_FDV) = 0xDA;
// Устанавливаем режим работы
USART_REG(USART0_CON) = 0x8811;
// Записываем байт в буфер
USART_REG(USART0_TXB) = tx & 0xFF;
// Ждём пока байт не передастся на конечное устройство
while(!(USART_REG(USART0_FCSTAT) & 2));
// Сбросим флаги прерывания
USART_REG(USART0_ICR) = (USART_REG(USART0_ICR)) | 0x02;
}
Ну, то есть чтобы что-то передать устройству, надо записать в эти чёртовы регистры, ну и считывать с них же, этим и будем пользоваться для перехвата.
MMU и Таблица переадресации
MMU — устройство в микроконтроллере для управления памятью и адресным пространством. Оно может быть включено, а может и нет, но у нас оно работает и устанавливает режимы доступа к различным участкам памяти, и самое интересное — может переадресовывать или зеркалить адреса.
Я заводил речь о физических адресах и всё такое, но ещё существуют и виртуальные, которые можно создать с помощью MMU.
Всё 4-гигабайтное адресное пространство прописывается в маленькой табличке переадресации.
Таблица переадресации — это участок памяти, обычно в SRAM, в которой описано 4096 Мб адресного пространства. И каждая ячейка размером с WORD описывает 1 Мб. Нехитрыми вычислениями можно узнать её размер — 16 Кб. Ещё есть второй уровень таблиц, но не будем лезть в дебри, это необязательно. Так вот, положение ячейки от начала говорит MMU о физическом адресе,
который надо транслировать в виртуальный, значение которого в ней и прописывается. В ячейке также описывают атрибуты этого пространства в 1 Мб — кешированный, буферизированный, режимы доступа. Если ячейка пуста, то есть равна 0x00000000 (ну или хотя бы биты отвечающие за доступность), то адрес, который она должна описывать не существует, и процессор его не увидит.
Для понимания примерчик такой вот таблицы:
Адрес ячейки | Значение | Описание |
---|---|---|
0x0000 | 0x00000C12 | Описывает 0x00000000-0x000FFFFF / RW / Некешир. Небуф. |
0x0004 | 0x00100C12 | Описывает 0x00100000-0x001FFFFF / RW / Некешир. Небуф. |
0x0008 | 0x00200C12 | Описывает 0x00200000-0x002FFFFF / RW / Некешир. Небуф. |
0x000C | 0x00300C12 | Описывает 0x00300000-0x003FFFFF / RW / Некешир. Небуф. |
0x0010 | 0x00400C12 | Описывает 0x00400000-0x004FFFFF / RW / Некешир. Небуф. |
..... | ||
0x3840 | 0xF1000C12 | Зеркалит с 0xF1000000-0xF10FFFFF на 0xE1000000-0xE10FFFFF |
..... | ||
0x3C40 | 0xF1000C12 | Описывает 0xF1000000-0xF10FFFFF / RW / Некешир. Небуф. |
..... | ||
0xFFFC | 0x00000000 | Адреса 0xFFF00000-0xFFFFFFFF процессор не видит |
И да, эту таблицу мы описываем сами и где захотим, в любом участке RAM или Flash, а чтобы MMU знала о ней, необходимо прописать адрес в регистре сопроцессора CP15, но и это для нас не важно.
Векторы прерывания
Прерывания бывают железные (от устройств), программные (через специальные инструкции BKPT и SWI) и от ошибок (исключений).
В результате прерывания процессор, как ни странно, прерывает исполнение инструкций на текущим адресе и переходит на так называемый вектор прерывания, то есть определённый адрес, в зависимости от типа прерывания. И на нём обычно размещается инструкция для перехода на обработчик этого прерывания / исключения.
Рассмотрим эти векторы:
Адрес нижний | Адрес верхний | Вектор | Описание |
---|---|---|---|
0x00000000 | 0xFFFF0000 | Reset | Сброс |
0x00000004 | 0xFFFF0004 | Undefined_Instruction | Неизвестная инструкция |
0x00000008 | 0xFFFF0008 | SWI | Программное прерывание |
0x0000000C | 0xFFFF000C | Prefetch_Abort | Отказ считывания команды |
0x00000010 | 0xFFFF0010 | Data_Abort | Отказ доступа к данным |
0x00000014 | 0xFFFF0014 | RESERVED | Зарезервировано |
0x00000018 | 0xFFFF0018 | IRQ | Железное прерывание |
0x0000001C | 0xFFFF001C | FIQ | Железное прерывание |
В Siemens SGold они выглядят вот так:
Но нас интересует только один вектор Data Abort. Это прерывание возникает, когда процессор пытается совершить
операцию чтения / записи из несуществующего адреса или адреса, к которому в данный момент нет доступа.
Прошивка Siemens SGold использует этот вектор просто как регистрацию ошибки и выключение устройства с характерным звуком.
То есть обработчик, указатель которого находится по адресу 0x00000030, можно безболезненно подменять на свой.
Механизм отслеживания операций чтения/записи
Теперь, когда мы введены в курс дела, можно и рассмотреть, как эта фиговина работает-то.
Обратим свой взор на первую картинку в статье, не побоюсь этого слова, блок-схему.
Взглянем на код ARM — ассемблера (не ищите в нём смысла или законченности):
LDR R1, =0xF4700000 ; Помещение в регистр R1 значения 0xF4700000
LDR R2, [R1, #0x14] ; Чтение в регистр R2 из адреса в регистре R1 + 0x14 (в итоге из адреса 0xF4700014)
BIC R2, R2, #1 ; Очистка 0-го бита в регистре R2
STR R2, [R1, #0x14] ; Запись значения регистра R2 в адрес в регистре R1 + 0x14 (в итоге в адрес 0xF4700014)
MOV R2, #2 ; Помещение в регистр R2 значения 2
Самое интересное начинается на инструкции:
LDR R2, [R1, #0x14] ; Чтение в регистр R2 из адреса в регистре R1 + 0x14 (в итоге из адреса 0xF4700014)
Здесь процессор сначала спрашивает у MMU: «Адрес 0xF4700014 существует ли и есть ли к нему доступ?»
MMU говорит, что да и процессор довольный считывает из адреса и продолжает работу.
Подменяем обработчик исключения Data Abort на свой, для этого достаточно поменять указатель на адресе 0x00000030.
Зеркалим через таблицу переадресации адресное пространство 0xF4700000-0xF47FFFFF на 0xE4700000-0xE47FFFFF,
а подлинный адрес там стираем. Получается что 0xF4700014 — не существует, то есть процессор его не видит, зато есть
0xE4700014 — транслированный (отзеркаленный) с физического адреса 0xF4700014.
Повторяем код, процессор натыкается на ту самую инструкцию, спрашивает о существовании адреса и тут на тебе здрасте, нету!
Паника. В таких случаях процессор прыгает на вектор прерывания и попадает куда? Правильно, в наш обработчик. Мы бережно сохраняем контекст прерванной программы, чтобы ничто не потерялось и не затёрлось.
Далее, идёт эмуляция этой инструкции, но с учётом что адреса-то нету и вместо него надо брать 0xE4700014.
Под эмуляцией имеется: определение местоположения инструкции, анализ того, что она должна делать, собственно это всё и делаем, применяем к контексту (помните, который сохраняли), запишем все данные об операции (адрес инструкции, адрес регистра, значение и тип операции) куда-нибудь, преспокойно восстанавливаем его и направляем процессор на следующую инструкцию.
Если прошивка будет выполнять операции с адресами 0xF4700000-0xF47FFFFF, то неизбежно будет попадать на обработчик, а он, в свою очередь, исправно вести журнал этих операций. Красота же! Правда заместо одной инструкции нужно выполнять огроменный обработчик, но на производительности и работоспособности слабо сказывается.
Реализация механизма
Я думаю, что реализация всего этого — сильно зависит от платформы и этот код никому ничего не даст,
но всё же будет как-то странно без этого. Всё разрабатывалось в среде IAR 4.2
#ifndef __ARM_DEFS_H__
#define __ARM_DEFS_H__
#define WORD(a) * ( (unsigned int *) ( a ) )
#define HWRD(a) * ( (unsigned short *) ( a ) )
#define BYTE(a) * ( (unsigned char *) ( a ) )
#define INS_BIT(i,b) ( ( i >> b )&1 )
#define I32_FIELD(i,b,e) ( ( ( i << ( 31 - b ) ) >> 31 - b ) >> ( e ) )
#define I32_FIELD_FAST(i,e,m) ( ( i >> e ) & m )
#define IARM_COND(i) ( ( i >> 28 )&0xF )
#define IARM_Rn(i) ( ( i >> 16 )&0xF )
#define IARM_Rd(i) ( ( i >> 12 )&0xF )
#define IARM_Rs(i) ( ( i >> 8 )&0xF )
#define IARM_Rm(i) ( ( i >> 0 )&0xF )
#define IARM_ImmHi(i) ( ( i >> 16 )&0xF )
#define IARM_ImmLo(i) ( ( i >> 0 )&0xF )
#define IARM_Imm12(i) ( ( i >> 0 )&0xFFF )
#define IARM_ShiftImm(i) I32_FIELD_FAST(i,7,0x1F)
#define IARM_Shift(i) I32_FIELD_FAST(i,5,3)
#define IARM_Shift_LSL 0
#define IARM_Shift_LSR 1
#define PC_ALIGN(pc) (pc & 0xFFFFFFFE)
#define MAX_REGS 17
#define _R0 0
#define _R1 1
#define _R2 2
#define _R3 3
#define _R4 4
#define _R5 5
#define _R6 6
#define _R7 7
#define _R8 8
#define _R9 9
#define _R10 10
#define _R11 11
#define _R12 12
#define _SP 13
#define _LR 14
#define _PC 15
#define _CPSR 16
#define GET_PSR_N(cpsr) ((cpsr >> 31)&1)
#define GET_PSR_Z(cpsr) ((cpsr >> 30)&1)
#define GET_PSR_C(cpsr) ((cpsr >> 29)&1)
#define GET_PSR_V(cpsr) ((cpsr >> 28)&1)
#define GET_PSR_Q(cpsr) ((cpsr >> 27)&1)
#define GET_PSR_I(cpsr) ((cpsr >> 7)&1)
#define GET_PSR_F(cpsr) ((cpsr >> 6)&1)
#define GET_PSR_T(cpsr) ((cpsr >> 5)&1)
#define GET_PSR_M(cpsr) ((cpsr)&0x1F)
#define SET_PSR_T(cpsr, i) (cpsr |= ( i << 5))
#define MUSR 0x10 // User Mode
#define MFIQ 0x11 // FIQ Mode
#define MIRQ 0x12 // IRQ Mode
#define MSVC 0x13 // Supervisor Mode
#define MABT 0x17 // Abort Mode
#define MUND 0x1B // Undefined Mode
#define MSYS 0x1F // System Mode
#define MMSK 0x1F // Mask Mode
#define CEQ 0 // Равно: Z == 1
#define CNE 1 // Не равно: Z == 0
#define CCS 2 // Перенос: C == 1
#define CHS 2 // Беззнак больше или равно: C == 1
#define CCC 3 // Нет переноса: C == 0
#define CLO 3 // Беззнаковое меньше: C == 0
#define CMI 4 // Минус/отрицательное: N == 1
#define CPL 5 // Плюс/положительное или нуль: N == 0
#define CVS 6 // Переполнение: V == 1
#define CVC 7 // Нет переполнения: V == 0
#define CHI 8 // Беззнаковое больше: C == 1 && Z == 0
#define CLS 9 // Беззнаковое меньше или равно: C == 0 && Z == 1
#define CGE 10 // Больше или равно, со знаком: N == V
#define CLT 11 // Меньше чем, со знаком: N != V
#define CGT 12 // Больше чем, со знаком: Z == 0 && N == V
#define CLE 13 // Меньше или равно, со знаком: Z == 1 && N != V
#define CAL 14 // Безусловное выполнение
#define CMSK 15 // Маска условий
// LDR / STR
#define IARM_IS_LDR(i)
( I32_FIELD_FAST(i,26,3)==1 && INS_BIT(i,22)==0 && INS_BIT(i,20)==1 )
#define IARM_IS_STR(i)
( I32_FIELD_FAST(i,26,3)==1 && INS_BIT(i,22)==0 && INS_BIT(i,20)==0 )
#define IARM_LDR_I(i) INS_BIT(i,25)
#define IARM_LDR_P(i) INS_BIT(i,24)
#define IARM_LDR_U(i) INS_BIT(i,23)
#define IARM_LDR_W(i) INS_BIT(i,21)
// if Load and Store word or unsigned byte instructions
#define IARM_IS_LDRHS(i) ( (i >> 25)&7 == 0 && (i >> 7)&1 == 1 && (i >> 4)&1 == 1 )
#define IARM_LDRHS_P(i) INS_BIT(i,24)
#define IARM_LDRHS_U(i) INS_BIT(i,23)
#define IARM_LDRHS_I(i) INS_BIT(i,22)
#define IARM_LDRHS_W(i) INS_BIT(i,21)
#define IARM_LDRHS_L(i) INS_BIT(i,20)
#define IARM_LDRHS_S(i) INS_BIT(i, 6)
#define IARM_LDRHS_H(i) INS_BIT(i, 5)
/* THUMBs command detector Load / Store */
// PC-relative load
#define ITHUMB_LS_PCREL(i) (((i >> 11) & 0x1F) == 0x09)
#define ITHUMB_LS_PCREL_Rd(i) ((i >> 8) & 0x07)
#define ITHUMB_LS_PCREL_Offset(i) (i & 0xF)
// load/store with register offset
#define ITHUMB_LS_WITHREGOFFSET(i) (((i >> 9) &(~0x06)) == 0x28)
#define ITHUMB_LS_WITHREGOFFSET_Ro(i) ((i >> 6) & 0x07)
#define ITHUMB_LS_WITHREGOFFSET_Rb(i) ((i >> 3) & 0x07)
#define ITHUMB_LS_WITHREGOFFSET_Rd(i) ((i >> 0) & 0x07)
#define ITHUMB_LS_WITHREGOFFSET_L(i) ((i >> 11) & 0x01)
#define ITHUMB_LS_WITHREGOFFSET_B(i) ((i >> 10) & 0x01)
// load/store sign-extended byte/halfword
#define ITHUMB_LS_SIGNEXTBYTEHWRD(i) (((i >> 9) &(~0x06)) == 0x29)
#define ITHUMB_LS_SIGNEXTBYTEHWRD_Ro(i) ((i >> 6) & 0x07)
#define ITHUMB_LS_SIGNEXTBYTEHWRD_Rb(i) ((i >> 3) & 0x07)
#define ITHUMB_LS_SIGNEXTBYTEHWRD_Rd(i) ((i >> 0) & 0x07)
#define ITHUMB_LS_SIGNEXTBYTEHWRD_H(i) ((i >> 11) & 0x01)
#define ITHUMB_LS_SIGNEXTBYTEHWRD_S(i) ((i >> 10) & 0x01)
// load/store with immediate offset
#define ITHUMB_LS_WITHIMMOFFSET(i) (((i >> 11) &(~0x03)) == 0x0C)
#define ITHUMB_LS_WITHIMMOFFSET_L(i) ((i >> 11) & 0x01)
#define ITHUMB_LS_WITHIMMOFFSET_B(i) ((i >> 12) & 0x01)
#define ITHUMB_LS_WITHIMMOFFSET_Rb(i) ((i >> 3) & 0x07)
#define ITHUMB_LS_WITHIMMOFFSET_Rd(i) ((i >> 0) & 0x07)
#define ITHUMB_LS_WITHIMMOFFSET_Offset(i) ((i >> 6) & 0x1F)
// load/store halfword
#define ITHUMB_LS_HWRD(i) (((i >> 11) & (~0x01)) == 0x10)
#define ITHUMB_LS_HWRD_L(i) ((i >> 11) & 0x01)
#define ITHUMB_LS_HWRD_Rb(i) ((i >> 3) & 0x07)
#define ITHUMB_LS_HWRD_Rd(i) ((i >> 0) & 0x07)
#define ITHUMB_LS_HWRD_Offset(i) ((i >> 6) & 0x1F)
// SP-relative load/store
#define ITHUMB_LS_SPREL(i) (((i >> 12) & 0x0F) == 0x09)
#define ITHUMB_LS_SPREL_L(i) ((i >> 11) & 0x01)
#define ITHUMB_LS_SPREL_Rd(i) ((i >> 8) & 0x07)
#define ITHUMB_LS_SPREL_Offset(i) (i & 0xF)
#endif // __ARM_DEFS_H__
#ifndef __SNIFFER_H__
#define __SNIFFER_H__
#include "arm_defs.h"
extern void da_handler();
#define IO_ADDRESS 0xF0000000
#define IO_ADDRESS_MIRROR 0xE0000000
#define IO_ADDRESS_DIF 0x10000000
#define VECTOR_DATAABORT_JUMPER 0xE59FF018
#define VECTOR_DATAABORT_JUMPER_OFS 0x10
#define VECTOR_DATAABORT_HANDLER_OFS 0x30
#define MMU_ATTR 0xC12
#define MMU_TABLE 0x00090000
#define MMU_GRID(a) * ( (unsigned int *) ( (MMU_TABLE + ((a >> 20) & 0xFFF) * 4) ) )
#define MMU_GRID_MIRROR(a) MMU_GRID(a - IO_ADDRESS_DIF)
#define MMU_GRID_SETATTR(a) ((a & 0xFFF00000) | MMU_ATTR)
typedef struct
{
unsigned int r0;
unsigned int r1;
unsigned int r2;
unsigned int r3;
unsigned int r4;
unsigned int r5;
unsigned int r6;
unsigned int r7;
unsigned int r8;
unsigned int r9;
unsigned int r10;
unsigned int r11;
unsigned int r12;
unsigned int sp;
unsigned int lr;
unsigned int pc;
unsigned int cpsr;
}REGISTERS;
typedef struct
{
union regs
{
unsigned int a[MAX_REGS];
REGISTERS s;
};
}CONTEXT;
void io_sniffer_init(void (*sniff_prc)(unsigned int address, unsigned int value, unsigned int pc, char is_ldr));
void io_sniffer_deinit();
int io_sniffer_add(unsigned int io_address);
int io_sniffer_remove(unsigned int io_address);
#endif // __SNIFFER_H__
#ifndef __SYSTEM_H__
#define __SYSTEM_H__
__arm void SetDomainAccess(unsigned int domains);
__arm void SetMemoryAccess(unsigned int domains);
__arm void UnlockAllMemoryAccess();
__arm void DisableInterrupt();
__arm void EnableInterrupt();
__arm void EnableModeForOSWork();
__arm void DisableModeForOSWork();
#endif // __SYSTEM_H__
#include "arm_defs.h"
EXTERN context
EXTERN abt_stack
EXTERN emualate_ldr_str
CODE32
ARM
RSEG CODE:CODE
PUBLIC da_handler
da_handler:
// Сохраняем контекст R0 - R12 прерванной программы
LDR SP, =context
STMIA SP, {R0-R12}
// Подготавливаем стек для хендера
LDR SP, =abt_stack
ADD SP, SP, #0x4000
// Сохраняем CPSR прерванной программы
MRS R1, SPSR
LDR R0, =context
STR R1, [R0, #_CPSR*4]
// Сохраняем PC прерванной программы
SUB LR, LR, #0x08
STR LR, [R0, #_PC*4]
// Берём режим процессора прерванной программы
AND R2, R1, #MMSK
CMP R2, #MUSR
// Если режим USR, то возьмём SYS
MOVEQ R2, #MSYS
// Включаем режим прерванной программы
MRS R1, CPSR
BIC R1, R1, #MMSK
ORR R1, R1, R2
MSR CPSR_c, R1
// Сохраняем SP и LR прерванной программы
STR SP, [R0, #_SP*4]
STR LR, [R0, #_LR*4]
// Контекст полностью сохранён,
// переводим обратно в режим ABT
BIC R1, R1, #MMSK
ORR R1, R1, #MABT
MSR CPSR_c, R1
BL emualate_ldr_str
// Загружаем CPSR прерванной программы
LDR R0, =context
LDR R1, [R0, #_CPSR*4]
MSR SPSR_cxsf, R1
// Берём режим процессора прерванной программы
AND R2, R1, #MMSK
CMP R2, #MUSR
// Если режим USR, то возьмём SYS
MOVEQ R2, #MSYS
// Включаем режим прерванной программы
MRS R1, CPSR
BIC R1, R1, #MMSK
ORR R1, R1, R2
MSR CPSR_c, R1
// Загружаем SP и LR прерванной программы
LDR SP, [R0, #_SP*4]
LDR LR, [R0, #_LR*4]
// Включаем снова режим ABT
BIC R1, R1, #MMSK
ORR R1, R1, #MABT
MSR CPSR_c, R1
// Загружаем PC
LDR SP, =context
LDR LR, [SP, #_PC*4]
// Загружаем регистры R0-R12
LDMIA SP, {R0-R12}
// Переходим к следующей инструкции
// Восстанавливаем состояние флагов
MOVS PC, LR
END
#include "sniffer.h"
#include "system.h"
CONTEXT context;
unsigned char abt_stack[0x4000];
unsigned char sniffer_map[0x100];
unsigned int da_jumper = 0;
unsigned int da_address = 0;
void (*sniff_p)(unsigned int address, unsigned int value, unsigned int pc, char is_ldr) = 0;
__arm void sniff_proc(unsigned int address, unsigned int value, unsigned int pc, char is_ldr)
{
if (sniff_p)
sniff_p(address, value, pc, is_ldr);
}
__arm int emualate_ldr_str_sub(CONTEXT *context)
{
unsigned int cpsr;
unsigned int instruction;
unsigned int address;
//unsigned char cond;
char i, l, b, h, w, s, u, p;
char rn, rd, rm;
cpsr = context->s.cpsr;
// ARM
if (!GET_PSR_T(cpsr))
{
// Получаем инструкцию
instruction = WORD(context->s.pc);
// Берём условие
//cond = IARM_COND(instruction);
// Чтение (LDR)
if (IARM_IS_LDR(instruction))
{
p = IARM_LDR_P(instruction);
i = IARM_LDR_I(instruction);
u = IARM_LDR_U(instruction);
w = IARM_LDR_W(instruction);
rn = IARM_Rn(instruction);
rd = IARM_Rd(instruction);
rm = IARM_Rm(instruction);
int sign;
unsigned int index;
// Используем непосредственное значение для вычисления адреса
if (!i)
index = IARM_Imm12(instruction);
// Используем значение из регистра для вычисления адреса
else
{
// Смещение от регистра
if (!IARM_ShiftImm(instruction) && !IARM_Shift(instruction))
index = context->a[rm];
// Смещение от регистра со сдвигом
else
{
// Значение для сдвига
unsigned short si = IARM_ShiftImm(instruction);
// Тип сдвига
unsigned short st = IARM_Shift(instruction);
switch(st)
{
case IARM_Shift_LSL:
index = context->a[rm] << si;
break;
case IARM_Shift_LSR:
if (si)
{
index = 0;
break;
} else
{
index = context->a[rm] >> si;
break;
}
}
}
}
// Значит будем добавлять
if (u) sign = 1;
// Значит будем отнимать
else sign = -1;
// Используем пост-индексацию
if (!p)
{
address = context->a[rn];
context->a[rn] = address + index*sign;
context->a[rd] = WORD(address - IO_ADDRESS_DIF);
// Передадим данные об операции
sniff_proc(address, context->a[rd], context->s.pc, 1);
} else
{
// Используем пред-индексацию
if (w)
{
address = context->a[rn] + index*sign;
context->a[rn] = address;
context->a[rd] = WORD(address - IO_ADDRESS_DIF);
// Передадим данные об операции
sniff_proc(address, context->a[rd], context->s.pc, 1);
}
// Не используем пост/пред-индексацию
else
{
address = context->a[rn] + index*sign;
context->a[rd] = WORD(address - IO_ADDRESS_DIF);
// Передадим данные об операции
sniff_proc(address, context->a[rd], context->s.pc, 1);
}
}
}
// Запись (STR)
else if (IARM_IS_STR(instruction))
{
p = IARM_LDR_P(instruction);
i = IARM_LDR_I(instruction);
u = IARM_LDR_U(instruction);
w = IARM_LDR_W(instruction);
rn = IARM_Rn(instruction);
rd = IARM_Rd(instruction);
rm = IARM_Rm(instruction);
int sign;
unsigned int index;
// Используем непосредственное значение для вычисления адреса
if (!i) index = IARM_Imm12(instruction);
// Используем значение из регистра для вычисления адреса
else
{
// Смещение от регистра
if (!IARM_ShiftImm(instruction) && !IARM_Shift(instruction)) index = context->a[rm];
// Смещение от регистра со сдвигом
else
{
// Значение для сдвига
unsigned short si = IARM_ShiftImm(instruction);
// Тип сдвига
unsigned short st = IARM_Shift(instruction);
switch(st)
{
case IARM_Shift_LSL:
index = context->a[rm] << si;
break;
case IARM_Shift_LSR:
if (si)
{
index = 0;
break;
} else
{
index = context->a[rm] >> si;
break;
}
}
}
}
// Значит будем добавлять
if (u) sign = 1;
// Значит будем отнимать
else sign = -1;
// Используем пост-индексацию
if (!p)
{
address = context->a[rn];
context->a[rn] = address + index*sign;
WORD(address - IO_ADDRESS_DIF) = context->a[rd];
// Передадим данные об операции
sniff_proc(address, context->a[rd], context->s.pc, 0);
} else
{
// Используем пред-индексацию
if (w)
{
address = context->a[rn] + index*sign;
context->a[rn] = address;
WORD(address - IO_ADDRESS_DIF) = context->a[rd];
// Передадим данные об операции
sniff_proc(address, context->a[rd], context->s.pc, 0);
}
// Не используем пост/пред-индексацию
else
{
address = context->a[rn] + index*sign;;
WORD(address - IO_ADDRESS_DIF) = context->a[rd];
// Передадим данные об операции
sniff_proc(address, context->a[rd], context->s.pc, 0);
}
}
}
context->s.pc += 4;
return 1;
} else
// THUMB
{
// Получаем инструкцию
instruction = HWRD(context->s.pc);
if (ITHUMB_LS_WITHREGOFFSET(instruction))
{
rd = ITHUMB_LS_WITHREGOFFSET_Rd(instruction);
l = ITHUMB_LS_WITHREGOFFSET_L(instruction);
b = ITHUMB_LS_WITHREGOFFSET_B(instruction);
// Чтение
if (l)
{
// Считывание байта
if (b)
context->a[rd] = BYTE(address - IO_ADDRESS_DIF);
else
// Считывание слова
context->a[rd] = WORD(address - IO_ADDRESS_DIF);
// Передадим данные об операции
sniff_proc(address, context->a[rd], context->s.pc, 1);
}
// Запись
else
{
// Запись байта
if (b)
BYTE(address - IO_ADDRESS_DIF) = context->a[rd];
else
// Запись слова
WORD(address - IO_ADDRESS_DIF) = context->a[rd];
// Передадим данные об операции
sniff_proc(address, context->a[rd], context->s.pc, 0);
}
} else if (ITHUMB_LS_SIGNEXTBYTEHWRD(instruction))
{
address = context->a[ITHUMB_LS_SIGNEXTBYTEHWRD_Rb(instruction)] + context->a[ITHUMB_LS_SIGNEXTBYTEHWRD_Ro(instruction)];
rd = ITHUMB_LS_SIGNEXTBYTEHWRD_Rd(instruction);
h = ITHUMB_LS_SIGNEXTBYTEHWRD_H(instruction);
s = ITHUMB_LS_SIGNEXTBYTEHWRD_S(instruction);
// Запись полуслова
if (!h && !s)
{
HWRD(address - IO_ADDRESS_DIF) = context->a[rd];
// Передадим данные об операции
sniff_proc(address, context->a[rd], context->s.pc, 0);
//Чтение полуслова
} else if (h && !s)
{
context->a[rd] = HWRD(address - IO_ADDRESS_DIF);
// Передадим данные об операции
sniff_proc(address, context->a[rd], context->s.pc, 1);
// Чтение байта с расширенным знаком
} else if (!h && s)
{
context->a[rd] = BYTE(address - IO_ADDRESS_DIF);
if (INS_BIT(context->a[rd], 7))
context->a[rd] |= 0xFFFFFF00;
// Передадим данные об операции
sniff_proc(address, context->a[rd], context->s.pc, 1);
// Чтение полуслова с расширенным знаком
} else if (h && s)
{
context->a[rd] = HWRD(address - IO_ADDRESS_DIF);
if (INS_BIT(context->a[rd], 15))
context->a[rd] |= 0xFFFF0000;
// Передадим данные об операции
sniff_proc(address, context->a[rd], context->s.pc, 1);
}
} else if (ITHUMB_LS_WITHIMMOFFSET(instruction))
{
rd = ITHUMB_LS_WITHIMMOFFSET_Rd(instruction);
l = ITHUMB_LS_WITHIMMOFFSET_L(instruction);
b = ITHUMB_LS_WITHIMMOFFSET_B(instruction);
if (b)
address = context->a[ITHUMB_LS_WITHIMMOFFSET_Rb(instruction)] + ITHUMB_LS_WITHIMMOFFSET_Offset(instruction);
else
address = context->a[ITHUMB_LS_WITHIMMOFFSET_Rb(instruction)] + (ITHUMB_LS_WITHIMMOFFSET_Offset(instruction) << 2);
// Чтение
if (l)
{
// Считывание байта
if (b)
context->a[rd] = BYTE(address - IO_ADDRESS_DIF);
else
// Считывание слова
context->a[rd] = WORD(address - IO_ADDRESS_DIF);
// Передадим данные об операции
sniff_proc(address, context->a[rd], context->s.pc, 1);
}
// Запись
else
{
// Запись байта
if (b)
BYTE(address - IO_ADDRESS_DIF) = context->a[rd];
else
// Запись слова
WORD(address - IO_ADDRESS_DIF) = context->a[rd];
// Передадим данные об операции
sniff_proc(address, context->a[rd], context->s.pc, 0);
}
} else if (ITHUMB_LS_HWRD(instruction))
{
rd = ITHUMB_LS_HWRD_Rd(instruction);
l = ITHUMB_LS_HWRD_L(instruction);
address = context->a[ITHUMB_LS_HWRD_Rb(instruction)] + (ITHUMB_LS_HWRD_Offset(instruction) << 1);
// Чтение
if (l)
context->a[rd] = HWRD(address - IO_ADDRESS_DIF);
// Запись
else
HWRD(address - IO_ADDRESS_DIF) = context->a[rd];
// Передадим данные об операции
sniff_proc(address, context->a[rd], context->s.pc, l);
} else if (ITHUMB_LS_SPREL(instruction))
{
address = context->s.sp + (ITHUMB_LS_SPREL_Offset(instruction) << 2);
rd = ITHUMB_LS_SPREL_Rd(instruction);
l = ITHUMB_LS_SPREL_L(instruction);
// Чтение
if (l)
context->a[rd] = WORD(address - IO_ADDRESS_DIF);
else
// Запись
WORD(address - IO_ADDRESS_DIF) = context->a[rd];
// Передадим данные об операции
sniff_proc(address, context->a[rd], context->s.pc, l);
}
context->s.pc += 2;
return 1;
}
}
__arm void emualate_ldr_str(CONTEXT *context)
{
SetDomainAccess(0xFFFFFFFF);
emualate_ldr_str_sub(context);
SetDomainAccess(1);
}
void io_sniffer_init(void (*sniff_prc)(unsigned int address, unsigned int value, unsigned int pc, char is_ldr))
{
if (sniff_prc)
{
UnlockAllMemoryAccess();
da_jumper = WORD(VECTOR_DATAABORT_JUMPER_OFS);
da_address = WORD(VECTOR_DATAABORT_HANDLER_OFS);
WORD(VECTOR_DATAABORT_JUMPER_OFS) = VECTOR_DATAABORT_JUMPER;
WORD(VECTOR_DATAABORT_HANDLER_OFS) = (int)&da_handler;
SetMemoryAccess(1);
sniff_p = sniff_prc;
for (int i = 0; i < 0x100; i++)
sniffer_map[i] = 0;
}
}
void io_sniffer_deinit()
{
UnlockAllMemoryAccess();
da_jumper = WORD(VECTOR_DATAABORT_JUMPER_OFS);
da_address = WORD(VECTOR_DATAABORT_HANDLER_OFS);
WORD(VECTOR_DATAABORT_JUMPER_OFS) = (unsigned int)&da_jumper;
WORD(VECTOR_DATAABORT_HANDLER_OFS) = (unsigned int)&da_address;
for (int i = 0; i < 0x100; i++)
{
if (sniffer_map[i])
{
unsigned int io_address = IO_ADDRESS | (i << 20) | MMU_ATTR;
MMU_GRID(io_address) = MMU_GRID_SETATTR(io_address);
MMU_GRID_MIRROR(io_address) = 0x00000000;
}
sniffer_map[i] = 0;
}
SetMemoryAccess(1);
sniff_p = 0;
}
int io_sniffer_add(unsigned int io_address)
{
if ((io_address >> 28) == 0x0F)
{
unsigned char sm = (io_address >> 20) & 0x0FF;
if (!sniffer_map[sm])
{
UnlockAllMemoryAccess();
MMU_GRID(io_address) = 0x00000000;
MMU_GRID_MIRROR(io_address) = MMU_GRID_SETATTR(io_address);
SetMemoryAccess(1);
sniffer_map[sm] = 1;
return 1;
}
}
return 0;
}
int io_sniffer_remove(unsigned int io_address)
{
if ((io_address >> 28) == 0x0F)
{
unsigned char sm = (io_address >> 20) & 0x0FF;
if (sniffer_map[sm])
{
UnlockAllMemoryAccess();
MMU_GRID(io_address) = MMU_GRID_SETATTR(io_address);
MMU_GRID_MIRROR(io_address) = 0x00000000;
SetMemoryAccess(1);
sniffer_map[sm] = 0;
return 1;
}
}
return 0;
}
#include "system.h"
#include "intrinsics.h"
#pragma swi_number=0x00
__swi __arm void system_mode_sg();
#pragma swi_number=0x04
__swi __arm void system_mode_nsg();
#pragma swi_number=0x81B5
__swi __arm int is_nsg();
__arm void SetDomainAccess(unsigned int domains)
{
__MCR(15, 0, domains, 3, 0, 0);
for (int i = 0; i < 20; i++);
}
__arm void SetMemoryAccess(unsigned int domains)
{
if (is_nsg()) system_mode_nsg();
else system_mode_sg();
__disable_interrupt();
SetDomainAccess(domains);
__enable_interrupt();
}
__arm void UnlockAllMemoryAccess()
{
if (is_nsg()) system_mode_nsg();
else system_mode_sg();
__disable_interrupt();
SetDomainAccess(0xFFFFFFFF);
__enable_interrupt();
}
__arm void DisableInterrupt()
{
if (is_nsg()) system_mode_nsg();
else system_mode_sg();
__disable_interrupt();
}
__arm void EnableInterrupt()
{
if (is_nsg()) system_mode_nsg();
else system_mode_sg();
__enable_interrupt();
}
unsigned long cpsr = 0;
__arm void EnableModeForOSWork()
{
cpsr = __get_CPSR();
cpsr &= 0xC0;
cpsr |= 0x1F;
__set_CPSR(cpsr);
}
__arm void DisableModeForOSWork()
{
if (cpsr)
__set_CPSR(cpsr);
cpsr = 0;
}
Результат
Ну и напоследок расскажу, что же в итоге получилось добиться, используя этот сниффер.
На телефон скидывается исполняемый файл io_sniffer.elf, запускается.
Настроим сниффер так, чтобы он отлавливал операции с интерфейсом I2C (0xF4800000).
Помимо обработчика, есть специальный таск (тред, поток), который в режиме реального времени передаёт всё в компьютер через кабель, а там стоит программа, принимающая данные и выводящая их в окно.
Если нажать на кнопку телефона, то его динамик издаст щелчок (включается в настройках телефона), это порождение устройства Dialog, который обменивается по шине I2C с микроконтроллером. И по идее, мы должны увидеть, что прошивка такого делает,
что это устройство так синтезирует звук:
0xA07EE064|I2C |CLC |0xF4800000|Запись|0x00000100|
0xA07EE06C|I2C |BUSCON |0xF4800014|Запись|0xA0007E11|
0xA07EE070|I2C |SYSCON |0xF4800010|Чтение|0x00880000|
0xA07EE07C|I2C |SYSCON |0xF4800010|Запись|0x00880000|
0xA089550C|I2C |ICR |0xF48000FC|Чтение|0x00000000|
0xA0895514|I2C |ICR |0xF48000FC|Запись|0x00004000|
0xA0895518|I2C |ICR |0xF48000FC|Чтение|0x00000000|
0xA0895520|I2C |ICR |0xF48000FC|Запись|0x00001000|
0xA0895868|I2C |SYSCON |0xF4800010|Чтение|0x00880000|
0xA0895878|I2C |SYSCON |0xF4800010|Чтение|0x00880000|
0xA0895888|I2C |SYSCON |0xF4800010|Чтение|0x00880000|
0xA0895938|I2C |RTB |0xF4800018|Запись|0x00001262|
0xA0895940|I2C |SYSCON |0xF4800010|Чтение|0x00880000|
0xA0895950|I2C |SYSCON |0xF4800010|Запись|0x04880000|
0xA0895964|I2C |WHBSYSCON|0xF4800020|Чтение|0x00000000|
0xA0895970|I2C |WHBSYSCON|0xF4800020|Запись|0x00100000|
0xA0895540|I2C |ICR |0xF48000FC|Чтение|0x00003000|
0xA0895548|I2C |ICR |0xF48000FC|Запись|0x00007000|
0xA0895374|I2C |SYSCON |0xF4800010|Чтение|0x04980230|
0xA0895388|I2C |SYSCON |0xF4800010|Чтение|0x04980230|
0xA089539C|I2C |SYSCON |0xF4800010|Чтение|0x04980230|
0xA0895420|I2C |SYSCON |0xF4800010|Чтение|0x04980230|
0xA0895438|I2C |SYSCON |0xF4800010|Запись|0x00980230|
0xA0895444|I2C |RTB |0xF4800018|Запись|0x00000010|
0xA0895540|I2C |ICR |0xF48000FC|Чтение|0x00003000|
0xA0895548|I2C |ICR |0xF48000FC|Запись|0x00007000|
0xA0895374|I2C |SYSCON |0xF4800010|Чтение|0x00980130|
0xA0895388|I2C |SYSCON |0xF4800010|Чтение|0x00980130|
0xA089539C|I2C |SYSCON |0xF4800010|Чтение|0x00980130|
0xA0895590|I2C |SYSCON |0xF4800010|Чтение|0x00980130|
0xA08955A8|I2C |WHBSYSCON|0xF4800020|Чтение|0x00000000|
0xA08955B4|I2C |WHBSYSCON|0xF4800020|Запись|0x00080000|
0xA08955BC|I2C |SYSCON |0xF4800010|Чтение|0x008800A0|
0xA08955DC|I2C |WHBSYSCON|0xF4800020|Чтение|0x00000000|
0xA08955E8|I2C |WHBSYSCON|0xF4800020|Запись|0x00000080|
0xA08955F0|I2C |WHBSYSCON|0xF4800020|Чтение|0x00000000|
0xA08955FC|I2C |WHBSYSCON|0xF4800020|Запись|0x00000020|
0xA0895530|I2C |ICR |0xF48000FC|Запись|0x00004000|
0xA07EDF94|I2C |BUSCON |0xF4800014|Запись|0x00000000|
0xA07EDF9C|I2C |CLC |0xF4800000|Запись|0x00000001|
0xA07EE064|I2C |CLC |0xF4800000|Запись|0x00000100|
0xA07EE06C|I2C |BUSCON |0xF4800014|Запись|0xA0007E11|
0xA07EE070|I2C |SYSCON |0xF4800010|Чтение|0x00880000|
0xA07EE07C|I2C |SYSCON |0xF4800010|Запись|0x00880000|
0xA089550C|I2C |ICR |0xF48000FC|Чтение|0x00000000|
0xA0895514|I2C |ICR |0xF48000FC|Запись|0x00004000|
0xA0895518|I2C |ICR |0xF48000FC|Чтение|0x00000000|
0xA0895520|I2C |ICR |0xF48000FC|Запись|0x00001000|
0xA0895868|I2C |SYSCON |0xF4800010|Чтение|0x00880000|
0xA0895878|I2C |SYSCON |0xF4800010|Чтение|0x00880000|
0xA0895888|I2C |SYSCON |0xF4800010|Чтение|0x00880000|
0xA0895938|I2C |RTB |0xF4800018|Запись|0x00001362|
0xA0895940|I2C |SYSCON |0xF4800010|Чтение|0x00880000|
0xA0895950|I2C |SYSCON |0xF4800010|Запись|0x04880000|
0xA0895964|I2C |WHBSYSCON|0xF4800020|Чтение|0x00000000|
0xA0895970|I2C |WHBSYSCON|0xF4800020|Запись|0x00100000|
0xA0895540|I2C |ICR |0xF48000FC|Чтение|0x00003000|
0xA0895548|I2C |ICR |0xF48000FC|Запись|0x00007000|
0xA0895374|I2C |SYSCON |0xF4800010|Чтение|0x04980230|
0xA0895388|I2C |SYSCON |0xF4800010|Чтение|0x04980230|
0xA089539C|I2C |SYSCON |0xF4800010|Чтение|0x04980230|
0xA0895420|I2C |SYSCON |0xF4800010|Чтение|0x04980230|
0xA0895438|I2C |SYSCON |0xF4800010|Запись|0x00980230|
0xA0895444|I2C |RTB |0xF4800018|Запись|0x00000010|
0xA0895540|I2C |ICR |0xF48000FC|Чтение|0x00003000|
0xA0895548|I2C |ICR |0xF48000FC|Запись|0x00007000|
0xA0895374|I2C |SYSCON |0xF4800010|Чтение|0x00980130|
0xA0895388|I2C |SYSCON |0xF4800010|Чтение|0x00980130|
0xA089539C|I2C |SYSCON |0xF4800010|Чтение|0x00980130|
0xA0895590|I2C |SYSCON |0xF4800010|Чтение|0x00980130|
0xA08955A8|I2C |WHBSYSCON|0xF4800020|Чтение|0x00000000|
0xA08955B4|I2C |WHBSYSCON|0xF4800020|Запись|0x00080000|
0xA08955BC|I2C |SYSCON |0xF4800010|Чтение|0x008800A0|
0xA08955DC|I2C |WHBSYSCON|0xF4800020|Чтение|0x00000000|
0xA08955E8|I2C |WHBSYSCON|0xF4800020|Запись|0x00000080|
0xA08955F0|I2C |WHBSYSCON|0xF4800020|Чтение|0x00000000|
0xA08955FC|I2C |WHBSYSCON|0xF4800020|Запись|0x00000020|
0xA0895530|I2C |ICR |0xF48000FC|Запись|0x00004000|
0xA07EDF94|I2C |BUSCON |0xF4800014|Запись|0x00000000|
0xA07EDF9C|I2C |CLC |0xF4800000|Запись|0x00000001|
0xA07EE064|I2C |CLC |0xF4800000|Запись|0x00000100|
0xA07EE06C|I2C |BUSCON |0xF4800014|Запись|0xA0007E11|
0xA07EE070|I2C |SYSCON |0xF4800010|Чтение|0x00880000|
0xA07EE07C|I2C |SYSCON |0xF4800010|Запись|0x00880000|
0xA089550C|I2C |ICR |0xF48000FC|Чтение|0x00000000|
0xA0895514|I2C |ICR |0xF48000FC|Запись|0x00004000|
0xA0895518|I2C |ICR |0xF48000FC|Чтение|0x00000000|
0xA0895520|I2C |ICR |0xF48000FC|Запись|0x00001000|
0xA0895868|I2C |SYSCON |0xF4800010|Чтение|0x00880000|
0xA0895878|I2C |SYSCON |0xF4800010|Чтение|0x00880000|
0xA0895888|I2C |SYSCON |0xF4800010|Чтение|0x00880000|
0xA0895938|I2C |RTB |0xF4800018|Запись|0x00004462|
0xA0895940|I2C |SYSCON |0xF4800010|Чтение|0x00880000|
0xA0895950|I2C |SYSCON |0xF4800010|Запись|0x04880000|
0xA0895964|I2C |WHBSYSCON|0xF4800020|Чтение|0x00000000|
0xA0895970|I2C |WHBSYSCON|0xF4800020|Запись|0x00100000|
0xA0895540|I2C |ICR |0xF48000FC|Чтение|0x00003000|
0xA0895548|I2C |ICR |0xF48000FC|Запись|0x00007000|
0xA0895374|I2C |SYSCON |0xF4800010|Чтение|0x04980230|
0xA0895388|I2C |SYSCON |0xF4800010|Чтение|0x04980230|
0xA089539C|I2C |SYSCON |0xF4800010|Чтение|0x04980230|
0xA0895420|I2C |SYSCON |0xF4800010|Чтение|0x04980230|
0xA0895438|I2C |SYSCON |0xF4800010|Запись|0x00980230|
0xA0895444|I2C |RTB |0xF4800018|Запись|0x00000062|
0xA0895540|I2C |ICR |0xF48000FC|Чтение|0x00003000|
0xA0895548|I2C |ICR |0xF48000FC|Запись|0x00007000|
0xA0895374|I2C |SYSCON |0xF4800010|Чтение|0x00980130|
0xA0895388|I2C |SYSCON |0xF4800010|Чтение|0x00980130|
0xA089539C|I2C |SYSCON |0xF4800010|Чтение|0x00980130|
0xA0895590|I2C |SYSCON |0xF4800010|Чтение|0x00980130|
0xA08955A8|I2C |WHBSYSCON|0xF4800020|Чтение|0x00000000|
0xA08955B4|I2C |WHBSYSCON|0xF4800020|Запись|0x00080000|
0xA08955BC|I2C |SYSCON |0xF4800010|Чтение|0x008800A0|
0xA08955DC|I2C |WHBSYSCON|0xF4800020|Чтение|0x00000000|
0xA08955E8|I2C |WHBSYSCON|0xF4800020|Запись|0x00000080|
0xA08955F0|I2C |WHBSYSCON|0xF4800020|Чтение|0x00000000|
0xA08955FC|I2C |WHBSYSCON|0xF4800020|Запись|0x00000020|
0xA0895530|I2C |ICR |0xF48000FC|Запись|0x00004000|
0xA07EDF94|I2C |BUSCON |0xF4800014|Запись|0x00000000|
0xA07EDF9C|I2C |CLC |0xF4800000|Запись|0x00000001|
0xA07EE064|I2C |CLC |0xF4800000|Запись|0x00000100|
0xA07EE06C|I2C |BUSCON |0xF4800014|Запись|0xA0007E11|
0xA07EE070|I2C |SYSCON |0xF4800010|Чтение|0x00880000|
0xA07EE07C|I2C |SYSCON |0xF4800010|Запись|0x00880000|
0xA089550C|I2C |ICR |0xF48000FC|Чтение|0x00000000|
0xA0895514|I2C |ICR |0xF48000FC|Запись|0x00004000|
0xA0895518|I2C |ICR |0xF48000FC|Чтение|0x00000000|
0xA0895520|I2C |ICR |0xF48000FC|Запись|0x00001000|
0xA0895868|I2C |SYSCON |0xF4800010|Чтение|0x00880000|
0xA0895878|I2C |SYSCON |0xF4800010|Чтение|0x00880000|
0xA0895888|I2C |SYSCON |0xF4800010|Чтение|0x00880000|
0xA0895938|I2C |RTB |0xF4800018|Запись|0x00004662|
0xA0895940|I2C |SYSCON |0xF4800010|Чтение|0x00880000|
0xA0895950|I2C |SYSCON |0xF4800010|Запись|0x04880000|
0xA0895964|I2C |WHBSYSCON|0xF4800020|Чтение|0x00000000|
0xA0895970|I2C |WHBSYSCON|0xF4800020|Запись|0x00100000|
0xA0895540|I2C |ICR |0xF48000FC|Чтение|0x00003000|
0xA0895548|I2C |ICR |0xF48000FC|Запись|0x00007000|
0xA0895374|I2C |SYSCON |0xF4800010|Чтение|0x04980230|
0xA0895388|I2C |SYSCON |0xF4800010|Чтение|0x04980230|
0xA089539C|I2C |SYSCON |0xF4800010|Чтение|0x04980230|
0xA0895420|I2C |SYSCON |0xF4800010|Чтение|0x04980230|
0xA0895438|I2C |SYSCON |0xF4800010|Запись|0x00980230|
0xA0895444|I2C |RTB |0xF4800018|Запись|0x00000067|
0xA0895540|I2C |ICR |0xF48000FC|Чтение|0x00003000|
0xA0895548|I2C |ICR |0xF48000FC|Запись|0x00007000|
0xA0895374|I2C |SYSCON |0xF4800010|Чтение|0x00980130|
0xA0895388|I2C |SYSCON |0xF4800010|Чтение|0x00980130|
0xA089539C|I2C |SYSCON |0xF4800010|Чтение|0x00980130|
0xA0895590|I2C |SYSCON |0xF4800010|Чтение|0x00980130|
0xA08955A8|I2C |WHBSYSCON|0xF4800020|Чтение|0x00000000|
0xA08955B4|I2C |WHBSYSCON|0xF4800020|Запись|0x00080000|
0xA08955BC|I2C |SYSCON |0xF4800010|Чтение|0x008800A0|
0xA08955DC|I2C |WHBSYSCON|0xF4800020|Чтение|0x00000000|
0xA08955E8|I2C |WHBSYSCON|0xF4800020|Запись|0x00000080|
0xA08955F0|I2C |WHBSYSCON|0xF4800020|Чтение|0x00000000|
0xA08955FC|I2C |WHBSYSCON|0xF4800020|Запись|0x00000020|
0xA0895530|I2C |ICR |0xF48000FC|Запись|0x00004000|
0xA07EDF94|I2C |BUSCON |0xF4800014|Запись|0x00000000|
0xA07EDF9C|I2C |CLC |0xF4800000|Запись|0x00000001|
0xA07EE064|I2C |CLC |0xF4800000|Запись|0x00000100|
0xA07EE06C|I2C |BUSCON |0xF4800014|Запись|0xA0007E11|
0xA07EE070|I2C |SYSCON |0xF4800010|Чтение|0x00880000|
0xA07EE07C|I2C |SYSCON |0xF4800010|Запись|0x00880000|
0xA089550C|I2C |ICR |0xF48000FC|Чтение|0x00000000|
0xA0895514|I2C |ICR |0xF48000FC|Запись|0x00004000|
0xA0895518|I2C |ICR |0xF48000FC|Чтение|0x00000000|
0xA0895520|I2C |ICR |0xF48000FC|Запись|0x00001000|
0xA0895868|I2C |SYSCON |0xF4800010|Чтение|0x00880000|
0xA0895878|I2C |SYSCON |0xF4800010|Чтение|0x00880000|
0xA0895888|I2C |SYSCON |0xF4800010|Чтение|0x00880000|
0xA0895938|I2C |RTB |0xF4800018|Запись|0x00004262|
0xA0895940|I2C |SYSCON |0xF4800010|Чтение|0x00880000|
0xA0895950|I2C |SYSCON |0xF4800010|Запись|0x04880000|
0xA0895964|I2C |WHBSYSCON|0xF4800020|Чтение|0x00000000|
0xA0895970|I2C |WHBSYSCON|0xF4800020|Запись|0x00100000|
0xA0895540|I2C |ICR |0xF48000FC|Чтение|0x00003000|
0xA0895548|I2C |ICR |0xF48000FC|Запись|0x00007000|
0xA0895374|I2C |SYSCON |0xF4800010|Чтение|0x04980230|
0xA0895388|I2C |SYSCON |0xF4800010|Чтение|0x04980230|
0xA089539C|I2C |SYSCON |0xF4800010|Чтение|0x04980230|
0xA0895420|I2C |SYSCON |0xF4800010|Чтение|0x04980230|
0xA0895438|I2C |SYSCON |0xF4800010|Запись|0x00980230|
0xA0895444|I2C |RTB |0xF4800018|Запись|0x00000008|
0xA0895540|I2C |ICR |0xF48000FC|Чтение|0x00003000|
0xA0895548|I2C |ICR |0xF48000FC|Запись|0x00007000|
0xA0895374|I2C |SYSCON |0xF4800010|Чтение|0x00980130|
0xA0895388|I2C |SYSCON |0xF4800010|Чтение|0x00980130|
0xA089539C|I2C |SYSCON |0xF4800010|Чтение|0x00980130|
0xA0895590|I2C |SYSCON |0xF4800010|Чтение|0x00980130|
0xA08955A8|I2C |WHBSYSCON|0xF4800020|Чтение|0x00000000|
0xA08955B4|I2C |WHBSYSCON|0xF4800020|Запись|0x00080000|
0xA08955BC|I2C |SYSCON |0xF4800010|Чтение|0x008800A0|
0xA08955DC|I2C |WHBSYSCON|0xF4800020|Чтение|0x00000000|
0xA08955E8|I2C |WHBSYSCON|0xF4800020|Запись|0x00000080|
0xA08955F0|I2C |WHBSYSCON|0xF4800020|Чтение|0x00000000|
0xA08955FC|I2C |WHBSYSCON|0xF4800020|Запись|0x00000020|
0xA0895530|I2C |ICR |0xF48000FC|Запись|0x00004000|
0xA07EDF94|I2C |BUSCON |0xF4800014|Запись|0x00000000|
0xA07EDF9C|I2C |CLC |0xF4800000|Запись|0x00000001|
0xA07EE064|I2C |CLC |0xF4800000|Запись|0x00000100|
0xA07EE06C|I2C |BUSCON |0xF4800014|Запись|0xA0007E11|
0xA07EE070|I2C |SYSCON |0xF4800010|Чтение|0x00880000|
0xA07EE07C|I2C |SYSCON |0xF4800010|Запись|0x00880000|
0xA089550C|I2C |ICR |0xF48000FC|Чтение|0x00000000|
0xA0895514|I2C |ICR |0xF48000FC|Запись|0x00004000|
0xA0895518|I2C |ICR |0xF48000FC|Чтение|0x00000000|
0xA0895520|I2C |ICR |0xF48000FC|Запись|0x00001000|
0xA0895868|I2C |SYSCON |0xF4800010|Чтение|0x00880000|
0xA0895878|I2C |SYSCON |0xF4800010|Чтение|0x00880000|
0xA0895888|I2C |SYSCON |0xF4800010|Чтение|0x00880000|
0xA0895938|I2C |RTB |0xF4800018|Запись|0x00004462|
0xA0895940|I2C |SYSCON |0xF4800010|Чтение|0x00880000|
0xA0895950|I2C |SYSCON |0xF4800010|Запись|0x04880000|
0xA0895964|I2C |WHBSYSCON|0xF4800020|Чтение|0x00000000|
0xA0895970|I2C |WHBSYSCON|0xF4800020|Запись|0x00100000|
0xA0895540|I2C |ICR |0xF48000FC|Чтение|0x00003000|
0xA0895548|I2C |ICR |0xF48000FC|Запись|0x00007000|
0xA0895374|I2C |SYSCON |0xF4800010|Чтение|0x04980230|
0xA0895388|I2C |SYSCON |0xF4800010|Чтение|0x04980230|
0xA089539C|I2C |SYSCON |0xF4800010|Чтение|0x04980230|
0xA0895420|I2C |SYSCON |0xF4800010|Чтение|0x04980230|
0xA0895438|I2C |SYSCON |0xF4800010|Запись|0x00980230|
0xA0895444|I2C |RTB |0xF4800018|Запись|0x00000062|
0xA0895540|I2C |ICR |0xF48000FC|Чтение|0x00003000|
0xA0895548|I2C |ICR |0xF48000FC|Запись|0x00007000|
0xA0895374|I2C |SYSCON |0xF4800010|Чтение|0x00980130|
0xA0895388|I2C |SYSCON |0xF4800010|Чтение|0x00980130|
0xA089539C|I2C |SYSCON |0xF4800010|Чтение|0x00980130|
0xA0895590|I2C |SYSCON |0xF4800010|Чтение|0x00980130|
0xA08955A8|I2C |WHBSYSCON|0xF4800020|Чтение|0x00000000|
0xA08955B4|I2C |WHBSYSCON|0xF4800020|Запись|0x00080000|
0xA08955BC|I2C |SYSCON |0xF4800010|Чтение|0x008800A0|
0xA08955DC|I2C |WHBSYSCON|0xF4800020|Чтение|0x00000000|
0xA08955E8|I2C |WHBSYSCON|0xF4800020|Запись|0x00000080|
0xA08955F0|I2C |WHBSYSCON|0xF4800020|Чтение|0x00000000|
0xA08955FC|I2C |WHBSYSCON|0xF4800020|Запись|0x00000020|
0xA0895530|I2C |ICR |0xF48000FC|Запись|0x00004000|
0xA07EDF94|I2C |BUSCON |0xF4800014|Запись|0x00000000|
0xA07EDF9C|I2C |CLC |0xF4800000|Запись|0x00000001|
А вот передача 8-байтного файла (содержимое угадайте) habr.txt по ИК-порту
с телефона Siemens CF75 (на нём сниффер) в Siemens CX75.
Отлавливаем только регистры данных:
0xA0A3F3B0|USART1 |TXB |0xF1800020|Запись|
FF FF FF FF FF FF FF FF FF FF FF C0 FF 3F 01 10 яяяяяяяяяяяАя?..
64 77 01 FF FF FF FF 01 00 00 06 7C C1 C1 dw.яяяя....|ББ
0xA07F1BC0|USART1 |RXB |0xF1800024|Чтение|
C1 FF FF FF FF FF FF FF FF FF FF C0 FE BF 01 40 БяяяяяяяяяяАюї.@
90 81 09 10 64 77 01 01 00 00 B1 24 00 53 49 45 ђЃ..dw....±$.SIE
4D 45 4E 53 20 43 58 37 35 3E 35 C1 MENS CX75>5Б
0xA0A3F3B0|USART1 |TXB |0xF1800020|Запись|
FF FF FF FF FF FF FF FF FF FF FF C0 FF 3F 01 10 яяяяяяяяяяяАя?..
64 77 01 FF FF FF FF 01 01 00 DE 65 C1 C1 dw.яяяя...ЮeББ
0xA07F1BC0|USART1 |RXB |0xF1800024|Чтение|
C1 Б
0xA0A3F3B0|USART1 |TXB |0xF1800020|Запись|
FF FF FF FF FF FF FF FF FF FF FF C0 FF 3F 01 10 яяяяяяяяяяяАя?..
64 77 01 FF FF FF FF 01 02 00 B6 4F C1 C1 FF FF dw.яяяя...¶OББяя
FF FF FF FF FF FF FF FF FF C0 FF 3F 01 10 64 77 яяяяяяяяяАя?..dw
01 FF FF FF FF 01 03 00 6E 56 C1 C1 FF FF FF FF .яяяя...nVББяяяя
FF FF FF FF FF FF FF C0 FF 3F 01 10 64 77 01 FF яяяяяяяАя?..dw.я
FF FF FF 01 04 00 66 1B C1 C1 FF FF FF FF FF FF яяя...f.ББяяяяяя
FF FF FF FF FF C0 FF 3F 01 10 64 77 01 FF FF FF яяяяяАя?..dw.яяя
FF 01 05 00 BE 02 C1 C1 FF FF FF FF FF FF FF FF я...ѕ.ББяяяяяяяя
FF FF FF C0 FF 3F 01 10 64 77 01 FF FF FF FF 01 яяяАя?..dw.яяяя.
FF 00 B1 24 00 53 49 45 4D 45 4E 53 20 43 46 37 я.±$.SIEMENS CF7
35 51 CD C1 C1 FF FF FF FF FF FF FF FF FF FF FF 5QНББяяяяяяяяяяя
C0 FF 93 10 64 77 01 40 90 81 09 B4 01 01 3E 82 Ая“.dw.@ђЃ.ґ..>‚
01 07 83 01 0F 84 01 01 85 01 04 86 01 07 08 01 ..ѓ..„..…..†....
FF 25 82 C1 C1 я%‚ББ
0xA07F1BC0|USART1 |RXB |0xF1800024|Чтение|
C1 FF FF FF FF FF FF FF FF FF FF C0 B4 73 40 90 БяяяяяяяяяяАґs@ђ
81 09 10 64 77 01 01 01 3E 82 01 07 83 01 0F 84 Ѓ..dw...>‚..ѓ..„
01 01 85 01 04 86 01 07 08 01 FF 60 18 C1 ..…..†....я`.Б
0xA0A3F3B0|USART1 |TXB |0xF1800020|Запись|
FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 11 яяяяяяяяяяяяяАµ.
99 4A C1 C1 C1 C1 C1 C1 C1 C1 C1 C1 C1 C1 C1 C1 ™JББББББББББББББ
C1 C1 ББ
0xA07F1BC0|USART1 |RXB |0xF1800024|Чтение|
FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 11 41 яяяяяяяяяяяяАґ.A
53 C1 SБ
0xA0A3F3B0|USART1 |TXB |0xF1800020|Запись|
FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 10 яяяяяяяяяяяяяАµ.
80 02 01 00 34 14 C1 C1 Ђ...4.ББ
0xA07F1BC0|USART1 |RXB |0xF1800024|Чтение|
FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 31 43 яяяяяяяяяяяяАґ1C
72 C1 rБ
0xA0A3F3B0|USART1 |TXB |0xF1800020|Запись|
FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 11 яяяяяяяяяяяяяАµ.
99 4A C1 C1 ™JББ
0xA07F1BC0|USART1 |RXB |0xF1800024|Чтение|
FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 30 82 яяяяяяяяяяяяАґ0‚
00 81 00 8C 70 C1 .Ѓ.ЊpБ
0xA0A3F3B0|USART1 |TXB |0xF1800020|Запись|
FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 32 яяяяяяяяяяяяяАµ2
00 02 84 04 4F 42 45 58 13 49 72 44 41 3A 54 69 ..„.OBEX.IrDA:Ti
6E 79 54 50 3A 4C 73 61 70 53 65 6C 04 AF C1 C1 nyTP:LsapSel.ЇББ
0xA07F1BC0|USART1 |RXB |0xF1800024|Чтение|
FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 51 45 яяяяяяяяяяяяАґQE
11 C1 .Б
0xA0A3F3B0|USART1 |TXB |0xF1800020|Запись|
FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 31 яяяяяяяяяяяяяАµ1
9B 6B C1 C1 ›kББ
0xA07F1BC0|USART1 |RXB |0xF1800024|Чтение|
FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 52 02 яяяяяяяяяяяяАґR.
00 84 00 00 01 00 02 01 00 00 00 04 8D AF C1 .„..........ЌЇБ
0xA0A3F3B0|USART1 |TXB |0xF1800020|Запись|
FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 54 яяяяяяяяяяяяяАµT
84 04 01 00 04 18 B5 C1 C1 „.....µББ
0xA07F1BC0|USART1 |RXB |0xF1800024|Чтение|
FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 71 47 яяяяяяяяяяяяАґqG
30 C1 0Б
0xA0A3F3B0|USART1 |TXB |0xF1800020|Запись|
FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 51 яяяяяяяяяяяяяАµQ
9D 08 C1 C1 ќ.ББ
0xA07F1BC0|USART1 |RXB |0xF1800024|Чтение|
FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 74 84 яяяяяяяяяяяяАґt„
04 81 00 04 41 A3 C1 .Ѓ..AЈБ
0xA0A3F3B0|USART1 |TXB |0xF1800020|Запись|
FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 71 яяяяяяяяяяяяяАµq
9F 29 C1 C1 џ)ББ
0xA07F1BC0|USART1 |RXB |0xF1800024|Чтение|
FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 71 47 яяяяяяяяяяяяАґqG
30 C1 0Б
0xA0A3F3B0|USART1 |TXB |0xF1800020|Запись|
FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 71 яяяяяяяяяяяяяАµq
9F 29 C1 C1 џ)ББ
0xA07F1BC0|USART1 |RXB |0xF1800024|Чтение|
FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 71 47 яяяяяяяяяяяяАґqG
30 C1 0Б
0xA0A3F3B0|USART1 |TXB |0xF1800020|Запись|
FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 71 яяяяяяяяяяяяяАµq
9F 29 C1 C1 C1 џ)БББ
0xA07F1BC0|USART1 |RXB |0xF1800024|Чтение|
FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 71 47 яяяяяяяяяяяяАґqG
30 C1 0Б
0xA0A3F3B0|USART1 |TXB |0xF1800020|Запись|
FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 71 яяяяяяяяяяяяяАµq
9F 29 C1 C1 C1 C1 C1 C1 C1 C1 C1 C1 C1 C1 C1 C1 џ)ББББББББББББББ
C1 C1 ББ
0xA07F1BC0|USART1 |RXB |0xF1800024|Чтение|
FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 71 47 яяяяяяяяяяяяАґqG
30 C1 0Б
0xA0A3F3B0|USART1 |TXB |0xF1800020|Запись|
FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 71 яяяяяяяяяяяяяАµq
9F 29 C1 C1 C1 џ)БББ
0xA07F1BC0|USART1 |RXB |0xF1800024|Чтение|
FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 71 47 яяяяяяяяяяяяАґqG
30 C1 0Б
0xA0A3F3B0|USART1 |TXB |0xF1800020|Запись|
FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 71 яяяяяяяяяяяяяАµq
9F 29 C1 C1 џ)ББ
0xA07F1BC0|USART1 |RXB |0xF1800024|Чтение|
FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 71 47 яяяяяяяяяяяяАґqG
30 C1 0Б
0xA0A3F3B0|USART1 |TXB |0xF1800020|Запись|
FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 71 яяяяяяяяяяяяяАµq
9F 29 C1 C1 џ)ББ
0xA07F1BC0|USART1 |RXB |0xF1800024|Чтение|
FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 71 47 яяяяяяяяяяяяАґqG
30 C1 0Б
0xA0A3F3B0|USART1 |TXB |0xF1800020|Запись|
FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 71 яяяяяяяяяяяяяАµq
9F 29 C1 C1 C1 C1 C1 C1 C1 C1 C1 C1 C1 C1 џ)ББББББББББББ
0xA07F1BC0|USART1 |RXB |0xF1800024|Чтение|
FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 71 47 яяяяяяяяяяяяАґqG
30 C1 0Б
0xA0A3F3B0|USART1 |TXB |0xF1800020|Запись|
FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 71 яяяяяяяяяяяяяАµq
9F 29 C1 C1 џ)ББ
0xA07F1BC0|USART1 |RXB |0xF1800024|Чтение|
FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 71 47 яяяяяяяяяяяяАґqG
30 C1 0Б
0xA0A3F3B0|USART1 |TXB |0xF1800020|Запись|
FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 71 яяяяяяяяяяяяяАµq
9F 29 C1 C1 џ)ББ
0xA07F1BC0|USART1 |RXB |0xF1800024|Чтение|
FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 71 47 яяяяяяяяяяяяАґqG
30 C1 0Б
0xA0A3F3B0|USART1 |TXB |0xF1800020|Запись|
FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 76 яяяяяяяяяяяяяАµv
04 04 00 80 00 07 10 00 02 0B 92 AC C1 C1 ...Ђ......’¬ББ
0xA07F1BC0|USART1 |RXB |0xF1800024|Чтение|
FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 91 49 яяяяяяяяяяяяАґ‘I
D7 C1 ЧБ
0xA0A3F3B0|USART1 |TXB |0xF1800020|Запись|
FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 71 яяяяяяяяяяяяяАµq
9F 29 C1 C1 џ)ББ
0xA07F1BC0|USART1 |RXB |0xF1800024|Чтение|
FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 96 04 яяяяяяяяяяяяАґ–.
04 01 A0 00 07 10 00 02 0B 6F 76 C1 .. ......ovБ
0xA0A3F3B0|USART1 |TXB |0xF1800020|Запись|
FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 98 яяяяяяяяяяяяяАµ
04 04 01 02 00 1D 01 00 15 00 68 00 61 00 62 00 ..........h.a.b.
72 00 2E 00 74 00 78 00 74 00 00 C3 00 00 00 08 r...t.x.t..Г....
8C 02 C1 C1 Њ.ББ
0xA07F1BC0|USART1 |RXB |0xF1800024|Чтение|
FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 B1 4B яяяяяяяяяяяяАґ±K
F6 C1 цБ
0xA0A3F3B0|USART1 |TXB |0xF1800020|Запись|
FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 91 яяяяяяяяяяяяяАµ‘
91 CE C1 C1 ‘ОББ
0xA07F1BC0|USART1 |RXB |0xF1800024|Чтение|
FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 B8 04 яяяяяяяяяяяяАґё.
04 01 90 00 03 99 A7 C1 ..ђ..™§Б
0xA0A3F3B0|USART1 |TXB |0xF1800020|Запись|
FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 BA яяяяяяяяяяяяяАµє
04 04 01 02 00 0E 48 00 0B 48 41 42 52 48 41 42 ......H..HABRHAB
52 96 88 C1 C1 R–€ББ
0xA07F1BC0|USART1 |RXB |0xF1800024|Чтение|
FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 D1 4D яяяяяяяяяяяяАґСM
95 C1 •Б
0xA0A3F3B0|USART1 |TXB |0xF1800020|Запись|
FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 B1 яяяяяяяяяяяяяАµ±
93 EF C1 C1 “пББ
0xA07F1BC0|USART1 |RXB |0xF1800024|Чтение|
FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 D1 4D яяяяяяяяяяяяАґСM
95 C1 •Б
0xA0A3F3B0|USART1 |TXB |0xF1800020|Запись|
FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 B1 яяяяяяяяяяяяяАµ±
93 EF C1 C1 “пББ
0xA07F1BC0|USART1 |RXB |0xF1800024|Чтение|
FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 D1 4D яяяяяяяяяяяяАґСM
95 C1 •Б
0xA0A3F3B0|USART1 |TXB |0xF1800020|Запись|
FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 B1 яяяяяяяяяяяяяАµ±
93 EF C1 C1 “пББ
0xA07F1BC0|USART1 |RXB |0xF1800024|Чтение|
FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 D1 4D яяяяяяяяяяяяАґСM
95 C1 •Б
0xA0A3F3B0|USART1 |TXB |0xF1800020|Запись|
FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 B1 яяяяяяяяяяяяяАµ±
93 EF C1 C1 “пББ
0xA07F1BC0|USART1 |RXB |0xF1800024|Чтение|
FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 D1 4D яяяяяяяяяяяяАґСM
95 C1 •Б
0xA0A3F3B0|USART1 |TXB |0xF1800020|Запись|
FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 B1 яяяяяяяяяяяяяАµ±
93 EF C1 C1 “пББ
0xA07F1BC0|USART1 |RXB |0xF1800024|Чтение|
FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 D1 4D яяяяяяяяяяяяАґСM
95 C1 •Б
0xA0A3F3B0|USART1 |TXB |0xF1800020|Запись|
FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 B1 яяяяяяяяяяяяяАµ±
93 EF C1 C1 “пББ
0xA07F1BC0|USART1 |RXB |0xF1800024|Чтение|
FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 D1 4D яяяяяяяяяяяяАґСM
95 C1 •Б
0xA0A3F3B0|USART1 |TXB |0xF1800020|Запись|
FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 B1 яяяяяяяяяяяяяАµ±
93 EF C1 C1 “пББ
0xA07F1BC0|USART1 |RXB |0xF1800024|Чтение|
FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 DA 04 яяяяяяяяяяяяАґЪ.
04 01 90 00 03 A7 34 C1 ..ђ..§4Б
0xA0A3F3B0|USART1 |TXB |0xF1800020|Запись|
FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 DC яяяяяяяяяяяяяАµЬ
04 04 01 82 00 06 49 00 03 DD A5 C1 C1 ...‚..I..ЭҐББ
0xA07F1BC0|USART1 |RXB |0xF1800024|Чтение|
FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 F1 4F яяяяяяяяяяяяАґсO
B4 C1 ґБ
0xA0A3F3B0|USART1 |TXB |0xF1800020|Запись|
FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 D1 яяяяяяяяяяяяяАµС
95 8C C1 C1 •ЊББ
0xA07F1BC0|USART1 |RXB |0xF1800024|Чтение|
FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 FC 04 яяяяяяяяяяяяАґь.
04 01 A0 00 03 47 89 C1 .. ..G‰Б
0xA0A3F3B0|USART1 |TXB |0xF1800020|Запись|
FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 FE яяяяяяяяяяяяяАµю
04 04 01 81 00 03 A4 66 C1 C1 ...Ѓ..¤fББ
0xA07F1BC0|USART1 |RXB |0xF1800024|Чтение|
FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 11 41 яяяяяяяяяяяяАґ.A
53 C1 SБ
0xA0A3F3B0|USART1 |TXB |0xF1800020|Запись|
FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 F1 яяяяяяяяяяяяяАµс
97 AD C1 C1 —ББ
0xA07F1BC0|USART1 |RXB |0xF1800024|Чтение|
FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 1E 04 яяяяяяяяяяяяАґ..
04 01 A0 00 03 64 9C C1 .. ..dњБ
0xA0A3F3B0|USART1 |TXB |0xF1800020|Запись|
FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 11 яяяяяяяяяяяяяАµ.
99 4A C1 C1 ™JББ
0xA07F1BC0|USART1 |RXB |0xF1800024|Чтение|
FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 11 41 яяяяяяяяяяяяАґ.A
53 C1 SБ
0xA0A3F3B0|USART1 |TXB |0xF1800020|Запись|
FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 11 яяяяяяяяяяяяяАµ.
99 4A C1 C1 ™JББ
0xA07F1BC0|USART1 |RXB |0xF1800024|Чтение|
FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 11 41 яяяяяяяяяяяяАґ.A
53 C1 SБ
0xA0A3F3B0|USART1 |TXB |0xF1800020|Запись|
FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 10 яяяяяяяяяяяяяАµ.
84 04 02 01 E0 8B C1 C1 „...а‹ББ
0xA07F1BC0|USART1 |RXB |0xF1800024|Чтение|
FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 31 43 яяяяяяяяяяяяАґ1C
72 C1 rБ
0xA0A3F3B0|USART1 |TXB |0xF1800020|Запись|
FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 11 яяяяяяяяяяяяяАµ.
99 4A C1 C1 ™JББ
0xA07F1BC0|USART1 |RXB |0xF1800024|Чтение|
FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 31 43 яяяяяяяяяяяяАґ1C
72 C1 rБ
0xA0A3F3B0|USART1 |TXB |0xF1800020|Запись|
FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 12 яяяяяяяяяяяяяАµ.
80 02 02 01 5D 39 C1 C1 Ђ...]9ББ
0xA07F1BC0|USART1 |RXB |0xF1800024|Чтение|
FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 51 45 яяяяяяяяяяяяАґQE
11 C1 .Б
0xA0A3F3B0|USART1 |TXB |0xF1800020|Запись|
FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 11 яяяяяяяяяяяяяАµ.
99 4A C1 C1 ™JББ
0xA07F1BC0|USART1 |RXB |0xF1800024|Чтение|
FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 51 45 яяяяяяяяяяяяАґQE
11 C1 .Б
0xA0A3F3B0|USART1 |TXB |0xF1800020|Запись|
FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 11 яяяяяяяяяяяяяАµ.
99 4A C1 C1 C1 ™JБББ
0xA07F1BC0|USART1 |RXB |0xF1800024|Чтение|
FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 51 45 яяяяяяяяяяяяАґQE
11 C1 .Б
0xA0A3F3B0|USART1 |TXB |0xF1800020|Запись|
FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 11 яяяяяяяяяяяяяАµ.
99 4A C1 C1 ™JББ
0xA07F1BC0|USART1 |RXB |0xF1800024|Чтение|
FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 51 45 яяяяяяяяяяяяАґQE
11 C1 .Б
0xA0A3F3B0|USART1 |TXB |0xF1800020|Запись|
FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 11 яяяяяяяяяяяяяАµ.
99 4A C1 C1 ™JББ
0xA07F1BC0|USART1 |RXB |0xF1800024|Чтение|
FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 51 45 яяяяяяяяяяяяАґQE
11 C1 .Б
0xA0A3F3B0|USART1 |TXB |0xF1800020|Запись|
FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 11 яяяяяяяяяяяяяАµ.
99 4A C1 C1 ™JББ
0xA07F1BC0|USART1 |RXB |0xF1800024|Чтение|
FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 51 45 яяяяяяяяяяяяАґQE
11 C1 .Б
0xA0A3F3B0|USART1 |TXB |0xF1800020|Запись|
FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 11 яяяяяяяяяяяяяАµ.
99 4A C1 C1 ™JББ
0xA07F1BC0|USART1 |RXB |0xF1800024|Чтение|
FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 51 45 яяяяяяяяяяяяАґQE
11 C1 .Б
0xA0A3F3B0|USART1 |TXB |0xF1800020|Запись|
FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 11 яяяяяяяяяяяяяАµ.
99 4A C1 C1 ™JББ
0xA07F1BC0|USART1 |RXB |0xF1800024|Чтение|
FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 51 45 яяяяяяяяяяяяАґQE
11 C1 .Б
0xA0A3F3B0|USART1 |TXB |0xF1800020|Запись|
FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 11 яяяяяяяяяяяяяАµ.
99 4A C1 C1 ™JББ
0xA07F1BC0|USART1 |RXB |0xF1800024|Чтение|
FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 51 45 яяяяяяяяяяяяАґQE
11 C1 .Б
0xA0A3F3B0|USART1 |TXB |0xF1800020|Запись|
FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 11 яяяяяяяяяяяяяАµ.
99 4A C1 C1 ™JББ
0xA07F1BC0|USART1 |RXB |0xF1800024|Чтение|
FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 51 45 яяяяяяяяяяяяАґQE
11 C1 .Б
0xA0A3F3B0|USART1 |TXB |0xF1800020|Запись|
FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 11 яяяяяяяяяяяяяАµ.
99 4A C1 C1 ™JББ
0xA07F1BC0|USART1 |RXB |0xF1800024|Чтение|
FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 51 45 яяяяяяяяяяяяАґQE
11 C1 .Б
0xA0A3F3B0|USART1 |TXB |0xF1800020|Запись|
FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 11 яяяяяяяяяяяяяАµ.
99 4A C1 C1 ™JББ
0xA07F1BC0|USART1 |RXB |0xF1800024|Чтение|
FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 51 45 яяяяяяяяяяяяАґQE
11 C1 .Б
0xA0A3F3B0|USART1 |TXB |0xF1800020|Запись|
FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 11 яяяяяяяяяяяяяАµ.
99 4A C1 C1 ™JББ
0xA07F1BC0|USART1 |RXB |0xF1800024|Чтение|
FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 51 45 яяяяяяяяяяяяАґQE
11 C1 .Б
0xA0A3F3B0|USART1 |TXB |0xF1800020|Запись|
FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 11 яяяяяяяяяяяяяАµ.
99 4A C1 C1 ™JББ
0xA07F1BC0|USART1 |RXB |0xF1800024|Чтение|
FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 51 45 яяяяяяяяяяяяАґQE
11 C1 .Б
0xA0A3F3B0|USART1 |TXB |0xF1800020|Запись|
FF FF FF FF FF FF FF FF FF FF FF FF FF C0 B5 53 яяяяяяяяяяяяяАµS
8F 2B C1 C1 Џ+ББ
0xA07F1BC0|USART1 |RXB |0xF1800024|Чтение|
FF FF FF FF FF FF FF FF FF FF FF FF C0 B4 73 40 яяяяяяяяяяяяАґs@
90 81 09 10 64 77 01 3C 38 C1 ђЃ..dw.<8Б
Вернёмся опять к I2C. Поставим фильтр так, чтобы отслеживалась только передача данных.
При щелчках, сервисных звуках, изменении подсветки, громкости и вибрации, мы увидим что что-то происходит:
Файлы
IOSniffer_CPPBuilder_XE5.rar
IOSniffer_IAR42.rar
IOSniffer_I2C.avi
Автор: Dimadze