mirror of https://github.com/hak5/ToorChat.git
164 lines
4.7 KiB
Python
Executable File
164 lines
4.7 KiB
Python
Executable File
#!/usr/bin/env ipython
|
|
from chipcon_nic import *
|
|
|
|
RFCAT_START_SPECAN = 0x40
|
|
RFCAT_STOP_SPECAN = 0x41
|
|
|
|
class RfCat(FHSSNIC):
|
|
def RFdump(self, msg="Receiving", maxnum=100, timeoutms=1000):
|
|
try:
|
|
for x in xrange(maxnum):
|
|
y, t = self.RFrecv(timeoutms)
|
|
print "(%5.3f) %s: %s" % (t, msg, y.encode('hex'))
|
|
except ChipconUsbTimeoutException:
|
|
pass
|
|
|
|
def scan(self, basefreq=902e6, inc=250e3, count=104, delaysec=2, drate=38400, lowball=1):
|
|
'''
|
|
scan for signal over a range of frequencies
|
|
'''
|
|
self.RFdump("Clearing")
|
|
self.lowball(lowball)
|
|
self.setMdmDRate(drate)
|
|
print "Scanning range: "
|
|
while not keystop():
|
|
try:
|
|
print
|
|
for freq in xrange(int(basefreq), int(basefreq+(inc*count)), int(inc)):
|
|
print "Scanning for frequency %d..." % freq
|
|
self.setFreq(freq)
|
|
self.RFdump(timeoutms=delaysec*1000)
|
|
if keystop():
|
|
break
|
|
except KeyboardInterrupt:
|
|
print "Please press <enter> to stop"
|
|
|
|
sys.stdin.read(1)
|
|
self.lowballRestore()
|
|
|
|
def specan(self, basefreq=902e6, inc=250e3, count=104):
|
|
freq, delta = self._doSpecAn(basefreq, inc, count)
|
|
|
|
import rflib.ccspecan as rfspecan
|
|
if not hasattr(self, "_qt_app") or self._qt_app is None:
|
|
self._qt_app = rfspecan.QtGui.QApplication([])
|
|
|
|
fhigh = freq + (delta*(count+1))
|
|
|
|
window = rfspecan.Window(self, freq, fhigh, delta, 0)
|
|
window.show()
|
|
self._qt_app.exec_()
|
|
|
|
def _doSpecAn(self, basefreq, inc, count):
|
|
'''
|
|
store radio config and start sending spectrum analysis data
|
|
'''
|
|
if count>255:
|
|
raise Exception("sorry, only 255 samples per pass... (count)")
|
|
self.getRadioConfig()
|
|
self._specan_backup_radiocfg = self.radiocfg
|
|
|
|
self.setFreq(basefreq)
|
|
self.setMdmChanSpc(inc)
|
|
|
|
freq, fbytes = self.getFreq()
|
|
delta = self.getMdmChanSpc()
|
|
|
|
self.send(APP_NIC, RFCAT_START_SPECAN, "%c" % (count) )
|
|
return freq, delta
|
|
|
|
def _stopSpecAn(self):
|
|
'''
|
|
stop sending rfdata and return radio to original config
|
|
'''
|
|
self.send(APP_NIC, RFCAT_STOP_SPECAN, '')
|
|
self.radiocfg = self._specan_backup_radiocfg
|
|
self.setRadioConfig()
|
|
|
|
|
|
def rf_configure(*args, **k2args):
|
|
pass
|
|
|
|
def rf_redirection(self, fdtup):
|
|
if len(fdtup)>1:
|
|
fd0i, fd0o = fdtup
|
|
else:
|
|
fd0i, = fdtup
|
|
fd0o, = fdtup
|
|
|
|
fdsock = False # socket or fileio?
|
|
if hasattr(fd0i, 'recv'):
|
|
fdsock = True
|
|
|
|
while True:
|
|
x,y,z = select.select([fd0i ], [], [], .1)
|
|
#if self._pause:
|
|
# continue
|
|
|
|
if fd0i in x:
|
|
if fdsock:
|
|
data = fd0i.recv(self.max_packet_size)
|
|
else:
|
|
data = fd0i.read(self.max_packet_size)
|
|
|
|
if not len(data): # terminated socket
|
|
break
|
|
|
|
self.RFxmit(data)
|
|
|
|
try:
|
|
data = self.RFrecv(0)
|
|
if fdsock:
|
|
fd0o.sendall(data)
|
|
else:
|
|
fd0o.write(data)
|
|
except ChipconUsbTimeoutException:
|
|
pass
|
|
|
|
def cleanupInteractiveAtExit():
|
|
try:
|
|
if d.getDebugCodes():
|
|
d.setModeIDLE()
|
|
pass
|
|
except:
|
|
pass
|
|
|
|
def interactive(idx=0, DongleClass=RfCat, intro=''):
|
|
global d
|
|
import rflib.chipcon_nic as rfnic
|
|
import atexit
|
|
|
|
d = DongleClass(idx=idx)
|
|
d.setModeRX() # this puts the dongle into receive mode
|
|
atexit.register(cleanupInteractiveAtExit)
|
|
|
|
gbls = globals()
|
|
lcls = locals()
|
|
|
|
try:
|
|
import IPython.Shell
|
|
ipsh = IPython.Shell.IPShell(argv=[''], user_ns=lcls, user_global_ns=gbls)
|
|
print intro
|
|
ipsh.mainloop(intro)
|
|
|
|
except ImportError, e:
|
|
try:
|
|
from IPython.frontend.terminal.interactiveshell import TerminalInteractiveShell
|
|
ipsh = TerminalInteractiveShell()
|
|
ipsh.user_global_ns.update(gbls)
|
|
ipsh.user_global_ns.update(lcls)
|
|
ipsh.autocall = 2 # don't require parenthesis around *everything*. be smart!
|
|
ipsh.mainloop(intro)
|
|
except ImportError, e:
|
|
print e
|
|
shell = code.InteractiveConsole(gbls)
|
|
shell.interact(intro)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
idx = 0
|
|
if len(sys.argv) > 1:
|
|
idx = int(sys.argv.pop())
|
|
|
|
interactive(idx)
|