ToB企服应用市场:ToB评测及商务社交产业平台

标题: IDA 特征码生成和搜索脚本 [打印本页]

作者: 盛世宏图    时间: 2023-4-13 02:20
标题: IDA 特征码生成和搜索脚本
最近比较忙,就少写两句,直接附上源代码,其中的细节点就不再赘述,如有疑问,请留言。

一共就是实现了两个函数,一个用于搜索特征码 (SearchPattern),一个用于生成特征码 (GenerateFunctionSignature)
函数的参数和返回值:
1.SearchPattern 接收一个必要参数 hexStr(即要搜索的特征码),一个可选参数 num(最多返回多少个匹配的结果),返回一个存放所有符合条件的地址的 list
2.GenerateFunctionSignature 接收一个必要参数 addr(即要生成特征码的地址的起始位置),返回唯一的特征码字符串,例如输入地址:0x12345678,返回字符串 48 8B F2 4C 8B F1 E8 ?? ?? ?? ??
 
··· 以下是 SearchPattern 的实现:
  1. 1 import ida_bytes
  2. 2 import ida_ida
  3. 3
  4. 4 def SearchPattern(hexStr, num = 0):
  5. 5     '''
  6. 6     hexStr: 输入的特征码字符串,例:41 80 BE ?? ?? ?? ?? 0F 84 ?? ??
  7. 7     num:    搜索到多少个结果时返回,为 0 时搜索全部匹配的地址
  8. 8     '''
  9. 9     
  10. 10     # 生成掩码
  11. 11     bMask = hexStr.replace('00', '01')
  12. 12     bMask = bMask.replace('??', '00')
  13. 13     bMask = bytes.fromhex(bMask)
  14. 14     # print(bMask)
  15. 15     
  16. 16     # 生成模式码
  17. 17     bPattern = hexStr.replace('??', '00')
  18. 18     bPattern = bytes.fromhex(bPattern)
  19. 19     # print(bPattern)
  20. 20
  21. 21
  22. 22     results = []
  23. 23     ea = ida_ida.inf_get_min_ea()
  24. 24     
  25. 25     while True:
  26. 26         ea = ida_bytes.bin_search(
  27. 27             ea + 1,
  28. 28             ida_ida.inf_get_max_ea(),
  29. 29             bPattern,
  30. 30             bMask,
  31. 31             1,
  32. 32             ida_bytes.BIN_SEARCH_FORWARD| ida_bytes.BIN_SEARCH_NOBREAK| ida_bytes.BIN_SEARCH_NOSHOW)
  33. 33         if ea == ida_idaapi.BADADDR:
  34. 34             break
  35. 35         else:
  36. 36             # 这里可以稍作修改,让返回值变为当前函数的首地址
  37. 37             results.append(hex(ea))
  38. 38             if num != 0 and len(results) >= num:
  39. 39                 break
  40. 40     # print("find {} result".format(len(results)))
  41. 41     
  42. 42     return results
  43. 43
  44. 44
  45. 45 ## 测试
  46. 46 print(SearchPattern("48 8B C4 48 89 50 ??", 3))
复制代码
 
 
··· 以下是 GenerateFunctionSignature 的实现:
  1. 1 import ida_bytes, ida_ua
  2. 2
  3. 3 def GenerateFunctionSignature(funcBase):
  4. 4     # 初始化要用到的变量
  5. 5     instruction = ida_ua.insn_t()
  6. 6     offset = 0
  7. 7     signature = ""
  8. 8     
  9. 9     # 最多分析 100 条指令
  10. 10     for count in range(1, 101):
  11. 11         ida_ua.decode_insn(instruction, funcBase + offset)
  12. 12         offset += instruction.size
  13. 13         patternTemp = [0 for i in range(0, instruction.size)]
  14. 14         
  15. 15         
  16. 16         # 遍历当前指令的全部操作数,并将部分操作数的机器码置为 ??
  17. 17         for op in instruction.ops:
  18. 18             if op.type == o_void:
  19. 19                 continue
  20. 20             #  模糊位 ?? 的匹配条件:
  21. 21             # and op.type != ida_ua.o_phrase and op.type != ida_ua.o_displ
  22. 22             elif (op.type != ida_ua.o_reg):
  23. 23                 for index in range(op.offb, instruction.size):
  24. 24                     patternTemp[index] = "??"
  25. 25
  26. 26
  27. 27         # 读入除模糊位之外的机器码
  28. 28         for index in range(0, instruction.size):
  29. 29             if patternTemp[index] == "??":
  30. 30                 pass
  31. 31             else:
  32. 32                 byteStr = format(ida_bytes.get_byte(instruction.ea + index), '02X')
  33. 33                 patternTemp[index] = byteStr
  34. 34             signature = signature + ' ' + patternTemp[index]
  35. 35
  36. 36         
  37. 37         # 每分析 3 条指令,判断一次当前的 signature 是否唯一
  38. 38         if count%3 == 0:
  39. 39             if len(SearchPattern(signature, 2)) == 1:
  40. 40                 print('unique signature')
  41. 41                 return signature
  42. 42             else:
  43. 43                 # print('not unique signature')
  44. 44                 continue
  45. 45            
  46. 46     return None
  47. 47     
  48. 48
  49. 49 ## 测试
  50. 50 print("pattern = ", GenerateFunctionSignature(0x320E21F))
复制代码
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4