new: parsing BLE PnP ID field

This commit is contained in:
evilsocket 2019-02-22 13:18:43 +01:00
commit cff4b4c11b
No known key found for this signature in database
GPG key ID: 1564D7F30393A456
2 changed files with 55 additions and 16 deletions

View file

@ -38,7 +38,7 @@ func (mod *BLERecon) getRow(dev *network.BLEDevice, withName bool) []string {
return []string{ return []string{
rssi, rssi,
address, address,
dev.Name(), tui.Yellow(dev.Name()),
vendor, vendor,
dev.Advertisement.Flags.String(), dev.Advertisement.Flags.String(),
isConnectable, isConnectable,

View file

@ -176,30 +176,30 @@ func parseProperties(ch *gatt.Characteristic) (props []string, isReadable bool,
mask := ch.Properties() mask := ch.Properties()
if (mask & gatt.CharBroadcast) != 0 { if (mask & gatt.CharBroadcast) != 0 {
props = append(props, "bcast") props = append(props, "BCAST")
} }
if (mask & gatt.CharRead) != 0 { if (mask & gatt.CharRead) != 0 {
isReadable = true isReadable = true
props = append(props, "read") props = append(props, "READ")
} }
if (mask&gatt.CharWriteNR) != 0 || (mask&gatt.CharWrite) != 0 { if (mask&gatt.CharWriteNR) != 0 || (mask&gatt.CharWrite) != 0 {
props = append(props, tui.Bold("write")) props = append(props, tui.Bold("WRITE"))
isWritable = true isWritable = true
withResponse = (mask & gatt.CharWriteNR) == 0 withResponse = (mask & gatt.CharWriteNR) == 0
} }
if (mask & gatt.CharNotify) != 0 { if (mask & gatt.CharNotify) != 0 {
props = append(props, "notify") props = append(props, "NOTIFY")
} }
if (mask & gatt.CharIndicate) != 0 { if (mask & gatt.CharIndicate) != 0 {
props = append(props, "indicate") props = append(props, "INDICATE")
} }
if (mask & gatt.CharSignedWrite) != 0 { if (mask & gatt.CharSignedWrite) != 0 {
props = append(props, tui.Yellow("*write")) props = append(props, tui.Yellow("SIGN WRITE"))
isWritable = true isWritable = true
withResponse = true withResponse = true
} }
if (mask & gatt.CharExtended) != 0 { if (mask & gatt.CharExtended) != 0 {
props = append(props, "x") props = append(props, "X")
} }
return return
@ -289,21 +289,60 @@ func (mod *BLERecon) showServices(p gatt.Peripheral, services []*gatt.Service) {
} }
} }
if ch.Name() == "Appearance" && raw != nil && len(raw) >= 2 { sz := 0
if raw != nil {
sz = len(raw)
}
multi := ([]string)(nil)
if ch.Name() == "Appearance" && sz >= 2 {
// org.bluetooth.characteristic.gap.appearance
app := binary.LittleEndian.Uint16(raw[0:2]) app := binary.LittleEndian.Uint16(raw[0:2])
if appName, found := appearances[app]; found { if appName, found := appearances[app]; found {
data = tui.Green(appName) data = tui.Green(appName)
} }
} else if ch.Name() == "PnP ID" && sz >= 7 {
// org.bluetooth.characteristic.pnp_id
src := ""
vendorIdSrc := byte(raw[0])
vendorId := binary.LittleEndian.Uint16(raw[1:3])
prodId := binary.LittleEndian.Uint16(raw[3:5])
prodVer := binary.LittleEndian.Uint16(raw[5:7])
if vendorIdSrc == 1 {
src = " (Bluetooth SIG assigned Company Identifier)"
} else if vendorIdSrc == 2 {
src = " (USB Implementers Forum assigned Vendor ID value)"
}
multi = []string{
tui.Green("Vendor ID") + fmt.Sprintf(": 0x%04x%s", vendorId, tui.Dim(src)),
tui.Green("Product ID") + fmt.Sprintf(": 0x%04x", prodId),
tui.Green("Product Version") + fmt.Sprintf(": 0x%04x", prodVer),
}
} }
row := []string{ if multi == nil {
fmt.Sprintf("%04x", ch.Handle()), rows = append(rows, []string{
name, fmt.Sprintf("%04x", ch.Handle()),
strings.Join(props, ", "), name,
data, strings.Join(props, ", "),
data,
})
} else {
for i, m := range multi {
if i == 0 {
rows = append(rows, []string{
fmt.Sprintf("%04x", ch.Handle()),
name,
strings.Join(props, ", "),
m,
})
} else {
rows = append(rows, []string{"", "", "", m})
}
}
} }
rows = append(rows, row)
} }
} }