DJI 멀티 로터 드론의 추출, 모딩 및 재 포장을위한 도구.
이 프로젝트는 Phantom-Licensecheck의 파서의 대체 구현으로 시작되었습니다. 시간이 지남에 따라 많은 세대의 DJI 제품을 지원하기 위해 성장했습니다. 추출뿐만 아니라 이전에 추출한 모듈을 단일 파일로 다시 포장 할 수있는 도구로 구성됩니다. 특정 모듈에 사용되어 컨텐츠를 추출하고 수정할 수있는 도구도 있습니다.
다음은 도구의 가능한 몇 가지 사용입니다.
드론의 일부 구성 요소를 교체하려면 교정이 필요할 수 있습니다. 이 도구는 일부 장치, 대부분 홀 센서가있는 김벌에서 교정을 트리거 할 수 있습니다.
패킷이 어떻게 보이는지 아는 한, 사용자 정의 패킷을 드론으로 보내는 데 사용될 수도 있으며,이 방법은 교정 또는 페어링과 같은 공장 기능을 트리거합니다.
이 프로젝트의 위키에는 각 드론 내의 보드에 대한 수많은 정보와 각 보드의 구성 요소가 있습니다. 이 정보는 많은 애호가와 수리 기술자가 만들고 공유합니다.
이 도구는 DJI Assistant Software의 명령 줄 버전으로 사용할 수 있으며, 이러한 OEM 소프트웨어가 부족하거나 고급 기능이 잠겨있는 플랫폼의 매개 변수를 변경할 수 있습니다.
DJI의 비행 컨트롤러는 동작에 영향을 미치는 매개 변수의 사냥꾼을 정의합니다. 새 값이 FC 펌웨어가 허용하는 한계 내에있는 한 드론에 명령을 전송하여 수정할 수 있습니다.
이 도구를 사용하면 펌웨어 바이너리를 수정 한 다음 플래시 가능한 펌웨어 패키지로 다시 포장 할 수 있습니다. 이러한 방식으로, 모든 소프트웨어 제어 기능을 포함하여 다음을 포함 할 수 있습니다.
때로는 추가 지식 및 소프트웨어 수정 (예 : 드론 루팅)이 플래시 수정 펌웨어에 필요한 경우가 필요할 수 있습니다. 일부 펌웨어 패키지는 비대칭 암호화를 사용하여 서명되며 개인 키는 거의 사용하지 않습니다.
DJI 하드웨어 및 소프트웨어에 관심이 있다면 학습을 시작하기위한 곳입니다. 당신은 할 수 있습니다 :
그러한 지시는 제공되지 않습니다. 이러한 도구는 방대한 하드웨어 및 소프트웨어 지식을 가진 엔지니어를위한 것입니다. 이 도구로 무엇이든 달성하기 위해 무엇을하고 있는지 알아야합니다.
이것은 보안 메커니즘을 비활성화하고 현지 법률을 위반하기 위해 스크립트 어린이가 도구를 사용하지 않도록하기위한 것입니다.
도구가 어떻게 작동하는지 이해할 수 없다면 사용해서는 안됩니다. 경고가 표시되면 최종 펌웨어가 손상되지 않도록 원인을 조사해야합니다. 당신은 당신 자신의 위험에 대한 도구를 사용하고 있습니다.
어디서부터 시작 해야할지 모르면 테스트를 확인하십시오. 드론과 통신하거나 특정 펌웨어의 모든 레이어를 추출 할 수있는 명령 줄을 제공합니다 (올바르게 배치 할 수있는 한).
모든 도구는 소스 코드 형식으로 사용할 수 있으므로 소스를 보면서 이러한 도구에서 처리 한 구조 및 프로토콜에 대한 세부 정보를 쉽게 확인할 수 있습니다. 소스 코드는 또한 형식 문서 역할을하기위한 것입니다.
더 높은 수준 및 더 많은 하드웨어 관련 정보는 프로젝트 위키를 확인하십시오.
도구는 두 가지 범주로 나눌 수 있습니다.
하드웨어 독립적 인 도구 - 사용할 DJI 제품이 필요하지 않은 도구. DJI 펌웨어 패키지 또는 DAT 로그 파일과 같이 사용하는 입력 파일 만 있으면됩니다.
제품 통신 도구 - 의미있는 방식으로 이러한 도구를 사용하려면 드론을 PC에 연결해야합니다. 현재이 도구는 UART (Serial Interface) 및 I2C를 사용합니다.
특정 도구 아래는 간단히 설명되어 있습니다. 매개 변수없이 실행하면 각각의 지원되는 명령에 대한 세부 정보가 제공됩니다.
각 도구의 명령 줄 인수에 대한 세부 사항을 얻으려면 --help 옵션으로 실행하십시오. 일부 도구에는 헤더에 추가 설명이 있습니다.
DJI 펌웨어 XV4 컨테이너 도구; xV4 로 시작하는 패키지 파일에서 모듈을 추출하거나 펌웨어 모듈을 병합하여 컨테이너를 만들 수 있습니다. 파일이 xV4 로 시작하는 한 DJI에서 다운로드 한 빈 파일을 추출하려면 먼저이 도구를 사용하십시오.
Phantom 3 Pro 용 DJI 펌웨어 패키지에서 모듈 추출의 예 :
./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
Phantom 4 Pro V2 에 대한 UN 서명 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
미니 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 비행 컨트롤러 펌웨어 해독제 도구; Mavic Pro , Spark , Inspire 2 및 Phantom 4 와 같은 기간에 출시 된 여러 DJI 제품에서 비행 컨트롤러 펌웨어 모듈에서 제 2 계층 암호화를 제거합니다. 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 펌웨어를 추출하십시오. Ambarella 펌웨어를 많은 "Amba"문자열 내에 또는 파일 시작시 32 cher Zero 패드드 문자열로 인식 할 수 있습니다.
Phantom 3 Pro 용 Ambarella 펌웨어에서 파티션 추출의 예 :
./amba_fwpak.py -vv -x -m P3X_FW_V01.08.0080_m0100.bin
Ambarella A7/A9 펌웨어 ROMFS 파일 시스템 도구; ROMFS FileSystem 파일에서 단일 파일을 추출하거나 단일 파일에서 파일 시스템을 재구성 할 수 있습니다. Ambarella 펌웨어가 추출 된 후에 사용하십시오. 파일의 시작 부분 근처에서 파일 이름으로 ROMF 파티션을 인식 할 수 있으며 0xff가 채워진 바이트 블록으로 둘러싸여 있습니다.
Phantom 3 Pro 용 Ambarella 펌웨어에서 ROMFS 파티션 추출의 예 :
./amba_romfs.py -vv -x -p P3X_FW_V01.08.0080_m0100_part_rom_fw.a9s
Ambarella 펌웨어에서 UBIF 파티션 장착을위한 Linux 스크립트. 장착 후 파일을 복사하거나 수정할 수 있습니다. Ambarella 펌웨어가 추출 된 후에 사용하십시오. UBIF를 포함하는 파일은 파일 시작시 UBI# 에 의해 쉽게 인식 될 수 있습니다.
Phantom 3 Pro 용 Ambarella 펌웨어의 루트 파일 시스템 파티션 장착의 예 :
sudo ./amba_ubifs.sh P3X_FW_V01.08.0080_m0100_part_rfs.a9s
ELF 헤더로 이진 실행 가능한 암 이미지를 포장하는 도구. 펌웨어에 실행 파일의 이진 이미지가 포함 된 경우이 도구는 ELF 헤더를 재건 할 수 있습니다. 대부분의 디버거가 ELF 파일을 읽을 수 있으므로 ELF 형식은 쉽게 분해 될 수 있습니다. 암호화 된 회사 에서이 도구를 사용해도 엘프가 유용하지는 않습니다.
Phantom 3 용 FC 펌웨어를 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 섹션 사이의 올바른 경계가 어디에 있는지 확인하는 것이 좋습니다. 이 위치의 메모리 주소를 사용하여 더 나은 ELF 파일을 생성 할 수 있습니다.
첫 번째 룩 후 ELF에 대한 추가 업데이트에는 .bss 섹션 정의가 포함될 수 있습니다. 이 섹션은 이진에 의해 사용되지 않은 RAM 및 MMIO 영역을 나타냅니다. 칩의 프로그래밍 안내서에 따라 전체 메모리 맵 주소 범위를 다루는 하나의 큰 섹션을 정의하는 것이 유혹하지만 파일을 탐색하기가 더 어려워지면서 파일을 분해하면서 메모리 사용량과 관련 속도가 크게 증가합니다.
모든 섹션 오프셋은 빈 파일 내 위치가 아니라 메모리 주소를 사용하여 정의됩니다. 빈 파일 내에서 섹션의 적절한 위치를 찾은 경우이 도구의 명령 줄에 삽입하기 전에 파일 위치에 기본 주소를 추가하십시오.
기본 주소는 종종 특정 칩의 프로그래밍 안내서에서 찾을 수 있습니다. 바이너리가 추가 부트 로더로로드되면 해당 위치에서 이동할 수 있습니다. 이 경우 부트 로더는 문서에서 위치를 가져오고 실제 펌웨어 바이너리는 약간 높은 기본 주소로로드됩니다.
특정 회사에 대한 최적화 된 예 :
./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
이 도구는 빈 투에 대한 방향으로 만 변환을 지원합니다. ELF 파일을 BIN (즉, 수정 후)으로 다시 변환하려면 특정 아키텍처에 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 펌웨어 "시스템 소프트웨어"파티션 변환기. 파티션에는 실행 파일의 이진 이미지가 포함되어 있으며이 도구는 ELF 헤더로 랩핑합니다. 대부분의 디버거가 ELF 파일을 읽을 수 있으므로 ELF 형식은 쉽게 분해 될 수 있습니다. 이 도구는 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 펌웨어 Sys 파티션을 ELF로 변환 할 수 있습니다. 이진 데이터에서 특정 하드 코딩 된 값을 발견하고이를 내보내거나 가져올 수 있습니다. 내보내는 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 이진 하드 코드 값 편집기.
이 도구는 ti dm3xx davinci 미디어 프로세서 용 DJI 펌웨어 모듈에서 encode_usb elf 파일을 구문 분석 할 수 있습니다. 이진 데이터에서 특정 하드 코딩 된 값을 발견하고이를 내보내거나 가져올 수 있습니다.
하드 코딩 된 값을 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 펌웨어를 ELF로 변환 할 수 있습니다. 이진 데이터에서 특정 하드 코딩 된 값을 발견하고이를 내보내거나 가져올 수 있습니다.
하드 코딩 된 값을 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
PCAP 출력 형식이있는 DJI 범용 패킷 컨테이너 스트림 파레저.
스크립트는 RAW DUML 스트림 (예 : Flight Log 파일이 FLY???.DAT 패킷 CRC는 데이터가 전달되기 전에 확인됩니다. 그런 다음 PCAP 형식 지원이있는 모든 도구를 사용하여 데이터를 분석 할 수 있습니다 (예 : Wireshark).
비행 로그 파일 변환의 예 :
./comm_dat2pcap.py -vv -d FLY002.DAT
DUML PACKETIZER 및 PCAP 출력 형식을 갖춘 DJI 직렬 버스 스나이퍼.
스크립트는 두 개의 UART의 데이터를 캡처하고 PCAP 헤더로 단일 DUML 패킷을 랩핑합니다. 패킷 CRC는 데이터가 PCAP 파일 또는 FIFO 파이프로 전달되기 전에 확인됩니다. 그런 다음 PCAP 형식 지원이있는 모든 도구를 사용하여 데이터를 분석 할 수 있습니다 (예 : Wireshark).
유틸리티에는 드론 내의 RX 및 TX 라인에 연결된 RX 라인이있는 2 개의 직렬 인터페이스가 필요합니다.
두 개의 UART-TTL (일명 FTDI) 변환기에서 캡처를 시작하는 예 :
./comm_serial2pcap.py -b 115200 -F /tmp/wsf /dev/ttyUSB0 /dev/ttyUSB1
육각 문자열 출력이있는 DUML 패킷 빌더.
이 도구는 주어진 헤더 필드 및 페이로드를 포함하는 적절한 DUML 패킷을 구축 할 수 있습니다. 패킷은 16 진 형태로 출력됩니다. 알려진 명령 목록과 예상 페이로드의 모양은 아래에 설명 된 Wireshark 해부자에서 찾을 수 있습니다.
센서 ID를 위해 Spark Camera 모듈을 요청하는 패킷을 생성하는 예 :
./comm_mkdupc.py --receiver_type=Camera --seq_num=65280 --ack_type=ACK_After_Exec --cmd_set=Camera --cmd_id=181
패킷을 DJI 제품으로 보내고 응답을받는 DUML BUILDER.
이 도구는 주어진 헤더 필드 및 페이로드를 포함하는 적절한 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 와 같은 드론과 대화하지만 몇 가지 중요한 기능을위한 더 쉬운 인터페이스를 제공합니다.
Ph3 Pro에서 CSV 형식의 비행 컨트롤러 매개 변수 리스팅의 예 :
./comm_og_service_tool.py --port /dev/ttyUSB0 P3X FlycParam list --start=200 --count=100 --fmt=csv
Spark에서 비행 컨트롤러 매개 변수의 값을 얻는 예 :
./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
Spark Gimbal의 서비스 수행 "Joint Coarse"교정의 예 :
./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에서 CSV 형식의 비행 컨트롤러 매개 변수 리스팅 예 : CSV 형식 :
./comm_og_service_tool.py --bulk MAV3 FlycParam list --start=200 --count=100 --fmt=csv
스마트 배터리 시스템 통신 도구.
이 도구를 사용하면 스마트 배터리 데이터 사양을 기반으로 설계된 칩과 상호 작용할 수 있습니다. 또한 BQ 시리즈 가스 게이지 칩에서 Texas Instruments가 구현 한 해당 사양에 대한 일부 확장 기능을 지원합니다.
이 도구를 사용하려면 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 인터페이스를 사용하여 ManufacturerAccess ()의 BQ30Z55에서 여러 플래그 필드를 읽는 예 :
./comm_sbs_bqctrl.py -v --bus "smbus:1" --dev_address 0x0b --chip BQ30z55 --short monitor BQStatusBitsMA
UNSELING BQ30Z55 (쓰기 기능 활성화)의 예제 (기본 SHA-1 키를 사용하여 OS에서 사용할 수있는 2nd 버스 장치의 I2C 인터페이스를 사용하여 :
./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 Dissector가 포함되어 있습니다.
도구 문서는 폴더에 포함되어 있습니다.
특정 버전의 일부 특정 펌웨어 모듈의 경우 'Symbols'디렉토리에 사용 가능한 부분 기호가 있습니다. 기호는 두 가지 형식입니다.
기호는 통과 직접가 아니라 위에서 설명한 도구와 생성 된 ELF 파일과 일치합니다. 이전 섹션에서 제공된 예제 명령을 사용하여 컨텐츠가 기호와 일치하는 ELF 파일을 생성합니다.
기호가없는 펌웨어 버전에서 작업 할 때는 이름을 참조 할 수있는 기호가있는 버전을 사용하려고 할 수 있습니다.
참조 기호를위한 최고의 FW 버전을 찾고 있거나 FW 버전을 전혀 신경 쓰지 않고 MAP 파일의 가장 완전한 기호를 원하는 경우. 지도 파일에는 주로 수동으로 명명 된 기호가 포함되어 있으므로 가장 큰 기호는 더 많은 역전 작업이 수행 된 펌웨어 버전입니다.