
MediaTek बेसबैंड फर्मवेयर के विश्लेषण और रिवर्स इंजीनियरिंग के लिए उपकरण, जिसमें फ़ाइल निष्कर्षण, सिंबल पार्सिंग, और मॉडेम बाइनरीज़ के लिए Ghidra एकीकरण शामिल है।
इस रिपॉजिटरी में MediaTek मॉडेम फर्मवेयर से संबंधित Kaitai-आधारित फ़ाइल प्रारूप परिभाषाएँ, साथ ही इन फ़ाइल प्रकारों के साथ इंटरैक्ट करने के लिए कुछ बुनियादी कमांड लाइन टूल्स शामिल हैं। Kaitai IDE का उपयोग Kaitai परिभाषाओं (mtk_structs निर्देशिका में स्थित *.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: प्रत्येक प्रविष्टि के लिए एक प्रतीक टेक्स्ट फ़ाइल आउटपुट करने का विकल्प।)