def test_int2binhex(self): test1 = -16 self.assertRaises(TypeError, int2binhex, test1) test2 = 1 test2_res = b'\x01' self.assertEqual(int2binhex(test2), test2_res) test3 = 15 test3_res = b'\x0f' self.assertEqual(int2binhex(test3), test3_res) test4 = 256 test4_res = b'\x01\x00' self.assertEqual(int2binhex(test4), test4_res)
def searchanddestroy(device, target, memsize): ''' Main search loop ''' pageaddress = cfg.startaddress signatures = target['signatures'] # Add signature lengths in bytes to the dictionary, and replace integer # representations of the signatures and patches with bytes for signature in signatures: signature['length'] = siglen(signature['chunks']) offsets = signature['offsets'] # Offsets within pages for chunk in signature['chunks']: chunk['chunk'] = util.int2binhex(chunk['chunk']) try: chunk['patch'] = util.int2binhex(chunk['patch']) except KeyError: chunk['patch'] = None # Progress bar prog = term.ProgressBar(max_value = memsize, total_width = cfg.termwidth, print_data = cfg.verbose) try: # Build a batch of read requests of the form: [(addr1, len1), ...] and # a corresponding match vector: [(chunks1, patchoffset1), ...] j = 0 count = 0 cand = b'\x00' r = [] p = [] while pageaddress < memsize: sig_len = len(signatures) for i in range(sig_len): # Iterate over signatures offsets = signatures[i]['offsets'] # Offsets within pages if isinstance(offsets, int): offsets = [offsets] # Create a list if single offset chunks = signatures[i]['chunks'] # The chunks that is the sig length = signatures[i]['length'] # Sig length in bytes offset_len = len(offsets) for n in range(offset_len): # Iterate over offsets address = pageaddress + offsets[n] + cfg.PAGESIZE * j r.append((address, length)) p.append(chunks) count += 1 # If we have built a full vector, read from memory and # compare to the corresponding signatures if count == cfg.vectorsize: # Read data from device m = 0 for caddr, cand in device.readv(r): if match(cand, p[m]): print() return (caddr, p[m]) m += 1 # Jump to next pages (we're finished with these) mask = ~(cfg.PAGESIZE - 0x01) pageaddress = address & mask if sig_len == i and offset_len == n: pageaddress = pageaddress + cfg.PAGESIZE # Zero out counters and vectors j = 0 count = 0 r = [] p = [] # Print status prog.update_amount(pageaddress, cand) prog.draw() j += 1 # Increase read request count except IOError: print() term.fail('I/O Error, make sure FireWire interfaces are properly ' + 'connected') except KeyboardInterrupt: print() term.fail('Aborted') raise KeyboardInterrupt # If we get here, we haven't found anything :-/ print() return (None, None)
def searchanddestroy(device, target, memsize): ''' Main search loop ''' pageaddress = settings.startaddress signatures = target['signatures'] # Add signature lengths in bytes to the dictionary, and replace integer # representations of the signatures and patches with bytes for signature in signatures: signature['length'] = siglen(signature['chunks']) offsets = signature['offsets'] # Offsets within pages for chunk in signature['chunks']: chunk['chunk'] = int2binhex(chunk['chunk']) try: chunk['patch'] = int2binhex(chunk['patch']) except KeyError: chunk['patch'] = None try: # Build a batch of read requests of the form: [(addr1, len1), ...] and # a corresponding match vector: [(chunks1, patchoffset1), ...] j = 0 count = 0 cand = b'\x00' r = [] p = [] while pageaddress < memsize: sig_len = len(signatures) for i in range(sig_len): # Iterate over signatures offsets = signatures[i]['offsets'] # Offsets within pages if isinstance(offsets, int): offsets = [offsets] # Create a list if single offset chunks = signatures[i]['chunks'] # The chunks that is the sig length = signatures[i]['length'] # Sig length in bytes offset_len = len(offsets) for n in range(offset_len): # Iterate over offsets address = pageaddress + offsets[n] + settings.PAGESIZE * j r.append((address, length)) p.append(chunks) count += 1 # If we have built a full vector, read from memory and # compare to the corresponding signatures if count == settings.vectorsize: # Read data from device m = 0 for caddr, cand in device.readv(r): if match(cand, p[m]): print() return (caddr, p[m]) m += 1 # Jump to next pages (we're finished with these) mask = ~(settings.PAGESIZE - 0x01) pageaddress = address & mask if sig_len == i and offset_len == n: pageaddress = pageaddress + settings.PAGESIZE # Zero out counters and vectors j = 0 count = 0 r = [] p = [] # Print status mibaddr = pageaddress // settings.MiB sys.stdout.write('[*] Searching, {0:>4d} MiB so far'.format(mibaddr)) if settings.verbose: sys.stdout.write('. Sample data read: {0}'.format(bytes2hexstr(cand)[0:24])) sys.stdout.write('\r') sys.stdout.flush() j += 1 # Increase read request count except IOError: print() fail('I/O Error, make sure FireWire interfaces are properly connected') except KeyboardInterrupt: print() fail('Aborted') raise KeyboardInterrupt # If we get here, we haven't found anything :-/ print() return (None, None)
def searchanddestroy(device, target, memsize): ''' Main search loop ''' pageaddress = settings.startaddress signatures = target['signatures'] # Add signature lengths in bytes to the dictionary, and replace integer # representations of the signatures and patches with bytes for signature in signatures: signature['length'] = siglen(signature['chunks']) offsets = signature['offsets'] # Offsets within pages for chunk in signature['chunks']: chunk['chunk'] = int2binhex(chunk['chunk']) try: chunk['patch'] = int2binhex(chunk['patch']) except KeyError: chunk['patch'] = None try: # Build a batch of read requests of the form: [(addr1, len1), ...] and # a corresponding match vector: [(chunks1, patchoffset1), ...] j = 0 count = 0 cand = b'\x00' r = [] p = [] while pageaddress < memsize: sig_len = len(signatures) for i in range(sig_len): # Iterate over signatures offsets = signatures[i]['offsets'] # Offsets within pages if isinstance(offsets, int): offsets = [offsets] # Create a list if single offset chunks = signatures[i]['chunks'] # The chunks that is the sig length = signatures[i]['length'] # Sig length in bytes offset_len = len(offsets) for n in range(offset_len): # Iterate over offsets address = pageaddress + offsets[n] + settings.PAGESIZE * j r.append((address, length)) p.append(chunks) count += 1 # If we have built a full vector, read from memory and # compare to the corresponding signatures if count == settings.vectorsize: # Read data from device m = 0 for caddr, cand in device.readv(r): if match(cand, p[m]): print() return (caddr, p[m]) m += 1 # Jump to next pages (we're finished with these) mask = ~(settings.PAGESIZE - 0x01) pageaddress = address & mask if sig_len == i and offset_len == n: pageaddress = pageaddress + settings.PAGESIZE # Zero out counters and vectors j = 0 count = 0 r = [] p = [] # Print status mibaddr = pageaddress // settings.MiB sys.stdout.write( '[*] Searching, {0:>4d} MiB so far'.format( mibaddr)) if settings.verbose: sys.stdout.write('. Sample data read: {0}'.format( bytes2hexstr(cand)[0:24])) sys.stdout.write('\r') sys.stdout.flush() j += 1 # Increase read request count except IOError: print() fail('I/O Error, make sure FireWire interfaces are properly connected') except KeyboardInterrupt: print() fail('Aborted') raise KeyboardInterrupt # If we get here, we haven't found anything :-/ print() return (None, None)