最近比較忙,就少寫兩句,直接附上源代碼,其中的細(xì)節(jié)點(diǎn)就不再贅述,如有疑問,請留言。
一共就是實(shí)現(xiàn)了兩個函數(shù),一個用于搜索特征碼 (SearchPattern),一個用于生成特征碼 (GenerateFunctionSignature)。
函數(shù)的參數(shù)和返回值:
1.SearchPattern?接收一個必要參數(shù)?hexStr(即要搜索的特征碼),一個可選參數(shù) num(最多返回多少個匹配的結(jié)果),返回一個存放所有符合條件的地址的 list
2.GenerateFunctionSignature 接收一個必要參數(shù) addr(即要生成特征碼的地址的起始位置),返回唯一的特征碼字符串,例如輸入地址:0x12345678,返回字符串 48 8B F2 4C 8B F1 E8 ?? ?? ?? ??
?
···?以下是?SearchPattern?的實(shí)現(xiàn):
1 import ida_bytes 2 import ida_ida 3 4 def SearchPattern(hexStr, num = 0): 5 ''' 6 hexStr: 輸入的特征碼字符串,例:41 80 BE ?? ?? ?? ?? 0F 84 ?? ?? 7 num: 搜索到多少個結(jié)果時返回,為 0 時搜索全部匹配的地址 8 ''' 9 10 # 生成掩碼 11 bMask = hexStr.replace('00', '01') 12 bMask = bMask.replace('??', '00') 13 bMask = bytes.fromhex(bMask) 14 # print(bMask) 15 16 # 生成模式碼 17 bPattern = hexStr.replace('??', '00') 18 bPattern = bytes.fromhex(bPattern) 19 # print(bPattern) 20 21 22 results = [] 23 ea = ida_ida.inf_get_min_ea() 24 25 while True: 26 ea = ida_bytes.bin_search( 27 ea + 1, 28 ida_ida.inf_get_max_ea(), 29 bPattern, 30 bMask, 31 1, 32 ida_bytes.BIN_SEARCH_FORWARD| ida_bytes.BIN_SEARCH_NOBREAK| ida_bytes.BIN_SEARCH_NOSHOW) 33 if ea == ida_idaapi.BADADDR: 34 break 35 else: 36 # 這里可以稍作修改,讓返回值變?yōu)楫?dāng)前函數(shù)的首地址 37 results.append(hex(ea)) 38 if num != 0 and len(results) >= num: 39 break 40 # print("find {} result".format(len(results))) 41 42 return results 43 44 45 ## 測試 46 print(SearchPattern("48 8B C4 48 89 50 ??", 3))
?
?
···?以下是 GenerateFunctionSignature 的實(shí)現(xiàn):文章來源:http://www.zghlxwxcb.cn/news/detail-411628.html
1 import ida_bytes, ida_ua 2 3 def GenerateFunctionSignature(funcBase): 4 # 初始化要用到的變量 5 instruction = ida_ua.insn_t() 6 offset = 0 7 signature = "" 8 9 # 最多分析 100 條指令 10 for count in range(1, 101): 11 ida_ua.decode_insn(instruction, funcBase + offset) 12 offset += instruction.size 13 patternTemp = [0 for i in range(0, instruction.size)] 14 15 16 # 遍歷當(dāng)前指令的全部操作數(shù),并將部分操作數(shù)的機(jī)器碼置為 ?? 17 for op in instruction.ops: 18 if op.type == o_void: 19 continue 20 # 模糊位 ?? 的匹配條件: 21 # and op.type != ida_ua.o_phrase and op.type != ida_ua.o_displ 22 elif (op.type != ida_ua.o_reg): 23 for index in range(op.offb, instruction.size): 24 patternTemp[index] = "??" 25 26 27 # 讀入除模糊位之外的機(jī)器碼 28 for index in range(0, instruction.size): 29 if patternTemp[index] == "??": 30 pass 31 else: 32 byteStr = format(ida_bytes.get_byte(instruction.ea + index), '02X') 33 patternTemp[index] = byteStr 34 signature = signature + ' ' + patternTemp[index] 35 36 37 # 每分析 3 條指令,判斷一次當(dāng)前的 signature 是否唯一 38 if count%3 == 0: 39 if len(SearchPattern(signature, 2)) == 1: 40 print('unique signature') 41 return signature 42 else: 43 # print('not unique signature') 44 continue 45 46 return None 47 48 49 ## 測試 50 print("pattern = ", GenerateFunctionSignature(0x320E21F))
?文章來源地址http://www.zghlxwxcb.cn/news/detail-411628.html
到了這里,關(guān)于IDA 特征碼生成和搜索腳本的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!