计划执行与检查节点
executing-plans
按既定实施计划完成工作,保持过程检查和反馈。
re-automotive【效率与协作】汽车逆向:CAN 总线、ECU 固件、AUTOSAR Classic(RTE/runnable/BSW)与 Adaptive(执行管理/清单)。 触发词:汽车、CAN、ECU、车载、OBD、UDS、AUTOSAR、RTE、runnable、SWC、BSW、E_OS_ACCESS、 Adaptive、ARA、Execution Management、Function Group、Machine State、Execution Manifest
独立 GitHub 快照 · 自动分类 · 以原作者文档为准
所有工具先验证再使用。实车/实总线测试默认物理隔离——[[re-analyze/platform-tips]] 最高原则:仅自有或获授权测试车辆/台架可接入;实验室起步用 vcan 虚拟总线,不接真车。
apt install can-utils(Debian/Ubuntu)/ dnf install can-utils(Fedora)/ Arch: 无官方包 → AUR(can-utils)或源码构建(git clone https://github.com/linux-can/can-utils && cd can-utils && ./autogen.sh && ./configure && make)candump --help;cansend --helpmodprobe can vcan can-isotp;ip link 来自 iproute2(基础系统自带)modprobe vcan && ip link add dev vcan0 type vcan && ip link set up vcan0 && ip -details link show vcan0dmesg 应注册 can0(个别发行版 CAN 驱动在 modules-extra 包,modprobe gs_usb 报错时装对应 extra 包)modprobe gs_usb;ip -details link show can0tshark --version;candump -l 日志可直接 File → Open 打开pip install python-canapt install python3-can(Debian/Ubuntu)/ dnf install python3-can(Fedora)/ pacman -S python-can(Arch extra)python3 -c "import can; print(can.__version__)"pip install obd;验证 python3 -c "import obd"pip install udsoncan isotp;验证 python3 -c "import udsoncan, isotp"pip install scapy(含 scapy.contrib.automotive 与 scapy.layers.can)python3 -c "from scapy.contrib.automotive.uds import UDS; from scapy.contrib.automotive.doip import DoIP; from scapy.layers.can import CAN; print('ok')"按顺序执行,每步记下结果。
CAN 接入(USB-CAN / socketcan):
sudo modprobe can vcan can-isotp
sudo ip link add dev vcan0 type vcan
sudo ip link set up vcan0
sudo modprobe gs_usb
sudo ip link set can0 up type can bitrate 500000 # 500 kbit/s 经典波特率
ip -details link show can0 # 确认 bitrate / state UP
candump 抓包:
candump -t a can0 # 实时查看(绝对时间戳)
candump -l can0 # 落盘日志(默认文件名带时间戳;无轮转——需要轮转交给 logrotate/外部脚本;Wireshark 可直接打开)
candump can0 -n 100 # 只抓 100 帧
candump can0,7E0:7FF # ID 过滤:接口名后接 can_id:mask(逗号分隔);掩码 7FF = 精确匹配 7E0,区间过滤用 7F8(匹配 7E0~7E7);CAN 无地址(见坑 1)
candump -f can.log can0 # 注意 -f 是"日志写入文件",不是过滤参数
报文 ID / 周期 / 信号解析:
cansniffer can0 # 按 ID 聚类、周期与变化字节高亮
candump can0 | awk '{print $2}' | sort | uniq -c # 按 ID 统计帧数(默认输出第 2 列是 ID;注意 -c 是颜色模式,不是计数)
canbusload can0@500000 # 总线负载率 %
pip install cantools)UDS / OBD 诊断:
import obd
conn = obd.OBD() # 自动探测适配器串口
conn.query(obd.commands.SPEED) # 车速
conn.query(obd.commands.GET_DTC) # 故障码
import udsoncan, isotp
from udsoncan.connections import IsoTPSocketConnection
from udsoncan.client import Client, ClientConfig
from udsoncan.services import DiagnosticSessionControl, DataIdentifier
# 关键:DID 的 payload 怎么编解码,由 config['data_identifiers'] 决定——
# 该 DID 不在映射里时,udsoncan 在发送请求**之前**就抛 ConfigError
#("contains no definition for data identifier 0xf190");映射里有但 codec 不是
# DidCodec 实例则抛 ValueError("is not a valid DidCodec")。
# 配置只需给出要覆盖的键:Client 会用 udsoncan.configs.default_client_config 补齐其余项,
# 所以 data_identifiers 之外不必逐项照抄默认值。
config = ClientConfig()
config['data_identifiers'] = {
0xF190: ..., # VIN 的标准 DID;codec = 17 字节 ASCII(用库自带的类型,或自定义 DidCodec 子类)
}
conn = IsoTPSocketConnection('can0', isotp.Address(isotp.AddressingMode.Normal_11bits, rxid=0x7E8, txid=0x7E0))
with Client(conn, request_timeout=2, config=config) as client:
client.change_session(DiagnosticSessionControl.Session.extendedDiagnosticSession)
vin = client.read_data_by_identifier(DataIdentifier.VIN)
read_data_by_identifier / write_data_by_identifier 依赖 client 配置里的 data_identifiers(DID → codec 映射)——响应只是字节串,缺了 codec 就无从解码,udsoncan 会以配置错误终止而不是"返回原始字节"。官方示例一律写成 Client(..., config=MyCar.config) 并注明 VIN 的 codec 配在 client 配置里。只想看原始载荷就别走 DID 解码路径,用不做解码的低层接口ECU 固件:
0x34 RequestDownload → 0x36 TransferData × N → 0x37 RequestTransferExit;实际 ECU 编程通常先按 OEM 要求进 0x10 编程会话,服务受安全级别保护时执行 0x27(安全访问),擦除/完整性校验多经 OEM 定义的 0x31(例程控制),过程可能需 0x3E 保活、结束可能 0x11 复位——具体序列从 ECU 行为/ODX/固件恢复,不假定固定顺序。或 0x23 读内存获取固件 → 转 [[re-fw-extract]] 解包(ECU/车机固件与 IoT 固件同流程)按目标形态分流(判定规则):
Rte_IRead_*/Rte_IWrite_*)在 runnable 边界做快照与写回("消费者看到旧值"可能是语义);E_OS_ACCESS 来自 OS-Application 所有权/保护(默认拒绝,授权来自配置),不是参数错误;并发异常先查 OS 配置(Task 映射、优先级、抢占)candump can0,ID:mask 过滤,不预设主机概念candump 错误帧刷屏(error frame),或高负载下周期抖动、抓到的周期不可信;原因——波特率与总线不一致;负载高(>60-70%)时仲裁延迟与丢帧;对策——接入前确认波特率(500 kbit/s 最常见,canbusload 看负载率),周期性分析排除高负载时段,需要精确时序用硬件时间戳Rte_* 包装与 RTEEvent 映射、确认它被映射到哪个 OS Task([[autosar-classic]])Rte_Read_*(显式)与 Rte_IRead_*(隐式),按配置判定通信形式([[autosar-classic]])E_OS_ACCESS 当参数错误:现象——ActivateTask 一类服务返回访问错误,怀疑 task ID 写错或 OS 损坏;原因——OS-Application 的所有权/保护状态:未在配置时授予访问权,或对象属于另一个不可访问的应用;对策——查对象所属 OS-Application、应用状态、信任级别与当前调用上下文([[autosar-classic]])