nccgroup/mtk_bp

GitHub: nccgroup/mtk_bp

MediaTek 基带固件逆向工程工具集,提供基于 Kaitai Struct 的格式定义与命令行解包、符号提取功能,帮助研究人员解析 md1img 容器并对接 Ghidra 进行静态分析。

Stars: 70 | Forks: 19

# MediaTek BP 固件工具 本仓库包含与 MediaTek modem 固件相关的、基于 [Kaitai](https://kaitai.io/) 的文件格式定义,以及一些用于与这些文件类型进行交互的基础命令行工具。[Kaitai IDE](https://ide.kaitai.io/) 也可用于通过 Kaitai 定义(位于 `mtk_structs` 目录下的 `*.ksy` 文件)交互式地探索文件。 基于这些定义的适用于 `md1img` 文件的 Ghidra loader 可在 获取。 以 中的 [`XT2205-1_TESLA_TMO_12_S2STS32.71-118-4-2-6-3_subsidy-TMO_UNI_RSU_QCOM_regulatory-DEFAULT_cid50_CFC.xml.zip`](https://mirrors.lolinet.com/firmware/lenomola/tesla/official/TMO/XT2205-1_TESLA_TMO_12_S2STS32.71-118-4-2-6-3_subsidy-TMO_UNI_RSU_QCOM_regulatory-DEFAULT_cid50_CFC.xml.zip) 为例: ## 解包 `md1img` 容器 `md1_extract.py` 会提取包含在 `md1img` 中的文件: ``` $ ./md1_extract.py ../XT2205-1_TESLA_TMO_12_S2STS32.71-118-4-2-6-3_subsidy-TMO_UNI_RSU_QCOM_regulatory-DEFAULT_cid50_CFC/md1img.img --outdir ./md1img_out/ extracting files to: ./md1img_out md1rom: addr=0x00000000, size=43084864 extracted to 000_md1rom cert1md: addr=0x12345678, size=1781 extracted to 001_cert1md cert2: addr=0x12345678, size=988 extracted to 002_cert2 md1drdi: addr=0x00000000, size=12289536 extracted to 003_md1drdi cert1md: addr=0x12345678, size=1781 extracted to 004_cert1md cert2: addr=0x12345678, size=988 extracted to 005_cert2 md1dsp: addr=0x00000000, size=6776460 extracted to 006_md1dsp cert1md: addr=0x12345678, size=1781 extracted to 007_cert1md cert2: addr=0x12345678, size=988 extracted to 008_cert2 md1_filter: addr=0xffffffff, size=300 extracted to 009_md1_filter md1_filter_PLS_PS_ONLY: addr=0xffffffff, size=300 extracted to 010_md1_filter_PLS_PS_ONLY md1_filter_1_Moderate: addr=0xffffffff, size=300 extracted to 011_md1_filter_1_Moderate md1_filter_2_Standard: addr=0xffffffff, size=300 extracted to 012_md1_filter_2_Standard md1_filter_3_Slim: addr=0xffffffff, size=300 extracted to 013_md1_filter_3_Slim md1_filter_4_UltraSlim: addr=0xffffffff, size=300 extracted to 014_md1_filter_4_UltraSlim md1_filter_LowPowerMonitor: addr=0xffffffff, size=300 extracted to 015_md1_filter_LowPowerMonitor md1_emfilter: addr=0xffffffff, size=2252 extracted to 016_md1_emfilter md1_dbginfodsp: addr=0xffffffff, size=1635062 extracted to 017_md1_dbginfodsp md1_dbginfo: addr=0xffffffff, size=1332720 extracted to 018_md1_dbginfo md1_mddbmeta: addr=0xffffffff, size=899538 extracted to 019_md1_mddbmeta md1_mddbmetaodb: addr=0xffffffff, size=562654 extracted to 020_md1_mddbmetaodb md1_mddb: addr=0xffffffff, size=12280622 extracted to 021_md1_mddb md1_mdmlayout: addr=0xffffffff, size=8341403 extracted to 022_md1_mdmlayout md1_file_map: addr=0xffffffff, size=889 extracted to 023_md1_file_map ``` 主要的 modem 固件位于 `md1rom` 文件(`000_md1rom`)中。关于对 nanoMIPS 二进制文件进行逆向工程,请参阅 [nanoMIPS Ghidra 扩展](https://github.com/nccgroup/ghidra-nanomips)。 ## 列出调试符号 `mtk_dbg_extract.py` 从 `md1_dbginfo`(完整文件名由 `md1_file_map` 提供)中提取符号,并将其输出为 可使用 Ghidra 的 `ImportSymbolsScript.py` 脚本导入的文本格式。 ``` $ ./mtk_dbg_extract.py symbols DbgInfo_NR16.R2.MT6879.TC2.PR1.SP_LENOVO_S0MP1_K6879V1_64_MT6879_NR16_TC2_PR1_SP_V17_P38_03_24_03R_2023_05_19_22_31 | tee debug_symbols.txt INT_Vectors 0x0000084c f brom_ext_main 0x00000860 f INT_SetPLL_Gen98 0x00000866 f PLL_Set_CLK_To_26M 0x000009a2 f PLL_MD_Pll_Init 0x000009da f INT_SetPLL 0x000009dc f INT_Initialize_Phase1 0x027b5c80 f INT_Initialize_Phase2 0x027b617c f init_cm 0x027b6384 f init_cm_wt 0x027b641e f ... ``` 一些调试信息文件(例如示例固件中的 `md1_dbginfodsp`)包含多个文件的符号。 目前,每个文件的符号将按顺序打印,并以 `#` 开头的分隔行隔开,例如: ``` # 0x000010 DSP_USIP0 _ss_reset_entry 0x00000000 l _vector_excpetion_veneer 0x00000404 l ... # 0x081c4b DSP_USIP1 _ss_reset_entry 0x00000000 l _vector_excpetion_veneer 0x00000404 l ... # 0x2cb407 DSP_SCQ16 SCQ16_LTE_ROCODE void_lte_dmrs_comm_cell_info_trace___uint___uint 0x0003aff8 l void_inv_cholesky_4x4_vst_func_Q3_VMLmvpvHalf_Q3_VMLmvpvHalf_Q3_VMLmvpvcHalf_Q3_VMLmvpvcHalf_Q3_VMLmvpvcHalf_Q3_VMLmvpvcHalf_Q3_VMLmvpvcHalf_Q3_VMLmvpvHalf_Q3_VMLmvpvHalf_Q3_VMLmvpvcHalf_Q3_VMLmvpsHalf___uint___uint___uint___uint___uint___uint___uint___uint___uint___uint___uint___uint___uint___uint___uint___uint 0x0004a5ab l ... ``` `ImportSymbolsScript.py` _不_ 支持这些注释行,因此必须手动进行拆分。 (TODO:增加为每个条目输出独立符号文本文件的选项。)
标签:Kaitai, 云资产清单, 固件解析, 文件提取, 联发科, 逆向工具, 逆向工程