mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2025-08-19 21:03:48 -07:00
Linux: add native support for Bluetooth in client
This commit is contained in:
parent
73e6f0d07e
commit
7ca7677568
8 changed files with 151 additions and 23 deletions
|
@ -27,6 +27,7 @@ addons:
|
||||||
packages:
|
packages:
|
||||||
- gcc-arm-none-eabi
|
- gcc-arm-none-eabi
|
||||||
- libnewlib-dev
|
- libnewlib-dev
|
||||||
|
- libbluetooth-dev
|
||||||
homebrew:
|
homebrew:
|
||||||
packages:
|
packages:
|
||||||
- readline
|
- readline
|
||||||
|
|
|
@ -35,6 +35,9 @@ foreach(_qt_package IN LISTS QT_PACKAGELIST)
|
||||||
endif(NOT ${_qt_package}_FOUND)
|
endif(NOT ${_qt_package}_FOUND)
|
||||||
endforeach()
|
endforeach()
|
||||||
|
|
||||||
|
find_package(PkgConfig)
|
||||||
|
pkg_search_module(BLUEZ QUIET bluez)
|
||||||
|
|
||||||
SET (CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
|
SET (CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
|
||||||
|
|
||||||
add_subdirectory(deps)
|
add_subdirectory(deps)
|
||||||
|
@ -208,6 +211,12 @@ else (Qt5_FOUND)
|
||||||
${TARGET_SOURCES})
|
${TARGET_SOURCES})
|
||||||
endif (Qt5_FOUND)
|
endif (Qt5_FOUND)
|
||||||
|
|
||||||
|
if (BLUEZ_FOUND)
|
||||||
|
message("Bluez library found, building native Bluetooth support :)")
|
||||||
|
add_definitions("-DHAVE_BLUEZ")
|
||||||
|
set(ADDITIONAL_LNK bluetooth ${ADDITIONAL_LNK})
|
||||||
|
endif (BLUEZ_FOUND)
|
||||||
|
|
||||||
add_executable(
|
add_executable(
|
||||||
proxmark3
|
proxmark3
|
||||||
${TARGET_SOURCES}
|
${TARGET_SOURCES}
|
||||||
|
|
|
@ -90,6 +90,14 @@ else
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
ifneq ($(SKIPBT),1)
|
||||||
|
BTLDLIBS = $(shell $(PKG_CONFIG_ENV) pkg-config --libs bluez 2>/dev/null)
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifneq ($(BTLDLIBS),)
|
||||||
|
PM3CFLAGS += -DHAVE_BLUEZ
|
||||||
|
endif
|
||||||
|
|
||||||
ifneq ($(SKIPQT),1)
|
ifneq ($(SKIPQT),1)
|
||||||
# Check for correctly configured Qt5
|
# Check for correctly configured Qt5
|
||||||
QTINCLUDES = $(shell $(PKG_CONFIG_ENV) pkg-config --cflags Qt5Core Qt5Widgets 2>/dev/null)
|
QTINCLUDES = $(shell $(PKG_CONFIG_ENV) pkg-config --cflags Qt5Core Qt5Widgets 2>/dev/null)
|
||||||
|
@ -132,6 +140,24 @@ else
|
||||||
QTGUIOBJS = $(OBJDIR)/guidummy.o
|
QTGUIOBJS = $(OBJDIR)/guidummy.o
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
$(info ===================================================================)
|
||||||
|
$(info Client platform: $(platform))
|
||||||
|
ifeq ($(SKIPQT),1)
|
||||||
|
$(info GUI support: skipped)
|
||||||
|
else ifneq ($(QTLDLIBS),)
|
||||||
|
$(info GUI support: QT found, enabled)
|
||||||
|
else
|
||||||
|
$(info GUI support: QT not found, disabled)
|
||||||
|
endif
|
||||||
|
ifeq ($(SKIPBT),1)
|
||||||
|
$(info native BT support: skipped)
|
||||||
|
else ifneq ($(BTLDLIBS),)
|
||||||
|
$(info native BT support: Bluez found, enabled)
|
||||||
|
else
|
||||||
|
$(info native BT support: Bluez not found, disabled)
|
||||||
|
endif
|
||||||
|
$(info ===================================================================)
|
||||||
|
|
||||||
# Flags to generate temporary dependency files
|
# Flags to generate temporary dependency files
|
||||||
DEPFLAGS = -MT $@ -MMD -MP -MF $(OBJDIR)/$*.Td
|
DEPFLAGS = -MT $@ -MMD -MP -MF $(OBJDIR)/$*.Td
|
||||||
# make temporary to final dependency files after successful compilation
|
# make temporary to final dependency files after successful compilation
|
||||||
|
@ -286,7 +312,7 @@ all: $(BINS)
|
||||||
all-static: LDLIBS:=-static $(LDLIBS)
|
all-static: LDLIBS:=-static $(LDLIBS)
|
||||||
all-static: $(BINS)
|
all-static: $(BINS)
|
||||||
|
|
||||||
proxmark3: LDLIBS+=$(LUALIB) $(JANSSONLIB) $(MBEDTLSLIB) $(CBORLIB) $(ZLIB) $(REVENGLIB) $(AMIIBOLIB) $(HARDNESTEDLIB) $(CLIPARSERLIB) $(QTLDLIBS)
|
proxmark3: LDLIBS+=$(LUALIB) $(JANSSONLIB) $(MBEDTLSLIB) $(CBORLIB) $(ZLIB) $(REVENGLIB) $(AMIIBOLIB) $(HARDNESTEDLIB) $(CLIPARSERLIB) $(BTLDLIBS) $(QTLDLIBS)
|
||||||
proxmark3: $(OBJDIR)/proxmark3.o $(COREOBJS) $(CMDOBJS) $(OBJCOBJS) $(QTGUIOBJS) $(LUALIB) $(JANSSONLIB) $(CBORLIB) $(REVENGLIB) $(MBEDTLSLIB) $(ZLIB) $(AMIIBOLIB) $(HARDNESTEDLIB) $(CLIPARSERLIB) lualibs/pm3_cmd.lua lualibs/mfc_default_keys.lua
|
proxmark3: $(OBJDIR)/proxmark3.o $(COREOBJS) $(CMDOBJS) $(OBJCOBJS) $(QTGUIOBJS) $(LUALIB) $(JANSSONLIB) $(CBORLIB) $(REVENGLIB) $(MBEDTLSLIB) $(ZLIB) $(AMIIBOLIB) $(HARDNESTEDLIB) $(CLIPARSERLIB) lualibs/pm3_cmd.lua lualibs/mfc_default_keys.lua
|
||||||
$(info [=] LD $@)
|
$(info [=] LD $@)
|
||||||
$(Q)$(LD) $(LDFLAGS) $(OBJDIR)/proxmark3.o $(COREOBJS) $(CMDOBJS) $(OBJCOBJS) $(QTGUIOBJS) $(LDLIBS) -o $@
|
$(Q)$(LD) $(LDFLAGS) $(OBJDIR)/proxmark3.o $(COREOBJS) $(CMDOBJS) $(OBJCOBJS) $(QTGUIOBJS) $(LDLIBS) -o $@
|
||||||
|
|
|
@ -639,9 +639,10 @@ int TestProxmark(void) {
|
||||||
conn.send_via_fpc_usart = pm3_capabilities.via_fpc;
|
conn.send_via_fpc_usart = pm3_capabilities.via_fpc;
|
||||||
conn.uart_speed = pm3_capabilities.baudrate;
|
conn.uart_speed = pm3_capabilities.baudrate;
|
||||||
|
|
||||||
PrintAndLogEx(INFO, "Communicating with PM3 over %s%s",
|
PrintAndLogEx(INFO, "Communicating with PM3 over %s%s%s",
|
||||||
conn.send_via_fpc_usart ? _YELLOW_("FPC UART") : _YELLOW_("USB-CDC"),
|
conn.send_via_fpc_usart ? _YELLOW_("FPC UART") : _YELLOW_("USB-CDC"),
|
||||||
memcmp(conn.serial_port_name, "tcp:", 4) == 0 ? " over " _YELLOW_("TCP") : "");
|
memcmp(conn.serial_port_name, "tcp:", 4) == 0 ? " over " _YELLOW_("TCP") : "",
|
||||||
|
memcmp(conn.serial_port_name, "bt:", 3) == 0 ? " over " _YELLOW_("BT") : "");
|
||||||
|
|
||||||
if (conn.send_via_fpc_usart) {
|
if (conn.send_via_fpc_usart) {
|
||||||
PrintAndLogEx(INFO, "PM3 UART serial baudrate: " _YELLOW_("%u") "\n", conn.uart_speed);
|
PrintAndLogEx(INFO, "PM3 UART serial baudrate: " _YELLOW_("%u") "\n", conn.uart_speed);
|
||||||
|
|
|
@ -48,10 +48,16 @@
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <netinet/tcp.h>
|
#include <netinet/tcp.h>
|
||||||
#include <netdb.h>
|
#include <netdb.h>
|
||||||
#include "sys/socket.h"
|
#include <sys/socket.h>
|
||||||
#include "sys/un.h"
|
#include <sys/un.h>
|
||||||
|
|
||||||
|
#ifdef HAVE_BLUEZ
|
||||||
|
#include <bluetooth/bluetooth.h>
|
||||||
|
#include <bluetooth/rfcomm.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "comms.h"
|
#include "comms.h"
|
||||||
|
#include "ui.h"
|
||||||
|
|
||||||
// Taken from https://github.com/unbit/uwsgi/commit/b608eb1772641d525bfde268fe9d6d8d0d5efde7
|
// Taken from https://github.com/unbit/uwsgi/commit/b608eb1772641d525bfde268fe9d6d8d0d5efde7
|
||||||
#ifndef SOL_TCP
|
#ifndef SOL_TCP
|
||||||
|
@ -158,6 +164,52 @@ serial_port uart_open(const char *pcPortName, uint32_t speed) {
|
||||||
return sp;
|
return sp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (memcmp(pcPortName, "bt:", 3) == 0) {
|
||||||
|
#ifdef HAVE_BLUEZ
|
||||||
|
if (strlen(pcPortName) != 20) {
|
||||||
|
free(sp);
|
||||||
|
return INVALID_SERIAL_PORT;
|
||||||
|
}
|
||||||
|
char *addrstr = strndup(pcPortName + 3, 17);
|
||||||
|
|
||||||
|
if (addrstr == NULL) {
|
||||||
|
printf("Error: malloc\n");
|
||||||
|
free(sp);
|
||||||
|
return INVALID_SERIAL_PORT;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct sockaddr_rc addr = { 0 };
|
||||||
|
addr.rc_family = AF_BLUETOOTH;
|
||||||
|
addr.rc_channel = (uint8_t) 1;
|
||||||
|
if (str2ba(addrstr, &addr.rc_bdaddr) != 0) {
|
||||||
|
PrintAndLogEx(ERR, "Invalid Bluetooth MAC address " _RED_("%s"), addrstr);
|
||||||
|
free(addrstr);
|
||||||
|
free(sp);
|
||||||
|
return INVALID_SERIAL_PORT;
|
||||||
|
}
|
||||||
|
int sfd = socket(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM);
|
||||||
|
if (sfd == -1) {
|
||||||
|
PrintAndLogEx(ERR, "Error opening Bluetooth socket");
|
||||||
|
free(addrstr);
|
||||||
|
free(sp);
|
||||||
|
return INVALID_SERIAL_PORT;
|
||||||
|
}
|
||||||
|
if (connect(sfd, (struct sockaddr *)&addr, sizeof(addr)) == -1) {
|
||||||
|
PrintAndLogEx(ERR, "Error: cannot connect device " _YELLOW_("%s") " over Bluetooth", addrstr);
|
||||||
|
close(sfd);
|
||||||
|
free(addrstr);
|
||||||
|
free(sp);
|
||||||
|
return INVALID_SERIAL_PORT;
|
||||||
|
}
|
||||||
|
|
||||||
|
sp->fd = sfd;
|
||||||
|
return sp;
|
||||||
|
#else // HAVE_BLUEZ
|
||||||
|
PrintAndLogEx(ERR, "Sorry, this client doesn't support native Bluetooth addresses");
|
||||||
|
free(sp);
|
||||||
|
return INVALID_SERIAL_PORT;
|
||||||
|
#endif // HAVE_BLUEZ
|
||||||
|
}
|
||||||
// The socket for abstract namespace implement.
|
// The socket for abstract namespace implement.
|
||||||
// Is local socket buffer, not a TCP or any net connection!
|
// Is local socket buffer, not a TCP or any net connection!
|
||||||
// so, you can't connect with address like: 127.0.0.1, or any IP
|
// so, you can't connect with address like: 127.0.0.1, or any IP
|
||||||
|
|
|
@ -102,7 +102,9 @@ http://www.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp
|
||||||
|
|
||||||
#### Linux
|
#### Linux
|
||||||
|
|
||||||
#### (1) Connecting rdv4.0 with Bluetooth on Linux computer
|
#### (1) Connecting rdv4.0 with Bluetooth on Linux computer via native Bluetooth support in the client
|
||||||
|
|
||||||
|
This requires to have compiled the client with Bluetooth support.
|
||||||
|
|
||||||
1. Find the MAC address of the Bluetooth add-on, named PM3_RDV4.0.
|
1. Find the MAC address of the Bluetooth add-on, named PM3_RDV4.0.
|
||||||
|
|
||||||
|
@ -114,21 +116,9 @@ Scanning ...
|
||||||
|
|
||||||
Instead of `aa:bb:cc:dd:ee:ff`, you'll see your MAC address.
|
Instead of `aa:bb:cc:dd:ee:ff`, you'll see your MAC address.
|
||||||
|
|
||||||
2. Bind your BT add-on MAC address to a serial port
|
2. Use Proxmark client with Bluetooth MAC address as bt:<mac>
|
||||||
```sh
|
```sh
|
||||||
sudo rfcomm bind rfcomm0 aa:bb:cc:dd:ee:ff
|
./proxmark3 bt:aa:bb:cc:dd:ee:ff
|
||||||
```
|
|
||||||
|
|
||||||
Replace `aa:bb:cc:dd:ee:ff` by your MAC address.
|
|
||||||
|
|
||||||
3. The blue state LED on the add-on will keep blinking after the
|
|
||||||
connection is established. Only when the Proxmark3 client opens the
|
|
||||||
`/dev/rfcomm0` port, the blue LED turns on solid, indicating that the
|
|
||||||
connection is successful.
|
|
||||||
|
|
||||||
4. Use Proxmark client on BT-serial port
|
|
||||||
```sh
|
|
||||||
./proxmark3 /dev/rfcomm0
|
|
||||||
```
|
```
|
||||||
The first time, your OS will ask you for pairing. The default PIN is
|
The first time, your OS will ask you for pairing. The default PIN is
|
||||||
1234. If PIN is not typed in quickly, the client might timeout. Simply
|
1234. If PIN is not typed in quickly, the client might timeout. Simply
|
||||||
|
@ -172,6 +162,39 @@ turn on solid.
|
||||||
./proxmark3 /dev/ttyUSB0
|
./proxmark3 /dev/ttyUSB0
|
||||||
```
|
```
|
||||||
|
|
||||||
|
#### (1b, deprecated) Connecting rdv4.0 with Bluetooth on Linux computer via rfcomm
|
||||||
|
|
||||||
|
rfcomm is a deprecated tool which might be unavailable in your Linux distribution.
|
||||||
|
|
||||||
|
1. Find the MAC address of the Bluetooth add-on, named PM3_RDV4.0.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
sudo hcitool scan
|
||||||
|
Scanning ...
|
||||||
|
aa:bb:cc:dd:ee:ff PM3_RDV4.0
|
||||||
|
```
|
||||||
|
|
||||||
|
Instead of `aa:bb:cc:dd:ee:ff`, you'll see your MAC address.
|
||||||
|
|
||||||
|
2. Bind your BT add-on MAC address to a serial port
|
||||||
|
```sh
|
||||||
|
sudo rfcomm bind rfcomm0 aa:bb:cc:dd:ee:ff
|
||||||
|
```
|
||||||
|
|
||||||
|
Replace `aa:bb:cc:dd:ee:ff` by your MAC address.
|
||||||
|
|
||||||
|
3. The blue state LED on the add-on will keep blinking after the
|
||||||
|
connection is established. Only when the Proxmark3 client opens the
|
||||||
|
`/dev/rfcomm0` port, the blue LED turns on solid, indicating that the
|
||||||
|
connection is successful.
|
||||||
|
|
||||||
|
4. Use Proxmark client on BT-serial port
|
||||||
|
```sh
|
||||||
|
./proxmark3 /dev/rfcomm0
|
||||||
|
```
|
||||||
|
|
||||||
|
See instructions above (method 1) for initial pairing.
|
||||||
|
|
||||||
#### MacOS
|
#### MacOS
|
||||||
|
|
||||||
#### (1) Connecting rdv4.0 with Bluetooth on MacOS
|
#### (1) Connecting rdv4.0 with Bluetooth on MacOS
|
||||||
|
|
|
@ -25,9 +25,11 @@ Install the requirements
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
sudo apt-get install --no-install-recommends git ca-certificates build-essential pkg-config \
|
sudo apt-get install --no-install-recommends git ca-certificates build-essential pkg-config \
|
||||||
libreadline-dev gcc-arm-none-eabi libnewlib-dev qtbase5-dev
|
libreadline-dev gcc-arm-none-eabi libnewlib-dev qtbase5-dev libbluetooth-dev
|
||||||
```
|
```
|
||||||
|
|
||||||
|
If you don't need the native Bluetooth support in the client, you can skip the installation of `libbluetooth-dev`.
|
||||||
|
|
||||||
If you don't need the graphical components of the Proxmark3 client (such as in `hw tune`), you can skip the installation of `qtbase5-dev`.
|
If you don't need the graphical components of the Proxmark3 client (such as in `hw tune`), you can skip the installation of `qtbase5-dev`.
|
||||||
|
|
||||||
If you get some (non blocking) error at runtime such as _Gtk-Message: Failed to load module "canberra-gtk-module"_ you may have to install `libcanberra-gtk-module`.
|
If you get some (non blocking) error at runtime such as _Gtk-Message: Failed to load module "canberra-gtk-module"_ you may have to install `libcanberra-gtk-module`.
|
||||||
|
@ -35,17 +37,21 @@ If you get some (non blocking) error at runtime such as _Gtk-Message: Failed to
|
||||||
## On ArchLinux
|
## On ArchLinux
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
sudo pacman -Sy git base-devel readline arm-none-eabi-gcc arm-none-eabi-newlib qt5-base --needed
|
sudo pacman -Sy git base-devel readline arm-none-eabi-gcc arm-none-eabi-newlib qt5-base bluez --needed
|
||||||
```
|
```
|
||||||
|
|
||||||
|
If you don't need the native Bluetooth support in the client, you can skip the installation of `bluez`.
|
||||||
|
|
||||||
If you don't need the graphical components of the Proxmark3 client (such as in `hw tune`), you can skip the installation of `qt5-base`.
|
If you don't need the graphical components of the Proxmark3 client (such as in `hw tune`), you can skip the installation of `qt5-base`.
|
||||||
|
|
||||||
## On Fedora
|
## On Fedora
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
sudo dnf install git make gcc gcc-c++ arm-none-eabi-gcc-cs arm-none-eabi-newlib readline-devel qt5-qtbase-devel libatomic
|
sudo dnf install git make gcc gcc-c++ arm-none-eabi-gcc-cs arm-none-eabi-newlib readline-devel qt5-qtbase-devel bluez-libs-devel libatomic
|
||||||
```
|
```
|
||||||
|
|
||||||
|
If you don't need the native Bluetooth support in the client, you can skip the installation of `bluez-libs-devel`.
|
||||||
|
|
||||||
If you don't need the graphical components of the Proxmark3 client (such as in `hw tune`), you can skip the installation of `qt5-qtbase-devel`.
|
If you don't need the graphical components of the Proxmark3 client (such as in `hw tune`), you can skip the installation of `qt5-qtbase-devel`.
|
||||||
|
|
||||||
## On openSUSE
|
## On openSUSE
|
||||||
|
@ -56,6 +62,8 @@ sudo zypper install git patterns-devel-base-devel_basis gcc-c++ readline-devel c
|
||||||
|
|
||||||
If you don't need the graphical components of the Proxmark3 client (such as in `hw tune`), you can skip the installation of `libqt5-qtbase-devel`.
|
If you don't need the graphical components of the Proxmark3 client (such as in `hw tune`), you can skip the installation of `libqt5-qtbase-devel`.
|
||||||
|
|
||||||
|
Note that Bluez is not available on openSUSE so the native Bluetooth support won't be available in the client.
|
||||||
|
|
||||||
# Clone the RRG/Iceman repository
|
# Clone the RRG/Iceman repository
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
|
|
|
@ -19,6 +19,14 @@ make clean
|
||||||
make SKIPQT=1
|
make SKIPQT=1
|
||||||
```
|
```
|
||||||
|
|
||||||
|
On Linux hosts, if the Bluez headers and library are present, the client will be compiled with native Bluetooth support. It's possible to explicitly skip Bluetooth support with:
|
||||||
|
|
||||||
|
```
|
||||||
|
make clean
|
||||||
|
make SKIPBT=1
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
## Firmware
|
## Firmware
|
||||||
|
|
||||||
By default, the firmware is of course tuned for the Proxmark3 Rdv4.0 device, which has built-in support for 256kb onboard flash SPI memory, Sim module (smart card support), FPC connector.
|
By default, the firmware is of course tuned for the Proxmark3 Rdv4.0 device, which has built-in support for 256kb onboard flash SPI memory, Sim module (smart card support), FPC connector.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue