
MediaTek 베이스밴드 펌웨어를 분석하고 리버스 엔지니어링하기 위한 도구로, 파일 추출, 심볼 파싱, 모뎀 바이너리용 Ghidra 통합을 지원합니다.
이 저장소에는 MediaTek 모뎀 펌웨어와 관련된 Kaitai 기반 파일 형식 정의와 이러한 파일 형식을 다루기 위한 몇 가지 기본적인 명령줄 도구가 포함되어 있습니다. Kaitai IDE를 사용하면 mtk_structs 디렉터리에 있는 Kaitai 정의(*.ksy 파일)로 파일을 대화형으로 탐색할 수도 있습니다.
이 정의들을 기반으로 한 md1img 파일용 Ghidra 로더는 https://github.com/nccgroup/ghidra-mtk-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/에서 가져와 사용한 예시입니다:
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
주요 모뎀 펌웨어는 md1rom 파일(000_md1rom)에 있습니다. nanoMIPS 바이너리 리버스 엔지니어링에 대해서는 nanoMIPS Ghidra 확장을 참조하세요.
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: 각 항목에 대한 심볼 텍스트 파일을 출력하는 옵션)