This repository has been archived by the owner on Dec 12, 2021. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathbrOOKforce.py
95 lines (76 loc) · 3.36 KB
/
brOOKforce.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
from rflib import *
import time
import bitstring
import argparse
import itertools
class Brookforce(object):
def __init__(self, frequency=None, rate=None, preamble=None, message=None, repeat=1, checksum=None, charset="01", verbose=False):
self.frequency = frequency
self.rate = rate
self.verbose = verbose
self.preamble = preamble
self.message = message
self.checksum = checksum
self.repeat = repeat
self.charset = charset.decode('string_escape')
def emit(self):
d = RfCat()
d.setMdmModulation(MOD_ASK_OOK)
d.setFreq(self.frequency)
d.setMaxPower()
d.setMdmDRate(self.rate)
if self.preamble is not None:
preamble = self.build_preamble()
for message in self.build_message():
if all(c in '01' for c in message):
message = bitstring.BitArray(bin=message).tobytes()
if self.verbose:
print('MESSAGE : %s' % (repr(message)))
if self.preamble is not None:
d.makePktFLEN(len(preamble))
d.RFxmit(preamble)
d.makePktFLEN(len(message))
for i in xrange(self.repeat):
d.RFxmit(message)
d.setModeIDLE()
def build_preamble(self):
if all(c in '01' for c in self.preamble):
return bitstring.BitArray(bin=self.preamble).tobytes()
else:
return self.preamble
def build_message(self):
frmt_message = self.message.replace("?", "%s")
nb_bf = frmt_message.count("%s")
for combination in itertools.product(self.charset, repeat=nb_bf):
final_message = frmt_message % combination
final_message = final_message.decode('string_escape')
if "#CHECKSUM#" in self.message:
if self.checksum is not None:
checksum = self.checksum(final_message)
final_message = final_message.replace("#CHECKSUM#", checksum)
else:
raise Exception("Warning, checksum in message, but no checksum method defined")
yield final_message
if __name__ == "__main__":
""" Test method (example)
"""
parser=argparse.ArgumentParser(description="Bruteforce OOK/ASK")
parser.add_argument('-p', '--preamble', help='message preamble', default=None)
parser.add_argument('-c', '--charset', help='bruteforce charset', default="01")
parser.add_argument('-m', '--message', help='raw message', required=True)
parser.add_argument('-f', '--frequency', help='frequency', default=433000000, type=int)
parser.add_argument('-r', '--rate', help='rate', default=2500, type=int)
parser.add_argument('-x', '--repeat', help='repeat', default=1, type=int)
parser.add_argument('-v', '--verbose', help='verbose mode', action="store_true")
args = vars(parser.parse_args())
def simple_crc(message):
return "01" # static crc, write your own here !
bf = Brookforce(preamble=args['preamble'],
message=args['message'],
frequency=args['frequency'],
rate=args['rate'],
repeat=args['repeat'],
verbose=args['verbose'],
charset=args['charset'],
checksum=simple_crc)
bf.emit()