用于提取,改装和重新包装DJI多旋风无人机的固件的工具。
该项目是从Phantom-licensecheck的解析器的替代实现。随着时间的流逝,它不断发展以支持许多世代的DJI产品。它由不仅允许提取的工具组成,还可以将先前提取的模块重新包装回单个文件中。还有一些工具应在特定模块上使用以提取并允许修改其内容。
这是工具的一些可能用途。
替换无人机的某些组件可能需要校准。这些工具能够在某些设备中触发校准,主要是带有霍尔传感器的gimbal。
也可以使用它们将任何自定义数据包发送到无人机,这样就可以触发工厂功能(例如校准或配对) - 只要您知道数据包的外观。
该项目的Wiki在每个无人机内有大量有关董事会的信息,每个板上的组件。此信息由许多发烧友和维修技术人员创建和共享。
这些工具可以用作DJI Assistant软件的命令行版本,该版本还允许更改缺少此类OEM软件或已锁定高级功能的平台的参数。
来自DJI的飞行控制器定义了影响其行为的参数。只要新值在FC固件接受的限制范围内,就可以通过将命令发送到无人机来修改。
这些工具允许修改固件二进制文件,然后将它们重新包装回闪烁的固件软件包。这样,可以更改任何软件控制功能,包括:
有时可能需要其他知识和软件修改(即扎根无人机)才能闪烁修改固件 - 使用非对称加密术签名一些固件软件包,而私钥很少可用。
如果您对DJI硬件和软件感兴趣,那么这是开始学习的地方。你可以:
将不会提供此类指示。这些工具适用于具有庞大硬件和软件知识的工程师。您需要知道使用这些工具来实现任何目标。
这是为了确保脚本孩子不会使用这些工具来禁用安全机制并允许违反本地法律。
如果您不了解工具的工作原理,则不应使用它们。如果显示出任何警告,则必须调查确保最终固件不会损坏的原因。您正在使用自己的风险使用工具。
如果您不知道从哪里开始,请检查测试。他们将为您提供与无人机通信或提取特定固件的所有层的命令线(只要您可以正确放置)。
由于所有工具均以源代码表格可用,因此可以通过查看其源来查看这些工具处理的结构和协议的详细信息。源代码旨在还充当格式文档。
有关更高级别和更多与硬件有关的信息,请检查Wiki项目。
工具可以分为两类:
独立于硬件的工具 - 您不需要使用任何DJI产品的工具。您只需要他们使用的输入文件,例如DJI固件软件包或DAT日志文件。
产品通信工具 - 您需要将无人机连接到PC,以便以任何有意义的方式使用这些工具。当前,工具使用串行接口(UART)和I2C。
简而言之,在特定工具下进行描述。在没有参数的情况下运行它们将为您提供有关每个参数的详细信息。
要获取有关每个工具的命令行参数的详细信息,请使用--help选项运行它们。一些工具在其标题中还有其他评论 - 尝试查看它们。
DJI固件XV4容器工具;允许从以xV4开头的软件包文件中提取模块,或通过合并固件模块来创建容器。首先使用此工具,以从DJI下载的bin文件,只要文件以xV4开头。
从phantom 3 Pro中提取模块的示例:
./dji_xv4_fwcon.py -vv -x -p P3X_FW_V01.08.0080.bin
DJI固件IMAH UN-SIGNER和解密工具;允许从IM*H开始的.sig文件解密和UN-SIGN模块。从固件软件包中解开单个模块后,请使用此工具来解密其内容。只要可以提供所选密钥的私有部分,该工具还可以重新签名模块。
用于加密和身份验证的密钥会随着时间而变化。当IM*H文件是指该工具具有多个版本的键时,它将在警告消息中显示可能的键列表,并选择当前操作的最新密钥。
Mavic Pro的不签名相机固件的示例:
./dji_imah_fwsig.py -vv -k PRAK-2017-01 -k PUEK-2017-07 -u -i wm220_0101_v02.00.55.69_20161215.pro.fw.sig
幻影4 pro V2的未签名FC固件的示例:
./dji_imah_fwsig.py -vv -k PRAK-2017-01 -k PUEK-2017-07 -u -i wm335_0306_v03.03.04.10_20180429.pro.fw.sig
为Mini 2签署以前未签名的FC固件的示例(需要私人部分的PRAK ):
./dji_imah_fwsig.py -vv -k PRAK-2019-09 -s -i wm161_0306_v03.04.09.74_20210112.pro.fw.sig
有关该工具使用的更多示例以及特定平台的键标识符,请阅读用于测试它的脚本: tests/test_dji_imah_fwsig_rebin1.sh 。
DJI MAVIC飞行控制器固件解密工具;从同一时期发布的几种DJI产品中删除飞行控制器固件模块中的第二层加密: Mavic Pro , Spark , Inspire 2和Phantom 4 。不接受IM*H格式 - 需要已经删除具有第一级加密的输入文件。
为Mavic Pro解密FC固件的示例:
./dji_mvfc_fwpak.py dec -i wm220_0306_v03.02.40.11_20170918.pro.fw
Ambarella A7/A9固件包工具;允许从固件中提取分区或将其合并。使用此方法从提取DJI容器后创建的文件中提取Ambarella固件。您可以在文件开始时通过许多“ AMBA”字符串或32个char零填充的字符串识别Ambarella固件。
从Ambarella固件中提取phantom 3 Pro的分区的示例:
./amba_fwpak.py -vv -x -m P3X_FW_V01.08.0080_m0100.bin
Ambarella A7/A9固件ROMFS文件系统工具;允许从ROMFS文件系统文件中提取单个文件,或从单个文件中重建文件系统。提取Ambarella固件后使用此功能。您可以通过文件开始附近的文件名来识别ROMFS分区,并被0xff填充字节的块包围。
从Ambarella固件中提取ROMFS分区的示例3 pro :
./amba_romfs.py -vv -x -p P3X_FW_V01.08.0080_m0100_part_rom_fw.a9s
Linux脚本,用于从Ambarella固件安装UBIFS分区。安装后,可以复制或修改文件。提取Ambarella固件后使用此功能。在文件开头的UBI#可以轻松识别包含UBIF的文件。
phantom 3 pro的安装根文件系统分区的示例:
sudo ./amba_ubifs.sh P3X_FW_V01.08.0080_m0100_part_rfs.a9s
用精灵标头包装二进制可执行手臂图像的工具。如果固件包含可执行文件的二进制图像,则此工具可以为其重建精灵标题。然后可以轻松拆卸精灵格式,因为大多数辩论者可以读取精灵文件。请注意,在加密的固件上使用此工具不会导致可用的精灵。
将FC固件转换为Phantom 3转换为ELF的示例:
./arm_bin2elf.py -vv -e -b 0x8020000 -l 0x6000000 -p P3X_FW_V01.07.0060_m0306.bin
上面的命令将导致工具尝试检测代码( .text )和数据( .data )部分之间的边界应在哪里。该检测并不是完美的,尤其是对于彼此之间没有.ARM.exidx部分的二进制文件。如果二进制中存在.ARM.exidx ,则该工具可以轻松找到它并正确划分二进制数据,将.ARM.exidx视为.text和.data之间的分离器。
换句话说, .ARM.exidx的位置会影响.text部分的长度,并影响.data部分的启动偏移。如果文件中没有.ARM.exidx部分,则将其用作零尺寸的分离器。首次查看拆卸后,最好检查.text和.data部分之间的正确边框位于位置。该位置的存储地址可用于生成更好的小精灵文件。
首次查看后,对小精灵的其他更新可以包括定义.bss部分。这些部分代表了由二进制的非初始化的RAM和MMIO区域。只需定义一个大部分即可根据芯片的编程指南覆盖整个内存地址范围,但是这会导致大量的内存使用量和相关的放缓,同时拆卸文件,同时也使文件更难导航。
请注意,所有部分偏移均使用内存地址定义,而不是bin文件中的位置。如果您在bin文件中找到了部分的正确位置,请记住将基础地址添加到文件位置,然后再插入该工具的命令行。
通常可以在特定芯片的编程指南中找到基地地址;有时,如果二进制文件由其他引导程序加载,则可能会从该位置转移。在这种情况下,引导加载程序从文档中获取位置,然后将实际固件二进制加载在更高的基础地址。
特定公司的优化示例:
./arm_bin2elf.py -vv -e -b 0x8020000 --section .ARM.exidx@0x80A5D34:0 --section .bss@0x10000000:0x0A000 --section .bss2@0x20000000:0x30000 --section .bss3@0x40000000:0x30000 -p P3X_FW_V01.07.0060_m0306.bin
./arm_bin2elf.py -vv -e -b 0x000A000 --section .ARM.exidx@0x026E50:0 --section .bss@0x10000000:0x08000 --section .bss2@0x40000000:0x50000 --section .bss3@0xE0000000:0x10000 -p C1_FW_V01.06.0000_m1400.bin
./arm_bin2elf.py -vv -e -b 0x000A000 --section .ARM.exidx@0x0212E0:0 --section .bss@0x10000000:0x08000 --section .bss2@0x40000000:0x50000 --section .bss3@0xE0000000:0x10000 -p C1_FW_v01.09.0200_m1400.bin
./arm_bin2elf.py -vv -e -b 0x000A000 --section .ARM.exidx@0x0233E0:0 --section .bss@0x02000000:0x04000 --section .bss2@0x2008000:0x1000 --section .bss3@0x1C000000:0x2400 --section .bss4@0x1c024000:0x2400 --section .bss5@0x4002C000:0x50000 --section .bss6@0x400F8000:0x200 --section .bss7@0xE000E000:0x1200 -p C1_FW_V01.06.0000_m1401.bin
./arm_bin2elf.py -vv -e -b 0x8008000 --section .ARM.exidx@0x8015510:0 --section .bss@0x1FFFF700:0x05A00 --section .bss2@0x40000000:0x6700 --section .bss3@0x40010000:0x5500 --section .bss4@0x40020000:0x2200 --section .bss5@0x42200000:0x100 --section .bss6@0x42420000:0x500 -p P3X_FW_V01.08.0080_m0900.bin
./arm_bin2elf.py -vv -e -b 0x8008000 --section .ARM.exidx@0x801B6D0:0 --section .bss@0x1FFFF700:0x0C900 --section .bss2@0x40000000:0x6700 --section .bss3@0x40010000:0x5500 --section .bss4@0x40020000:0x7000 --section .bss5@0x50060800:0x100 -p P3X_FW_V01.11.0030_m0400.bin
./arm_bin2elf.py -vv -e -b 0x0420000 --section .ARM.exidx@0x4EDAF0:0 --section .bss@0x20400000:0x40000 --section .bss4@0x42200000:0x100 -p MATRICE600_FW_V02.00.00.21_m0306.bin
./arm_bin2elf.py -vv -e -b 0x0420000 --section .ARM.exidx@0x4F0E00:0 --section .bss@0x20400000:0x60100 --section .bss2@0x400E0000:0x2000 -p wm330_0306_v03.01.10.93_20160707.fw_0306.decrypted.bin
./arm_bin2elf.py -vv -e -b 0x0420000 --section .ARM.exidx@0x5277d0:0 --section .bss@0x20400000:0x60000 --section .bss2@0x400E0000:0x1000 --section .bss3@0xE0000000:0x10000 -p wm100_0306_v03.02.43.20_20170920.pro.fw_0306.decrypted.bin
./arm_bin2elf.py -vv -e -b 0x0420000 --section .ARM.exidx@0x5465d8:0 --section .bss@0x20400000:0x60100 --section .bss2@0x400E0000:0x2000 -p wm220_0306_v03.02.35.05_20170525.pro.fw_0306.decrypted.bin
./arm_bin2elf.py -vv -e -b 0x7D000000 --section .ARM.exidx@0x7D0356E0:0 --section .bss@0x7D04f380:0x3800 --section .bss2@0x7D0f1900:0x200 -p wm230_0801_v10.00.07.12_20180126-recovery.img.TZOS.bin
./arm_bin2elf.py -vv -e -b 0xFFFC0000 --section .ARM.exidx@0xFFFDA540:0x20 --section .bss@0xFFFE14D0:0x42B0 --section .bss1@0x0202000:0x20 --section .bss2@0x0402020:0x20 --section .bss3@0x0B00000:0x40 --section .bss4@0x2700000:0x40 --section .bss5@0x9000000:0x20 --section .bss6@0xF0440000:0x4500 --section .bss7@0xF0501200:0x200 --section .bss8@0xF0A09000:0x20 --section .bss9@0xF0A40000:0x1200 --section .bss10@0xF0A4D000:0x2100 --section .bss11@0xF0A61000:0x1200 --section .bss12@0xF0A72000:0x20 --section .bss13@0xF0D02000:0x20 --section .bss14@0xF0D04000:0x20 --section .bss15@0xF0E00A00:0xC0 --section .bss16@0xF0E08000:0x20 --section .bss17@0xF5001000:0x40 --section .bss18@0xF6409000:0x100 --section .bss19@0xF6800000:0x1200 --section .bss20@0xFA800000:0x100 --section .bss21@0xFAF01000:0x3500 --section .bss22@0xFB001000:0x2900 --section .bss23@0xFCC01000:0x2400 --section .bss24@0xFD001000:0x2D00 --section .bss25@0xFD400000:0x20 --section .bss26@0xFD501000:0x2400 --section .bss27@0xFF001000:0x1100 -p wm230_0801_v10.00.07.12_20180126.pro.fw_0801.bootarea_p0_BLLK.bin
该工具仅支持bin-to-eft方向转换。要将小精灵文件转换回垃圾箱(即修改后),请使用objcopy实用程序进行特定的体系结构。 objcopy工具是GNU二元实用程序( binutils )的一部分,而不是该存储库的一部分。
示例:
arm-none-eabi-objcopy -O binary P3X_FW_V01.07.0060_m0100_part_sys.elf P3X_FW_V01.07.0060_m0100_part_sys.bin
arm-none-eabi-objcopy -O binary P3X_FW_V01.07.0060_m0900.elf P3X_FW_V01.07.0060_m0900.bin
Ambarella A7/A9固件“系统软件”分区转换器。该分区包含可执行文件的二进制图像,此工具将其包装在精灵标题中。然后可以轻松拆卸精灵格式,因为大多数辩论者可以读取精灵文件。该工具与arm_bin2elf.py非常相似,它只是预先配置到特定的固件。
示例: ./amba_sys2elf.py -vv -e -l 0x6000000 -p P3X_FW_V01.08.0080_m0100_part_sys.a9s
所有为arm_bin2elf.py解释的边境调整规则也适用于此工具。
特定公司的优化示例:
./amba_sys2elf.py -vv -e -l 0x6000000 --section .ARM.exidx@0xEA83E4C:0 -p P3X_FW_V01.08.0080_m0100_part_sys.a9s
./amba_sys2elf.py -vv -e -l 0x6000000 --section .ARM.exidx@0xEA82EC0:0 -p P3X_FW_V01.07.0060_m0100_part_sys.a9s
./amba_sys2elf.py -vv -e -l 0x6000000 --section .ARM.exidx@0xEA64774:0 -p P3X_FW_V01.01.0008_m0100_part_sys.a9s
Ambarella A7/A9固件“系统软件”分区硬编码值编辑器。
该工具可以解析转换为精灵的Ambarella固件分区。它在二进制数据中找到某些硬编码值,并允许导出或导入它们。仅导出的JSON文件中的setValue元素确实可以更改,所有其他数据都是信息的。
将硬编码值导出到JSON文件的示例:
./amba_sys_hardcoder.py -vv -x --elffile P3X_FW_V01.08.0080_m0100_part_sys.elf
从JSON文件中导入值回到ELF的示例:
./amba_sys_hardcoder.py -vv -u --elffile P3X_FW_V01.08.0080_m0100_part_sys.elf
DJI DM3XX DAVINCI ENCODE_USB二进制硬编码值编辑器。
该工具可以从dji固件模块中解析concode_usb elf文件,用于ti dm3xx davinci媒体处理器。它在二进制数据中找到某些硬编码值,并允许导出或导入它们。
将硬编码值导出到JSON文件的示例:
./dm3xx_encode_usb_hardcoder.py -vv -x --elffile P3X_FW_V01.07.0060_m0800-encode_usb.elf
从JSON文件中导入值回到ELF的示例:
./dm3xx_encode_usb_hardcoder.py -vv -u --elffile P3X_FW_V01.07.0060_m0800-encode_usb.elf
DJI Lightbridge STM32微控制器二进制硬编码值编辑器。
该工具可以将Lightbridge MCU固件转换为精灵。它在二进制数据中找到某些硬编码值,并允许导出或导入它们。
将硬编码值导出到JSON文件的示例:
./lightbridge_stm32_hardcoder.py -vv -x --elffile P3X_FW_V01.07.0060_m0900.elf
从JSON文件中导入值回到ELF的示例:
./lightbridge_stm32_hardcoder.py -vv -u --elffile P3X_FW_V01.07.0060_m0900.elf
DJI飞行控制器固件二进制硬编码值编辑器。
该工具可以解析转换为Elf的飞行控制器固件。它在二进制数据中找到某些硬编码值,并允许导出或导入它们。
将硬编码值导出到JSON文件的示例:
./dji_flyc_hardcoder.py -vvv -x -e P3X_FW_V01.07.0060_m0306.elf
从JSON文件中导入值回到ELF的示例:
./dji_flyc_hardcoder.py -vvv -u -e P3X_FW_V01.07.0060_m0306.elf
飞行控制器固件参数数组编辑器在固件二进制中找到了飞行参数数组,并允许将参数提取到JSON格式文本文件中。然后可以轻松修改此文件,并用于更新二进制固件,更改每个参数的属性和限制。
为了找到参数数组,该工具需要将二进制文件加载到微控制器的RAM中的基本地址。如果您不知道要使用的基础地址,则使用的特定芯片编程指南可能会为您提供线索。
提取的示例,然后更新飞行控制器参数:
./dji_flyc_param_ed.py -vv -x -m P3X_FW_V01.07.0060_m0306.bin
./dji_flyc_param_ed.py -vv -u -m P3X_FW_V01.07.0060_m0306.bin
其他产品的更多示例:
./dji_flyc_param_ed.py -vv -x -b 0x420000 -m A3_FW_V01.02.00.00_m0306.bin
./dji_flyc_param_ed.py -vv -x -b 0x420000 -m MATRICE600_FW_V02.00.00.21_m0306.bin
./dji_flyc_param_ed.py -vv -x -b 0x420000 -m MATRICE600PRO_FW_V01.00.00.80_m0306.bin
./dji_flyc_param_ed.py -vv -x -b 0x420000 -m wm220_0306_v03.02.35.05_20170525.pro.bin
./dji_flyc_param_ed.py -vv -x -b 0x0000 -m wm230_0306_v01.00.02.255_20170213.bin
DJI通用数据包容器流媒体带有PCAP输出格式。
脚本解析了RAW DUML流(即飞行日志文件FLY???.DAT ),并用PCAP标头包装单个数据包。在数据传递之前,请先检查数据包CRC。然后,任何具有PCAP格式支持的工具都可以用于分析数据(即Wireshark)。
转换飞行日志文件的示例:
./comm_dat2pcap.py -vv -d FLY002.DAT
DJI串行总线sniffer带有DUML包装仪和PCAP输出格式。
该脚本从两个UART捕获数据,并用PCAP标头包装单个DUML数据包。数据包CRC将在数据传递给PCAP文件或FIFO管道之前检查。然后,任何具有PCAP格式支持的工具都可以用于分析数据(即Wireshark)。
该实用程序需要两个连接到无人机内RX和TX线的RX线的串行接口。
从两个UART到TTL(又称FTDI)转换器启动捕获的示例:
./comm_serial2pcap.py -b 115200 -F /tmp/wsf /dev/ttyUSB0 /dev/ttyUSB1
DUML数据包构建器带有十六进制字符串输出。
该工具可以构建一个合适的DUML数据包,其中包含给定的标头字段和有效载荷。数据包将以十六进制形式输出。已知命令的列表和预期有效载荷的外观可以在下面描述的Wireshark Discutor中找到。
生成数据包以其传感器ID询问Spark Camera模块的示例:
./comm_mkdupc.py --receiver_type=Camera --seq_num=65280 --ack_type=ACK_After_Exec --cmd_set=Camera --cmd_id=181
DUML构建器将数据包发送到DJI产品并收到响应。
该工具构建了一个合适的DUML数据包,其中包含给定的标头字段和有效载荷。然后,它通过给定的串行端口发送并等待响应。它显示收到返回数据包。
可以将其视为dji_mb_ctrl二进制的替代方法,可以在某些无人机中找到。这两个工具之间的参数名称不同。
向飞行控制器询问硬件和固件版本数据的示例(在PH3上进行了测试):
./comm_serialtalk.py --port /dev/ttyUSB0 -vv --timeout=5000 --receiver_type=FlyController --seq_num=65280 --ack_type=No_ACK_Needed --cmd_set=General --cmd_id=1
向飞行控制器询问硬件和固件版本数据的示例(Mavic 3):
./comm_serialtalk.py --bulk -vv --timeout=5000 --receiver_type=FlyController --seq_num=65280 --ack_type=ACK_After_Exec --cmd_set=General --cmd_id=1
DJI产品的OGS服务工具。
该脚本允许触发DJI无人机的一些服务功能。它与无人机(如comm_serialtalk.py进行对话,但为某些重要功能提供了更轻松的接口。
列表飞行控制器参数200-300在PH3 Pro到CSV格式的示例:
./comm_og_service_tool.py --port /dev/ttyUSB0 P3X FlycParam list --start=200 --count=100 --fmt=csv
在火花上获取飞行控制器参数值的示例:
./comm_og_service_tool.py --port /dev/ttyUSB0 -vv SPARK FlycParam get g_config.flying_limit.max_height_0 --fmt=2line
Spark上飞行控制器参数的设置值的示例:
./comm_og_service_tool.py --port /dev/ttyUSB0 -vv SPARK FlycParam set g_config.flying_limit.max_height_0 500
执行服务“关节粗大”校准的示例:
./comm_og_service_tool.py --port /dev/ttyUSB0 -vv SPARK GimbalCalib JointCoarse
使用Windows主机执行Spark Gimbal的“线性大厅”校准的示例:
python3 comm_og_service_tool.py --port COM23 -vv SPARK GimbalCalib LinearHall
在Mavic 3 Pro上列出飞行控制器参数200-300至CSV格式的示例:
./comm_og_service_tool.py --bulk MAV3 FlycParam list --start=200 --count=100 --fmt=csv
智能电池系统通信工具。
该工具允许与基于智能电池数据规范设计的芯片进行交互。它还支持Texas Instruments在其BQ系列燃气表芯片中实施的规范的一些扩展。
该工具的使用需要与SBS兼容芯片的SMBUS线(SDA,SCL,GND)的连接。 SMBUS通信将I2C用作基础,因此大多数带有I2C总线的设备都可以用于建立通信。
使用I2C接口的简单读取BatteryStatus()的示例(该脚本将在内部构造SMBUS消息):
./comm_sbs_bqctrl.py -vvv --bus "i2c:1" --dev_address 0x0b read BatteryStatus
使用smbus接口:
./comm_sbs_bqctrl.py -v --bus "smbus:1" --dev_address 0x0b --chip BQ30z55 --short monitor BQStatusBitsMA
使用默认的SHA-1密钥的Unsealing BQ30Z55(启用写入功能)的示例,使用I2C接口在第二个总线设备上可用于OS:
./comm_sbs_bqctrl.py -v --bus "i2c:2" --dev_address 0x0b --chip BQ30z55 --short sealing Unseal
tests文件夹包含一个脚本集合,可用于验证工具是否正确完成其工作。那里有两种一般类型的测试:
通信工具测试,标记comm 。这些是针对通常与真实设备交谈的脚本。测试正在注入预期的答案,以接收缓冲区,因此可以在没有连接的产品的情况下运行它们。
固件提取工具测试,标记为fw_xv4 , fw_imah_v1 , fw_imah_v2 。这些提取并重新包装在fw_packages目录中找到的固件,然后将结果文件与原始文件进行比较,以检查是否没有引入任何意外的更改。
除了测试修改外,您还可以使用测试作为更多用法示例的来源。他们记录用于提取特定固件并在产品上执行特定命令的命令行。
测试准备与pytest一起使用。执行所有测试的示例:
pytest tests -rsx --full-scope --log-cli-level=INFO
--full-scope选项使测试在所有已知的二进制文件上都执行,而不是用于连续集成的选择。 CI测试具有选择性,以确保自动测试在合理的时间内结束。
回忆录,这些测试只会在fw_packages文件夹的适当子文件夹中放置在二进制文件上。可以在测试脚本中轻松找到子文件夹的有效名称。如果没有将固件二进制文件放在文件夹中,则将跳过所有固件提取测试。
除了运行所有测试外,您还可以运行特定的测试(带有-k )或具有特定标记(带有-m )的一组测试。仅运行fw_xv4测试的示例:
pytest tests -rsx --full-scope -m fw_xv4 --log-cli-level=DEBUG
该文件夹包含用于分析DJI无人机界面中通信的Wireshark解剖器。
该工具的文档包含在其文件夹中。
对于某些特定版本中的特定固件模块,“符号”目录中有部分符号。符号以两种格式:
符号与上述工具生成的精灵文件匹配,而不是直接与垃圾箱。使用上一节中提供的示例命令来生成具有与符号匹配的内容的ELF文件。
在没有可用符号的固件版本时,您可能需要使用带有符号的版本以供参考。
如果您正在寻找最佳的FW版本以获取参考符号,或者您根本不在乎FW版本,只需要最完整的符号 - 检查地图文件的大小。地图文件主要包含手动命名的符号,因此最大的符号将用于固件版本,在此版本上进行了更多的逆转工作。