fido fix (#775)
[proxmark3-svn] / tools / findbits.py
CommitLineData
a93bd81d 1#!/usr/bin/python
2
3# findbits.py - find Binary, Octal, Decimal or Hex number in bitstream
4#
5# Adam Laurie <adam@algroup.co.uk>
6# http://rfidiot.org/
7#
8# This code is copyright (c) Adam Laurie, 2009, All rights reserved.
9# For non-commercial use only, the following terms apply - for all other
10# uses, please contact the author:
11#
12# This code is free software; you can redistribute it and/or modify
13# it under the terms of the GNU General Public License as published by
14# the Free Software Foundation; either version 2 of the License, or
15# (at your option) any later version.
16#
17# This code is distributed in the hope that it will be useful,
18# but WITHOUT ANY WARRANTY; without even the implied warranty of
19# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20# GNU General Public License for more details.
21#
22
23import sys
24import os
a93bd81d 25
26# invert binary string
27def invert(data):
9f975d42 28 return ''.join('0' if c == '1' else '1' for c in data)
a93bd81d 29
30# do the actual search
9455b51c 31def search(target,data):
f208c9e2 32 location = data.find(target)
a93bd81d 33 if location >= 0:
34 print '*** Match at bit %d:' % location,
35 print '%s<%s>%s' % (data[:location],target,data[location+len(target):])
36 else:
37 print 'Not found'
38
39# convert integer to binary string
40def binstring(number):
df1e29bb 41 return bin(number)[2:] if number > 0 else ''
a93bd81d 42
43# reverse string order
44def stringreverse(data):
ee0ef5c5 45 return data[::-1]
a93bd81d 46
47# match forward, backward and inverted
d13dee90 48def domatch(binary,number):
a93bd81d 49 reversed= stringreverse(number)
50 inverted= invert(binary)
51
52 print ' Forward: (%s)' % number,
53 search(binary,number)
54 print ' Reverse: (%s)' % reversed,
55 search(binary,reversed)
56 print ' Inverse: (%s)' % inverted
57 print ' Forward: (%s)' % number,
58 search(inverted,number)
59 print ' Reverse: (%s)' % reversed,
60 search(inverted,reversed)
61
79c4de2a 62def main():
63 if(len(sys.argv) < 3):
64 print
65 print '\t'+sys.argv[0] + ' - Search bitstream for a known number'
66 print
67 print 'Usage: ' + sys.argv[0] + ' <NUMBER> <BITSTREAM>'
68 print
69 print '\tNUMBER will be converted to it\'s BINARY equivalent for all valid'
70 print '\tinstances of BINARY, OCTAL, DECIMAL and HEX, and the bitstream'
71 print '\tand it\'s inverse will be searched for a pattern match. Note that'
72 print '\tNUMBER must be specified in BINARY to match leading zeros.'
73 print
74 print 'Example:'
75 print
76 print '\tfindbits.py 73 0110010101110011'
77 print
78 os._exit(True)
a93bd81d 79
79c4de2a 80 bases= {
81 2:'BINARY',
82 8:'OCTAL',
83 10:'DECIMAL',
84 16:'HEX',
85 }
a93bd81d 86
c3631ff8 87 for base, base_name in sorted(bases.iteritems()):
79c4de2a 88 try:
89 number= int(sys.argv[1],base)
90 print
c3631ff8 91 print 'Trying', base_name
79c4de2a 92 # do BINARY as specified to preserve leading zeros
93 if base == 2:
94 domatch(sys.argv[1],sys.argv[2])
95 else:
96 domatch(binstring(number),sys.argv[2])
97 except:
98 continue
99
100if __name__ == '__main__':
101 main()
Impressum, Datenschutz