
متطفل Bluetooth 5 و 4.x LE لأجهزة TI CC1352/CC26x2 مع دعم للإعلانات الموسعة، جميع أوضاع PHY، تصفية MAC/RSSI، وتصدير PCAP متوافق مع Wireshark.
Sniffle هي أداة استنشاق (sniffer) لبلوتوث 5 و 4.x (LE) باستخدام أجهزة TI CC1352/CC26x2.
يتميز Sniffle بعدد من الخصائص المفيدة، بما في ذلك:
إذا كنت لا تريد عناء إعداد بيئة بناء للبرنامج الثابت، يمكنك ببساطة كتابة ملفات البرنامج الثابت الجاهزة باستخدام UniFlash/DSLite. تُرفق ملفات البرنامج الثابت الجاهزة بالإصدارات في تبويب الإصدارات على GitHub لهذا المشروع. عند استخدام البرنامج الثابت الجاهز، تأكد من استخدام كود Python المطابق لوسم الإصدار بدلاً من master لتجنب مشكلات التوافق مع البرنامج الثابت المتأخر عن فرع master.
إن arm-none-eabi-gcc المقدم عبر مدير حزم توزيعات لينكس المختلفة
غالبًا ما يفتقر إلى بعض ملفات الرأس أو يتطلب بعض التغييرات على إعدادات
الرابط. لتقليل المتاعب، أقترح استخدام ARM GCC المرتبط أعلاه.
يمكنك فقط تنزيل الملفات التنفيذية الجاهزة واستخراجها.
يتم توفير TI SDK كملف ثنائي قابل للتنفيذ يستخرج مجموعة من الكود المصدري
بمجرد قبول اتفاقية الترخيص. على لينكس وماك، الدليل الافتراضي
للتثبيت موجود داخل ~/ti/. يعمل هذا بشكل جيد وتتوقع ملفات البناء (makefiles)
هذا المسار، لذا أقترح الالتزام بالافتراضي هنا. وينطبق الأمر نفسه
على أداة TI SysConfig.
بعد استخراج SDK، ستحتاج إلى تعديل ملف makefile واحد ليطابق
بيئة البناء الخاصة بك. داخل ~/ti/simplelink_cc13xx_cc26xx_sdk_8_30_01_01
(أو أينما تم تثبيت SDK) يوجد ملف makefile باسم imports.mak.
المسارات الوحيدة التي يجب ضبطها هنا لبناء Sniffle هي GCC وXDC و
cmake وSysConfig. لا نحتاج إلى مترجم CCS. انظر الـ diff أدناه
كمثال، وقم بالتكييف حسب المكان الذي ثبّت فيه الأشياء.```
diff --git a/imports.mak b/imports.mak
index b2cf5bf59..389d1a7c3 100644
--- a/imports.mak
+++ b/imports.mak
@@ -18,14 +18,14 @@
-XDC_INSTALL_DIR ?= /home/username/ti/xdctools_3_62_01_15_core -SYSCONFIG_TOOL ?= /home/username/ti/ccs1270/ccs/utils/sysconfig_1.21.1/sysconfig_cli.sh +XDC_INSTALL_DIR ?= $(HOME)/ti/xdctools_3_62_01_15_core +SYSCONFIG_TOOL ?= $(HOME)/ti/sysconfig_1.21.1/sysconfig_cli.sh
-CMAKE ?= /home/username/cmake-3.21.3/bin/cmake +CMAKE ?= cmake PYTHON ?= python3
TICLANG_ARMCOMPILER ?= /home/username/ti/ccs1270/ccs/tools/compiler/ti-cgt-armllvm_3.2.2.LTS-0 -GCC_ARMCOMPILER ?= /home/username/arm-none-eabi-gcc/12.3.Rel1-0 +GCC_ARMCOMPILER ?= $(HOME)/arm_tools/arm-gnu-toolchain-14.3.rel1-x86_64-arm-none-eabi IAR_ARMCOMPILER ?= /home/username/iar9.50.2
اعتبارًا من إصدار SDK 8.30.01.01، للتجميع مع الإصدارات الحديثة من GCC (وbinutils)،
يلزم إجراء تعديل بسيط على SDK لتجنب أخطاء الربط
"Unknown destination type (ARM/Thumb)" و"dangerous relocation: unsupported relocation".```
diff --git a/kernel/tirtos7/packages/ti/sysbios/family/arm/m3/Hwi_asm_gcc.s b/kernel/tirtos7/packages/ti/sysbios/family/arm/m3/Hwi_asm_gcc.s
index 187cfd744..4cbf0d384 100644
--- a/kernel/tirtos7/packages/ti/sysbios/family/arm/m3/Hwi_asm_gcc.s
+++ b/kernel/tirtos7/packages/ti/sysbios/family/arm/m3/Hwi_asm_gcc.s
@@ -236,6 +236,7 @@ lab$1:
@ user code has set the PRIMASK and not cleared it, or when single
@ stepping with interrupts disabled.
+.type ti_sysbios_family_arm_m3_Hwi_interruptsAreDisabledButShouldNotBe, %function
ti_sysbios_family_arm_m3_Hwi_interruptsAreDisabledButShouldNotBe:
b ti_sysbios_family_arm_m3_Hwi_interruptsAreDisabledButShouldNotBe
diff --git a/kernel/tirtos7/packages/ti/sysbios/family/arm/v8m/Hwi_asm_gcc.s b/kernel/tirtos7/packages/ti/sysbios/family/arm/v8m/Hwi_asm_gcc.s
index 717f49c9a..1c83ed725 100644
--- a/kernel/tirtos7/packages/ti/sysbios/family/arm/v8m/Hwi_asm_gcc.s
+++ b/kernel/tirtos7/packages/ti/sysbios/family/arm/v8m/Hwi_asm_gcc.s
@@ -226,6 +226,7 @@ lab$1:
@ user code has set the PRIMASK and not cleared it, or when single
@ stepping with interrupts disabled.
+.type ti_sysbios_family_arm_v8m_Hwi_interruptsAreDisabledButShouldNotBe, %function
ti_sysbios_family_arm_v8m_Hwi_interruptsAreDisabledButShouldNotBe:
b ti_sysbios_family_arm_v8m_Hwi_interruptsAreDisabledButShouldNotBe
بعد إجراء هذا التعديل، ستحتاج إلى إعادة ترجمة SDK.``` cd ~/ti/simplelink_cc13xx_cc26xx_sdk_8_30_01_01 make build-gcc -j5
### الحصول على DSLite
DSLite هو أداة TI للبرمجة والتصحيح عبر سطر الأوامر والمخصصة لمصححات XDS110. تحتوي لوحتا Launchpad من فئتي CC26xx وCC13xx على مصححات XDS110. لسوء الحظ، لا توفر TI تنزيلًا مستقلًا لأداة DSLite عبر سطر الأوامر. أسهل طريقة للحصول على DSLite هي تثبيت [UniFlash](http://www.ti.com/tool/download/UNIFLASH) من TI. وهو متاح لأنظمة Linux وMac وWindows. سيكون الملف التنفيذي لـ DSLite موجودًا في المسار `deskdb/content/TICloudAgent/linux/ccs_base/DebugServer/bin/DSLite` بالنسبة إلى دليل تثبيت UniFlash. على Linux، يكون دليل تثبيت UniFlash الافتراضي داخل `~/ti/`.
يجب وضع المجلد الذي يحتوي على الملف التنفيذي لـ DSLite في `$PATH` الخاص بك.
## بناء البرنامج الثابت (Firmware)
بمجرد تثبيت GCC وDSLite وSDK وتشغيلها، يجب أن يكون بناء Sniffle أمرًا مباشرًا. فقط انتقل إلى دليل `fw` وشغّل الأمر `make`. إذا لم تقم بتثبيت SDK في الدليل الافتراضي، فقد تحتاج إلى تعديل `SIMPLELINK_SDK_INSTALL_DIR` في ملف makefile.
إذا كنت تبني أو تثبّت على أحد أنواع Launchpad الأخرى غير CC26x2R، فيجب عليك تحديد `PLATFORM=xxx`، إما كوسيط للأمر make، أو بتعريفه كمتغير بيئة قبل استدعاء make. يمكن العثور على القيم المدعومة لـ `PLATFORM` في ملف makefile الخاص بالبرنامج الثابت. تأكد من تنفيذ `make clean` قبل البناء لمنصة مختلفة.
## تثبيت البرنامج الثابت (لوحة TI Launchpad)
لتثبيت Sniffle على لوحة CC26x2R Launchpad (الموصولة بالطاقة) باستخدام DSLite، شغّل `make load` داخل دليل `fw`. بالنسبة لأي نماذج أخرى من Launchpad، يجب تحديد وسيط `PLATFORM` للأمر make كما هو موصوف أعلاه. يمكنك أيضًا وميض الملف الثنائي المُجمَّع `sniffle.hex` باستخدام واجهة UniFlash الرسومية.
## تثبيت البرنامج الثابت (دونجل SONOFF USB)
لتثبيت Sniffle على دونجل SONOFF CC2652P (المزوَّد بجسر CP2102N USB/UART)، استخدم الأداة [JelmerT/cc2538-bsl](https://github.com/JelmerT/cc2538-bsl) لوميض البرنامج الثابت عبر مُحمّل الإقلاع المدمج في ROM باستخدام الأمر التالي:```
python3 cc2538-bsl.py -p /dev/ttyUSB0 --bootloader-sonoff-usb -ewv sniffle_cc1352p1_cc2652p1.hex
اعتبارًا من 10 يناير 2025، هناك خطأ في cc2538-bsl يمنعه من
إعادة ضبط شريحة CC2562P في دونجل Sonoff بعد الوميض. الإصلاح لهذه
المشكلة موجود في طلب السحب 173، ولم
يتم دمجه بعد. في غضون ذلك، أثناء انتظار دمج طلب السحب،
يمكنك استخدام fork الخاص بي على https://github.com/sultanqasim/cc2538-bsl.
في عام 2022، بسبب نقص الرقائق أثناء جائحة كوفيد-19، تم تصنيع بعض دونجلات Sonoff CC2652P
باستخدام رقائق جسر USB/UART من نوع CP2102 (غير N) بحد أقصى 921600 باود. إذا
كان لديك واحد من هذه، فستحتاج إلى وميض صورة برنامج ثابت مختلفة تستخدم
سرعة باود أبطأ تبلغ 921600. هذا الإصدار الخاص بسرعة الباود الأبطأ يُسمى
sniffle_cc1352p1_cc2652p1_1M.hex (متغير البناء CC2652P1F_1M). ستحتاج أيضًا
إلى استدعاء أدوات Sniffle مع الخيار -b 921600 لتجاوز
سرعة الباود الافتراضية البالغة 2000000.
تحذير: لا تقم بوميض متغير البناء الخاطئ باستخدام محمّل الإقلاع، أو قد يؤدي ذلك إلى
تعطيل الجهاز (brick) وقفل نفسك خارج محمّل الإقلاع. بالنسبة لأجهزة Sonoff
CC2652P، استخدم ملف sniffle_cc1352p1_cc2652p1.hex (متغير البناء CC2652P1F)
أو ملف sniffle_cc1352p1_cc2652p1_1M.hex(متغير البناءCC2652P1F_1M`)
لسرعة باود تبلغ 921600. إذا قمت بوميض المتغير الخاطئ وأغلقت على نفسك
الوصول إلى محمّل الإقلاع، فمن المحتمل أن تتمكن من استعادة الجهاز باستخدام JTAG/SWD.
توفر Electronic Cats أداة Catnip Uploader لتحميل البرنامج الثابت. للحصول على معلومات مفصلة، راجع المستودع. قم بتنزيل الأداة واتبع هذه الأوامر:```bash
[ec@sniffle]$ git clone https://github.com/ElectronicCats/CatSniffer-Tools.git [ec@sniffle]$ cd CatSniffer-Tools/catnip_uploader [ec@sniffle]$ pip install -r requirements.txt
[ec@sniffle]$ python3 catnip_uploader.py releases [INFO] Fetching assets from https://api.github.com/repos/ElectronicCats/CatSniffer-Firmware/releases/latest [INFO] Release: board-v3.x-v1.1.0 [INFO] Fetching assets from https://api.github.com/repos/nccgroup/Sniffle/releases/latest [INFO] Release: v1.10.0 [INFO] Found local release: releases_board-v3.x-v1.1.0 [SUCCESS] Local release is up to date: board-v3.x-v1.1.0 [SUCCESS] Available releases: 0: sniffer_fw_CC1352P_7_v1.10.hex 1: airtag_scanner_CC1352P_7_v1.0.hex 2: nccgroup_v1.10.0_sniffle_cc1352p7_1M.hex 3: airtag_spoofer_CC1352P_7_v1.0.hex 4: sniffle_CC1352P_7_v1.7.hex
[ec@sniffle]$ python3 catnip_uploader.py load 2 COMPORT
تحتاج إلى تغيير *COMPORT* إلى المسار المناسب للوحة الخاصة بك.
باستخدام الأمر `python3 catnip_uploader.py load 2 COMPORT`، ستقوم بتحميل
البرنامج الثابت `2: nccgroup_v1.10.0_sniffle_cc1352p7_1M.hex`.
**لتحميل البرنامج الثابت، يتطلب Catsniffer V3 استخدام SerialPassthroughwithboot**.
**تحذير:** لا تومض نسخة البناء الخاطئة باستخدام مُحمِّل الإقلاع، أو أنك
تخاطر بتعطيل الجهاز وفقدان الوصول إلى مُحمِّل الإقلاع. إذا كنت
تستخدم البرنامج النصي `catnip_uploader.py` لجلب البرنامج الثابت وتثبيته، فسوف
يعرض فقط البرامج الثابتة المتوافقة. ومع ذلك، إذا اخترت تجميع وتثبيت
البرنامج الثابت يدويًا، فتأكد من استخدام نسخة البناء الصحيحة. بالنسبة لأجهزة CatSniffer
v3، استخدم ملف `sniffle_cc1352p7_1M.hex` (نسخة البناء `CC1352P74_1M`).
أجهزة CatSniffer v1.x/v2.x تستخدم نسخة شريحة مختلفة (CC1352P1) تتطلب
نسخة بناء مختلفة (نسخة `CC1352P1F3_1M`، صورة `sniffle_cc1352p1_cc2652p1_1M.hex`
). لم يتم اختبار Sniffle على أجهزة CatSniffer v1.x/v2.x، لكنها ستعمل
على الأرجح طالما قمت بوميض نسخة البناء المناسبة. إذا قمت بوميض
النسخة الخاطئة وفقدت الوصول إلى مُحمِّل الإقلاع، فقد يكون من الممكن استعادة
الجهاز باستخدام JTAG/SWD.
## استخدام Sniffer```
[skhan@serpent python_cli]$ ./sniff_receiver.py --help
usage: sniff_receiver.py [-h] [-s SERPORT] [-b BAUDRATE] [-c {37,38,39}] [-p] [-r RSSI]
[-m MAC] [-i IRK] [-S STRING] [-a] [-A] [-e] [-H] [-l] [-q]
[-Q PRELOAD] [-n] [-C] [-d] [-o OUTPUT]
Host-side receiver for Sniffle BLE5 sniffer
options:
-h, --help show this help message and exit
-s SERPORT, --serport SERPORT
Sniffer serial port name
-b BAUDRATE, --baudrate BAUDRATE
Sniffer serial port baud rate
-c {37,38,39}, --advchan {37,38,39}
Advertising channel to listen on
-p, --pause Pause sniffer after disconnect
-r RSSI, --rssi RSSI Filter packets by minimum RSSI
-m MAC, --mac MAC Filter packets by advertiser MAC
-i IRK, --irk IRK Filter packets by advertiser IRK
-S STRING, --string STRING
Filter for advertisements containing the specified string
-a, --advonly Passive scanning, don't follow connections
-A, --scan Active scanning, don't follow connections
-e, --extadv Capture BT5 extended (auxiliary) advertising
-H, --hop Hop primary advertising channels in extended mode
-l, --longrange Use long range (coded) PHY for primary advertising
-q, --quiet Don't display empty packets
-Q PRELOAD, --preload PRELOAD
Preload expected encrypted connection parameter changes
-n, --nophychange Ignore encrypted PHY mode changes
-C, --crcerr Capture packets with CRC errors
-d, --decode Decode advertising data
-o OUTPUT, --output OUTPUT
PCAP output file name
The XDS110 debugger on the Launchpad boards creates two serial ports. On
Linux, they are typically named ttyACM0 and ttyACM1. The first of the
two created serial ports is used to communicate with Sniffle. By default,
the Python CLI communicates using the first CDC-ACM device it sees matching
the TI XDS110 USB VID:PID combo, or the first Sonoff dongle it sees. You
may need to override this with the -s command line option if you are using
a different USB serial adapter or have additional USB CDC-ACM devices connected.
For the -r (RSSI filter) option, a value of -40 tends to work well if the
sniffer is very close to or nearly touching the transmitting device. The RSSI
filter is very useful for ignoring irrelevant advertisements in a busy RF
environment. The RSSI filter is only active when capturing advertisements,
as you always want to capture data channel traffic for a connection being
followed. You probably don't want to use an RSSI filter when MAC filtering
is active, as you may lose advertisements from the MAC address of interest
when the RSSI is too low.
To hop along with advertisements and have reliable connection sniffing, you
need to set up a MAC filter with the -m option. You should specify the
MAC address of the peripheral device, not the central device. To figure out
which MAC address to sniff, you can run the sniffer with RSSI filtering while
placing the sniffer near the target. This will show you advertisements from
the target device including its MAC address. It should be noted that many BLE
devices advertise with a randomized MAC address rather than their "real" fixed
MAC written on a label.
Most new BLE devices use Resolvable Private Addresses (RPAs) rather than fixed
static or public addresses. While you can set up a MAC filter to a particular
RPA, devices periodically change their RPA. RPAs can can be resolved (associated
with a particular device) if the Identity Resolving Key (IRK) is known. Sniffle
supports automated RPA resolution when the IRK is provided. This avoids the need
to keep updating the MAC filter whenever the RPA changes. You can specify an
IRK for Sniffle with the -i option; the IRK should be provided in hexadecimal
format, with the most significant byte (MSB) first. Specifying an IRK allows
Sniffle to channel hop with an advertiser the same way it does with a MAC filter.
The IRK based MAC filtering feature (-i) is mutually exclusive with the static
MAC filtering feature (-m).
There is also a convenience feature to automatically identify the MAC address
of the advertiser whose advertisement or scan response contains a specified
string (series of bytes). This is useful for devices with RPAs where the IRK is
unknown, but the advertisement contains a sufficiently unique static string suitable
for identification. This feature uses the -S option, with the string specified
using standard escape sequences. For example, to look for an advertiser whose
advertisement contains the hex byte sequence DE AD BE EF, specify
-S "\xDE\xAD\xBE\xEF". To look for an advertiser with the string "hello",
simply specify -S "hello". When the string search feature is used, initially
all MAC addresses will be accepted till an advertisement containing the search
string is found. After that, a MAC filter will be set up with the corresponding
advertiser's MAC address, and any RSSI filter would be automatically disabled.
To enable following auxiliary pointers in Bluetooth 5 extended advertising,
enable the -e option. To improve performance and reliability in extended
advertising capture, this option disables hopping on the primary advertising
channels, even when a MAC filter is set up. If you are unsure whether a
connection will be established via legacy or extended advertising, you can
enable the -H flag in conjunction with -e to perform primary channel
hopping with legacy advertisements, and scheduled listening to extended
advertisement auxiliary packets. When combining -e and -H, the
reliability of connection detection may be reduced compared to hopping on
primary (legacy) or secondary (extended) advertising channels alone.
To sniff the long range PHY on primary advertising channels, specify the -l
option. Note that no hopping between primary advertising channels is supported
in long range mode, since all long range advertising uses the BT5 extended
mechanism. Under the extended mechanism, auxiliary pointers on all three
primary channels point to the same auxiliary packet, so hopping between
primary channels is unnecessary.
To not print empty data packets on screen while following a connection, use
the -q flag. This makes it easier to observe meaningful communications in
real time, but may obscure when connection following is flaky or lost.
For encrypted connections, Sniffle supports detecting connection parameter
updates even when the encryption key is unknown, and it attempts to measure
the new parameters. However, if you know the new connection interval and Instant
delta to expect in encrypted connection parameter updates, you can specify them
with the --preload/-Q option to improve performance/reliability.
The expected Interval:DeltaInstant pair should be provided as colon separated
integers. Interval is an integer representing multiples of 1.25 ms (as defined
in LL_CONNECTION_UPDATE_IND). DeltaInstant is the number of connection events
between when the connection update packet is transmitted and when the new
parameters are applied. DeltaInstant must be greater than or equal to 6, as per
the Bluetooth specification's requirements for central devices. If multiple
encrypted parameter updates are expected, you can provide multiple parameter
pairs, separated by commas (eg. 6:7,39:8). If you have a device that issues
encrypted PHY update PDUs that don't change the PHY, or puts out encrypted LE
power control PDUs without any PHY changes, you can use the --nophychange/-n
option.
To stop the sniffer, press Ctrl-C.
If for some reason the sniffer firmware locks up and refuses to capture any traffic even with filters disabled, you should reset the sniffer MCU. On Launchpad boards, the reset button is located beside the micro USB port.
usage: scanner.py [-h] [-s SERPORT] [-b BAUDRATE] [-c {37,38,39}] [-r RSSI] [-l] [-d] [-o OUTPUT]
Scanner utility for Sniffle BLE5 sniffer
options: -h, --help show this help message and exit -s SERPORT, --serport SERPORT Sniffer serial port name -b BAUDRATE, --baudrate BAUDRATE Sniffer serial port baud rate -c {37,38,39}, --advchan {37,38,39} Advertising channel to listen on -r RSSI, --rssi RSSI Filter packets by minimum RSSI -l, --longrange Use long range (coded) PHY for primary advertising -d, --decode Decode advertising data -o OUTPUT, --output OUTPUT PCAP output file name
تعمل وسائط سطر أوامر الماسح الضوئي بنفس طريقة عمل أداة الاستشعار. الغرض من أداة الماسح الضوئي هو جمع قائمة بالأجهزة القريبة التي تُعلن عن وجودها، وإصدار طلبات فحص نشطة للأجهزة المرصودة، دون الحصول على الانهمار الهائل من البيانات سريعة التمرير التي تحصل عليها مع أداة الاستشعار. سيدخل العتاد/البرنامج الثابت في وضع فحص نشط حيث سيقوم بالإبلاغ عن الإعلانات المستلمة، وإصدار طلبات فحص لتلك القابلة للفحص، والإبلاغ عن استجابات الفحص المستلمة. ستسجّل أداة الماسح الضوئي عناوين MAC المرصودة وتبلغ عنها مرة واحدة فقط دون إغراق الشاشة. بمجرد الانتهاء من التقاط الإعلانات، اضغط على Ctrl-C لإيقاف الفحص والإبلاغ عن النتائج. سيعرض الماسح الضوئي آخر إعلان واستجابة فحص من كل هدف. سيتم فرز نتائج الفحص حسب RSSI بترتيب تنازلي.
## أمثلة الاستخدام
استشعر جميع الإعلانات على channel 38، وتجاهل RSSI < -50، وابقَ على قناة الإعلان حتى عند رؤية CONNECT\_REQs.```
./sniff_receiver.py -c 38 -r -50 -a
التقط الإعلانات من MAC 12:34:56:78:9A:BC، والزم قناة الإعلان حتى عند رؤية CONNECT_REQs، واحفظ الإعلانات في data1.pcap.```
./sniff_receiver.py -m 12:34:56:78:9A:BC -a -o data1.pcap
قم بالتقاط الإعلانات والاتصالات لأول عنوان MAC يُرى بمستوى
RSSI >= -40. سيتم تعطيل مرشح RSSI تلقائيًا بمجرد
تثبيت عنوان MAC. احفظ البيانات الملتقطة في `data2.pcap`.```
./sniff_receiver.py -m top -r -40 -o data2.pcap
التقط الإعلانات والاتصالات من الجهاز الطرفي باستخدام IRK بترتيب البايت الكبير 4E0BEA5355866BE38EF0AC2E3F0EBC22. قم بتحميل مسبق لتحديثين متوقعين لمعاملات الاتصال المشفرة؛ الأول بفاصل زمني (Interval) قيمته 6، يحدث عند لحظة 6 أحداث اتصال بعد ملاحظة المتشمم لرسالة LL_CONNECTION_UPDATE_IND المشفرة. أما تحديث الاتصال المشفر المتوقع الثاني فله فاصل زمني (Interval) قيمته 39، وDeltaInstant قيمته 6 أيضًا.``` ./sniff_receiver.py -i 4E0BEA5355866BE38EF0AC2E3F0EBC22 -Q 6:6,39:6
مراقبة إعلانات واتصالات BT5 الموسّعة من الأجهزة القريبة (RSSI >= -55).```
./sniff_receiver.py -r -55 -e
التقط الإعلانات القديمة والموسّعة والاتصالات من الجهاز بعنوان MAC
المحدد. احفظ البيانات الملتقطة في data3.pcap.```
./sniff_receiver.py -eH -m 12:34:56:78:9A:BC -o data3.pcap
التقط الإعلانات الموسعة والاتصالات باستخدام الطبقة المادية الأولية طويلة المدى على
القناة 38.```
./sniff_receiver.py -le -c 38
قم بالمسح النشط على القناة 39 بحثًا عن الإعلانات ذات قيمة RSSI أكبر من -50.``` ./scanner.py -c 39 -r -50
## الحصول على IRK
إذا كان لديك هاتف Android بصلاحيات الروت، فيمكنك العثور على مفاتيح IRK (وLTK) في ملف إعدادات Bluedroid. على Android 8.1، يقع هذا الملف في المسار `/data/misc/bluedroid/bt_config.conf`. يحدد `LE_LOCAL_KEY_IRK` مفتاح IRK الخاص بجهاز Android نفسه، وتشير أول 16 بايت من `LE_KEY_PID` لكل جهاز مقترن في الملف إلى مفتاح IRK الخاص بالجهاز المقترن. لاحظ أن المفاتيح المخزنة في هذا الملف بتنسيق Little Endian، لذلك **يجب عكس ترتيب البايتات للمفاتيح في هذا الملف.** على سبيل المثال، يجب تحويل مفتاح IRK بتنسيق Little Endian وهو 22BC0E3F2EACF08EE36B865553EA0B4E إلى 4E0BEA5355866BE38EF0AC2E3F0EBC22 (بتنسيق Big Endian) عند تمريره إلى Sniffle باستخدام الخيار `-i`.
يمكنك أيضًا العثور على IRK وLTK عبر سجلات HCI Snoop الملتقطة على Android أو iOS دون الحصول على صلاحية الروت للجهاز:
* Android: <https://novelbits.s3.us-east-2.amazonaws.com/Developer+Guides/Android+Bluetooth+Debugging+Guide.pdf>
* iOS: <https://novelbits.s3.us-east-2.amazonaws.com/Developer+Guides/iOS+Bluetooth+Debugging+Guide.pdf>
## إضافة Wireshark
تتضمن Sniffle إضافةً لبرنامج Wireshark تتيح تشغيل Sniffle تلقائيًا من واجهة Wireshark الرسومية عبر اختيار واجهة الالتقاط 'Sniffle'.
لتثبيت إضافة Sniffle، ابحث أولاً عن موقع مجلد Extcap الشخصي في مربع حوار 'About Wireshark' (*Help* > *About Wireshark* > *Folders* > *Personal Extcap path*). على أنظمة POSIX (Linux وMac OS) التي تعمل بإصدارات حديثة من Wireshark (4.2.0+)، يوجد هذا المجلد في المسار `~/.local/lib/wireshark/extcap`. أما في Windows، فيمكن العثور عليه في `%USERPROFILE%\AppData\Roaming\Wireshark\extcap`.
على أنظمة POSIX، يمكنك ببساطة إنشاء رابط رمزي (symlink) لإضافة Sniffle extcap في دليل extcap الشخصي لـ Wireshark:```
mkdir -p ~/.local/lib/wireshark/extcap
ln -s $(pwd)/python_cli/sniffle_extcap.py ~/.local/lib/wireshark/extcap
على نظام Mac OS، قد يحاول Wireshark استخدام Python الخاص بـ Xcode بدلاً من Python الموجود في PATH الخاص بك والمحدد في ملف تعريف الصدفة (shell profile). وبالتالي، قد لا يظهر ملحق Sniffle في واجهات extcap إذا لم تكن PySerial مثبتة لدى Python الخاص بـ Xcode. لإصلاح ذلك، يمكنك تعديل سطر shebang في sniffle_extcap.py ليشير مباشرة إلى Python الذي يحتوي على PySerial مثبتة، على سبيل المثال Python الخاص بـ Homebrew في /opt/homebrew/bin/python3، بدلاً من /usr/bin/env python3.
على Windows، يمكنك نسخ الملفات والمجلدات التالية من دليل python_cli إلى مجلد Extcap الشخصي الخاص بك:```
sniffle/
sniffle_extcap.py
sniffle_extcap.bat
على نظام ويندوز، قد يكون من الضروري تعديل ملف `sniffle_extcap.bat` لتحديد موقع
مفسّر بايثون إذا كان دليل التثبيت غير مُضمّن في PATH، على سبيل المثال:```
@echo off
C:\my_python_install\python.exe "%~dp0sniffle_extcap.py" %*
بعد تثبيت البرنامج المساعد، أعد تشغيل Wireshark أو اختر Capture > Refresh Interfaces لتمكين واجهة Sniffle.
بينما كان البرنامج الثابت الأصلي لـ Sniffle لعام 2019 مجرد مستمع سلبي، أضافت إصدارات البرنامج الثابت الأحدث ميزات متنوعة لإرسال الحزم بنشاط بطرق مختلفة. يدعم البرنامج الثابت الحالي لـ Sniffle العمل كجهاز مركزي وطرفي في GAP، بما في ذلك المسح النشط، والإعلان التقليدي والموسع، وبدء الاتصالات، والاتصال في دور مركزي أو طرفي. يقوم السكربت scanner.py بالمسح النشط. يبدأ السكربت initiator.py اتصالًا بجهاز طرفي ثم يعمل كجهاز مركزي متصل. بينما يقوم السكربت advertiser.py بالإعلان التقليدي ويقبل طلبات الاتصال من الأجهزة الأخرى، منتقلًا إلى دور جهاز طرفي متصل.
تختلف وظيفة الإرسال في Sniffle قليلًا عن وحدة تحكم Bluetooth التقليدية القائمة على HCI، لأنها تمنحك تحكمًا منخفض المستوى للغاية في وحدات PDU الدقيقة التي يتم إرسالها في طبقة الارتباط. يتيح هذا التحكم منخفض المستوى للكود على الجانب المضيف تنفيذ وظائف إضافية، مثل اختبار الفاز لطبقة الارتباط أو هجمات الترحيل لطبقة الارتباط.
لم أخصص الوقت بعد لتوثيق واجهة برمجة التطبيقات (API) للبرنامج الثابت لـ Sniffle رسميًا، على الرغم من أنها بديهية إلى حد ما عند النظر إلى تنفيذها على الجانب المضيف في sniffle_hw.py. يتم تفعيل المسح النشط (الذي يرسل طلبات المسح) بواسطة cmd_scan. يتم تشغيل بدء الاتصال بواسطة cmd_connect، على الرغم من أنه من الأسهل استخدام الغلاف initiate_conn. يتم تفعيل الإعلان (القابل للاتصال اختياريًا) بواسطة cmd_advertise للإعلان التقليدي، أو cmd_advertise_ext للإعلان الموسع.
منذ إصلاح مشكلة TI EXT_EP-11735 في منتصف عام 2024، أصبح مُنقّح XDS110 (المضمن في لوحات TI Launchpad) يتعامل مع معدلات الباود العالية مثل 2M (كما يستخدمها Sniffle) بشكل معقول دون زمن استجابة مفرط. ومع ذلك، لا يزال أحدث برنامج ثابت لـ XDS110 يستخدم تشغيل UART القائم على DMA مع التخزين المؤقت عند معدلات الباود هذه، وبالتالي يمكن أن يقدم زمن استجابة يصل إلى 30 مللي ثانية. هذا الزمن غير مهم للاستخدام كمستمع، ولكنه قد يكون ضارًا للعمليات الأكثر نشاطًا مثل الكود على الجانب المضيف الذي يعمل كعميل أو خادم GATT، أو تنفيذ هجمات الترحيل. يمكن لتعديل إصدار البرنامج الثابت 3.0.0.28 من XDS110 الموصوف أدناه للتشغيل القائم على المقاطعات أن يقلل بشكل كبير من زمن الاستجابة لهذه العمليات الحساسة للوقت. يجب أن يكون من الممكن إجراء تعديل مماثل على أحدث برنامج ثابت لـ XDS110، لكنني لم أخصص الوقت لتفكيكه وإيجاد البتات الصحيحة لتغييرها.
في منتصف عام 2024 وما قبله، كان البرنامج الثابت لمُنقّح TI XDS110 (المضمن على لوحات Launchpad) يعاني من سلوك غير مرغوب فيه في جسر USB إلى UART، حيث يمكن أن يكون هناك زمن استجابة شديد عند معدلات الباود العالية، خاصة مع عمليات الكتابة الصغيرة المتكررة التي يقوم بها برنامج Sniffle الثابت. استمرت هذه المشكلة لسنوات، وكانت لا تزال موجودة في أبريل 2024 مع البرنامج الثابت XDS110 3.0.0.28 المرفق مع UniFlash 8.6.0. كان السبب الجذري هو أنه في التشغيل القائم على DMA، كان البرنامج الثابت لـ XDS110 يجمع بيانات UART في مخزن مؤقت يتناسب حجمه مع معدل الباود، وينتظر امتلاء هذا المخزن قبل نقل البيانات. كانت هناك آلية لتطهير هذا المخزن إذا لم تصل بيانات جديدة خلال آخر 15 مللي ثانية، ولكن هذه الآلية لم يتم تشغيلها أبدًا عندما كان Sniffle يضيف بشكل متكرر حزمًا صغيرة من أحداث الاتصال كل بضع مللي ثانية. نتيجة لهذا السلوك غير الأمثل، يمكن أن تظهر البيانات الملتقطة في دفعات متأخرة على المضيف.
يحتوي البرنامج الثابت لـ XDS110 أيضًا على وضع بديل لتشغيل UART، حيث يؤدي كل استقبال UART إلى مقاطعة تؤدي إلى تمرير البيانات إلى المضيف فورًا. وضع التشغيل القائم على المقاطعات هذا له زمن استجابة أقل بكثير. ومع ذلك، يستخدمه البرنامج الثابت فقط لمعدلات الباود الأقل من 230400. كحل بديل لزمن الاستجابة العالي لتشغيل وضع DMA مع أجزاء بيانات صغيرة متكررة، يمكنك تعديل البرنامج الثابت لاستخدام جسر USB-UART القائم على المقاطعات حتى عند معدلات الباود العالية (مثل 2M باود كما يستخدمها Sniffle). في البرنامج الثابت 3.0.0.28 (المرفق مع Uniflash 8.6.0)، يمكنك تحرير البايتات بالنظام الست عشري عند الإزاحة 0x0A14 من 61 3F إلى 00 1F. سيؤدي هذا إلى تغيير معدل الباود للتبديل إلى تشغيل UART القائم على DMA من 230400 إلى 0x200000 (2097152).
انتبه إلى أن الإزاحات وتعديلات البايت الموصوفة أعلاه مخصصة فقط للبرنامج الثابت 3.0.0.28، وستكون مختلفة بالنسبة لإصدارات البرنامج الثابت الأخرى. قد يؤدي وميض برنامج ثابت غير صالح على المُنقّح إلى تلفه، ولا نتحمل أي مسؤولية عن أي ضرر قد يحدث.
يمكن استخدام الأوامر التالية على Linux لتعديل البرنامج الثابت لـ XDS110 للحصول على UART منخفض زمن الاستجابة عند معدلات الباود العالية:``` cd ~/ti/uniflash_8.6.0/deskdb/content/TICloudAgent/linux/ccs_base/common/uscif/xds110/ cp firmware_3.0.0.28.bin firmware_3.0.0.28_fastuart.bin printf '\x00\x1f' | dd of=firmware_3.0.0.28_fastuart.bin bs=1 seek=$((0x0A14)) conv=notrunc sha256sum firmware_3.0.0.28_fastuart.bin
قبل الوميض، تحقق من أن مجموع SHA256 للبرنامج الثابت المعدل هو
`c226f2e9cb2b9f0bc111ca11f2903d58d4065293468623428c0e8eeb22086dcf`. بعد التحقق من ذلك،
نفّذ الأوامر التالية لوميض البرنامج الثابت المعدل لمصحح XDS110:```
./xdsdfu -m
./xdsdfu -f firmware_3.0.0.28_fastuart.bin -r
يمكن استخدام Sniffle لتنفيذ ترحيل طبقة الارتباط
لحركة مرور Bluetooth LE. عند القيام بالترحيل، يعمل جهاز Sniffle واحد كمركز BLE (باستخدام relay_master.py) بينما يعمل جهاز Sniffle ثانٍ كطرف BLE محيطي (باستخدام relay_slave.py). الماستر والعبد هما مصطلحان تاريخيان للمركز والطرف المحيطي في BLE على التوالي. يلتقط مُرحِّل الماستر بيانات الإعلان والاستجابة لمسح من الجهاز المحيطي الحقيقي، ثم يمررها إلى مُرحِّل العبد. يبث مُرحِّل العبد إعلانات واستجابات مسح تحاكي الجهاز المحيطي الحقيقي ويقبل الاتصالات. عند قبول اتصال، يُخطر مُرحِّل العبد مُرحِّل الماستر، الذي يبدأ بعد ذلك اتصالًا بالجهاز المحيطي الحقيقي. من هذه النقطة فصاعدًا، تُمرَّر جميع حزم طبقة الارتباط بين مُرحِّل الماستر ومُرحِّل العبد.
يوفر سكربت مُرحِّل الماستر وظيفة لطلب فترات اتصال أسرع على أحد جانبي الترحيل أو كليهما لتقليل زمن الاستجابة. إذا كنت تستخدم XDS110 كجسر USB/UART، فاعلم أن برنامج XDS110 الثابت يضيف زمن استجابة إضافيًا إلى الترحيل إلا إذا قمت بتعديله كما هو موضح أعلاه.
يُرجى ملاحظة أن سكربت مُرحِّل الماستر ينشئ مستمع شبكة يرتبط بجميع الواجهات (0.0.0.0)، وأن البروتوكول الشبكي المستخدم للتواصل بين أجهزة الترحيل لا يوفر أي حماية. استخدم هذه السكربتات فقط في بيئات شبكة موثوقة.
يظهر أدناه استخدام سكربتات مُرحِّل الماستر (المركز) والعبد (الطرف المحيطي). في الوقت الحالي، الإعلان الموسّع غير مدعوم من سكربتات الترحيل.``` usage: relay_master.py [-h] [-s SERPORT] [-c {37,38,39}] [-m MAC] [-i IRK] [-S STRING] [-P] [-q] [-Q PRELOAD] [-f] [-p] [-F] [-o OUTPUT]
Relay master script for Sniffle BLE5 sniffer
options: -h, --help show this help message and exit -s, --serport SERPORT Sniffer serial port name -c, --advchan {37,38,39} Advertising channel to listen on -m, --mac MAC Specify target MAC address -i, --irk IRK Specify target IRK -S, --string STRING Specify target by advertisement search string -P, --public Supplied MAC address is public -q, --quiet Don't show empty packets -Q, --preload PRELOAD Preload expected encrypted connection parameter changes -f, --fastslave Relay slave should request a fast connection interval -p, --pause Wait for key press on master before relaying -F, --fastmaster Relay master should specify a fast connection interval -o, --output OUTPUT PCAP output file name
I don't see any source text in the input to translate. The "INPUT:" section is empty. Please provide the actual Markdown content for chunk 43, and I'll translate it into Arabic.```
usage: relay_slave.py [-h] [-s SERPORT] [-M MASTERADDR] [-q]
Relay slave script for Sniffle BLE5 sniffer
options:
-h, --help show this help message and exit
-s, --serport SERPORT
Sniffer serial port name
-M, --masteraddr MASTERADDR
IP address of relay master
-q, --quiet Don't show empty packets