首页 > 其他分享 >IDA 特征码生成和搜索脚本

IDA 特征码生成和搜索脚本

时间:2023-04-12 19:35:05浏览次数:34  
标签:脚本 ea instruction bytes 搜索 signature bMask IDA ida

最近比较忙,就少写两句,直接附上源代码,其中的细节点就不再赘述,如有疑问,请留言。


一共就是实现了两个函数,一个用于搜索特征码 (SearchPattern),一个用于生成特征码 (GenerateFunctionSignature)

函数的参数和返回值:

1.SearchPattern 接收一个必要参数 hexStr(即要搜索的特征码),一个可选参数 num(最多返回多少个匹配的结果),返回一个存放所有符合条件的地址的 list

2.GenerateFunctionSignature 接收一个必要参数 addr(即要生成特征码的地址的起始位置),返回唯一的特征码字符串,例如输入地址:0x12345678,返回字符串 48 8B F2 4C 8B F1 E8 ?? ?? ?? ??

 

··· 以下是 SearchPattern 的实现:

 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:    搜索到多少个结果时返回,为 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             # 这里可以稍作修改,让返回值变为当前函数的首地址
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 的实现:

 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         # 遍历当前指令的全部操作数,并将部分操作数的机器码置为 ??
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         # 读入除模糊位之外的机器码
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 条指令,判断一次当前的 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))

 

标签:脚本,ea,instruction,bytes,搜索,signature,bMask,IDA,ida
From: https://www.cnblogs.com/GoodFish-/p/17310962.html

相关文章

  • 一份bat脚本的学习视频
    我想你会惊讶的发现?软件开发人员仅仅掌握编写代码的能力是远远不够的,你还必须掌握脚本编写的能力。我有一份windowsbat脚本教学视频,可以提供给大家。我相信掌握了这份bat视频的技能,你将会超越大部分开发人员,你离晋升之路有近了一步,因而你的工作和生活也会越来越好,对吧?如果你的答......
  • LeetCode 450.删除二叉搜索树的结点
    1.题目:给定一个二叉搜索树的根节点root和一个值key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。一般来说,删除节点可分为两个步骤:首先找到需要删除的节点;如果找到了,删除它。示例1:输入:root=[5,3,6,2,4,null,......
  • frida遍历list里的内容
         vararrays=Java.use('java.util.Arrays')   console.log('content:'+arrays.toString(list.toArray()));先这样打印出来的是list元素里的类型然后按下面这样强转类型遍历打印出来就是。 varNameInfo=Java.use("com.xxx.xxx.NameInfo"); ......
  • 力扣74. 搜索二维矩阵
    编写一个高效的算法来判断 mxn 矩阵中,是否存在一个目标值。该矩阵具有如下特性:每行中的整数从左到右按升序排列。每行的第一个整数大于前一行的最后一个整数。 示例1:   输入:matrix=[[1,3,5,7],[10,11,16,20],[23,30,34,60]],target=3输出:true示例2: 输......
  • 力扣 33. 搜索旋转排序数组
    整数数组nums按升序排列,数组中的值互不相同。在传递给函数之前,nums在预先未知的某个下标k(0<=k<nums.length)上进行了旋转,使数组变为[nums[k],nums[k+1],...,nums[n-1],nums[0],nums[1],...,nums[k-1]](下标从0开始计数)。例如,[0,1,2,4,5,6,7]在下标3处经......
  • 简单的nmap扫描脚本
    简单的nmap扫描脚本下载链接:https://github.com/baimao-box/nmapscan/tree/main一次扫描命令解释:二次扫描命令解释:总结用这个脚本扫描时,比较隐蔽和快速,二次扫描时,扫描的端口信息也很详细。一次扫描时只需要输入目标ip即可,二次扫描时只输入要扫描的端口即可。扫描后的文件的存储位......
  • linux下使用pyinstaller打包python脚本
    最近给运维写一个系统维护的python脚本,但是被告知生产环境有很多服务器没有安装python解释器,于是在网上搜索多pyinstaller解决方案,本文简单记录之。下载pyinstaller。最新的pyinstaller版本为2.0版本,官方网站http://www.pyinstaller.org。下载链接:http://jaist.dl.sourceforge......
  • ES滚动分页聚合composite,对聚合结果使用脚本过滤
    需求1:对ip根据c段聚合,筛选聚合结果文档数大于3的2:持续聚合,类似分页方式查询语句如下,由于是内网开发的,这个脚本无法粘贴出来,截图做个笔    分页方式:每次聚合结果会有一个 after_key  下次传入即可 ......
  • centos7部署nodejs脚本
    在服务器运行nodejs脚本中,遇到三个问题,进行记录1.用到sharp依赖,但是在服务器上安装不成功,依赖会从github上下载不下来解决:设置使用sharp对应的镜像地址npmconfigsetsharp_binary_host"https://npmmirror.com/mirrors/sharp"npmconfigsetsharp_libvips_binary_host"ht......
  • 性能测试之jmeter脚本监控3
    1,influxDb数据库2,安装influxDB服务3,配置jmeter监听器,后端监听器4,配置grafana可视化工具本文永久更新地址:1,influxDb数据库InfluxDB以更少的代码为分析、物联网和云原生服务构建实时应用程序。其核心是一个数据库,专门用于处理由传感器、应用程序和基础设施生成的海量数......