Compare commits

...

71 Commits

Author SHA1 Message Date
3cd5c6b617
Merge branch 'development' 2023-11-02 18:05:27 -07:00
4b53941c6a
Fix[eros]: value too large 2023-11-02 18:04:36 -07:00
7347a53374
Chore: tidy up 2023-04-30 04:18:53 -07:00
40b8acacdf
Chore: deps 2023-04-30 04:18:45 -07:00
e4f9223fb4
Refactor: overhaul program configuration system 2023-04-30 04:18:34 -07:00
5892355417
Chore: deps 2023-04-30 03:38:55 -07:00
7042dfb8d9
Docs: fix comments 2023-04-30 03:38:45 -07:00
3e72e21fab
Fix: various things stopping us from building 2022-08-20 19:07:54 -07:00
e12f33f307
Revert e-notes (diff branch) - update .gitignore 2022-08-17 19:29:10 -07:00
12ad017b39
Broken: wrath of Dillinger 2022-01-31 03:08:08 -08:00
721e08994c fixing for use while developing 2021-08-28 03:37:19 -07:00
df20ee2de6 Excellent HTTPS API prep-wor by Dillinger 2021-08-21 01:45:32 -07:00
Dillinger
8d5e1ab6b8 Am a big ol dum dum 2021-08-18 08:55:45 -04:00
Dillinger
08c7491e6b Am a dum dum 2021-08-18 08:44:42 -04:00
fc5e158b46 Update 'src/eros/eros.go'
added clientside api functionality for exploit; my json code might get cucked by json-iterator tho
2021-08-17 20:43:35 +00:00
38210653b8 begin implementing mutexes and adjusting the way we reference and instantiate instances of types accordingly 2021-08-17 09:25:41 -07:00
df3dfabe22 refactor handling of types cross package and add documentation 2021-08-17 08:28:24 -07:00
ed222d181d fix version string redundancy 2021-08-16 12:18:38 -07:00
5528bd925c Make minor progress on deimos implementation and create Makefile and add versioning for builds 2021-08-16 12:16:05 -07:00
16d7e6bd95 fix go-prompt issue with fork 2021-07-11 18:54:34 -07:00
93a7e51c29 being deimos packet capture implementation scaffolding 2021-07-09 01:13:24 -07:00
4428ac4da7 Work on command line interface, add arboghast 2021-06-30 20:40:33 -07:00
d535711880 hunt down wrath bugs 2021-06-21 14:52:09 -07:00
413bbeb95a Merge branch 'development' of ssh://git.tcp.direct:2222/freqy/protomolecule into development 2021-06-19 12:50:11 -07:00
ebe586a48c sample code in wrath to get off to a good start 2021-06-19 12:50:05 -07:00
e3eeb9184a add cmd.go 2021-06-16 14:57:31 -07:00
877557553c refactor connection timeout, attempt to improve connection speed, attempt to improve speed of scan cancellation 2021-06-15 19:42:53 -07:00
8f63a56d67 rework eros and make minor CLI adjustments 2021-06-15 13:23:53 -07:00
52c1f28f80 continue implementation of a command line interface 2021-06-15 01:15:30 -07:00
75637fe9d4 Merge branch 'development' into cli 2021-06-14 18:16:36 -07:00
9909426150 begin implementing an interactive command line interface 2021-06-14 18:15:50 -07:00
freqyXin
55260e7132 pushing work on wrath -- this function is not working yet 2021-06-14 16:31:42 -07:00
freqyXin
6a95824ae2 added wrath package and started forming the targeted attack features 2021-06-12 22:29:40 -07:00
ea531e6665 Merge branch 'development' of ssh://git.tcp.direct:2222/freqy/protomolecule into development 2021-06-10 12:25:49 -07:00
93468fa399 Readme Update 2021-06-10 12:25:43 -07:00
freqyXin
49dff682e5 created cortazar package for device analysis features, and added notify feature 2021-06-04 21:06:39 -07:00
7ea9c004df add bluetooth profile render 2021-06-04 14:34:53 -07:00
f5126f85bc clean up and re-organize 2021-06-01 19:18:35 -07:00
91ba197c6c test implementation of channels for IPC, prep for currency 2021-05-31 01:24:09 -07:00
086b479e43 restructuring packages 2021-05-31 00:34:40 -07:00
24c3d30c14 restructuring packages 2021-05-31 00:31:52 -07:00
76b70b4fab semantics and readme update 2021-05-30 22:16:09 -07:00
29f2db2c20 hey wait a minute that's not a uint16 2021-05-30 22:07:52 -07:00
64fd893846 Merge branch 'development' of ssh://git.tcp.direct:2222/freqy/protomolecule into development 2021-05-30 21:59:29 -07:00
freqyXin
f27ae8802f updating apple Manufacturer data to include apple TV and iPhone enumm 2021-05-30 21:58:58 -07:00
287add1fcc Merge branch 'development' of ssh://git.tcp.direct:2222/freqy/protomolecule into development 2021-05-30 21:47:47 -07:00
cd50c251e1 go doc friendly 2021-05-30 21:47:40 -07:00
freqyXin
b022d32ffe Merge branch 'development' of ssh://git.tcp.direct:2222/freqy/protomolecule into development 2021-05-30 21:45:27 -07:00
freqyXin
f0c76853ee Basic manufacturer string output is working! Should for sure be refined from here. 2021-05-30 21:44:55 -07:00
711804afeb added CLI flag for loading JSON manufacturer data 2021-05-30 20:16:03 -07:00
e294599c16 okay now its actually storing the manufacturer data in memory properly and appending new UUIDs if they don't exist 2021-05-30 18:23:45 -07:00
04ba336746 exporting manufacturer data list to make it accessible everywhere eros is imported (eros.Manufacturers) 2021-05-30 17:31:06 -07:00
06fbc0e5c1 seperated this file so that it doesn't crash nano 2021-05-30 17:14:25 -07:00
d138f0e2d4 loading manufacturer data from disk into memory for comparison during scans 2021-05-30 17:13:56 -07:00
freqyXin
cd4fd63285 debugging manufacturer enumeration 2021-05-29 22:12:45 -07:00
freqyXin
faec2ddb3e Added ManufUUID.json as list of known manufacturers, and attempted to create manufacturer enumeration function but it doesnt seem to be working correctly 2021-05-29 21:44:40 -07:00
2b4a528073 tweaked logging output, tried to fix connection timer issues 2021-05-29 03:48:52 -07:00
306b34243f fixed attack mode connection timeout 2021-05-28 05:51:50 -07:00
9883283eeb I'm working on having better priorities along with my git commit messages. 2021-05-28 05:39:16 -07:00
02fa9324f7 Code cleanup, detecting apple devices now(?). More concurrency prepping. 2021-05-28 05:19:11 -07:00
6e9176b99a fixing tracking mode (yes again) 2021-05-28 05:18:59 -07:00
79577dc64e manually merging conflicting pushes 2021-05-28 05:06:56 -07:00
3790b66197 fixing signal handler 2021-05-28 04:30:14 -07:00
9e9d8982a7 making way for Manufac data, added notes about logging clean up 2021-05-28 04:29:21 -07:00
a947d991ff code cleanup/minor rework 2021-05-28 04:25:21 -07:00
e5c5674f6b fixing log output to not include the entire rssi history 2021-05-28 03:02:47 -07:00
8070caa958 fixing tracking mode not toggling properly from previous changes 2021-05-28 02:41:18 -07:00
607e996ad6 lots of documentation and continuing work on scan manager 2021-05-28 01:54:20 -07:00
abe98e2c89 Merge branch 'development' of freqy/protomolecule into master 2021-05-11 10:14:10 +00:00
ee48f6b9ca Update 'README.md'
Fixing typos
2021-05-09 03:04:09 +00:00
dc8f357771 Merge branch 'development' of freqy/protomolecule into master
logging implemented, eros database implemented, kayos did not write "fuckhole jones" or "bug hunting" in any of his commit messages
2021-05-09 01:21:00 +00:00
26 changed files with 5980 additions and 1060 deletions

45
.gitignore vendored

@ -1,39 +1,6 @@
protomol.code-workspace
.vscode/launch.json
16ways.json
.eros-data/devices/000000000.data
.eros-data/devices/config.json
.eros-data/devices/lock
.eros-data/exploits/000000000.data
.eros-data/exploits/config.json
.eros-data/exploits/lock
.logs/2021-05-09T10:03:08-07:00.log
.logs/2021-05-09T13:48:07-07:00.log
.logs/2021-05-09T13:49:43-07:00.log
.logs/2021-05-09T13:50:42-07:00.log
.logs/2021-05-09T13:57:18-07:00.log
.logs/2021-05-09T14:08:07-07:00.log
.logs/2021-05-09T14:08:55-07:00.log
.logs/2021-05-09T14:13:26-07:00.log
.logs/2021-05-09T14:19:12-07:00.log
.logs/2021-05-09T14:28:16-07:00.log
.logs/2021-05-09T14:37:11-07:00.log
.logs/2021-05-09T15:42:20-07:00.log
.logs/2021-05-09T16:02:40-07:00.log
.logs/2021-05-09T16:18:04-07:00.log
.logs/2021-05-09T16:19:39-07:00.log
.logs/2021-05-09T16:20:09-07:00.log
.logs/2021-05-09T16:21:32-07:00.log
.logs/2021-05-09T16:26:12-07:00.log
.logs/2021-05-09T16:27:26-07:00.log
.logs/2021-05-09T16:29:45-07:00.log
.logs/2021-05-09T16:30:46-07:00.log
.logs/2021-05-09T16:31:54-07:00.log
.logs/2021-05-09T16:32:42-07:00.log
.logs/2021-05-09T16:34:17-07:00.log
.logs/2021-05-09T16:48:56-07:00.log
.logs/2021-05-09T17:03:18-07:00.log
.logs/2021-05-09T18:00:31-07:00.log
.logs/2021-05-09T18:02:48-07:00.log
.UUIDs.txt.swp
.gitignore
*.code-workspace
.idea/
*.json
.eros-data/*
.logs/*
*.txt

22
Makefile Normal file

@ -0,0 +1,22 @@
.DEFAULT_GOAL := protomolecule
.PHONY = fmt vet all clean deps benchmark
all: main
protomolecule:
go build -ldflags="-s -w -X main.GitVersion=git-$(shell git rev-list --count HEAD)-$(shell git rev-parse --short HEAD) -X main.BuildDate=$(shell date -u +%Y-%m-%dT%H:%M:%S%Z)"
install:
cp protomolecule /usr/local/bin/
uninstall:
rm /usr/local/bin/protomolecule
benchmark:
go test -bench=.
deps:
go mod tidy -v
fmt:
find . -name "*.go" -exec gofmt -s -w {} \;
vet:
go vet ./
clean:
rm protomolecule

481
ManufUUID.json Normal file

@ -0,0 +1,481 @@
{"ManufUUID":"0xFEFF" , "ManufString":"GN Netcom","ManuFSite":""}
{"ManufUUID":"0xFEFE" , "ManufString":"GN ReSound A/S","ManuFSite":""}
{"ManufUUID":"0xFEFD" , "ManufString":"Gimbal, Inc.","ManuFSite":""}
{"ManufUUID":"0xFEFC" , "ManufString":"Gimbal, Inc.","ManuFSite":""}
{"ManufUUID":"0xFEFB" , "ManufString":"Telit Wireless Solutions (Formerly Stollmann E+V GmbH) ","ManuFSite":""}
{"ManufUUID":"0xFEFA" , "ManufString":"PayPal, Inc.","ManuFSite":""}
{"ManufUUID":"0xFEF9" , "ManufString":"PayPal, Inc.","ManuFSite":""}
{"ManufUUID":"0xFEF8" , "ManufString":"Aplix Corporation","ManuFSite":""}
{"ManufUUID":"0xFEF7" , "ManufString":"Aplix Corporation","ManuFSite":""}
{"ManufUUID":"0xFEF6" , "ManufString":"Wicentric, Inc.","ManuFSite":""}
{"ManufUUID":"0xFEF5" , "ManufString":"Dialog Semiconductor GmbH","ManuFSite":""}
{"ManufUUID":"0xFEF4" , "ManufString":"Google","ManuFSite":""}
{"ManufUUID":"0xFEF3" , "ManufString":"Google","ManuFSite":""}
{"ManufUUID":"0xFEF2" , "ManufString":"CSR","ManuFSite":""}
{"ManufUUID":"0xFEF1" , "ManufString":"CSR","ManuFSite":""}
{"ManufUUID":"0xFEF0" , "ManufString":"Intel","ManuFSite":""}
{"ManufUUID":"0xFEEF" , "ManufString":"Polar Electro Oy","ManuFSite":""}
{"ManufUUID":"0xFEEE" , "ManufString":"Polar Electro Oy","ManuFSite":""}
{"ManufUUID":"0xFEED" , "ManufString":"Tile, Inc.","ManuFSite":""}
{"ManufUUID":"0xFEEC" , "ManufString":"Tile, Inc.","ManuFSite":""}
{"ManufUUID":"0xFEEB" , "ManufString":"Swirl Networks, Inc.","ManuFSite":""}
{"ManufUUID":"0xFEEA" , "ManufString":"Swirl Networks, Inc.","ManuFSite":""}
{"ManufUUID":"0xFEE9" , "ManufString":"Quintic Corp.","ManuFSite":""}
{"ManufUUID":"0xFEE8" , "ManufString":"Quintic Corp.","ManuFSite":""}
{"ManufUUID":"0xFEE7" , "ManufString":"Tencent Holdings Limited.","ManuFSite":""}
{"ManufUUID":"0xFEE6" , "ManufString":"Silvair, Inc.","ManuFSite":""}
{"ManufUUID":"0xFEE5" , "ManufString":"Nordic Semiconductor ASA","ManuFSite":""}
{"ManufUUID":"0xFEE4" , "ManufString":"Nordic Semiconductor ASA","ManuFSite":""}
{"ManufUUID":"0xFEE3" , "ManufString":"Anki, Inc.","ManuFSite":""}
{"ManufUUID":"0xFEE2" , "ManufString":"Anki, Inc.","ManuFSite":""}
{"ManufUUID":"0xFEE1" , "ManufString":"Anhui Huami Information Technology Co., Ltd.","ManuFSite":""}
{"ManufUUID":"0xFEE0" , "ManufString":"Anhui Huami Information Technology Co., Ltd.","ManuFSite":""}
{"ManufUUID":"0xFEDF" , "ManufString":"Design SHIFT","ManuFSite":""}
{"ManufUUID":"0xFEDE" , "ManufString":"Coin, Inc.","ManuFSite":""}
{"ManufUUID":"0xFEDD" , "ManufString":"Jawbone","ManuFSite":""}
{"ManufUUID":"0xFEDC" , "ManufString":"Jawbone","ManuFSite":""}
{"ManufUUID":"0xFEDB" , "ManufString":"Perka, Inc.","ManuFSite":""}
{"ManufUUID":"0xFEDA" , "ManufString":"ISSC Technologies Corp.","ManuFSite":""}
{"ManufUUID":"0xFED9" , "ManufString":"Pebble Technology Corporation","ManuFSite":""}
{"ManufUUID":"0xFED8" , "ManufString":"Google","ManuFSite":""}
{"ManufUUID":"0xFED7" , "ManufString":"Broadcom","ManuFSite":""}
{"ManufUUID":"0xFED6" , "ManufString":"Broadcom","ManuFSite":""}
{"ManufUUID":"0xFED5" , "ManufString":"Plantronics Inc.","ManuFSite":""}
{"ManufUUID":"0xFED4" , "ManufString":"Apple, Inc.","ManuFSite":""}
{"ManufUUID":"0xFED3" , "ManufString":"Apple, Inc.","ManuFSite":""}
{"ManufUUID":"0xFED2" , "ManufString":"Apple, Inc.","ManuFSite":""}
{"ManufUUID":"0xFED1" , "ManufString":"Apple, Inc.","ManuFSite":""}
{"ManufUUID":"0xFED0" , "ManufString":"Apple, Inc.","ManuFSite":""}
{"ManufUUID":"0xFECF" , "ManufString":"Apple, Inc.","ManuFSite":""}
{"ManufUUID":"0xFECE" , "ManufString":"Apple, Inc.","ManuFSite":""}
{"ManufUUID":"0xFECD" , "ManufString":"Apple, Inc.","ManuFSite":""}
{"ManufUUID":"0xFECC" , "ManufString":"Apple, Inc.","ManuFSite":""}
{"ManufUUID":"0xFECB" , "ManufString":"Apple, Inc.","ManuFSite":""}
{"ManufUUID":"0xFECA" , "ManufString":"Apple, Inc.","ManuFSite":""}
{"ManufUUID":"0xFEC9" , "ManufString":"Apple, Inc.","ManuFSite":""}
{"ManufUUID":"0xFEC8" , "ManufString":"Apple, Inc.","ManuFSite":""}
{"ManufUUID":"0xFEC7" , "ManufString":"Apple, Inc.","ManuFSite":""}
{"ManufUUID":"0xFEC6" , "ManufString":"Kocomojo, LLC","ManuFSite":""}
{"ManufUUID":"0xFEC5" , "ManufString":"Realtek Semiconductor Corp.","ManuFSite":""}
{"ManufUUID":"0xFEC4" , "ManufString":"PLUS Location Systems","ManuFSite":""}
{"ManufUUID":"0xFEC3" , "ManufString":"360fly, Inc.","ManuFSite":""}
{"ManufUUID":"0xFEC2" , "ManufString":"Blue Spark Technologies, Inc. ","ManuFSite":""}
{"ManufUUID":"0xFEC1" , "ManufString":"KDDI Corporation","ManuFSite":""}
{"ManufUUID":"0xFEC0" , "ManufString":"KDDI Corporation","ManuFSite":""}
{"ManufUUID":"0xFEBF" , "ManufString":"Nod, Inc.","ManuFSite":""}
{"ManufUUID":"0xFEBE" , "ManufString":"Bose Corporation","ManuFSite":""}
{"ManufUUID":"0xFEBD" , "ManufString":"Clover Network, Inc","ManuFSite":""}
{"ManufUUID":"0xFEBC" , "ManufString":"Dexcom Inc","ManuFSite":""}
{"ManufUUID":"0xFEBB" , "ManufString":"adafruit industries","ManuFSite":""}
{"ManufUUID":"0xFEBA" , "ManufString":"Tencent Holdings Limited","ManuFSite":""}
{"ManufUUID":"0xFEB9" , "ManufString":"LG Electronics","ManuFSite":""}
{"ManufUUID":"0xFEB8" , "ManufString":"Facebook, Inc.","ManuFSite":""}
{"ManufUUID":"0xFEB7" , "ManufString":"Facebook, Inc.","ManuFSite":""}
{"ManufUUID":"0xFEB6" , "ManufString":"Vencer Co., Ltd","ManuFSite":""}
{"ManufUUID":"0xFEB5" , "ManufString":"WiSilica Inc.","ManuFSite":""}
{"ManufUUID":"0xFEB4" , "ManufString":"WiSilica Inc.","ManuFSite":""}
{"ManufUUID":"0xFEB3" , "ManufString":"Taobao","ManuFSite":""}
{"ManufUUID":"0xFEB2" , "ManufString":"Microsoft Corporation","ManuFSite":""}
{"ManufUUID":"0xFEB1" , "ManufString":"Electronics Tomorrow Limited","ManuFSite":""}
{"ManufUUID":"0xFEB0" , "ManufString":"Nest Labs Inc","ManuFSite":""}
{"ManufUUID":"0xFEAF" , "ManufString":"Nest Labs Inc","ManuFSite":""}
{"ManufUUID":"0xFEAE" , "ManufString":"Nokia","ManuFSite":""}
{"ManufUUID":"0xFEAD" , "ManufString":"Nokia","ManuFSite":""}
{"ManufUUID":"0xFEAC" , "ManufString":"Nokia","ManuFSite":""}
{"ManufUUID":"0xFEAB" , "ManufString":"Nokia","ManuFSite":""}
{"ManufUUID":"0xFEAA" , "ManufString":"Google","ManuFSite":""}
{"ManufUUID":"0xFEA9" , "ManufString":"Savant Systems LLC","ManuFSite":""}
{"ManufUUID":"0xFEA8" , "ManufString":"Savant Systems LLC","ManuFSite":""}
{"ManufUUID":"0xFEA7" , "ManufString":"UTC Fire and Security ","ManuFSite":""}
{"ManufUUID":"0xFEA6" , "ManufString":"GoPro, Inc.","ManuFSite":""}
{"ManufUUID":"0xFEA5" , "ManufString":"GoPro, Inc.","ManuFSite":""}
{"ManufUUID":"0xFEA4" , "ManufString":"Paxton Access Ltd","ManuFSite":""}
{"ManufUUID":"0xFEA3" , "ManufString":"ITT Industries","ManuFSite":""}
{"ManufUUID":"0xFEA2" , "ManufString":"Intrepid Control Systems, Inc. ","ManuFSite":""}
{"ManufUUID":"0xFEA1" , "ManufString":"Intrepid Control Systems, Inc. ","ManuFSite":""}
{"ManufUUID":"0xFEA0" , "ManufString":"Google","ManuFSite":""}
{"ManufUUID":"0xFE9F" , "ManufString":"Google","ManuFSite":""}
{"ManufUUID":"0xFE9E" , "ManufString":"Dialog Semiconductor B.V.","ManuFSite":""}
{"ManufUUID":"0xFE9D" , "ManufString":"Mobiquity Networks Inc","ManuFSite":""}
{"ManufUUID":"0xFE9C" , "ManufString":"GSI Laboratories, Inc.","ManuFSite":""}
{"ManufUUID":"0xFE9B" , "ManufString":"Samsara Networks, Inc","ManuFSite":""}
{"ManufUUID":"0xFE9A" , "ManufString":"Estimote","ManuFSite":""}
{"ManufUUID":"0xFE99" , "ManufString":"Currant Inc","ManuFSite":""}
{"ManufUUID":"0xFE98" , "ManufString":"Currant Inc","ManuFSite":""}
{"ManufUUID":"0xFE97" , "ManufString":"Tesla Motors Inc.","ManuFSite":""}
{"ManufUUID":"0xFE96" , "ManufString":"Tesla Motors Inc.","ManuFSite":""}
{"ManufUUID":"0xFE95" , "ManufString":"Xiaomi Inc.","ManuFSite":""}
{"ManufUUID":"0xFE94" , "ManufString":"OttoQ In","ManuFSite":""}
{"ManufUUID":"0xFE93" , "ManufString":"OttoQ In","ManuFSite":""}
{"ManufUUID":"0xFE92" , "ManufString":"Jarden Safety & Security ","ManuFSite":""}
{"ManufUUID":"0xFE91" , "ManufString":"Shanghai Imilab Technology Co.,Ltd ","ManuFSite":""}
{"ManufUUID":"0xFE90" , "ManufString":"JUMA","ManuFSite":""}
{"ManufUUID":"0xFE8F" , "ManufString":"CSR","ManuFSite":""}
{"ManufUUID":"0xFE8E" , "ManufString":"ARM Ltd","ManuFSite":""}
{"ManufUUID":"0xFE8D" , "ManufString":"Interaxon Inc.","ManuFSite":""}
{"ManufUUID":"0xFE8C" , "ManufString":"TRON Forum","ManuFSite":""}
{"ManufUUID":"0xFE8B" , "ManufString":"Apple, Inc.","ManuFSite":""}
{"ManufUUID":"0xFE8A" , "ManufString":"Apple, Inc.","ManuFSite":""}
{"ManufUUID":"0xFE89" , "ManufString":"B&O Play A/S","ManuFSite":""}
{"ManufUUID":"0xFE88" , "ManufString":"SALTO SYSTEMS S.L.","ManuFSite":""}
{"ManufUUID":"0xFE87" , "ManufString":"Qingdao Yeelink Information Technology Co., Ltd.","ManuFSite":""}
{"ManufUUID":"0xFE86" , "ManufString":"HUAWEI Technologies Co., Ltd. ","ManuFSite":""}
{"ManufUUID":"0xFE85" , "ManufString":"RF Digital Corp","ManuFSite":""}
{"ManufUUID":"0xFE84" , "ManufString":"RF Digital Corp","ManuFSite":""}
{"ManufUUID":"0xFE83" , "ManufString":"Blue Bite","ManuFSite":""}
{"ManufUUID":"0xFE82" , "ManufString":"Medtronic Inc.","ManuFSite":""}
{"ManufUUID":"0xFE81" , "ManufString":"Medtronic Inc.","ManuFSite":""}
{"ManufUUID":"0xFE80" , "ManufString":"Doppler Lab","ManuFSite":""}
{"ManufUUID":"0xFE7F" , "ManufString":"Doppler Lab","ManuFSite":""}
{"ManufUUID":"0xFE7E" , "ManufString":"Awear Solutions Ltd","ManuFSite":""}
{"ManufUUID":"0xFE7D" , "ManufString":"Aterica Health Inc.","ManuFSite":""}
{"ManufUUID":"0xFE7C" , "ManufString":"Telit Wireless Solutions (Formerly Stollmann E+V GmbH) ","ManuFSite":""}
{"ManufUUID":"0xFE7B" , "ManufString":"Orion Labs, Inc.","ManuFSite":""}
{"ManufUUID":"0xFE7A" , "ManufString":"Bragi GmbH","ManuFSite":""}
{"ManufUUID":"0xFE79" , "ManufString":"Zebra Technologies","ManuFSite":""}
{"ManufUUID":"0xFE78" , "ManufString":"Hewlett-Packard Company","ManuFSite":""}
{"ManufUUID":"0xFE77" , "ManufString":"Hewlett-Packard Company","ManuFSite":""}
{"ManufUUID":"0xFE76" , "ManufString":"TangoMe","ManuFSite":""}
{"ManufUUID":"0xFE75" , "ManufString":"TangoMe","ManuFSite":""}
{"ManufUUID":"0xFE74" , "ManufString":"unwire","ManuFSite":""}
{"ManufUUID":"0xFE73" , "ManufString":"Abbott (formerly St. Jude Medical, Inc.)","ManuFSite":""}
{"ManufUUID":"0xFE72" , "ManufString":"Abbott (formerly St. Jude Medical, Inc.)","ManuFSite":""}
{"ManufUUID":"0xFE71" , "ManufString":"Plume Design Inc","ManuFSite":""}
{"ManufUUID":"0xFE70" , "ManufString":"Beijing Jingdong Century Trading Co., Ltd.","ManuFSite":""}
{"ManufUUID":"0xFE6F" , "ManufString":"LINE Corporation","ManuFSite":""}
{"ManufUUID":"0xFE6E" , "ManufString":"The University of Tokyo ","ManuFSite":""}
{"ManufUUID":"0xFE6D" , "ManufString":"The University of Tokyo ","ManuFSite":""}
{"ManufUUID":"0xFE6C" , "ManufString":"TASER International, Inc.","ManuFSite":""}
{"ManufUUID":"0xFE6B" , "ManufString":"TASER International, Inc.","ManuFSite":""}
{"ManufUUID":"0xFE6A" , "ManufString":"Kontakt Micro-Location Sp. z o.o.","ManuFSite":""}
{"ManufUUID":"0xFE69" , "ManufString":"Qualcomm Life Inc","ManuFSite":""}
{"ManufUUID":"0xFE68" , "ManufString":"Qualcomm Life Inc","ManuFSite":""}
{"ManufUUID":"0xFE67" , "ManufString":"Lab Sensor Solutions","ManuFSite":""}
{"ManufUUID":"0xFE66" , "ManufString":"Intel Corporation","ManuFSite":""}
{"ManufUUID":"0xFE65" , "ManufString":"CHIPOLO d.o.o.","ManuFSite":""}
{"ManufUUID":"0xFE64" , "ManufString":"Siemens AG","ManuFSite":""}
{"ManufUUID":"0xFE63" , "ManufString":"Connected Yard, Inc.","ManuFSite":""}
{"ManufUUID":"0xFE62" , "ManufString":"Indagem Tech LLC","ManuFSite":""}
{"ManufUUID":"0xFE61" , "ManufString":"Logitech International SA","ManuFSite":""}
{"ManufUUID":"0xFE60" , "ManufString":"Lierda Science & Technology Group Co., Ltd. ","ManuFSite":""}
{"ManufUUID":"0xFE5F" , "ManufString":"Eyefi, Inc.","ManuFSite":""}
{"ManufUUID":"0xFE5E" , "ManufString":"Plastc Corporation","ManuFSite":""}
{"ManufUUID":"0xFE5D" , "ManufString":"Grundfos A/S","ManuFSite":""}
{"ManufUUID":"0xFE5C" , "ManufString":"million hunters GmbH","ManuFSite":""}
{"ManufUUID":"0xFE5B" , "ManufString":"GT-tronics HK Ltd","ManuFSite":""}
{"ManufUUID":"0xFE5A" , "ManufString":"Cronologics Corporation","ManuFSite":""}
{"ManufUUID":"0xFE59" , "ManufString":"Nordic Semiconductor ASA","ManuFSite":""}
{"ManufUUID":"0xFE58" , "ManufString":"Nordic Semiconductor ASA","ManuFSite":""}
{"ManufUUID":"0xFE57" , "ManufString":"Dotted Labs","ManuFSite":""}
{"ManufUUID":"0xFE56" , "ManufString":"Google Inc.","ManuFSite":""}
{"ManufUUID":"0xFE55" , "ManufString":"Google Inc.","ManuFSite":""}
{"ManufUUID":"0xFE54" , "ManufString":"Motiv, Inc.","ManuFSite":""}
{"ManufUUID":"0xFE53" , "ManufString":"3M","ManuFSite":""}
{"ManufUUID":"0xFE52" , "ManufString":"SetPoint Medical","ManuFSite":""}
{"ManufUUID":"0xFE51" , "ManufString":"SRAM","ManuFSite":""}
{"ManufUUID":"0xFE50" , "ManufString":"Google Inc.","ManuFSite":""}
{"ManufUUID":"0xFE4F" , "ManufString":"Molekule, Inc.","ManuFSite":""}
{"ManufUUID":"0xFE4E" , "ManufString":"NTT docomo","ManuFSite":""}
{"ManufUUID":"0xFE4D" , "ManufString":"Casambi Technologies Oy","ManuFSite":""}
{"ManufUUID":"0xFE4C" , "ManufString":"Volkswagen AG","ManuFSite":""}
{"ManufUUID":"0xFE4B" , "ManufString":"Signify Netherlands B.V. (formerly Philips Lighting B.V.) ","ManuFSite":""}
{"ManufUUID":"0xFE4A" , "ManufString":"OMRON HEALTHCARE Co., Ltd. ","ManuFSite":""}
{"ManufUUID":"0xFE49" , "ManufString":"SenionLab AB","ManuFSite":""}
{"ManufUUID":"0xFE48" , "ManufString":"General Motors","ManuFSite":""}
{"ManufUUID":"0xFE47" , "ManufString":"General Motors","ManuFSite":""}
{"ManufUUID":"0xFE46" , "ManufString":"B&O Play A/S","ManuFSite":""}
{"ManufUUID":"0xFE45" , "ManufString":"Snapchat Inc","ManuFSite":""}
{"ManufUUID":"0xFE44" , "ManufString":"SK Telecom","ManuFSite":""}
{"ManufUUID":"0xFE43" , "ManufString":"Andreas Stihl AG & Co. KG","ManuFSite":""}
{"ManufUUID":"0xFE42" , "ManufString":"Nets A/S","ManuFSite":""}
{"ManufUUID":"0xFE41" , "ManufString":"Inugo Systems Limited","ManuFSite":""}
{"ManufUUID":"0xFE40" , "ManufString":"Inugo Systems Limited","ManuFSite":""}
{"ManufUUID":"0xFE3F" , "ManufString":"Friday Labs Limited","ManuFSite":""}
{"ManufUUID":"0xFE3E" , "ManufString":"BD Medical","ManuFSite":""}
{"ManufUUID":"0xFE3D" , "ManufString":"BD Medical","ManuFSite":""}
{"ManufUUID":"0xFE3C" , "ManufString":"alibaba","ManuFSite":""}
{"ManufUUID":"0xFE3B" , "ManufString":"Dolby Laboratories","ManuFSite":""}
{"ManufUUID":"0xFE3A" , "ManufString":"TTS Tooltechnic Systems AG & Co. KG ","ManuFSite":""}
{"ManufUUID":"0xFE39" , "ManufString":"TTS Tooltechnic Systems AG & Co. KG ","ManuFSite":""}
{"ManufUUID":"0xFE38" , "ManufString":"Spaceek LTD","ManuFSite":""}
{"ManufUUID":"0xFE37" , "ManufString":"Spaceek LTD","ManuFSite":""}
{"ManufUUID":"0xFE36" , "ManufString":"HUAWEI Technologies Co., Ltd ","ManuFSite":""}
{"ManufUUID":"0xFE35" , "ManufString":"HUAWEI Technologies Co., Ltd ","ManuFSite":""}
{"ManufUUID":"0xFE34" , "ManufString":"SmallLoop LLC","ManuFSite":""}
{"ManufUUID":"0xFE33" , "ManufString":"CHIPOLO d.o.o.","ManuFSite":""}
{"ManufUUID":"0xFE32" , "ManufString":"Pro-Mark, Inc.","ManuFSite":""}
{"ManufUUID":"0xFE31" , "ManufString":"Volkswagen AG","ManuFSite":""}
{"ManufUUID":"0xFE30" , "ManufString":"Volkswagen AG","ManuFSite":""}
{"ManufUUID":"0xFE2F" , "ManufString":"CRESCO Wireless, Inc","ManuFSite":""}
{"ManufUUID":"0xFE2E" , "ManufString":"ERi,Inc.","ManuFSite":""}
{"ManufUUID":"0xFE2D" , "ManufString":"SMART INNOVATION Co.,Ltd","ManuFSite":""}
{"ManufUUID":"0xFE2C" , "ManufString":"Google","ManuFSite":""}
{"ManufUUID":"0xFE2B" , "ManufString":"ITT Industries","ManuFSite":""}
{"ManufUUID":"0xFE2A" , "ManufString":"DaisyWorks, Inc.","ManuFSite":""}
{"ManufUUID":"0xFE29" , "ManufString":"Gibson Innovations","ManuFSite":""}
{"ManufUUID":"0xFE28" , "ManufString":"Ayla Networks","ManuFSite":""}
{"ManufUUID":"0xFE27" , "ManufString":"Google","ManuFSite":""}
{"ManufUUID":"0xFE26" , "ManufString":"Google","ManuFSite":""}
{"ManufUUID":"0xFE25" , "ManufString":"Apple, Inc.","ManuFSite":""}
{"ManufUUID":"0xFE24" , "ManufString":"August Home Inc","ManuFSite":""}
{"ManufUUID":"0xFE23" , "ManufString":"Zoll Medical Corporation","ManuFSite":""}
{"ManufUUID":"0xFE22" , "ManufString":"Zoll Medical Corporation","ManuFSite":""}
{"ManufUUID":"0xFE21" , "ManufString":"Bose Corporation","ManuFSite":""}
{"ManufUUID":"0xFE20" , "ManufString":"Emerson","ManuFSite":""}
{"ManufUUID":"0xFE1F" , "ManufString":"Garmin International, Inc.","ManuFSite":""}
{"ManufUUID":"0xFE1E" , "ManufString":"Smart Innovations Co., Ltd ","ManuFSite":""}
{"ManufUUID":"0xFE1D" , "ManufString":"Illuminati Instrument Corporation","ManuFSite":""}
{"ManufUUID":"0xFE1C" , "ManufString":"NetMedia, Inc.","ManuFSite":""}
{"ManufUUID":"0xFE1B" , "ManufString":"Tyto Life LLC","ManuFSite":""}
{"ManufUUID":"0xFE1A" , "ManufString":"Tyto Life LLC","ManuFSite":""}
{"ManufUUID":"0xFE19" , "ManufString":"Google, Inc","ManuFSite":""}
{"ManufUUID":"0xFE18" , "ManufString":"Runtime, Inc.","ManuFSite":""}
{"ManufUUID":"0xFE17" , "ManufString":"Telit Wireless Solutions GmbH ","ManuFSite":""}
{"ManufUUID":"0xFE16" , "ManufString":"Footmarks, Inc.","ManuFSite":""}
{"ManufUUID":"0xFE15" , "ManufString":"Amazon.com Services, Inc..","ManuFSite":""}
{"ManufUUID":"0xFE14" , "ManufString":"Flextronics International USA Inc. ","ManuFSite":""}
{"ManufUUID":"0xFE13" , "ManufString":"Apple Inc.","ManuFSite":""}
{"ManufUUID":"0xFE12" , "ManufString":"M-Way Solutions GmbH","ManuFSite":""}
{"ManufUUID":"0xFE11" , "ManufString":"GMC-I Messtechnik GmbH","ManuFSite":""}
{"ManufUUID":"0xFE10" , "ManufString":"LAPIS Technology Co., Ltd. ","ManuFSite":""}
{"ManufUUID":"0xFE0F" , "ManufString":"Signify Netherlands B.V. (formerly Philips Lighting B.V.) ","ManuFSite":""}
{"ManufUUID":"0xFE0E" , "ManufString":"Setec Pty Ltd","ManuFSite":""}
{"ManufUUID":"0xFE0D" , "ManufString":"Procter & Gamble","ManuFSite":""}
{"ManufUUID":"0xFE0C" , "ManufString":"Procter & Gamble","ManuFSite":""}
{"ManufUUID":"0xFE0B" , "ManufString":"ruwido austria gmbh","ManuFSite":""}
{"ManufUUID":"0xFE0A" , "ManufString":"ruwido austria gmbh","ManuFSite":""}
{"ManufUUID":"0xFE09" , "ManufString":"Pillsy, Inc.","ManuFSite":""}
{"ManufUUID":"0xFE08" , "ManufString":"Microsoft","ManuFSite":""}
{"ManufUUID":"0xFE07" , "ManufString":"Sonos, Inc.","ManuFSite":""}
{"ManufUUID":"0xFE06" , "ManufString":"Qualcomm Technologies, Inc.","ManuFSite":""}
{"ManufUUID":"0xFE05" , "ManufString":"CORE Transport Technologies NZ Limited","ManuFSite":""}
{"ManufUUID":"0xFE04" , "ManufString":"OpenPath Security Inc","ManuFSite":""}
{"ManufUUID":"0xFE03" , "ManufString":"Amazon.com Services, Inc.","ManuFSite":""}
{"ManufUUID":"0xFE02" , "ManufString":"Robert Bosch GmbH","ManuFSite":""}
{"ManufUUID":"0xFE01" , "ManufString":"Duracell U.S. Operations Inc. ","ManuFSite":""}
{"ManufUUID":"0xFE00" , "ManufString":"Amazon.com Services, Inc.","ManuFSite":""}
{"ManufUUID":"0xFDFF" , "ManufString":"OSRAM GmbH","ManuFSite":""}
{"ManufUUID":"0xFDFE" , "ManufString":"ADHERIUM(NZ) LIMITED","ManuFSite":""}
{"ManufUUID":"0xFDFD" , "ManufString":"RecursiveSoft Inc.","ManuFSite":""}
{"ManufUUID":"0xFDFC" , "ManufString":"Optrel AG","ManuFSite":""}
{"ManufUUID":"0xFDFB" , "ManufString":"Tandem Diabetes Care","ManuFSite":""}
{"ManufUUID":"0xFDFA" , "ManufString":"Tandem Diabetes Care","ManuFSite":""}
{"ManufUUID":"0xFDF9" , "ManufString":"INIA","ManuFSite":""}
{"ManufUUID":"0xFDF8" , "ManufString":"Onvocal","ManuFSite":""}
{"ManufUUID":"0xFDF7" , "ManufString":"HP Inc.","ManuFSite":""}
{"ManufUUID":"0xFDF6" , "ManufString":"AIAIAI ApS","ManuFSite":""}
{"ManufUUID":"0xFDF5" , "ManufString":"Milwaukee Electric Tools","ManuFSite":""}
{"ManufUUID":"0xFDF4" , "ManufString":"O. E. M. Controls, Inc.","ManuFSite":""}
{"ManufUUID":"0xFDF3" , "ManufString":"Amersports","ManuFSite":""}
{"ManufUUID":"0xFDF2" , "ManufString":"AMICCOM Electronics Corporation","ManuFSite":""}
{"ManufUUID":"0xFDF1" , "ManufString":"LAMPLIGHT Co.,Ltd","ManuFSite":""}
{"ManufUUID":"0xFDF0" , "ManufString":"Google Inc.","ManuFSite":""}
{"ManufUUID":"0xFDEF" , "ManufString":"ART AND PROGRAM, INC. ","ManuFSite":""}
{"ManufUUID":"0xFDEE" , "ManufString":"Huawei Technologies Co., Ltd. ","ManuFSite":""}
{"ManufUUID":"0xFDED" , "ManufString":"Pole Star","ManuFSite":""}
{"ManufUUID":"0xFDEC" , "ManufString":"Mannkind Corporation","ManuFSite":""}
{"ManufUUID":"0xFDEB" , "ManufString":"Syntronix Corporation","ManuFSite":""}
{"ManufUUID":"0xFDEA" , "ManufString":"SeeScan, Inc","ManuFSite":""}
{"ManufUUID":"0xFDE9" , "ManufString":"Spacesaver Corporation","ManuFSite":""}
{"ManufUUID":"0xFDE8" , "ManufString":"Robert Bosch GmbH","ManuFSite":""}
{"ManufUUID":"0xFDE7" , "ManufString":"SECOM Co., LTD","ManuFSite":""}
{"ManufUUID":"0xFDE6" , "ManufString":"Intelletto Technologies Inc","ManuFSite":""}
{"ManufUUID":"0xFDE5" , "ManufString":"SMK Corporation","ManuFSite":""}
{"ManufUUID":"0xFDE4" , "ManufString":"JUUL Labs, Inc.","ManuFSite":""}
{"ManufUUID":"0xFDE3" , "ManufString":"Abbott Diabetes Care","ManuFSite":""}
{"ManufUUID":"0xFDE2" , "ManufString":"Google Inc.","ManuFSite":""}
{"ManufUUID":"0xFDE1" , "ManufString":"Fortin Electronic Systems","ManuFSite":""}
{"ManufUUID":"0xFDE0" , "ManufString":"John Deere","ManuFSite":""}
{"ManufUUID":"0xFDDF" , "ManufString":"Harman International","ManuFSite":""}
{"ManufUUID":"0xFDDE" , "ManufString":"Noodle Technology Inc.","ManuFSite":""}
{"ManufUUID":"0xFDDD" , "ManufString":"Arch Systems Inc","ManuFSite":""}
{"ManufUUID":"0xFDDC" , "ManufString":"4iiii Innovations Inc.","ManuFSite":""}
{"ManufUUID":"0xFDDB" , "ManufString":"Samsung Electronics Co., Ltd. ","ManuFSite":""}
{"ManufUUID":"0xFDDA" , "ManufString":"MHCS","ManuFSite":""}
{"ManufUUID":"0xFDD9" , "ManufString":"Jiangsu Teranovo Tech Co., Ltd.","ManuFSite":""}
{"ManufUUID":"0xFDD8" , "ManufString":"Jiangsu Teranovo Tech Co., Ltd.","ManuFSite":""}
{"ManufUUID":"0xFDD7" , "ManufString":"Emerson","ManuFSite":""}
{"ManufUUID":"0xFDD6" , "ManufString":"Ministry of Supply","ManuFSite":""}
{"ManufUUID":"0xFDD5" , "ManufString":"Brompton Bicycle Ltd","ManuFSite":""}
{"ManufUUID":"0xFDD4" , "ManufString":"LX Solutions Pty Limited ","ManuFSite":""}
{"ManufUUID":"0xFDD3" , "ManufString":"FUBA Automotive Electronics GmbH ","ManuFSite":""}
{"ManufUUID":"0xFDD2" , "ManufString":"Bose Corporation","ManuFSite":""}
{"ManufUUID":"0xFDD1" , "ManufString":"Huawei Technologies Co., Ltd ","ManuFSite":""}
{"ManufUUID":"0xFDD0" , "ManufString":"Huawei Technologies Co., Ltd ","ManuFSite":""}
{"ManufUUID":"0xFDCF" , "ManufString":"Nalu Medical, Inc","ManuFSite":""}
{"ManufUUID":"0xFDCE" , "ManufString":"SENNHEISER electronic GmbH & Co. KG","ManuFSite":""}
{"ManufUUID":"0xFDCD" , "ManufString":"Qingping Technology (Beijing) Co., Ltd.","ManuFSite":""}
{"ManufUUID":"0xFDCC" , "ManufString":"Shoof Technologies","ManuFSite":""}
{"ManufUUID":"0xFDCB" , "ManufString":"Meggitt SA","ManuFSite":""}
{"ManufUUID":"0xFDCA" , "ManufString":"Fortin Electronic Systems","ManuFSite":""}
{"ManufUUID":"0xFDC9" , "ManufString":"Busch-Jaeger Elektro GmbH","ManuFSite":""}
{"ManufUUID":"0xFDC8" , "ManufString":"Hach Danaher","ManuFSite":""}
{"ManufUUID":"0xFDC7" , "ManufString":"Eli Lilly and Company ","ManuFSite":""}
{"ManufUUID":"0xFDC6" , "ManufString":"Eli Lilly and Company ","ManuFSite":""}
{"ManufUUID":"0xFDC5" , "ManufString":"Automatic Labs","ManuFSite":""}
{"ManufUUID":"0xFDC4" , "ManufString":"Simavita (Aust) Pty Ltd ","ManuFSite":""}
{"ManufUUID":"0xFDC3" , "ManufString":"Baidu Online Network Technology (Beijing) Co., Ltd ","ManuFSite":""}
{"ManufUUID":"0xFDC2" , "ManufString":"Baidu Online Network Technology (Beijing) Co., Ltd ","ManuFSite":""}
{"ManufUUID":"0xFDC1" , "ManufString":"Hunter Douglas","ManuFSite":""}
{"ManufUUID":"0xFDC0" , "ManufString":"Hunter Douglas","ManuFSite":""}
{"ManufUUID":"0xFDBF" , "ManufString":"California Things Inc.","ManuFSite":""}
{"ManufUUID":"0xFDBE" , "ManufString":"California Things Inc.","ManuFSite":""}
{"ManufUUID":"0xFDBD" , "ManufString":"Clover Network, Inc.","ManuFSite":""}
{"ManufUUID":"0xFDBC" , "ManufString":"Emerson","ManuFSite":""}
{"ManufUUID":"0xFDBB" , "ManufString":"Profoto","ManuFSite":""}
{"ManufUUID":"0xFDBA" , "ManufString":"Comcast Cable Corporation","ManuFSite":""}
{"ManufUUID":"0xFDB9" , "ManufString":"Comcast Cable Corporation","ManuFSite":""}
{"ManufUUID":"0xFDB8" , "ManufString":"LivaNova USA Inc.","ManuFSite":""}
{"ManufUUID":"0xFDB7" , "ManufString":"LivaNova USA Inc.","ManuFSite":""}
{"ManufUUID":"0xFDB6" , "ManufString":"GWA Hygiene GmbH","ManuFSite":""}
{"ManufUUID":"0xFDB5" , "ManufString":"ECSG","ManuFSite":""}
{"ManufUUID":"0xFDB4" , "ManufString":"HP Inc","ManuFSite":""}
{"ManufUUID":"0xFDB3" , "ManufString":"Audiodo AB","ManuFSite":""}
{"ManufUUID":"0xFDB2" , "ManufString":"Portable Multimedia Ltd","ManuFSite":""}
{"ManufUUID":"0xFDB1" , "ManufString":"Proxy Technologies, Inc.","ManuFSite":""}
{"ManufUUID":"0xFDB0" , "ManufString":"Proxy Technologies, Inc.","ManuFSite":""}
{"ManufUUID":"0xFDAF" , "ManufString":"Wiliot LTD","ManuFSite":""}
{"ManufUUID":"0xFDAE" , "ManufString":"Houwa System Design, k.k. ","ManuFSite":""}
{"ManufUUID":"0xFDAD" , "ManufString":"Houwa System Design, k.k. ","ManuFSite":""}
{"ManufUUID":"0xFDAC" , "ManufString":"Tentacle Sync GmbH","ManuFSite":""}
{"ManufUUID":"0xFDAB" , "ManufString":"Xiaomi Inc.","ManuFSite":""}
{"ManufUUID":"0xFDAA" , "ManufString":"Xiaomi Inc.","ManuFSite":""}
{"ManufUUID":"0xFDA9" , "ManufString":"Rhombus Systems, Inc.","ManuFSite":""}
{"ManufUUID":"0xFDA8" , "ManufString":"PSA Peugeot Citroën","ManuFSite":""}
{"ManufUUID":"0xFDA7" , "ManufString":"WWZN Information Technology Company Limited","ManuFSite":""}
{"ManufUUID":"0xFDA6" , "ManufString":"WWZN Information Technology Company Limited","ManuFSite":""}
{"ManufUUID":"0xFDA5" , "ManufString":"Neurostim OAB, Inc.","ManuFSite":""}
{"ManufUUID":"0xFDA4" , "ManufString":"Inseego Corp.","ManuFSite":""}
{"ManufUUID":"0xFDA3" , "ManufString":"Inseego Corp.","ManuFSite":""}
{"ManufUUID":"0xFDA2" , "ManufString":"Groove X, Inc","ManuFSite":""}
{"ManufUUID":"0xFDA1" , "ManufString":"Groove X, Inc","ManuFSite":""}
{"ManufUUID":"0xFDA0" , "ManufString":"Secugen Corporation","ManuFSite":""}
{"ManufUUID":"0xFD9F" , "ManufString":"VitalTech Affiliates LLC","ManuFSite":""}
{"ManufUUID":"0xFD9E" , "ManufString":"The Coca-Cola Company","ManuFSite":""}
{"ManufUUID":"0xFD9D" , "ManufString":"Gastec Corporation","ManuFSite":""}
{"ManufUUID":"0xFD9C" , "ManufString":"Huawei Technologies Co., Ltd. ","ManuFSite":""}
{"ManufUUID":"0xFD9B" , "ManufString":"Huawei Technologies Co., Ltd. ","ManuFSite":""}
{"ManufUUID":"0xFD9A" , "ManufString":"Huawei Technologies Co., Ltd. ","ManuFSite":""}
{"ManufUUID":"0xFD99" , "ManufString":"ABB Oy","ManuFSite":""}
{"ManufUUID":"0xFD98" , "ManufString":"Disney Worldwide Services, Inc. ","ManuFSite":""}
{"ManufUUID":"0xFD97" , "ManufString":"June Life, Inc.","ManuFSite":""}
{"ManufUUID":"0xFD96" , "ManufString":"Google LLC","ManuFSite":""}
{"ManufUUID":"0xFD95" , "ManufString":"Rigado","ManuFSite":""}
{"ManufUUID":"0xFD94" , "ManufString":"Hewlett Packard Enterprise","ManuFSite":""}
{"ManufUUID":"0xFD93" , "ManufString":"Bayerische Motoren Werke AG ","ManuFSite":""}
{"ManufUUID":"0xFD92" , "ManufString":"Qualcomm Technologies International, Ltd. (QTIL)","ManuFSite":""}
{"ManufUUID":"0xFD91" , "ManufString":"Groove X, Inc.","ManuFSite":""}
{"ManufUUID":"0xFD90" , "ManufString":"Guangzhou SuperSound Information Technology Co.,Ltd","ManuFSite":""}
{"ManufUUID":"0xFD8F" , "ManufString":"Matrix ComSec Pvt. Ltd. ","ManuFSite":""}
{"ManufUUID":"0xFD8E" , "ManufString":"Motorola Solutions","ManuFSite":""}
{"ManufUUID":"0xFD8D" , "ManufString":"quip NYC Inc.","ManuFSite":""}
{"ManufUUID":"0xFD8C" , "ManufString":"Google LLC","ManuFSite":""}
{"ManufUUID":"0xFD8B" , "ManufString":"Jigowatts Inc.","ManuFSite":""}
{"ManufUUID":"0xFD8A" , "ManufString":"Signify Netherlands B.V.","ManuFSite":""}
{"ManufUUID":"0xFD89" , "ManufString":"Urbanminded LTD","ManuFSite":""}
{"ManufUUID":"0xFD88" , "ManufString":"Urbanminded LTD","ManuFSite":""}
{"ManufUUID":"0xFD87" , "ManufString":"Google LLC","ManuFSite":""}
{"ManufUUID":"0xFD86" , "ManufString":"Abbott","ManuFSite":""}
{"ManufUUID":"0xFD85" , "ManufString":"Husqvarna AB","ManuFSite":""}
{"ManufUUID":"0xFD84" , "ManufString":"Tile, Inc.","ManuFSite":""}
{"ManufUUID":"0xFD83" , "ManufString":"iNFORM Technology GmbH","ManuFSite":""}
{"ManufUUID":"0xFD82" , "ManufString":"Sony Corporation","ManuFSite":""}
{"ManufUUID":"0xFD81" , "ManufString":"CANDY HOUSE, Inc.","ManuFSite":""}
{"ManufUUID":"0xFD80" , "ManufString":"Phindex Technologies, Inc","ManuFSite":""}
{"ManufUUID":"0xFD7F" , "ManufString":"Husqvarna AB","ManuFSite":""}
{"ManufUUID":"0xFD7E" , "ManufString":"Samsung Electronics Co., Ltd. ","ManuFSite":""}
{"ManufUUID":"0xFD7D" , "ManufString":"Center for Advanced Research Wernher Von Braun ","ManuFSite":""}
{"ManufUUID":"0xFD7C" , "ManufString":"Toshiba Information Systems(Japan) Corporation ","ManuFSite":""}
{"ManufUUID":"0xFD7B" , "ManufString":"WYZE LABS, INC.","ManuFSite":""}
{"ManufUUID":"0xFD7A" , "ManufString":"Withings","ManuFSite":""}
{"ManufUUID":"0xFD79" , "ManufString":"Withings","ManuFSite":""}
{"ManufUUID":"0xFD78" , "ManufString":"Withings","ManuFSite":""}
{"ManufUUID":"0xFD77" , "ManufString":"Withings","ManuFSite":""}
{"ManufUUID":"0xFD76" , "ManufString":"Insulet Corporation","ManuFSite":""}
{"ManufUUID":"0xFD75" , "ManufString":"Insulet Corporation","ManuFSite":""}
{"ManufUUID":"0xFD74" , "ManufString":"BRControls Products BV","ManuFSite":""}
{"ManufUUID":"0xFD73" , "ManufString":"BRControls Products BV","ManuFSite":""}
{"ManufUUID":"0xFD72" , "ManufString":"Logitech International SA","ManuFSite":""}
{"ManufUUID":"0xFD71" , "ManufString":"GN Hearing A/S","ManuFSite":""}
{"ManufUUID":"0xFD70" , "ManufString":"GuangDong Oppo Mobile Telecommunications Corp., Ltd","ManuFSite":""}
{"ManufUUID":"0xFD6F" , "ManufString":"Apple, Inc. [iPhone]","ManuFSite":""}
{"ManufUUID":"0xFD6E" , "ManufString":"Polidea sp. z o.o. ","ManuFSite":""}
{"ManufUUID":"0xFD6D" , "ManufString":"Sigma Elektro GmbH","ManuFSite":""}
{"ManufUUID":"0xFD6C" , "ManufString":"Samsung Electronics Co., Ltd. ","ManuFSite":""}
{"ManufUUID":"0xFD6B" , "ManufString":"rapitag GmbH","ManuFSite":""}
{"ManufUUID":"0xFD6A" , "ManufString":"Emerson","ManuFSite":""}
{"ManufUUID":"0xFD69" , "ManufString":"Samsung Electronics Co., Ltd ","ManuFSite":""}
{"ManufUUID":"0xFD68" , "ManufString":"Ubique Innovation AG","ManuFSite":""}
{"ManufUUID":"0xFD67" , "ManufString":"Montblanc Simplo GmbH","ManuFSite":""}
{"ManufUUID":"0xFD66" , "ManufString":"Zebra Technologies Corporation","ManuFSite":""}
{"ManufUUID":"0xFD65" , "ManufString":"Razer Inc.","ManuFSite":""}
{"ManufUUID":"0xFD64" , "ManufString":"INRIA","ManuFSite":""}
{"ManufUUID":"0xFD63" , "ManufString":"Fitbit, Inc.","ManuFSite":""}
{"ManufUUID":"0xFD62" , "ManufString":"Fitbit, Inc.","ManuFSite":""}
{"ManufUUID":"0xFD61" , "ManufString":"Arendi AG","ManuFSite":""}
{"ManufUUID":"0xFD60" , "ManufString":"Sercomm Corporation","ManuFSite":""}
{"ManufUUID":"0xFD5F" , "ManufString":"Oculus VR, LLC","ManuFSite":""}
{"ManufUUID":"0xFD5E" , "ManufString":"Tapkey GmbH","ManuFSite":""}
{"ManufUUID":"0xFD5D" , "ManufString":"maxon motor ltd.","ManuFSite":""}
{"ManufUUID":"0xFD5C" , "ManufString":"React Mobile","ManuFSite":""}
{"ManufUUID":"0xFD5B" , "ManufString":"V2SOFT INC.","ManuFSite":""}
{"ManufUUID":"0xFD5A" , "ManufString":"Samsung Electronics Co., Ltd. ","ManuFSite":""}
{"ManufUUID":"0xFD59" , "ManufString":"Samsung Electronics Co., Ltd. ","ManuFSite":""}
{"ManufUUID":"0xFD58" , "ManufString":"Volvo Car Corporation","ManuFSite":""}
{"ManufUUID":"0xFD57" , "ManufString":"Volvo Car Corporation","ManuFSite":""}
{"ManufUUID":"0xFD56" , "ManufString":"Resmed Ltd","ManuFSite":""}
{"ManufUUID":"0xFD55" , "ManufString":"Braveheart Wireless, Inc.","ManuFSite":""}
{"ManufUUID":"0xFD54" , "ManufString":"Qingdao Haier Technology Co., Ltd.","ManuFSite":""}
{"ManufUUID":"0xFD53" , "ManufString":"PCI Private Limited","ManuFSite":""}
{"ManufUUID":"0xFD52" , "ManufString":"UTC Fire and Security ","ManuFSite":""}
{"ManufUUID":"0xFD51" , "ManufString":"UTC Fire and Security ","ManuFSite":""}
{"ManufUUID":"0xFD50" , "ManufString":"Hangzhou Tuya Information Technology Co., Ltd","ManuFSite":""}
{"ManufUUID":"0xFD4F" , "ManufString":"Forkbeard Technologies AS","ManuFSite":""}
{"ManufUUID":"0xFD4E" , "ManufString":"70mai Co.,Ltd.","ManuFSite":""}
{"ManufUUID":"0xFD4D" , "ManufString":"70mai Co.,Ltd.","ManuFSite":""}
{"ManufUUID":"0xFD4C" , "ManufString":"Adolf Wuerth GmbH & Co KG","ManuFSite":""}
{"ManufUUID":"0xFD4B" , "ManufString":"Samsung Electronics Co., Ltd. ","ManuFSite":""}
{"ManufUUID":"0xFD4A" , "ManufString":"Sigma Elektro GmbH","ManuFSite":""}
{"ManufUUID":"0xFD49" , "ManufString":"Panasonic Corporation","ManuFSite":""}
{"ManufUUID":"0xFD48" , "ManufString":"Geberit International AG","ManuFSite":""}
{"ManufUUID":"0xFD47" , "ManufString":"Liberty Global Inc.","ManuFSite":""}
{"ManufUUID":"0xFD46" , "ManufString":"Lemco IKE","ManuFSite":""}
{"ManufUUID":"0xFD45" , "ManufString":"GB Solution co.,Ltd","ManuFSite":""}
{"ManufUUID":"0xFD44" , "ManufString":"Apple Inc.","ManuFSite":""}
{"ManufUUID":"0xFD43" , "ManufString":"Apple Inc.","ManuFSite":""}
{"ManufUUID":"0xFD42" , "ManufString":"Globe (Jiangsu) Co.,Ltd","ManuFSite":""}
{"ManufUUID":"0xFD41" , "ManufString":"Amazon Lab126","ManuFSite":""}
{"ManufUUID":"0xFD40" , "ManufString":"Beflex Inc.","ManuFSite":""}
{"ManufUUID":"0xFD3F" , "ManufString":"Cognosos, Inc","ManuFSite":""}
{"ManufUUID":"0xFD3E" , "ManufString":"Pure Watercraft, inc.","ManuFSite":""}
{"ManufUUID":"0xFD3D" , "ManufString":"Woan Technology (Shenzhen) Co., Ltd.","ManuFSite":""}
{"ManufUUID":"0xFD3C" , "ManufString":"Redline Communications Inc.","ManuFSite":""}
{"ManufUUID":"0xFD3B" , "ManufString":"Verkada Inc.","ManuFSite":""}
{"ManufUUID":"0xFD3A" , "ManufString":"Verkada Inc.","ManuFSite":""}
{"ManufUUID":"0xFD39" , "ManufString":"PREDIKTAS","ManuFSite":""}
{"ManufUUID":"0xFD38" , "ManufString":"Danfoss A/S","ManuFSite":""}
{"ManufUUID":"0xFD37" , "ManufString":"TireCheck GmbH","ManuFSite":""}
{"ManufUUID":"0xFD36" , "ManufString":"Google LLC","ManuFSite":""}
{"ManufUUID":"0xFD35" , "ManufString":"Transsion Holdings Limited","ManuFSite":""}
{"ManufUUID":"0xFD34" , "ManufString":"Aerosens LLC.","ManuFSite":""}
{"ManufUUID":"0xFD33" , "ManufString":"DashLogic, Inc.","ManuFSite":""}
{"ManufUUID":"0xFD32" , "ManufString":"Gemalto Holding BV","ManuFSite":""}
{"ManufUUID":"0xFD31" , "ManufString":"LG Electronics Inc.","ManuFSite":""}
{"ManufUUID":"0xFD30" , "ManufString":"Sesam Solutions BV","ManuFSite":""}
{"ManufUUID":"0xFD2F" , "ManufString":"Bitstrata Systems Inc.","ManuFSite":""}
{"ManufUUID":"0xFD2E" , "ManufString":"Bitstrata Systems Inc.","ManuFSite":""}
{"ManufUUID":"0xFD2D" , "ManufString":"Xiaomi Inc.","ManuFSite":""}
{"ManufUUID":"0xFD2C" , "ManufString":"The Access Technologies","ManuFSite":""}
{"ManufUUID":"0xFD2B" , "ManufString":"The Access Technologies","ManuFSite":""}
{"ManufUUID":"0xFD2A" , "ManufString":"Sony Corporation","ManuFSite":""}
{"ManufUUID":"0xFD29" , "ManufString":"Asahi Kasei Corporation","ManuFSite":""}
{"ManufUUID":"0xFD28" , "ManufString":"Julius Blum GmbH","ManuFSite":""}
{"ManufUUID":"0xFD27" , "ManufString":"i2Systems","ManuFSite":""}
{"ManufUUID":"0xFD26" , "ManufString":"Novo Nordisk A/S","ManuFSite":""}
{"ManufUUID":"0xFD25" , "ManufString":"GD Midea Air-Conditioning Equipment Co., Ltd.","ManuFSite":""}
{"ManufUUID":"0xFD24" , "ManufString":"GD Midea Air-Conditioning Equipment Co., Ltd.","ManuFSite":""}
{"ManufUUID":"0xFD23" , "ManufString":"DOM Sicherheitstechnik GmbH & Co. KG","ManuFSite":""}
{"ManufUUID":"0xFD22" , "ManufString":"Huawei Technologies Co., Ltd. ","ManuFSite":""}
{"ManufUUID":"0xFD21" , "ManufString":"Huawei Technologies Co., Ltd. ","ManuFSite":""}
{"ManufUUID":"0xFD20" , "ManufString":"GN Hearing A/S","ManuFSite":""}
{"ManufUUID":"0xFD1F" , "ManufString":"3M","ManuFSite":""}

@ -1,6 +1,7 @@
# protomolecule
Cross platform BLE scanner and logger with teeth \n
Cross platform BLE scanner and logger with teeth
***add a better description***
@ -21,25 +22,25 @@ Cross platform BLE scanner and logger with teeth \n
## Short Term Needs
- ### Scan for
- Device Manufacturer Data
- Services UUIDs
- ~~Device Manufacturer Data~~
- ~~Services UUIDs~~
- ### Go channels to handle scanning (Keep continous background scanning as an option)
- ### Output to simple menu for device target / attack selection (Bubbletea? Pterm?)
- ### Implement bitcask DB to hold device info (will likely need a struct) ** eros **
- ### ~~Implement bitcask DB to hold device info (will likely need a struct) ** eros **~~
- MAC (Key)
- Device Local Name (data)
- Device Manufacturer Data (data)
- Services UUIDs (data)
- ~~Address (Key)~~
- ~~Device Local Name (data)~~
- ~~Device Manufacturer Data (data)~~
- ~~Services UUIDs (data)~~
- ### Implement- Exploit DB
- If GATT exploits are known, present user with options
- ### Logging vs 6.5 grendel drop
- ### Logging
- ### Connect to device
- ### Read / Write GATT
- ### Device selection
@ -48,7 +49,9 @@ Cross platform BLE scanner and logger with teeth \n
- ### GATT fuzzing
- ### Sweyntooth
- ### Advertisment fuzzing / flooding
- ### Sweyntooth
- ### Search for DFU

481
UUIDs.txt

@ -1,481 +0,0 @@
0xFEFF GN Netcom
0xFEFE GN ReSound A/S
0xFEFD Gimbal, Inc.
0xFEFC Gimbal, Inc.
0xFEFB Telit Wireless Solutions (Formerly Stollmann E+V GmbH)
0xFEFA PayPal, Inc.
0xFEF9 PayPal, Inc.
0xFEF8 Aplix Corporation
0xFEF7 Aplix Corporation
0xFEF6 Wicentric, Inc.
0xFEF5 Dialog Semiconductor GmbH
0xFEF4 Google
0xFEF3 Google
0xFEF2 CSR
0xFEF1 CSR
0xFEF0 Intel
0xFEEF Polar Electro Oy
0xFEEE Polar Electro Oy
0xFEED Tile, Inc.
0xFEEC Tile, Inc.
0xFEEB Swirl Networks, Inc.
0xFEEA Swirl Networks, Inc.
0xFEE9 Quintic Corp.
0xFEE8 Quintic Corp.
0xFEE7 Tencent Holdings Limited.
0xFEE6 Silvair, Inc.
0xFEE5 Nordic Semiconductor ASA
0xFEE4 Nordic Semiconductor ASA
0xFEE3 Anki, Inc.
0xFEE2 Anki, Inc.
0xFEE1 Anhui Huami Information Technology Co., Ltd.
0xFEE0 Anhui Huami Information Technology Co., Ltd.
0xFEDF Design SHIFT
0xFEDE Coin, Inc.
0xFEDD Jawbone
0xFEDC Jawbone
0xFEDB Perka, Inc.
0xFEDA ISSC Technologies Corp.
0xFED9 Pebble Technology Corporation
0xFED8 Google
0xFED7 Broadcom
0xFED6 Broadcom
0xFED5 Plantronics Inc.
0xFED4 Apple, Inc.
0xFED3 Apple, Inc.
0xFED2 Apple, Inc.
0xFED1 Apple, Inc.
0xFED0 Apple, Inc.
0xFECF Apple, Inc.
0xFECE Apple, Inc.
0xFECD Apple, Inc.
0xFECC Apple, Inc.
0xFECB Apple, Inc.
0xFECA Apple, Inc.
0xFEC9 Apple, Inc.
0xFEC8 Apple, Inc.
0xFEC7 Apple, Inc.
0xFEC6 Kocomojo, LLC
0xFEC5 Realtek Semiconductor Corp.
0xFEC4 PLUS Location Systems
0xFEC3 360fly, Inc.
0xFEC2 Blue Spark Technologies, Inc.
0xFEC1 KDDI Corporation
0xFEC0 KDDI Corporation
0xFEBF Nod, Inc.
0xFEBE Bose Corporation
0xFEBD Clover Network, Inc
0xFEBC Dexcom Inc
0xFEBB adafruit industries
0xFEBA Tencent Holdings Limited
0xFEB9 LG Electronics
0xFEB8 Facebook, Inc.
0xFEB7 Facebook, Inc.
0xFEB6 Vencer Co., Ltd
0xFEB5 WiSilica Inc.
0xFEB4 WiSilica Inc.
0xFEB3 Taobao
0xFEB2 Microsoft Corporation
0xFEB1 Electronics Tomorrow Limited
0xFEB0 Nest Labs Inc
0xFEAF Nest Labs Inc
0xFEAE Nokia
0xFEAD Nokia
0xFEAC Nokia
0xFEAB Nokia
0xFEAA Google
0xFEA9 Savant Systems LLC
0xFEA8 Savant Systems LLC
0xFEA7 UTC Fire and Security
0xFEA6 GoPro, Inc.
0xFEA5 GoPro, Inc.
0xFEA4 Paxton Access Ltd
0xFEA3 ITT Industries
0xFEA2 Intrepid Control Systems, Inc.
0xFEA1 Intrepid Control Systems, Inc.
0xFEA0 Google
0xFE9F Google
0xFE9E Dialog Semiconductor B.V.
0xFE9D Mobiquity Networks Inc
0xFE9C GSI Laboratories, Inc.
0xFE9B Samsara Networks, Inc
0xFE9A Estimote
0xFE99 Currant Inc
0xFE98 Currant Inc
0xFE97 Tesla Motors Inc.
0xFE96 Tesla Motors Inc.
0xFE95 Xiaomi Inc.
0xFE94 OttoQ In
0xFE93 OttoQ In
0xFE92 Jarden Safety & Security
0xFE91 Shanghai Imilab Technology Co.,Ltd
0xFE90 JUMA
0xFE8F CSR
0xFE8E ARM Ltd
0xFE8D Interaxon Inc.
0xFE8C TRON Forum
0xFE8B Apple, Inc.
0xFE8A Apple, Inc.
0xFE89 B&O Play A/S
0xFE88 SALTO SYSTEMS S.L.
0xFE87 Qingdao Yeelink Information Technology Co., Ltd.
0xFE86 HUAWEI Technologies Co., Ltd.
0xFE85 RF Digital Corp
0xFE84 RF Digital Corp
0xFE83 Blue Bite
0xFE82 Medtronic Inc.
0xFE81 Medtronic Inc.
0xFE80 Doppler Lab
0xFE7F Doppler Lab
0xFE7E Awear Solutions Ltd
0xFE7D Aterica Health Inc.
0xFE7C Telit Wireless Solutions (Formerly Stollmann E+V GmbH)
0xFE7B Orion Labs, Inc.
0xFE7A Bragi GmbH
0xFE79 Zebra Technologies
0xFE78 Hewlett-Packard Company
0xFE77 Hewlett-Packard Company
0xFE76 TangoMe
0xFE75 TangoMe
0xFE74 unwire
0xFE73 Abbott (formerly St. Jude Medical, Inc.)
0xFE72 Abbott (formerly St. Jude Medical, Inc.)
0xFE71 Plume Design Inc
0xFE70 Beijing Jingdong Century Trading Co., Ltd.
0xFE6F LINE Corporation
0xFE6E The University of Tokyo
0xFE6D The University of Tokyo
0xFE6C TASER International, Inc.
0xFE6B TASER International, Inc.
0xFE6A Kontakt Micro-Location Sp. z o.o.
0xFE69 Qualcomm Life Inc
0xFE68 Qualcomm Life Inc
0xFE67 Lab Sensor Solutions
0xFE66 Intel Corporation
0xFE65 CHIPOLO d.o.o.
0xFE64 Siemens AG
0xFE63 Connected Yard, Inc.
0xFE62 Indagem Tech LLC
0xFE61 Logitech International SA
0xFE60 Lierda Science & Technology Group Co., Ltd.
0xFE5F Eyefi, Inc.
0xFE5E Plastc Corporation
0xFE5D Grundfos A/S
0xFE5C million hunters GmbH
0xFE5B GT-tronics HK Ltd
0xFE5A Cronologics Corporation
0xFE59 Nordic Semiconductor ASA
0xFE58 Nordic Semiconductor ASA
0xFE57 Dotted Labs
0xFE56 Google Inc.
0xFE55 Google Inc.
0xFE54 Motiv, Inc.
0xFE53 3M
0xFE52 SetPoint Medical
0xFE51 SRAM
0xFE50 Google Inc.
0xFE4F Molekule, Inc.
0xFE4E NTT docomo
0xFE4D Casambi Technologies Oy
0xFE4C Volkswagen AG
0xFE4B Signify Netherlands B.V. (formerly Philips Lighting B.V.)
0xFE4A OMRON HEALTHCARE Co., Ltd.
0xFE49 SenionLab AB
0xFE48 General Motors
0xFE47 General Motors
0xFE46 B&O Play A/S
0xFE45 Snapchat Inc
0xFE44 SK Telecom
0xFE43 Andreas Stihl AG & Co. KG
0xFE42 Nets A/S
0xFE41 Inugo Systems Limited
0xFE40 Inugo Systems Limited
0xFE3F Friday Labs Limited
0xFE3E BD Medical
0xFE3D BD Medical
0xFE3C alibaba
0xFE3B Dolby Laboratories
0xFE3A TTS Tooltechnic Systems AG & Co. KG
0xFE39 TTS Tooltechnic Systems AG & Co. KG
0xFE38 Spaceek LTD
0xFE37 Spaceek LTD
0xFE36 HUAWEI Technologies Co., Ltd
0xFE35 HUAWEI Technologies Co., Ltd
0xFE34 SmallLoop LLC
0xFE33 CHIPOLO d.o.o.
0xFE32 Pro-Mark, Inc.
0xFE31 Volkswagen AG
0xFE30 Volkswagen AG
0xFE2F CRESCO Wireless, Inc
0xFE2E ERi,Inc.
0xFE2D SMART INNOVATION Co.,Ltd
0xFE2C Google
0xFE2B ITT Industries
0xFE2A DaisyWorks, Inc.
0xFE29 Gibson Innovations
0xFE28 Ayla Networks
0xFE27 Google
0xFE26 Google
0xFE25 Apple, Inc.
0xFE24 August Home Inc
0xFE23 Zoll Medical Corporation
0xFE22 Zoll Medical Corporation
0xFE21 Bose Corporation
0xFE20 Emerson
0xFE1F Garmin International, Inc.
0xFE1E Smart Innovations Co., Ltd
0xFE1D Illuminati Instrument Corporation
0xFE1C NetMedia, Inc.
0xFE1B Tyto Life LLC
0xFE1A Tyto Life LLC
0xFE19 Google, Inc
0xFE18 Runtime, Inc.
0xFE17 Telit Wireless Solutions GmbH
0xFE16 Footmarks, Inc.
0xFE15 Amazon.com Services, Inc..
0xFE14 Flextronics International USA Inc.
0xFE13 Apple Inc.
0xFE12 M-Way Solutions GmbH
0xFE11 GMC-I Messtechnik GmbH
0xFE10 LAPIS Technology Co., Ltd.
0xFE0F Signify Netherlands B.V. (formerly Philips Lighting B.V.)
0xFE0E Setec Pty Ltd
0xFE0D Procter & Gamble
0xFE0C Procter & Gamble
0xFE0B ruwido austria gmbh
0xFE0A ruwido austria gmbh
0xFE09 Pillsy, Inc.
0xFE08 Microsoft
0xFE07 Sonos, Inc.
0xFE06 Qualcomm Technologies, Inc.
0xFE05 CORE Transport Technologies NZ Limited
0xFE04 OpenPath Security Inc
0xFE03 Amazon.com Services, Inc.
0xFE02 Robert Bosch GmbH
0xFE01 Duracell U.S. Operations Inc.
0xFE00 Amazon.com Services, Inc.
0xFDFF OSRAM GmbH
0xFDFE ADHERIUM(NZ) LIMITED
0xFDFD RecursiveSoft Inc.
0xFDFC Optrel AG
0xFDFB Tandem Diabetes Care
0xFDFA Tandem Diabetes Care
0xFDF9 INIA
0xFDF8 Onvocal
0xFDF7 HP Inc.
0xFDF6 AIAIAI ApS
0xFDF5 Milwaukee Electric Tools
0xFDF4 O. E. M. Controls, Inc.
0xFDF3 Amersports
0xFDF2 AMICCOM Electronics Corporation
0xFDF1 LAMPLIGHT Co.,Ltd
0xFDF0 Google Inc.
0xFDEF ART AND PROGRAM, INC.
0xFDEE Huawei Technologies Co., Ltd.
0xFDED Pole Star
0xFDEC Mannkind Corporation
0xFDEB Syntronix Corporation
0xFDEA SeeScan, Inc
0xFDE9 Spacesaver Corporation
0xFDE8 Robert Bosch GmbH
0xFDE7 SECOM Co., LTD
0xFDE6 Intelletto Technologies Inc
0xFDE5 SMK Corporation
0xFDE4 JUUL Labs, Inc.
0xFDE3 Abbott Diabetes Care
0xFDE2 Google Inc.
0xFDE1 Fortin Electronic Systems
0xFDE0 John Deere
0xFDDF Harman International
0xFDDE Noodle Technology Inc.
0xFDDD Arch Systems Inc
0xFDDC 4iiii Innovations Inc.
0xFDDB Samsung Electronics Co., Ltd.
0xFDDA MHCS
0xFDD9 Jiangsu Teranovo Tech Co., Ltd.
0xFDD8 Jiangsu Teranovo Tech Co., Ltd.
0xFDD7 Emerson
0xFDD6 Ministry of Supply
0xFDD5 Brompton Bicycle Ltd
0xFDD4 LX Solutions Pty Limited
0xFDD3 FUBA Automotive Electronics GmbH
0xFDD2 Bose Corporation
0xFDD1 Huawei Technologies Co., Ltd
0xFDD0 Huawei Technologies Co., Ltd
0xFDCF Nalu Medical, Inc
0xFDCE SENNHEISER electronic GmbH & Co. KG
0xFDCD Qingping Technology (Beijing) Co., Ltd.
0xFDCC Shoof Technologies
0xFDCB Meggitt SA
0xFDCA Fortin Electronic Systems
0xFDC9 Busch-Jaeger Elektro GmbH
0xFDC8 Hach Danaher
0xFDC7 Eli Lilly and Company
0xFDC6 Eli Lilly and Company
0xFDC5 Automatic Labs
0xFDC4 Simavita (Aust) Pty Ltd
0xFDC3 Baidu Online Network Technology (Beijing) Co., Ltd
0xFDC2 Baidu Online Network Technology (Beijing) Co., Ltd
0xFDC1 Hunter Douglas
0xFDC0 Hunter Douglas
0xFDBF California Things Inc.
0xFDBE California Things Inc.
0xFDBD Clover Network, Inc.
0xFDBC Emerson
0xFDBB Profoto
0xFDBA Comcast Cable Corporation
0xFDB9 Comcast Cable Corporation
0xFDB8 LivaNova USA Inc.
0xFDB7 LivaNova USA Inc.
0xFDB6 GWA Hygiene GmbH
0xFDB5 ECSG
0xFDB4 HP Inc
0xFDB3 Audiodo AB
0xFDB2 Portable Multimedia Ltd
0xFDB1 Proxy Technologies, Inc.
0xFDB0 Proxy Technologies, Inc.
0xFDAF Wiliot LTD
0xFDAE Houwa System Design, k.k.
0xFDAD Houwa System Design, k.k.
0xFDAC Tentacle Sync GmbH
0xFDAB Xiaomi Inc.
0xFDAA Xiaomi Inc.
0xFDA9 Rhombus Systems, Inc.
0xFDA8 PSA Peugeot Citroën
0xFDA7 WWZN Information Technology Company Limited
0xFDA6 WWZN Information Technology Company Limited
0xFDA5 Neurostim OAB, Inc.
0xFDA4 Inseego Corp.
0xFDA3 Inseego Corp.
0xFDA2 Groove X, Inc
0xFDA1 Groove X, Inc
0xFDA0 Secugen Corporation
0xFD9F VitalTech Affiliates LLC
0xFD9E The Coca-Cola Company
0xFD9D Gastec Corporation
0xFD9C Huawei Technologies Co., Ltd.
0xFD9B Huawei Technologies Co., Ltd.
0xFD9A Huawei Technologies Co., Ltd.
0xFD99 ABB Oy
0xFD98 Disney Worldwide Services, Inc.
0xFD97 June Life, Inc.
0xFD96 Google LLC
0xFD95 Rigado
0xFD94 Hewlett Packard Enterprise
0xFD93 Bayerische Motoren Werke AG
0xFD92 Qualcomm Technologies International, Ltd. (QTIL)
0xFD91 Groove X, Inc.
0xFD90 Guangzhou SuperSound Information Technology Co.,Ltd
0xFD8F Matrix ComSec Pvt. Ltd.
0xFD8E Motorola Solutions
0xFD8D quip NYC Inc.
0xFD8C Google LLC
0xFD8B Jigowatts Inc.
0xFD8A Signify Netherlands B.V.
0xFD89 Urbanminded LTD
0xFD88 Urbanminded LTD
0xFD87 Google LLC
0xFD86 Abbott
0xFD85 Husqvarna AB
0xFD84 Tile, Inc.
0xFD83 iNFORM Technology GmbH
0xFD82 Sony Corporation
0xFD81 CANDY HOUSE, Inc.
0xFD80 Phindex Technologies, Inc
0xFD7F Husqvarna AB
0xFD7E Samsung Electronics Co., Ltd.
0xFD7D Center for Advanced Research Wernher Von Braun
0xFD7C Toshiba Information Systems(Japan) Corporation
0xFD7B WYZE LABS, INC.
0xFD7A Withings
0xFD79 Withings
0xFD78 Withings
0xFD77 Withings
0xFD76 Insulet Corporation
0xFD75 Insulet Corporation
0xFD74 BRControls Products BV
0xFD73 BRControls Products BV
0xFD72 Logitech International SA
0xFD71 GN Hearing A/S
0xFD70 GuangDong Oppo Mobile Telecommunications Corp., Ltd
0xFD6F Apple, Inc.
0xFD6E Polidea sp. z o.o.
0xFD6D Sigma Elektro GmbH
0xFD6C Samsung Electronics Co., Ltd.
0xFD6B rapitag GmbH
0xFD6A Emerson
0xFD69 Samsung Electronics Co., Ltd
0xFD68 Ubique Innovation AG
0xFD67 Montblanc Simplo GmbH
0xFD66 Zebra Technologies Corporation
0xFD65 Razer Inc.
0xFD64 INRIA
0xFD63 Fitbit, Inc.
0xFD62 Fitbit, Inc.
0xFD61 Arendi AG
0xFD60 Sercomm Corporation
0xFD5F Oculus VR, LLC
0xFD5E Tapkey GmbH
0xFD5D maxon motor ltd.
0xFD5C React Mobile
0xFD5B V2SOFT INC.
0xFD5A Samsung Electronics Co., Ltd.
0xFD59 Samsung Electronics Co., Ltd.
0xFD58 Volvo Car Corporation
0xFD57 Volvo Car Corporation
0xFD56 Resmed Ltd
0xFD55 Braveheart Wireless, Inc.
0xFD54 Qingdao Haier Technology Co., Ltd.
0xFD53 PCI Private Limited
0xFD52 UTC Fire and Security
0xFD51 UTC Fire and Security
0xFD50 Hangzhou Tuya Information Technology Co., Ltd
0xFD4F Forkbeard Technologies AS
0xFD4E 70mai Co.,Ltd.
0xFD4D 70mai Co.,Ltd.
0xFD4C Adolf Wuerth GmbH & Co KG
0xFD4B Samsung Electronics Co., Ltd.
0xFD4A Sigma Elektro GmbH
0xFD49 Panasonic Corporation
0xFD48 Geberit International AG
0xFD47 Liberty Global Inc.
0xFD46 Lemco IKE
0xFD45 GB Solution co.,Ltd
0xFD44 Apple Inc.
0xFD43 Apple Inc.
0xFD42 Globe (Jiangsu) Co.,Ltd
0xFD41 Amazon Lab126
0xFD40 Beflex Inc.
0xFD3F Cognosos, Inc
0xFD3E Pure Watercraft, inc.
0xFD3D Woan Technology (Shenzhen) Co., Ltd.
0xFD3C Redline Communications Inc.
0xFD3B Verkada Inc.
0xFD3A Verkada Inc.
0xFD39 PREDIKTAS
0xFD38 Danfoss A/S
0xFD37 TireCheck GmbH
0xFD36 Google LLC
0xFD35 Transsion Holdings Limited
0xFD34 Aerosens LLC.
0xFD33 DashLogic, Inc.
0xFD32 Gemalto Holding BV
0xFD31 LG Electronics Inc.
0xFD30 Sesam Solutions BV
0xFD2F Bitstrata Systems Inc.
0xFD2E Bitstrata Systems Inc.
0xFD2D Xiaomi Inc.
0xFD2C The Access Technologies
0xFD2B The Access Technologies
0xFD2A Sony Corporation
0xFD29 Asahi Kasei Corporation
0xFD28 Julius Blum GmbH
0xFD27 i2Systems
0xFD26 Novo Nordisk A/S
0xFD25 GD Midea Air-Conditioning Equipment Co., Ltd.
0xFD24 GD Midea Air-Conditioning Equipment Co., Ltd.
0xFD23 DOM Sicherheitstechnik GmbH & Co. KG
0xFD22 Huawei Technologies Co., Ltd.
0xFD21 Huawei Technologies Co., Ltd.
0xFD20 GN Hearing A/S
0xFD1F 3M

324
cmd.go Normal file

@ -0,0 +1,324 @@
package main
import (
"fmt"
"os"
"strconv"
"strings"
cli "git.tcp.direct/Mirrors/go-prompt"
. "github.com/logrusorgru/aurora"
"github.com/rs/zerolog"
"github.com/rs/zerolog/log"
"protomolecule/src/eros"
// "protomolecule/src/wrath"
projVars "protomolecule/src/config"
"protomolecule/src/deimos"
)
var suggestions = []cli.Suggest{
// Main Commands
// {"scan",
// "Start and stop scans"},
{"scan start",
"Start default scan"},
{"scan start attack",
"Start scan that also attempts to connect to all discovered BLE devices"},
{"scan start tracking",
"Start continuous RSSI tracking of all BLE devices within range"},
{"eros recall mac",
"Retrieve device info from database by MAC address"},
{"eros recall all",
"Retrieve info on all devices"},
{"eros backup",
"Backup all databases to the supplied directory"},
{"arboghast start",
"Start entropic fuzzing via advertising"},
/*
{"wrath",
"attack by address"},
*/
{"exit",
"Exit ProtoMolecule"},
{"debug",
"Toggle debug messages"},
{"help",
"in-app documentation"},
}
func completer(in cli.Document) []cli.Suggest {
c := in.CurrentLineBeforeCursor()
if c == "" {
return []cli.Suggest{}
}
return cli.FilterHasPrefix(suggestions, c, true)
}
// Interpret is where we will actuall define our commands
func executor(cmd string) {
cmd = strings.TrimSpace(cmd)
var args []string
args = strings.Split(cmd, " ")
getArgs := func(args []string) string {
var ret string
for i, a := range args {
if i == 0 {
ret = a
continue
}
ret = ret + " " + a
if i != len(args)-1 {
ret = ret + " "
}
}
return ret
}
switch args[0] {
case "exit":
fallthrough
case "quit":
eros.Slumber()
os.Exit(0)
case "debug":
switch log.Logger.GetLevel() {
case zerolog.DebugLevel:
zerolog.SetGlobalLevel(zerolog.InfoLevel)
log.Info().
Msg("Debug mode turned " + Sprintf(BrightRed("OFF\n").Bold()))
case zerolog.InfoLevel:
zerolog.SetGlobalLevel(zerolog.DebugLevel)
log.Debug().
Msg("Debug mode turned " + Sprintf(BrightGreen("ON\n").Bold()))
default:
return
}
case "eros":
if len(args) < 2 {
getHelp("eros")
return
}
switch args[1] {
case "recall":
if len(args) < 3 {
getHelp("eros recall")
return
}
switch args[2] {
case "mac":
if len(args) < 4 {
getHelp("eros recall")
return
}
fromEros, err := eros.Recall(args[3])
if err != nil {
log.Error().Err(err).Str("target", args[3]).
Msg("Failed to recall MAC")
println()
return
}
log.Info().
Str("Name", fromEros.Name).
Str("Addr", fromEros.Addr).
Str("ManuF", fromEros.Manufacturer). // needs to be changed back to fromEros.Manufacturer
Int16("Current_RSSI", fromEros.RSSIlast).
Int("Service_Count", len(fromEros.Services)).
Msg("EROS_RECALL")
case "backup":
if len(args) < 3 {
getHelp("eros backup")
return
}
if err := eros.Backup(args[3]); err != nil {
log.Error().Err(err).Msg("Failed to backup databases!")
}
}
}
case "help":
if len(args) < 2 {
getHelp("meta")
return
}
getHelp(getArgs(args))
case "loadnames":
if len(args) < 2 {
log.Error().Msg("missing argument: path to json file with manufacturer UUIDs")
println()
}
projVars.GlobalConfig.ManuFile = args[1]
eros.ManufLoad()
case "adapter":
if len(args) > 1 {
switch args[1] {
case "list":
deimos.PrintBlueDevices()
case "sniff":
var (
err error
devint int
)
if len(args) < 2 {
log.Error().Msg("not enough parameters, missing adapter ID")
println()
return
}
if devint, err = strconv.Atoi(args[2]); err != nil {
log.Error().Msg("invalid parameter, must be integer of adapter ID")
println()
return
}
deimos.Sniff(devint)
default:
log.Error().Msg("unknown sub-command: " + args[1])
println()
}
} else {
getHelp(getArgs(args))
}
case "scan":
if len(args) > 1 {
switch args[1] {
case "list":
fallthrough
case "status":
fmt.Println(getArgs(args) + ": start new default BLE scan")
case "start":
if len(args) > 2 {
switch args[2] {
case "tracking":
*projVars.GlobalConfig.CooleanFlags.Tracking = true
*projVars.GlobalConfig.CooleanFlags.Attack = false
case "attack":
*projVars.GlobalConfig.CooleanFlags.Tracking = false
*projVars.GlobalConfig.CooleanFlags.Attack = true
default:
// getHelp(getArgs(args))
log.Error().Msg("unknown sub command: " + args[2])
println()
}
}
bleScan()
}
} else {
getHelp(getArgs(args))
}
case "rpc":
if len(args) > 1 {
switch args[1] {
case "status":
fmt.Println(getArgs(args) + ": ")
case "server":
fmt.Println(getArgs(args) + ": ")
case "client":
fmt.Println(getArgs(args) + ": ")
}
} else {
getHelp(getArgs(args))
}
/*
case "wrath":
if len(args) < 2 {
getHelp("wrath")
return
}
wrath(args[1])
*/
case "clear":
print("\033[H\033[2J")
// termenv.ClearScreen()
default:
log.Error().Msg("unknown command: " + cmd)
println()
}
}
func getHelp(target string) {
fmt.Println("pRaNkeD! (help not available just yet.)")
fmt.Println()
return
/*
var lines []string
lines = append(lines, "help: "+target)
switch target {
case "meta":
var list string
for _, cmd := range cmds {
list = list + cmd + ", "
}
fmt.Println("Enabled commands: ")
list = strings.TrimSuffix(list, ", ")
fmt.Println(list)
fmt.Println()
default:
log.Error().Msg("Help entry not found!")
fmt.Println()
}
*/
}
func StartCLI() {
var hist []string
p := cli.New(
executor,
completer,
cli.OptionPrefix("ProtoMolecule"+"> "),
// cli.OptionPrefixBackgroundColor(cli.Black),
cli.OptionPrefixTextColor(cli.Cyan),
cli.OptionHistory(hist),
cli.OptionSuggestionBGColor(cli.Black),
cli.OptionSuggestionTextColor(cli.White),
cli.OptionSelectedSuggestionBGColor(cli.Black),
cli.OptionSelectedSuggestionTextColor(cli.Cyan),
// prompt.OptionLivePrefix
cli.OptionTitle("ProtoMolecule"),
)
p.Run()
}

41
go.mod

@ -1,16 +1,37 @@
module protomolecule
go 1.16
go 1.19
require (
git.tcp.direct/kayos/prototooth v0.3.1-0.20210513000132-e440008138af
github.com/go-ole/go-ole v1.2.5 // indirect
github.com/godbus/dbus/v5 v5.0.4 // indirect
github.com/muka/go-bluetooth v0.0.0-20201211051136-07f31c601d33 // indirect
git.tcp.direct/Mirrors/go-prompt v0.3.0
git.tcp.direct/kayos/prototooth v0.5.1
github.com/google/gopacket v1.1.19
github.com/json-iterator/go v1.1.12
github.com/logrusorgru/aurora v2.0.3+incompatible
github.com/prologic/bitcask v0.3.10
github.com/rs/zerolog v1.21.0
github.com/sirupsen/logrus v1.8.1 // indirect
github.com/stretchr/testify v1.7.0 // indirect
golang.org/x/sys v0.0.0-20210414055047-fe65e336abe0 // indirect
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect
github.com/rs/zerolog v1.27.0
tinygo.org/x/bluetooth v0.5.0
)
require (
github.com/JuulLabs-OSS/cbgo v0.0.2 // indirect
github.com/fatih/structs v1.1.0 // indirect
github.com/go-ole/go-ole v1.2.6 // indirect
github.com/godbus/dbus/v5 v5.1.0 // indirect
github.com/mattn/go-colorable v0.1.12 // indirect
github.com/mattn/go-isatty v0.0.14 // indirect
github.com/mattn/go-runewidth v0.0.13 // indirect
github.com/mattn/go-tty v0.0.4 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/muka/go-bluetooth v0.0.0-20220819143208-8b1989180f4c // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/pkg/term v1.1.0 // indirect
github.com/plar/go-adaptive-radix-tree v1.0.4 // indirect
github.com/rivo/uniseg v0.2.0 // indirect
github.com/sirupsen/logrus v1.9.0 // indirect
golang.org/x/crypto v0.7.0 // indirect
golang.org/x/exp v0.0.0-20200228211341-fcea875c7e85 // indirect
golang.org/x/sys v0.6.0 // indirect
golang.org/x/term v0.6.0 // indirect
)

104
go.sum

@ -11,8 +11,10 @@ cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqCl
cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
git.tcp.direct/kayos/prototooth v0.3.1-0.20210513000132-e440008138af h1:+J2MfTQvW1DmX1HYIQUsrCd5l0Il9JMYTOowIs8ju1Y=
git.tcp.direct/kayos/prototooth v0.3.1-0.20210513000132-e440008138af/go.mod h1:kk4oyPgWq6Rijn30Js4ITQC5DFwmpyzWL3+8V6q9wdM=
git.tcp.direct/Mirrors/go-prompt v0.3.0 h1:4IXTCPeuMfoemcJ+riSuKQhAx1rJo5hTtuSkr/IFq+A=
git.tcp.direct/Mirrors/go-prompt v0.3.0/go.mod h1:x8Gs5SGQbFzTglOjiK16geOcdw1dVZas3HYkfx0o6ls=
git.tcp.direct/kayos/prototooth v0.5.1 h1:j/WOekGSZLGCt1gqLFAedWEooprTyxYEIyQKei4kcew=
git.tcp.direct/kayos/prototooth v0.5.1/go.mod h1:sRAZ69v83VhnR037/DylbPPBwKb5UCoqEurDFNum0fM=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
github.com/JuulLabs-OSS/cbgo v0.0.2 h1:gCDyT0+EPuI8GOFyvAksFcVD2vF4CXBAVwT6uVnD9oo=
@ -27,6 +29,7 @@ github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
github.com/bgould/http v0.0.0-20190627042742-d268792bdee7/go.mod h1:BTqvVegvwifopl4KTEDth6Zezs9eR+lCWhvGKvkxJHE=
github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84=
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
@ -36,6 +39,7 @@ github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc
github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
github.com/coreos/go-systemd/v22 v22.3.3-0.20220203105225-a9a7ef127534/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
@ -56,12 +60,13 @@ github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
github.com/go-ole/go-ole v1.2.4/go.mod h1:XCwSNxSkXRo4vlyPy93sltvi/qJq0jqQhjqQNIwKuxM=
github.com/go-ole/go-ole v1.2.5 h1:t4MGB5xEDZvXI+0rMjjsfBsD7yAgp/s9ZDkL1JndXwY=
github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY=
github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
github.com/godbus/dbus/v5 v5.0.4 h1:9349emZab16e7zQvpmsbtjc18ykshndd8y2PG3sgJbA=
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk=
github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
@ -77,6 +82,9 @@ github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8=
github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo=
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
@ -113,23 +121,38 @@ github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/J
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/logrusorgru/aurora v2.0.3+incompatible h1:tOpm7WcpBTn4fjmVfgpQq0EfczGlG91VSDkswnjF5A8=
github.com/logrusorgru/aurora v2.0.3+incompatible/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4=
github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40=
github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=
github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=
github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y=
github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU=
github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
github.com/mattn/go-tty v0.0.4 h1:NVikla9X8MN0SQAqCYzpGyXv0jY7MNl3HOWD2dkle7E=
github.com/mattn/go-tty v0.0.4/go.mod h1:u5GGXBtZU6RQoKV8gY5W6UhMudbR5vXnUe7j3pxse28=
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=
@ -140,11 +163,15 @@ github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS4
github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY=
github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/muka/go-bluetooth v0.0.0-20200619025933-f6113f7141c5/go.mod h1:yV39+EVOWdnoTe75NyKdo9iuyI3Slyh4t7eQvElUbWE=
github.com/muka/go-bluetooth v0.0.0-20201211051136-07f31c601d33 h1:p3srutpE8TpQmOUQ5Qw94jYFUdoG2jBbILeYLroQNoI=
github.com/muka/go-bluetooth v0.0.0-20201211051136-07f31c601d33/go.mod h1:dMCjicU6vRBk34dqOmIZm0aod6gUwZXOXzBROqGous0=
github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
github.com/muka/go-bluetooth v0.0.0-20210812063148-b6c83362e27d/go.mod h1:dMCjicU6vRBk34dqOmIZm0aod6gUwZXOXzBROqGous0=
github.com/muka/go-bluetooth v0.0.0-20220819143208-8b1989180f4c h1:CTU9zYG49RMMVTZwRcC78uBJ5gGmvLSgQXCDn1n4jJY=
github.com/muka/go-bluetooth v0.0.0-20220819143208-8b1989180f4c/go.mod h1:dMCjicU6vRBk34dqOmIZm0aod6gUwZXOXzBROqGous0=
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
@ -156,6 +183,8 @@ github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/term v1.1.0 h1:xIAAdCMh3QIAy+5FrE8Ad8XoDhEU4ufwbaSozViP9kk=
github.com/pkg/term v1.1.0/go.mod h1:E25nymQcrSllhX42Ok8MRm1+hyBdHY0dCeiKZ9jpNGw=
github.com/plar/go-adaptive-radix-tree v1.0.4 h1:Ucd8R6RH2E7RW8ZtDKrsWyOD3paG2qqJO0I20WQ8oWQ=
github.com/plar/go-adaptive-radix-tree v1.0.4/go.mod h1:Ot8d28EII3i7Lv4PSvBlF8ejiD/CtRYDuPsySJbSaK8=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
@ -172,11 +201,13 @@ github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y8
github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY=
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ=
github.com/rs/zerolog v1.21.0 h1:Q3vdXlfLNT+OftyBHsU0Y445MD+8m8axjKgf2si0QcM=
github.com/rs/zerolog v1.21.0/go.mod h1:ZPhntP/xmq1nnND05hhpAh2QMhSsA4UN3MGZ6O2J3hM=
github.com/rs/xid v1.3.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
github.com/rs/zerolog v1.27.0 h1:1T7qCieN22GVc8S4Q2yuexzBb1EqjbgjSH9RohbMjKs=
github.com/rs/zerolog v1.27.0/go.mod h1:7frBqO0oezxmnO7GF86FY++uy8I0Tk/If5ni1G9Qc0U=
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
@ -185,8 +216,8 @@ github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPx
github.com/sirupsen/logrus v1.5.0/go.mod h1:+F7Ogzej0PZc/94MaYx/nvG9jOFMD2osvC3s+Squfpo=
github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE=
github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0=
github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
@ -208,7 +239,6 @@ github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48=
github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
@ -219,6 +249,7 @@ github.com/tidwall/match v1.0.1/go.mod h1:LujAq0jyVjBy028G1WhWfIzbpQfMO8bBZ6Tyb0
github.com/tidwall/redcon v1.4.0/go.mod h1:IGzxyoKE3Ea5AWIXo/ZHP+hzY8sWXaMKr7KlFgcWSZU=
github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc=
github.com/valyala/fastjson v1.6.3/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY=
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
@ -235,6 +266,8 @@ golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8U
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.7.0 h1:AvwMYaRytfdeVt3u6mLaxYtErKYjxA2OXjJ1HHq6t3A=
golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@ -251,6 +284,7 @@ golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHl
golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
@ -274,7 +308,8 @@ golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR
golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@ -284,7 +319,6 @@ golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJ
golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@ -292,6 +326,7 @@ golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5h
golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@ -301,20 +336,27 @@ golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200826173525-f9321e4c35a6/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210414055047-fe65e336abe0 h1:g9s1Ppvvun/fI+BptTMj909BBIcGrzQ32k9FNlcevOE=
golang.org/x/sys v0.0.0-20210414055047-fe65e336abe0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.6.0 h1:clScbb1cHjoCkyRbWwBEUZ5H/tIFu5TAXIqaZD0Gcjw=
golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
@ -335,9 +377,9 @@ golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtn
golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200925191224-5d1fdd8fa346/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU=
golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
@ -376,14 +418,20 @@ gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bl
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo=
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
tinygo.org/x/bluetooth v0.5.0 h1:UftQTmx/snuTbeoS/R6+ZixmxSl5d6BvyfxlmD8eDng=
tinygo.org/x/bluetooth v0.5.0/go.mod h1:3rm7IKtmhP7aU2XRJI/Ods3J9Lqc3BAPPTNZmTtb42Q=
tinygo.org/x/drivers v0.14.0/go.mod h1:uT2svMq3EpBZpKkGO+NQHjxjGf1f42ra4OnMMwQL2aI=
tinygo.org/x/drivers v0.15.1/go.mod h1:uT2svMq3EpBZpKkGO+NQHjxjGf1f42ra4OnMMwQL2aI=
tinygo.org/x/drivers v0.16.0/go.mod h1:uT2svMq3EpBZpKkGO+NQHjxjGf1f42ra4OnMMwQL2aI=
tinygo.org/x/drivers v0.20.0/go.mod h1:uJD/l1qWzxzLx+vcxaW0eY464N5RAgFi1zTVzASFdqI=
tinygo.org/x/tinyfont v0.2.1/go.mod h1:eLqnYSrFRjt5STxWaMeOWJTzrKhXqpWw7nU3bPfKOAM=
tinygo.org/x/tinyfs v0.1.0/go.mod h1:ysc8Y92iHfhTXeyEM9+c7zviUQ4fN9UCFgSOFfMWv20=
tinygo.org/x/tinyterm v0.1.0/go.mod h1:/DDhNnGwNF2/tNgHywvyZuCGnbH3ov49Z/6e8LPLRR4=

175
main.go

@ -3,56 +3,33 @@ package main
import (
"flag"
"os"
"protomolecule/src/dust"
"protomolecule/src/eros"
"protomolecule/src/scanStuff"
projVars "protomolecule/src/vars"
"os/signal"
"syscall"
"time"
//projVars "protomolecule/src/vars"
projVars "protomolecule/src/config"
"protomolecule/src/dust"
"protomolecule/src/eros"
"protomolecule/src/protogen"
"github.com/rs/zerolog"
"github.com/rs/zerolog/log"
//"git.tcp.direct/kayos/prototooth"
)
var ScanMgr *scanStuff.Meta
var (
manufLoad bool
GitVersion string
BuildDate string
)
//const banner = 'IOKWhOKWhOKWhMK34paE4paE4paEICAgICAgICDiloTiloTiloTiloTiloQgICAgICDigKIg4paMIOKWhCDCty4gICAgICAg4paE4paE4paMICDiloTiloTiloQgLiDiloTiloTCtyDiloTigKIg4paE4paM4paE4paE4paMICDiloTiloTiloQgLgrilpDilogg4paE4paI4paA4paEIOKWiMK34paqICAgICDigKLilojiloggIOKWqiAgICAgwrfilojilogg4paQ4paI4paI4paI4paq4paqICAgICDilojilojigKIgIOKWgOKWhC7iloDCt+KWkOKWiCDilozilqrilojilqrilojilojilozilojilojigKIgIOKWgOKWhC7iloDCtwog4paI4paI4paAwrfilpDiloDiloDiloQgIOKWhOKWiOKWgOKWhCAg4paQ4paILuKWqiDiloTilojiloDiloQg4paQ4paIIOKWjOKWkOKWjOKWkOKWiMK3IOKWhOKWiOKWgOKWhCDilojilojilqogIOKWkOKWgOKWgOKWquKWhOKWiOKWiCDiloTiloTilojilozilpDilojilozilojilojilqogIOKWkOKWgOKWgOKWquKWhArilpDilojilqrCt+KAouKWkOKWiOKAouKWiOKWjOKWkOKWiOKWjC7ilpDilowg4paQ4paI4paMwrfilpDilojilowu4paQ4paM4paI4paIIOKWiOKWiOKWjOKWkOKWiOKWjOKWkOKWiOKWjC7ilpDilozilpDilojilozilpDilozilpDilojiloTiloTilozilpDilojilojilojilozilpDilojiloTilojilozilpDilojilozilpDilozilpDilojiloTiloTilowKLuKWgCAgIC7iloAgIOKWgCDiloDilojiloTiloDilqog4paA4paA4paAICDiloDilojiloTiloDilqriloDiloAgIOKWiOKWquKWgOKWgOKWgCDiloDilojiloTiloDilqou4paA4paA4paAICDiloDiloDiloAgwrfiloDiloDiloAgIOKWgOKWgOKWgCAu4paA4paA4paAICDiloDiloDiloAgCg=='
func init() {
// print banner for style points
// dust.Splash()
flag.Parse()
if *projVars.AFlag {
projVars.AttackMode = true
}
if *projVars.DFlag {
zerolog.SetGlobalLevel(zerolog.DebugLevel)
}
if *projVars.TFlag {
projVars.TrackingMode = true
}
ScanMgr = &scanStuff.Meta{
Count: 0,
Scans: make(map[int]*scanStuff.Scan),
}
// TODO: make this a commandline argument
// assure the log directory exists
func loginit() {
// setup json logfile
// TODO: make this a command line argument
var logDir string = "./.logs/"
err := os.MkdirAll(logDir, 0755)
if err != nil {
panic(err.Error())
}
// define log file itself using the current date and time
Now := time.Now()
date := Now.Format(time.RFC3339)
logFileName := date + ".log"
@ -70,31 +47,115 @@ func init() {
// suppress debug messages unless -d is called
zerolog.SetGlobalLevel(zerolog.InfoLevel)
}
log.Debug().Msg("Logging initialized")
func cliFlags() {
flag.Parse()
if *projVars.GlobalConfig.CooleanFlags.Debug {
zerolog.SetGlobalLevel(zerolog.DebugLevel)
}
manufLoad = *projVars.GlobalConfig.StringFlags.MACVendorFile != ""
}
func sigHandler() {
c := make(chan os.Signal, 1)
signal.Notify(c, os.Interrupt, syscall.SIGTERM)
for {
select {
case <-c:
log.Warn().
Msg("Interrupt detected, stopping scan...")
for _, scan := range protogen.ScanMgr.Scans {
for _, dev := range scan.Device {
if dev.Connected {
_ = dev.Conn.Disconnect()
}
}
_ = scan.Stop()
}
}
}
}
func init() {
// Initializing an instance of our scan manager to keep track of concurrent scans
// NOTE: Devices are kept track of per Scan via a nested map of eros.Device instances
//
// TODO: Get all of this management stuff into its own package (structs and maps and initialization of the former)
// TODO: Name these structs and maps and instances more uniformly and idiomatically
dust.PrintBanner()
protogen.ScanMgr = &protogen.Meta{
Scans: make(map[int]*protogen.Scan),
Mailbox: make(chan protogen.Postcard),
}
loginit()
cliFlags()
go sigHandler()
if len(GitVersion) > 0 {
log.Info().
Str("Version", GitVersion).
Str("Built", BuildDate).
Msg("Initializing protomolecule")
}
// see ./src/eros
log.Debug().Msg("Initializing database engine")
// initialize database engine
eros.Awaken()
// loading manufacturer info from json file determined by flag
if manufLoad {
eros.ManufLoad()
}
}
func earToTheWire() {
var sublog zerolog.Logger
// Define our IPC callbacks here
interpret := func(m protogen.Postcard) {
switch m.Command {
case "quit":
sublog.Warn().
Int("from", m.From).
Msg("IPC_QUIT")
os.Exit(0)
}
}
for {
select {
case postcard := <-protogen.ScanMgr.Mailbox:
sublog = log.With().Int("scan_id", postcard.From).Logger()
interpret(postcard)
}
}
}
func bleScan() {
var scan *protogen.Scan
// Note: the tinygo bluetooth (prototooth here) library does already have a channel system for starting and stopping scans
// the rational behind implementing an additional IPC system has to do with potentially doing more than just BLE
//
// this starts our IPC listener so that we are ready to catch any incoming IPC messages before we start any scans
go earToTheWire()
scan = protogen.ScanMgr.NewScan()
// time.Sleep(30 * time.Millisecond)
go dust.Must("Scan", scan.Start())
}
func main() {
var scanID int
var scan *scanStuff.Scan
scanID = ScanMgr.NewScan()
scan = ScanMgr.Scans[scanID]
//time.Sleep(30 * time.Millisecond)
dust.Must("Scan", scan.Start())
/*
connectToStuff := func(addr bluetooth.Addresser, device *bluetooth.Device) {
d, _ := adapter.Connect(addr, bluetooth.ConnectionParams{}, err ==
*device == d)
color.Red("Trying a connection", addr)
}
*/
defer eros.Slumber()
StartCLI()
}

File diff suppressed because it is too large Load Diff

Binary file not shown.

@ -0,0 +1,54 @@
// arboghast is a package focused on fuzzing BLE devices
package arboghast
import (
"sync"
bluetooth "git.tcp.direct/kayos/prototooth"
projVars "protomolecule/src/config"
)
type Circus struct {
Trick map[int]*Fuzzy
uuid_pool []bluetooth.UUID
mu *sync.Mutex
}
type Fuzzy struct {
config *bluetooth.AdvertisementOptions
ad *bluetooth.Advertisement
mu *sync.Mutex
}
var circus *Circus
func Awaken() {
circus = &Circus{
Trick: make(map[int]*Fuzzy),
uuid_pool: []bluetooth.UUID{},
mu: &sync.Mutex{},
}
}
func NewEntropicFuzzer() *Fuzzy {
options := &bluetooth.AdvertisementOptions{
LocalName: RandomAlpha(16),
// Interval:
}
mutex := &sync.Mutex{}
ad := projVars.GlobalConfig.GetScanAdapter().DefaultAdvertisement()
ad.Configure(*options)
return &Fuzzy{
config: options,
ad: ad,
mu: mutex,
}
}
func (f *Fuzzy) StartAd() {
f.ad.Start()
}

34
src/arboghast/entropy.go Normal file

@ -0,0 +1,34 @@
package arboghast
import (
"math/rand"
"time"
"unsafe"
)
var src = rand.NewSource(time.Now().UnixNano())
const (
letterBytes = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
letterIdxBits = 6 // 6 bits to represent a letter index
letterIdxMask = 1<<letterIdxBits - 1 // All 1-bits, as many as letterIdxBits
letterIdxMax = 63 / letterIdxBits // # of letter indices fitting in 63 bits
)
func RandomAlpha(n int) string {
b := make([]byte, n)
// A src.Int63() generates 63 random bits, enough for letterIdxMax characters!
for i, cache, remain := n-1, src.Int63(), letterIdxMax; i >= 0; {
if remain == 0 {
cache, remain = src.Int63(), letterIdxMax
}
if idx := int(cache & letterIdxMask); idx < len(letterBytes) {
b[i] = letterBytes[idx]
i--
}
cache >>= letterIdxBits
remain--
}
return *(*string)(unsafe.Pointer(&b))
}

@ -2,19 +2,15 @@ package blueStuff
import "git.tcp.direct/kayos/prototooth"
//controls connections to found devices to get service characteristics
//TODO: disable the scan adapter, enable the attack adapter (this step pmight not be needed)
// controls connections to found devices to get service characteristics
// TODO: disable the scan adapter, enable the attack adapter (this step pmight not be needed)
// use the result.LocalName passed from scanStuff to start connection
// once connected, for list of service characteristics and check for read / write for each
// loog all of this to eros
func pathways(target bluetooth.ScanResult) {
println("Discovery")
//device, err := projVars.ScanAdapter.Connect(bluetooth.ScanResult.Address, bluetooth.ConnectionParams{})
//srvcs, err := projVars.ScanAdapter.
// device, err := projVars.GlobalConfig.GetScanAdapter().Connect(bluetooth.ScanResult.Address, bluetooth.ConnectionParams{})
// srvcs, err := projVars.GlobalConfig.GetScanAdapter().
}

99
src/config/config.go Normal file

@ -0,0 +1,99 @@
package common
import (
"flag"
bluetooth "git.tcp.direct/kayos/prototooth"
)
type Mode uint32
const (
ModeNone Mode = iota
ModeScan
ModeTrack
ModeAttack
)
func (m Mode) String() string {
return [...]string{"None", "Track", "Attack"}[m]
}
// Tooth is a bluetooth adapter.
type Tooth struct {
ID int
Usecase Mode
*bluetooth.Adapter
}
type Config struct {
// ManuFile is a place holder for a file with list of all known Manufacturers
// this is actually stored by eros and likely deprecated.
ManuFile string
Teeth []*Tooth
CooleanFlags struct {
Debug *bool
Attack *bool
Tracking *bool
}
StringFlags struct {
MACVendorFile *string
MACTarget *string
}
}
func (c *Config) GetScanAdapter() *bluetooth.Adapter {
if len(c.Teeth) == 1 {
return c.Teeth[0].Adapter
}
var choice *bluetooth.Adapter
for _, v := range c.Teeth {
if v.Usecase == ModeScan || v.Usecase == ModeTrack {
choice = v.Adapter
break
}
}
return choice
}
var DefaultConfig = Config{
ManuFile: DefManuFile,
Teeth: []*Tooth{
&Tooth{
ID: 0,
Usecase: ModeNone,
Adapter: bluetooth.DefaultAdapter,
},
},
CooleanFlags: struct {
Debug *bool
Attack *bool
Tracking *bool
}{
Debug: flag.Bool("d", false, "global debug logging and pretty printing"),
Attack: flag.Bool("a", false, "attack mode"),
Tracking: flag.Bool("t", false, "device tracking mode"),
},
StringFlags: struct {
MACVendorFile *string
MACTarget *string
}{
MACVendorFile: flag.String("m", DefManuFile, "json file with manufacturer identifying data to preload into eros"),
MACTarget: flag.String("w", "00:00:00:00:00:00", "MAC address of target"),
},
}
const DefManuFile = "./ManufUUID.json"
// Service UUIDs for testing
var (
SonosScanTest = bluetooth.New16BitUUID(0xfe07)
AppleScanTest = bluetooth.New16BitUUID(0x004c)
GlobalConfig *Config
)
func init() {
GlobalConfig = &DefaultConfig
}

34
src/cortazar/cortazar.go Normal file

@ -0,0 +1,34 @@
package cortazar
//Intended to be used as the target analysis package
//for example
/*
1. attempt bonding (LTK exchange) with target, while in aggressive attack mode
2. store current LTK associated with target to device in eros
3. disconnect and forget target
4. recconect to target, pair, bond, store LTK, disconnect, forget -- repeatTK
5. compare LTKs for entropy
** could also be used for link key which is the pin established during pairing
*/
//---------
/*
device metrics
- location and device type/manufacturer/etc...
- when and where a device is seen over time
*/
//-----------
/*
*/

77
src/deimos/main.go Normal file

@ -0,0 +1,77 @@
package deimos
import (
"errors"
"fmt"
"github.com/google/gopacket/dumpcommand"
"github.com/google/gopacket/pcap"
"github.com/rs/zerolog/log"
"strconv"
"strings"
)
type DevMap map[int]pcap.Interface
var Devices DevMap
var Interface *pcap.Handle
func init() {
Devices = make(map[int]pcap.Interface)
}
func getInterfaces() []pcap.Interface {
devices, err := pcap.FindAllDevs()
if err != nil {
log.Error().Err(err).Msg("failed to get network interfaces")
return nil
}
return devices
}
func getBlueDevices() []pcap.Interface {
var blues []pcap.Interface
devices := getInterfaces()
for n, device := range devices {
if strings.Contains(strings.ToLower(device.Name), "bluetooth") {
Devices[n] = device
blues = append(blues, device)
}
if strings.Contains(strings.ToLower(device.Name), "hci") {
Devices[n] = device
blues = append(blues, device)
}
}
return blues
}
func PrintBlueDevices() {
getBlueDevices()
for n := range Devices {
devid := strconv.Itoa(n)
fmt.Println("[" + devid + "] " + Devices[n].Name)
}
}
func Sniff(dev int) error {
var (
err error
d pcap.Interface
preInterface *pcap.InactiveHandle
ok bool
)
if d, ok = Devices[dev]; !ok {
return errors.New("adapter ID does not exist")
}
if preInterface, err = pcap.NewInactiveHandle(d.Name); err != nil {
return err
}
defer preInterface.CleanUp()
if err = preInterface.SetPromisc(true); err != nil {
return err
}
if Interface, err = preInterface.Activate(); err != nil {
return err
}
go dumpcommand.Run(Interface)
return nil
}

7
src/dust/banner.go Normal file

File diff suppressed because one or more lines are too long

@ -4,26 +4,33 @@ import (
"encoding/base64"
//pt "github.com/pterm/pterm"
"github.com/rs/zerolog/log"
projVars "protomolecule/src/vars"
//"bufio"
//"strings"
//projVars "protomolecule/src/vars"
)
func Must(action string, err error) {
if err != nil {
log.Fatal().Err(err).Str("action", action).Msg("FATAL_ERROR")
switch err.Error() {
case "AdapterExists: Launch helper exited with unknown return code 1":
log.Error().Msg("Is your bluetooth adapter enabled? Linux: is bluetoothd started?")
default:
log.Fatal().Err(err).Str("action", action).Msg("FATAL_ERROR")
}
}
}
func FirstList() {
projVars.ScanList = make(map[string]string)
}
/* DID: Name devices that do not have a Local Device name
We solve this with our scan manager by assigning them an ID as a key in our map(s)
See: eros.Device & scanStuff.Meta & scanStuff.Scan
TODO: we should consider making a package to contain the concurrency managment mechanisms
//TODO: Name devices that do not have a Local Device name
func OhNameMeZaddy() {
}
*/
func b64d(str string) string {
data, err := base64.StdEncoding.DecodeString(str)
if err != nil {
@ -34,6 +41,8 @@ func b64d(str string) string {
/*
func Splash() {
const banner string = "IOKWhOKWhOKWhMK34paE4paE4paEICAgICAgICDiloTiloTiloTiloTiloQgICAgICDigKIg4paMIOKWhCDCty4gICAgICAg4paE4paE4paMICDiloTiloTiloQgLiDiloTiloTCtyDiloTigKIg4paE4paM4paE4paE4paMICDiloTiloTiloQgLgrilpDilogg4paE4paI4paA4paEIOKWiMK34paqICAgICDigKLilojiloggIOKWqiAgICAgwrfilojilogg4paQ4paI4paI4paI4paq4paqICAgICDilojilojigKIgIOKWgOKWhC7iloDCt+KWkOKWiCDilozilqrilojilqrilojilojilozilojilojigKIgIOKWgOKWhC7iloDCtwog4paI4paI4paAwrfilpDiloDiloDiloQgIOKWhOKWiOKWgOKWhCAg4paQ4paILuKWqiDiloTilojiloDiloQg4paQ4paIIOKWjOKWkOKWjOKWkOKWiMK3IOKWhOKWiOKWgOKWhCDilojilojilqogIOKWkOKWgOKWgOKWquKWhOKWiOKWiCDiloTiloTilojilozilpDilojilozilojilojilqogIOKWkOKWgOKWgOKWquKWhArilpDilojilqrCt+KAouKWkOKWiOKAouKWiOKWjOKWkOKWiOKWjC7ilpDilowg4paQ4paI4paMwrfilpDilojilowu4paQ4paM4paI4paIIOKWiOKWiOKWjOKWkOKWiOKWjOKWkOKWiOKWjC7ilpDilozilpDilojilozilpDilozilpDilojiloTiloTilozilpDilojilojilojilozilpDilojiloTilojilozilpDilojilozilpDilozilpDilojiloTiloTilowKLuKWgCAgIC7iloAgIOKWgCDiloDilojiloTiloDilqog4paA4paA4paAICDiloDilojiloTiloDilqriloDiloAgIOKWiOKWquKWgOKWgOKWgCDiloDilojiloTiloDilqou4paA4paA4paAICDiloDiloDiloAgwrfiloDiloDiloAgIOKWgOKWgOKWgCAu4paA4paA4paAICDiloDiloDiloAgCg=="
lines := make(map[int]string)
var count int = 0

@ -1,132 +1,227 @@
package eros
// Eros controls the Bitcask db that holds the devices captured during scanning
//
// MAC (Key)
// Addr (Key)
// Device Local Name (LocalName)
// Raw Advertisement Packet (Advertisement)
// Services UUIDs (Services)
// TODO:
//
// Output to report
package eros
import (
"encoding/json"
"bufio"
"os"
"strconv"
"strings"
"sync"
"time"
//"errors"
jsoniter "github.com/json-iterator/go"
projVars "protomolecule/src/config"
bluetooth "git.tcp.direct/kayos/prototooth"
"github.com/prologic/bitcask"
"github.com/rs/zerolog/log"
)
type Permissions struct {
Read string
Write string
var (
json = jsoniter.ConfigCompatibleWithStandardLibrary
dbs = []string{
"devices", // details about devices discovered
"exploits", // details about exploits to be used against BLE devices
"services", // definitions of various bluetooth services and will ultimately be updated via an HTTP repository
"manufacturers", // manufacturer to UUID correlations and info
}
err error
Manufacturers ManufData
// Exploits Exploit
// DataDir - should be defined by config or cmd flag
DataDir string = "./.eros-data/"
)
var DB map[string]*bitcask.Bitcask
// Ingest UUID will add the UUID to the manufacturer if it doesn't already exist
func (manuf *Manufacturer) IngestUUID(uuid bluetooth.UUID) bool {
contains := func(s []bluetooth.UUID, v bluetooth.UUID) bool {
for _, a := range s {
if a == v {
return true
}
}
return false
}
if contains(manuf.UUIDs, uuid) {
return false
}
manuf.UUIDs = append(manuf.UUIDs, uuid)
return true
}
func FinalizeDevice(bigidea Device) *Device {
bigidea.mu = &sync.RWMutex{}
return &bigidea
}
type Characteristic struct {
Name string
UUID string
Permissions []Permissions
func (d *Device) ConnectHandler(target bluetooth.Addresser, c bool) {
d.mu.Lock()
defer d.mu.Unlock()
if c {
d.Connected = true
} else {
d.Connected = false
}
}
// Device will hold details about the discoverd device
type Device struct {
Name string
MAC string
RSSInow int16
RSSIhist map[time.Time]int16
// ManufLoad loads data from a json file containing UUID manufacturer associations
func ManufLoad() {
path := *projVars.GlobalConfig.StringFlags.MACVendorFile
var uuid bluetooth.UUID
// Services - see Service struct
Services []Service
// Discovered - timestamp from when the device was first discovered
Discovered time.Time
// Seen - timestamp from when the device was last seen
Seen time.Time
}
log.Info().
Str("file", path).
Msg("Loading manufacturer data...")
// Service - BLE service details to be marshalled into json before stored in bitcask
type Service struct {
Name string
UUID string
Category string
f, err := os.Open(path)
if err != nil {
log.Error().Err(err).
Msg("Failed to open JSON file")
}
Characteristic []Characteristic
}
defer f.Close()
scan := bufio.NewScanner(f)
// deviceDb will hold details about devices discovered
var deviceDb *bitcask.Bitcask
for scan.Scan() {
var mf *Manufacturer
var newManuf bool = true
// attackDb will hold details about exploits to be used against BLE devices
var attackDb *bitcask.Bitcask
bytes := []byte(strings.TrimSpace(scan.Text()))
json.Unmarshal(bytes, &mf)
// serviceDb will hold definitions of various bluetook services and will ultimately be updated via an HTTP repository
var serviceDb *bitcask.Bitcask
utmp, err := strconv.ParseUint(mf.UString, 0, 16)
if err != nil {
log.Fatal().Str("file", path).
Str("string", mf.UString).
Err(err).Msg("MANUFACTURER_PARSE_ERROR")
}
var err error
uuid = bluetooth.New16BitUUID(uint16(utmp))
mf.IngestUUID(uuid)
// DataDir - should be defined by config or cmd flag
var DataDir string = "./.eros-data/"
log.Debug().
Str("Manufacturer", mf.Name).
Str("UUID_String", mf.UString).
// Interface("UUID_Type", uuid).
// Str("Website", mf.Website).
Msg("LOADED_MANUFACTURER_DATA")
// Exploit - BLE service exploit details to be marshalled into json before stored in bitcask
type Exploit struct {
Name string
Target string
Category string
Vector Vector
Payload Payload
}
mf.UString = ""
// Vector - TBD details of how an exploit initially attacks a BLE service
type Vector struct {
// placeholder
}
if len(Manufacturers.Entries) == 0 {
log.Debug().Msg("new manufacturer")
Manufacturers.Entries = append(Manufacturers.Entries, *mf)
continue
}
// Payload - TBD details of what an exploit will do to the device after the initial attack
type Payload struct {
// placeholder
for i, m := range Manufacturers.Entries {
if m.Name != mf.Name {
continue
}
newManuf = false
mf = &Manufacturers.Entries[i]
mf.IngestUUID(uuid)
log.Debug().Str("Manufacturer", mf.Name).
Int("UUID_Count", len(mf.UUIDs)).
// Interface("UUIDs", mf.UUIDs).
Msg("EXISTING_MANUFACTURER_FOUND")
}
if newManuf {
Manufacturers.Entries = append(Manufacturers.Entries, *mf)
}
}
for _, manuf := range Manufacturers.Entries {
var jsonData []byte
jsonData, err = json.Marshal(manuf)
if err != nil {
log.Fatal().Err(err).
Msg("EROS_FATAL_MANUFACTURER_JSON_MARSHAL")
}
err := DB["manufacturers"].Put([]byte(manuf.Name), jsonData)
if err != nil {
log.Fatal().Err(err).
Msg("EROS_FATAL_MANUFACTURER_JSON_STORE")
}
log.Debug().Str("Name", manuf.Name).
Msg("EROS_MANUFACTURER_STORE")
}
}
// Awaken - create the data directory if it does not exist; initialize bitcask in this directory
func Awaken() {
//log.Debug().Str("DataDir",DataDir).Msg("Initializing eros...")
deviceDb, err = bitcask.Open(DataDir + "devices")
if err != nil {
panic(err.Error)
}
attackDb, err = bitcask.Open(DataDir + "exploits")
if err != nil {
panic(err.Error)
}
serviceDb, err = bitcask.Open(DataDir + "services")
if err != nil {
panic(err.Error)
DB = make(map[string]*bitcask.Bitcask)
for _, name := range dbs {
DB[name], err = bitcask.Open(DataDir+name, bitcask.WithMaxValueSize(1024*1024*1024))
if err != nil {
panic(err.Error())
}
}
}
// exists - check if a device is present in the Database
func exists(mac string) bool {
if deviceDb.Has([]byte(mac)) {
func logErr(err error) {
if err != nil {
log.Error().Err(err).
Msg("EROS_DATABASE_ERROR")
}
}
// Slumber - Clean up database entries, sync them to persistent storage, and safelty close the database.
func Slumber() {
for _, db := range DB {
logErr(db.Merge())
logErr(db.Sync())
logErr(db.Close())
}
}
// Exists - check if a device is present in the Database
func Exists(Addr string) bool {
if DB["devices"].Has([]byte(Addr)) {
return true
}
return false
}
// Remember - store device details into the database
func Remember(dev Device) error {
// Remember stores device details into the database via an argument
func Remember(dev *Device) error {
var err error
var rhist map[time.Time]int16
if !exists(dev.MAC) {
if !Exists(dev.Addr) {
dev.Discovered = time.Now()
rhist = make(map[time.Time]int16)
} else {
re, _ := Recall(dev.MAC)
re, _ := Recall(dev.Addr)
dev.Discovered = re.Discovered
rhist = re.RSSIhist
}
rhist[time.Now()] = dev.RSSInow
rhist[time.Now()] = dev.RSSIlast
dev.RSSIhist = rhist
dev.Seen = time.Now()
@ -136,39 +231,158 @@ func Remember(dev Device) error {
return err
}
err = deviceDb.Put([]byte(dev.MAC), jsonData)
err = DB["devices"].Put([]byte(dev.Addr), jsonData)
return err
}
// Recall - retrieve device details from the database
func Recall(mac string) (Device, error) {
func Recall(Addr string) (Device, error) {
var err error
var bytes []byte
var member Device
bytes, err = deviceDb.Get([]byte(mac))
bytes, err = DB["devices"].Get([]byte(Addr))
if err != nil {
member = Device{}
return member, err
}
json.Unmarshal(bytes, &member)
if err := json.Unmarshal(bytes, &member); err != nil {
log.Panic().Err(err).Msg("Failed to unmarshal device")
}
return member, err
}
func Backup(path string) error {
for _, db := range DB {
logErr(db.Merge())
logErr(db.Sync())
err := db.Backup(path)
if err != nil {
return err
}
}
return nil
}
/*
// Hypnosis - retrieve new exploits/attacks from a remote http repository
func Hypnosis(repo string) {
// placeholder
e:= echo.New()
// CORS
e.Use(middleware.CORSWithConfig(middleware.CORSConfig{
AllowOrigins: []string{"*"},
AllowMethods: []string{echo.GET, echo.HEAD, echo.PUT, echo.PATCH, echo.POST, echo.DELETE} //TODO: possibly trim the methods
}))
// GET
e.GET("/exploits", func(c echo.Context) error { // This will definitely need to be updated
// Build request
req, err := http.NewRequest("GET", repo, nil)
if err != nil {
fmt.Println("Error in GET request: ", err)
}
// Certificate sanity checks
caCert, err := os.Readfile("server.crt")
if err != nil {
log.Fatal(err)
}
cert, err := tls.LoadX509KeyPair("client.crt", "client.key")
if err != nil {
log.Fatal(err)
}
// Add certificates
caCertPool := x509.NewCertPool()
caCertPool.AppendCertsFromPEM(caCert)
// Create client
client := &http.Client{
Transport: &http.Transport{
TLSClientConfig: &tls.Config{
RootCAs: caCertPool,
Certificates: []tls.Certificate{cert},
},
},
}
// Send request
res, err := client.Do(req)
if err != nil {
fmt.Println("Client Error: ", err)
}
// Defer body close
defer res.Body.Close()
// Late binding data from JSON
var exp Exploit
// Decode JSON stream
If err := json.NewDecoder(res.Body).Decode(&exp); err != nil {
fmt.Println(err)
}
return c.JSON(http.StatusOK, exp)
})
}
// Trauma - store details of an exploit/attack against BLE devices
func Trauma(name string, targ string, cat string, vec Vector, pay Payload) {
// placeholder
func Trauma(exp *Exploit) error {
var err error
var rhist map[time.Time]int16
if !Known(exp.Addr) {
exp.Discovered = time.Now()
rhist = make(map[time.Time]int16)
} else {
re, _ := Flashback(exp.Addr)
exp.Discovered = re.Discovered
rhist = re.RSSIhist
}
rhist[time.Now()] = exp.RSSIlast
exp.RSSIhist = rhist
exp.Seen = time.Now()
var jsonData []byte
jsonData, err = json.Marshal(exp)
if err != nil {
return err
}
err = DB["exploits"].Put([]byte(exp.Addr), jsonData)
return err
}
func FinalizeExploit(bigidea Exploit) *Exploit {
bigidea.mu = &sync.RWMutex{}
return &bigidea
}
*/
// Known - check if an exploit is present in the database
func Known(Addr string) bool {
return DB["exploits"].Has([]byte(Addr))
}
// Flashback - retrieve details for the named exploit/attack
func Flashback(name string) {
//placeholder
func Flashback(Addr string) (Exploit, error) {
var err error
var bytes []byte
var member Exploit
bytes, err = DB["exploits"].Get([]byte(Addr))
if err != nil {
member = Exploit{}
return member, err
}
if err := json.Unmarshal(bytes, &member); err != nil {
log.Panic().Err(err).Msg("Failed to unmarshal exploit")
}
return member, err
}

88
src/eros/structs.go Normal file

@ -0,0 +1,88 @@
package eros
import (
bluetooth "git.tcp.direct/kayos/prototooth"
"sync"
"time"
)
type Permissions struct {
Read string
Write string
Notify string
}
type Characteristic struct {
Name string
UUID string
Permissions []Permissions
}
// Service - BLE service details to be marshalled into json before stored in bitcask
type Service struct {
Name string
UUID string
Category string
Characteristic []Characteristic
}
type ManufData struct {
Entries []Manufacturer
}
// Manufacturer holds some information about a device manufacturer
type Manufacturer struct {
Name string `json:"ManufString"`
Website string `json:"ManuFSite"`
// UUIDs is a slice of UUIDs that we associate with the parent Manufacturer
UUIDs []bluetooth.UUID
// this exists purely for json unmarshalling purposes
UString string `json:"ManufUUID"`
}
// Exploit - BLE service exploit details to be marshalled into json before stored in bitcask
type Exploit struct {
Name string
Target string // Should prabably be a struct of some sort since exploits target service chars
Category string
Vector Vector
Payload Payload
}
// Vector - TBD details of how an exploit initially attacks a BLE service
type Vector struct {
// placeholder
}
// Payload - TBD details of what an exploit will do to the device after the initial attack
type Payload struct {
// placeholder
}
// Device will hold details about the discoverd device
type Device struct {
Name string // local name of the device
Addr string // Broadcast MAC
Manufacturer string // Manufacturer Data if broadcast
RSSIlast int16 // Most Current RSSI
RSSIhist map[time.Time]int16 // Last RSSI readings
Alias string // Alias given to device
Trusted bool // Is is in the trusted devices
WakeAllowed bool // Does the device allow wake
// Services - see Service struct
Services []Service
// Discovered - timestamp from when the device was first discovered
Discovered time.Time
// Seen - timestamp from when the device was last seen
Seen time.Time
Connected bool
Conn *bluetooth.Device
// The most at-risk type we have so far for concurrency, needs to be mutexed
mu *sync.RWMutex
}

305
src/protogen/ble_scan.go Normal file

@ -0,0 +1,305 @@
package protogen
import (
"sync"
"time"
projVars "protomolecule/src/config"
"github.com/rs/zerolog"
"github.com/rs/zerolog/log"
"protomolecule/src/eros"
bluetooth "git.tcp.direct/kayos/prototooth"
)
// ScanMgr will keep track of concurrently running scans
var ScanMgr *Meta
// NewScan - here we are creating an "anonymous" instance of a Scan struct
// You'll notice it doesn't contain most of the data that actually is supposed to live within that struct
//
// This works because the integer ID is being used as a key that will have a global scope
//
// See: Remember function as it is defined in eros/eros.go
// Remember usage in this file (scanStuff/scanStuff.go
//
// In these examples we are sending an instance of a struct with some data to eros; allowing it to finish filling out the rest
// This can be done with just structs, but becomes problematic when trying to refer to them later
//
// ref: https://gobyexample.com/mutexes
// ref: https://golang.org/pkg/sync/#Mutex
// ref: https://www.geeksforgeeks.org/mutex-in-golang-with-examples/
func (m *Meta) NewScan() *Scan {
newid := len(m.Scans)
m.Scans[newid] = &Scan{
ID: newid,
Started: time.Now(),
}
scan := m.Scans[newid]
scan.Device = make(map[int]*eros.Device)
scan.mu = &sync.RWMutex{}
return scan
}
func (s *Scan) NewDevice(name string, addr string, manuf string, rssi int16) *eros.Device {
s.mu.Lock()
defer s.mu.Unlock()
draft := eros.Device{
Name: name,
Addr: addr,
Manufacturer: manuf,
RSSIlast: rssi,
}
return eros.FinalizeDevice(draft)
}
/*
func ManfCheck(TargetAdvertData bluetooth.AdvertisementPayload) string {
uuids := TargetAdvertData.ServiceUUIDOut()
var ManufacturerOut string
for _, i := uuids, 0; i < len(uuids); i++ {
//very closse to getting this
for lines, i := manuF.ManufS, 0; i < len(lines); i++ {
curUUID := lines[i].UUID
curUUID16Bit := bluetooth.New16BitUUID(curUUID.Get16Bit())
curMan := lines[i].WhosIts
curCheck := TargetAdvertData.HasServiceUUID(curUUID16Bit)
if curCheck == true {
println(curMan)
ManufacturerOut = curMan
} else {
ManufacturerOut = "No Manufacturer Data in UUID"
}
}
}
return ManufacturerOut
}
*/
// resultHandler is called by the bluetooth library upon device discovery to handle the result
func (s *Scan) resultHandler(scanAdapter *bluetooth.Adapter, result bluetooth.ScanResult) {
var sublog zerolog.Logger
payload := result.AdvertisementPayload
addr := result.Address.String()
lname := result.LocalName()
// adbytes := payload.Bytes()
rssi := result.RSSI
EnumedManuf := ""
// TODO: probably make this a function or a method in eros(?)
//
// ---attempts to set the manufacturer value----
// range through the uuids in the payload and compare
// known manufacturers list
uuids := payload.ServiceUUIDOut()
for range uuids {
// for every element within the manufacturers list
// check each UUID
for _, man := range eros.Manufacturers.Entries {
// pull the UUID the current element of the manufacturer list
currManufErosOut := man.UUIDs /* current element from manufacturer data */
// for each manufacturer's UUID: compare the advertisment payload for a match
for _, manusss := range currManufErosOut {
manufBool := payload.HasServiceUUID(manusss)
// if there is a UUID match then assign the Manufacturer's name
// to the output variable EnumedManuf
if manufBool == true {
EnumedManuf = man.Name
}
}
}
}
// ManufOut := ManfCheck(payload)
layToRest := func(dev *eros.Device) {
sublog.Debug().Msg("Storing data with Eros")
if err := eros.Remember(dev); err != nil {
log.Warn().Err(err).Msg("EROS_REMEMBER_FAILURE")
}
// simple eros test
fromEros, err := eros.Recall(addr)
if err != nil {
log.Fatal().Err(err).Msg("EROS_RECALL_FAILURE")
}
log.Info().
Str("Name", fromEros.Name).
Str("Addr", fromEros.Addr).
Str("ManuF", fromEros.Manufacturer). // needs to be changed back to fromEros.Manufacturer
Int16("Current_RSSI", fromEros.RSSIlast).
Int("Service_Count", len(fromEros.Services)).
Msg("EROS_RECALL")
}
// Service enumeration and storage
// TODO:
// Fix Logging output here -- Prob shouldnt output this much info
// for each service discovered
// only each device
sublog = log.With().Int("Scan_ID", s.ID).
Str("LocalName", lname).Str("Addr", addr).
Str("ManuF", EnumedManuf).
Int16("RSSI", rssi).Logger()
// Skipping duplicate results unless tracking mode enabled (to store RSSI as devices move)
if !*projVars.GlobalConfig.CooleanFlags.Tracking {
for _, dev := range s.Device {
if addr == dev.Addr {
return
}
}
}
// Upon finding new and valid info we update the time for last activity
s.Activity = time.Now()
dev := s.NewDevice(lname, addr, EnumedManuf, rssi)
projVars.GlobalConfig.GetScanAdapter().SetConnectHandler(dev.ConnectHandler)
// Record all the services advertised, append them into the nested struct within Device
for _, uuid := range uuids {
svc := &eros.Service{
UUID: uuid.String(),
}
dev.Services = append(dev.Services, *svc)
sublog.Info().Str("UUID", svc.UUID).Msg("SERVICE_DISCOVERED")
}
if !*projVars.GlobalConfig.CooleanFlags.Attack {
layToRest(dev)
return
}
sublog.Info().Str("Adapter", "Attempting Connection").Msg("ADAPTER_STATUS")
var connErr error
var err error
// TODO: make timeout values and intervals command line arguments instead of hard coding them
timeout := bluetooth.NewDuration(time.Duration(3) * time.Second)
interval := bluetooth.NewDuration(time.Duration(20) * time.Millisecond)
dev.Conn, connErr = projVars.GlobalConfig.GetScanAdapter().
Connect(result.Address, bluetooth.ConnectionParams{ConnectionTimeout: timeout, MinInterval: interval})
if connErr != nil {
sublog.Error().Err(connErr).Msg("CONNECT_ERROR")
layToRest(dev)
return
}
var targetServices []bluetooth.DeviceService
sublog.Info().
Str("status", "Connected, attempting to Read Target Services").
Msg("ADAPTER_STATUS")
if !dev.Connected {
layToRest(dev)
return
}
// ServBuf := make([]byte, 255)
Charbuf := make([]byte, 255)
targetServices, err = dev.Conn.DiscoverServices(nil)
if err != nil {
sublog.Error().Err(err).Msg("DISCOVER_SERVICE_ERROR")
}
// for SerReadPos, srvcs := range targetServices {
for _, srvcs := range targetServices {
charSer := eros.Service{
UUID: srvcs.String(),
}
sublog.Info().Str("Service UUID", charSer.UUID).
// Int("Bytes", SerReadPos).
// Str("Value", string(ServBuf[:SerReadPos])).
Msg("GATT_SERVICE")
sublog.Debug().Str("status", "Attempting to Retrieve Characteristic List").Msg("ADAPTER_STATUS")
chars, _ := srvcs.DiscoverCharacteristics(nil)
dev.Services = append(dev.Services, charSer)
for _, char := range chars {
ReadPos, _ := char.Read(Charbuf)
// flags := char.Flags
sublog.Info().Str("UUID", char.UUID().String()).
// Int("Bytes", ReadPos).
Str("Value", string(Charbuf[:ReadPos])).
// Bool("Read", flags.Read()).
// Bool("Write", flags.Write()).
Msg("SERVICE_CHARACTERISTIC")
}
}
// finished with this device
_ = dev.Conn.Disconnect()
dev.Connected = false
sublog.Info().Str("Adapter", "Successfully Disconnected From Target").Msg("ADAPTER_STATUS")
layToRest(dev)
// TODO: stop scan and call bluestuff func and pass it the local name value
}
func (s *Scan) Stop() error {
// TODO: fix this adapterId situation
err := projVars.GlobalConfig.GetScanAdapter().StopScan()
if err != nil {
return err
}
return nil
}
func (s *Scan) Start() error {
s.Started = time.Now()
// create list of devices in the Area of Operation
// log.Debug().Msg("Creating Device Map")
// Enable BLE interface
log.Debug().Msg("Enabling Adapter")
err := projVars.GlobalConfig.GetScanAdapter().Enable()
if err != nil {
return err
}
adapterId := projVars.GlobalConfig.GetScanAdapter().ID
log.Info().
Str("ID", adapterId).
Bool("MODE_TRACK", *projVars.GlobalConfig.CooleanFlags.Tracking).
Bool("MODE_ATTACK", *projVars.GlobalConfig.CooleanFlags.Attack).
Msg("Starting new ProtoMolecule BLE Scan")
err = projVars.GlobalConfig.GetScanAdapter().Scan(s.resultHandler)
if err != nil {
return err
}
return nil
}

63
src/protogen/structs.go Normal file

@ -0,0 +1,63 @@
package protogen
import (
bluetooth "git.tcp.direct/kayos/prototooth"
"protomolecule/src/eros"
"sync"
"time"
)
/*
Why the Meta struct?
In theory we will have multiple types of scans in the future,
if that's the case this is going to become necessary very quickly
I've mocked up some commented out examples in the source code below.
*/
type Meta struct {
Scans map[int]*Scan
Mailbox chan Postcard
// // // Future Concepts // // //
// BLEScans map[int]*BLEScan
// LoraScans map[int]*LoraScan
// ZigScans map[int]*ZigScan
// WiFiScans map[int]*WiFiScan
// we definitely need this to be safe for concurrency
mu *sync.RWMutex
}
// Postcard will encapsulate interprocess communication messages that we send back to the main thread
type Postcard struct {
// From - the ScanID the message originated from
From int
// Stamp - the time the IPC message was created
Stamp time.Time
// Device ID - relevant DeviceID (if applicable) - Remember to use Scan.Devices[id] for easy referral
DeviceID int
// Command - the actual IPC command
Command string
// Arguments - augmenting arguments to the command
Arguments []string
}
// TODO: Form profiles on devices
// Scan represents an instance of a BLE scan
type Scan struct {
Count int
ID int
// Started the scan at this time
Started time.Time
// Activity was last seen at this time
Activity time.Time
// Device represents a bluetooth endpoints
Device map[int]*eros.Device
// Connection is an active connection to a bluetooth endpoint
Connection map[int]*bluetooth.Connection
/* Ignore is a map of devices to disregard during a scan,
by using the hardware address as a key. (needs disclaimer?) */
Ignore map[string]bool
// Gonna plan on mutexing scan operations just to be safe
mu *sync.RWMutex
}

@ -1,275 +0,0 @@
package scanStuff
import (
"protomolecule/src/dust"
"protomolecule/src/eros"
projVars "protomolecule/src/vars"
//"strconv"
"github.com/rs/zerolog"
"github.com/rs/zerolog/log"
bluetooth "git.tcp.direct/kayos/prototooth"
"time"
)
type Meta struct {
Count int
Scans map[int]*Scan
}
type Scan struct {
ID int
Started time.Time
Activity time.Time
Devices []eros.Device
}
func (mgr *Meta) NewScan() int {
var newid int = 0
if mgr.Count <= 0 {
newid = 0
} else {
newid = mgr.Count + 1
}
mgr.Scans[newid] = &Scan{
ID: newid,
Started: time.Now(),
}
return newid
}
func (s *Scan) Start() error {
s.Started = time.Now()
//create list of devices in the AO
log.Debug().Msg("Creating Device Map")
dust.FirstList()
log.Info().Msg("Enabling Adapter")
if projVars.TrackingMode == true {
log.Info().Str("Mode", "Tracking Mode Enabled").Msg("PROTO_MODE")
}
if projVars.AttackMode == true {
log.Info().Str("Mode", "Attack Mode Enabled").Msg("PROTO_MODE")
}
// Enable BLE interface.
err := projVars.ScanAdapter.Enable()
if err != nil {
return err
}
adapterId := projVars.ScanAdapter.ID
//TODO: Add device adapter MAC output
//println(bluetooth.Addresser.String())
//TODO: only scan a device once, skip if its in the map
// Start scanning.
// redundant(?): log.Info().Msg("scanning...")
//results := new(bluetooth.ScanResult)
log.Info().Str("ID", adapterId).Msg("Adapter in Use")
projVars.ScanAdapter.Scan(func(scanAdapter *bluetooth.Adapter, result bluetooth.ScanResult) {
payload := result.AdvertisementPayload
addr := result.Address.String()
lname := result.LocalName()
//adbytes := payload.Bytes()
uuids := payload.ServiceUUIDOut()
rssi := result.RSSI
var sublog zerolog.Logger
sublog = log.With().Int("Scan_ID", s.ID).Str("LocalName", lname).Str("MAC", addr).
Int16("RSSI", rssi).Logger()
//could add -t option to enable this feature for active tracking
// Skipping duplicate results
if projVars.TrackingMode == false {
if lname == projVars.ScanList[result.Address.String()] {
return
}
}
// Upon finding new and valid info we update the time for last activity
s.Activity = time.Now()
// Initialize a Device struct to hold the incoming data for future serialization
dev := &eros.Device{
Name: lname,
MAC: addr,
RSSInow: rssi,
}
AdvServBuf := make([]byte, 255)
// Record all the services advertised, append them into the nested struct within Device
sublog.Debug().Msg("DEVICE_DISCOVERED")
for advServPos, uuid := range uuids {
svc := &eros.Service{
UUID: uuid.String(),
}
//read advertised fields for device manufact
//result.HasServiceUUID()
sublog.Info().Str("Service UUID", svc.UUID).Int("Bytes", advServPos).Str("Value", string(AdvServBuf[:advServPos])).Msg("GATT_SERVICE")
dev.Services = append(dev.Services, *svc)
sublog.Debug().Str("UUID", svc.UUID).Msg("SERVICE_DISCOVERED")
}
// Append our defined device to the list of devices in the Scan struct
s.Devices = append(s.Devices, *dev)
// places captured devices into the eros DB
sublog.Debug().Msg("Storing data with Eros")
eros.Remember(*dev)
// simple eros test
fromEros, err := eros.Recall(addr)
if err != nil {
log.Error().Err(err).Msg("EROS_RECALL_FAILURE")
}
log.Info().Interface("Device", fromEros).Msg("EROS_RECALL")
if projVars.AttackMode == true && projVars.TrackingMode == false /*changed to false for debug*/ {
////////////////////////////////////////////////////////////////////////
//var PreTargetHandling type
// var TargetDeviceService *bluetooth.DeviceService
// var TargetDeviceServiceChar *bluetooth.DeviceCharacteristic
//Attempt to connect -- This should be put in bluestuff once its working
//time.Sleep(5 * time.Second)
projVars.ScanAdapter.SetConnectHandler(func(result bluetooth.Addresser, connected bool) {
connected = projVars.ConnectedToTarget
projVars.ConnectedToTarget = true
})
sublog.Info().Str("Adapter", "Attempting Connection").Msg("ADAPTER_STATUS")
TargetDevice, err := projVars.ScanAdapter.Connect(result.Address, bluetooth.ConnectionParams{})
var timeDealy = 50 * time.Millisecond
var tick <-chan time.Time
if tick == nil {
endTime := time.After(timeDealy)
select {
case <-endTime:
sublog.Info().Str("Adapter", "Connection Timeout").Msg("ADAPTER_STATUS")
TargetDevice.Disconnect()
endTime = nil
default:
sublog.Info().Str("Adapter", "Working...").Msg("ADAPTER_STATUS")
}
}
if err != nil {
sublog.Err(err).Msg("CONNECTION_ERROR")
}
if projVars.ConnectedToTarget == true {
var targetServices []bluetooth.DeviceService
sublog.Info().Str("Adapter", "Attempting to Read Target Services").Msg("ADAPTER_STATUS")
var timeDealy = 50 * time.Millisecond
var tick <-chan time.Time
if tick == nil {
endTime := time.After(timeDealy)
select {
case <-endTime:
sublog.Info().Str("Adapter", "Connection Timeout").Msg("ADAPTER_STATUS")
TargetDevice.Disconnect()
endTime = nil
default:
sublog.Debug().Str("Adapter", "Working...").Msg("ADAPTER_STATUS")
}
}
ServBuf := make([]byte, 255)
Charbuf := make([]byte, 255)
targetServices, err = TargetDevice.DiscoverServices(nil)
if err != nil {
sublog.Debug().Err(err).Msg("DISCOVER_SERVICE_ERROR")
}
for SerReadPos, srvcs := range targetServices {
charSer := eros.Service{
UUID: srvcs.String(),
}
sublog.Info().Str("Service UUID", charSer.UUID).Int("Bytes", SerReadPos).Str("Value", string(ServBuf[:SerReadPos])).Msg("GATT_SERVICE")
//ReadPos, _ := char.Read(Charbuf)
sublog.Debug().Str("Adapter", "Attempting to Retrieve Characteristic List").Msg("ADAPTER_STATUS")
chars, _ := srvcs.DiscoverCharacteristics(nil)
dev.Services = append(dev.Services, charSer)
for _, char := range chars {
ReadPos, _ := char.Read(Charbuf)
sublog.Info().Str("UUID", char.UUID().String()).
Int("Bytes", ReadPos).Str("Value", string(Charbuf[:ReadPos])).Msg("SERVICE_CHARACTERISTIC")
//println("Rawvalue = ", buf[i])
}
sublog.Debug().Str("Connected and enumerated", charSer.UUID).Msg("CONNECTION_SUCCESSFUL")
}
TargetDevice.Disconnect()
sublog.Info().Str("Adapter", "Successfully Disconnected From Target").Msg("ADAPTER_STATUS")
projVars.ConnectedToTarget = false
}
}
//time.Sleep(5 * time.Second)
//TODO: normalize this with the newly created ScanMgr
//TODO: create localname fort devices that dont broadcast one * dust.OhNameMeZaddy() *
projVars.ScanList[result.Address.String()] = result.LocalName()
//projVars.ScanAdapter.Connect(result.Address, bluetooth.ConnectionParams{})
//projVars.InitResults = append( projVars.ScanList[result.Address.String()], 1)
//TODO: stop scan and call bluestuff func and pass it the local name value ***********
//scanAdapter.Scan()
//time.Sleep(10 * time.Second)
//time.Sleep(20 * time.Millisecond)
})
//projVars.C <- result
//projVars.ScanAdapter.StopScan()
//dust.Must("start scan", err)
//time.Sleep(20 * time.Millisecond)
return nil
}

@ -1,55 +0,0 @@
package projVars
import (
"flag"
bluetooth "git.tcp.direct/kayos/prototooth"
"github.com/rs/zerolog"
)
//The initial list of device in the area
var ScanList map[string]string
var InitResults []string
//var to hold service UUIDs
var SrvcUUID bluetooth.UUID
var AdapterInUse = *&bluetooth.Adapter{}
var AttackMode bool = false
var TrackingMode bool = false
var ConnectedToTarget bool = false
//var SrvcUUIDList map[uint32]string
//hold the values for the initial ble scan results..
// ... i.e. the mac and broadcast name string
var C = make(chan bluetooth.ScanResult)
//the BLE adapter --duh
//var Adapter = bluetooth.DefaultAdapter
var ScanAdapter = bluetooth.DefaultAdapter
var AttackAdapter = bluetooth.DefaultAdapter
//Device to be targeted --not fully implemented
//var Target = flag.String("t", "00:00:00:00:00:00", "Target device to attack")
var DFlag = flag.Bool("d", false, "global debug logging and pretty printing")
var AFlag = flag.Bool("a", false, "attack mode")
var TFlag = flag.Bool("t", false, "device tracking mode")
//flag.Parse()
//var attacker bluetooth.Addresser
//var connected bool
//var disconnected bool = true
var log *zerolog.Logger
//Service UUIDs for testing
var SonosScanTest = bluetooth.New16BitUUID(0xfe07)
var AppleScanTest = bluetooth.New16BitUUID(0x004c)
//var ServiceUUID16Out

161
src/wrath/wrath.go Normal file

@ -0,0 +1,161 @@
package wrath
import (
bluetooth "git.tcp.direct/kayos/prototooth"
"github.com/rs/zerolog"
"github.com/rs/zerolog/log"
"tinygo.org/x/bluetooth/rawterm"
projVars "protomolecule/src/config"
)
// used for offensive operations
/*
func targetPicture() bluetooth.MAC {
type targetMac bluetooth.MAC
for c, err := range projVars.WAFlag {
append(targetMac{})
}
println(targetMac)
target, err := bluetooth.ParseMAC(targetMac)
if err != nil {
log.Err(err).Msg("Error")
}
a := bluetooth.Address{
MACAddress: target,
}
return target
}
*/
func Start(targetUUID bluetooth.UUID) {
var sublog zerolog.Logger
// bluetooth.DefaultAdapter.Connect(targetPicture(), bluetooth.ConnectionParams{})
// TargetDevice, connectError := projVars.GlobalConfig.GetScanAdapter().Connect(result.Address, bluetooth.ConnectionParams{})
// Enable BLE interface.
err := projVars.GlobalConfig.GetScanAdapter().Enable()
if err != nil {
log.Error().
Err(err).
Msg("could not enable the BLE stack")
return
}
// The address to connect to. Set during scanning and read afterwards.
var foundDevice bluetooth.ScanResult
// Scan for NUS peripheral.
log.Info().Msg("Scanning...")
err = projVars.GlobalConfig.GetScanAdapter().Scan(func(adapter *bluetooth.Adapter, foundDevice bluetooth.ScanResult) {
if !foundDevice.AdvertisementPayload.HasServiceUUID(targetUUID) {
return
}
// Stop the scan.
err := projVars.GlobalConfig.GetScanAdapter().StopScan()
if err != nil {
// Unlikely, but we can't recover from this.
log.Panic().Err(err).
Msg("failed to stop scan")
}
})
if err != nil {
log.Error().Err(err).
Msg("failed to start scan")
return
}
// Found a device: print this event.
if name := foundDevice.LocalName(); name == "" {
sublog = log.With().Str("MAC", foundDevice.Address.String()).Logger()
} else {
sublog = log.With().Str("MAC", foundDevice.Address.String()).
Str("Name", foundDevice.LocalName()).Logger()
}
// Found a NUS peripheral. Connect to it.
device, err := projVars.GlobalConfig.GetScanAdapter().Connect(foundDevice.Address, bluetooth.ConnectionParams{})
if err != nil {
sublog.Error().Err(err).
Msg("Failed to connect")
return
}
// Connected. Look up the Nordic UART Service.
sublog.Info().Msg("Discovering services...")
services, err := device.DiscoverServices([]bluetooth.UUID{targetUUID})
if err != nil {
log.Error().Err(err).
Msg("Failed to discover the Nordic UART Service")
return
}
service := services[0]
// Discover all characteristics (we'll filter later)
chars, err := service.DiscoverCharacteristics([]bluetooth.UUID{})
if err != nil {
log.Error().Err(err).
Msg("Failed to discover RX and TX characteristics")
return
}
rx := chars[0]
tx := chars[1]
// Enable notifications to receive incoming data.
err = tx.EnableNotifications(func(value []byte) {
for _, c := range value {
rawterm.Putchar(c)
}
})
if err != nil {
sublog.Error().Err(err).
Msg("Failed to enable TX notifications")
return
}
sublog.Info().Msg("Connected. Exit console using Ctrl-X.")
rawterm.Configure()
defer rawterm.Restore()
var line []byte
for {
ch := rawterm.Getchar()
line = append(line, ch)
// Send the current line to the central.
if ch == '\x18' {
// The user pressed Ctrl-X, exit the program.
break
} else if ch == '\n' {
sendbuf := line // copy buffer
// Reset the slice while keeping the buffer in place.
line = line[:0]
// Send the sendbuf after breaking it up in pieces.
for len(sendbuf) != 0 {
// Chop off up to 20 bytes from the sendbuf.
partlen := 20
if len(sendbuf) < 20 {
partlen = len(sendbuf)
}
part := sendbuf[:partlen]
sendbuf = sendbuf[partlen:]
// This performs a "write command" aka "write without response".
_, err := rx.WriteWithoutResponse(part)
if err != nil {
sublog.Error().Err(err).
Msg("could not send:")
}
}
}
}
}