2013-05-03 85 views
0

我(試圖)編寫一個程序,通過十六進制文件搜索兩個值之間的十六進制字符串實例,例如。在D4135B和D414AC之間,在第一個值之間遞增,直到達到第二個值--D4135B,D4135C,D4135D等等。 我設法讓它增加等,但它是我遇到的搜索部分。 這是我到目前爲止的代碼,它已經從其他地方拼湊在一起,我需要使它以某種方式將所有搜索命中輸出到輸出文件(file_out) 我已經超出了我對Python的理解的限制,我確信這可能是一個更簡單的方法。我會非常感謝任何幫助。在文件中搜索兩個值之間的匹配並在Python中輸出搜索匹配

def search_process(hx): # searching for two binary strings 
    global FLAG 
while threeByteHexPlusOne != threeByteHex2: #Keep incrementing until second value reached 
If Flag: 
    if hx.find(threeByteHex2) != -1: 
    FLAG = False #If threeByteHex = ThreeByteHexPlusOne, end search 
    Print (「Reached the end of the search」,hx.find(threeByteHexPlusOne)) 
    Else: 
     If hx.find(threeByteHexPlusOne) != -1: 
     FLAG = True 
    Return -1 #If no results found 

if __name__ == '__main__': 
    try: 
     file_in = open(FILE_IN, "r") #opening input file 
     file_out = open(FILE_OUT, 'w') #opening output file 
     hx_read = file_in.read #read from input file 
     tmp = '' 
     found = '' 
     while hx_read: #reading from file till file is empty 
      hx_read = tmp + hx_read 
      pos = search_process(hx_read) 

      while pos != -1: 
       hex_read = hx_read[pos:] 

       if FLAG: 
        found = found + hx_read 

       pos = search_process(hx_read) 
      tmp = bytes_read[] 
      hx_read = file_in.read 

     file_out.write(found) #writing to output file 

    except IOError: 
     print('FILE NOT FOUND!!! Check your filename or directory/PATH') 
+0

所以...當你運行它時會發生什麼一些更多的信息?它會拋出異常嗎?此外,縮進和情況是混亂的。 – 2013-05-03 15:39:03

回答

0

這裏有一個程序,看起來通過一個十六進制字符串從一個文件3個字節的一個時間,如果3個字節的十六進制字符串是給定的十六進制之間的界限,它寫入到另一個文件。它使用generators使得十六進制字符串中的字節更清晰一些。

import base64 
import sys 

_usage_string = 'Usage: python {} <input_file> <output_file>'.format(sys.argv[0]) 

def _to_base_10_int(value): 
    return int(value, 16) 

def get_bytes(hex_str): 
    # Two characters equals one byte 
    for i in range(0, len(hex_str), 2): 
     yield hex_str[i:i+2] 

def get_three_byte_hexes(hex_str): 
    bytes = get_bytes(hex_str) 
    while True: 
     try: 
      three_byte_hex = next(bytes) + next(bytes) + next(bytes) 
     except StopIteration: 
      break 
     yield three_byte_hex 

def find_hexes_in_range(hex_str, lower_bound_hex, upper_bound_hex): 
    lower_bound = _to_base_10_int(lower_bound_hex) 
    upper_bound = _to_base_10_int(upper_bound_hex) 
    found = [] 
    for three_byte_hex in get_three_byte_hexes(hex_str): 
     hex_value = _to_base_10_int(three_byte_hex) 
     if lower_bound <= hex_value < upper_bound: 
      found.append(three_byte_hex) 
    return found 

if __name__ == "__main__": 
    try: 
     assert(len(sys.argv) == 3) 
    except AssertionError: 
     print _usage_string 
     sys.exit(2) 
    file_contents = open(sys.argv[1], 'rb').read() 
    hex_str = base64.decodestring(file_contents).encode('hex') 
    found = find_hexes_in_range(hex_str, 'D4135B', 'D414AC') 
    print('Found:') 
    print(found) 
    if found: 
     with open(sys.argv[2], 'wb') as fout: 
      for _hex in found: 
       fout.write(_hex) 

檢查出發電機here