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))

 文章来源地址https://www.toymoban.com/news/detail-411628.html

到了这里,关于IDA 特征码生成和搜索脚本的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用IDA查看汇编代码,结合安卓系统生成的Tombstone文件,分析安卓app程序崩溃问题

    目录 1、IDA工具介绍 2、产品及问题场景描述 3、查看Tombstone文件

    2024年02月13日
    浏览(49)
  • DAY23:二叉树(十三)二叉树的最近公共祖先+二叉搜索树的最近公共祖先

    一定要仔细看 提示 ,二叉树 数值不重复 ,意味着后序遍历不会存在两边找到了同个元素的情况 本题需要进一步理解后序遍历, 可以认为后序遍历在\\\"深入\\\"到每个子树的最深层之后,才开始\\\"回溯\\\"并访问节点 。 在某种意义上,这可以被视为从下往上的遍历方式 , 但需要注

    2024年02月09日
    浏览(45)
  • LeetCode235. 二叉搜索树的最近公共祖先

    235. 二叉搜索树的最近公共祖先 一、题目 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大( 一个节点也可以是

    2024年02月12日
    浏览(38)
  • LeetCode_二叉搜索树_中等_236.二叉搜索树的最近公共祖先

    给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。” 例如,给定如下二叉搜

    2023年04月10日
    浏览(38)
  • Java——二叉树的最近公共祖先及二叉搜索树介绍

    目录 二叉树的最近公共祖先 题目  思路一:如果给定的是一颗二叉搜索树, 思路二:假设是孩子双亲表示法  二叉搜索树 定义Node类 查找 删除 插入 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点

    2023年04月08日
    浏览(39)
  • 简单聊两句前端模块化

    在前端开发中,模块化是一种将代码拆分为独立模块的开发方法。它通过将功能相似或相关的代码组织成可复用、可维护的模块,以提高开发效率和代码质量。 模块化的主要目的是解决传统的JS开发存在的问题,例如全局命名冲突、代码复用困难、依赖管理混乱等。通过模块

    2024年02月05日
    浏览(43)
  • 基于SIFT图像特征识别的匹配方法比较与实现

    目前常用的匹配器有 BFMatcher and FlannBasedMatcher 1.1 BFMatcher BFMatcher 全称是 Brute-Force Matcher (直译即为暴力匹配器) 大致原理: 对于 img1 中的每个描述符, BFMatcher 将其与 img2 中的所有描述符进行比较;它计算两个描述符之间的距离度量(例如,欧几里得距离或汉明距离,默认使

    2024年02月09日
    浏览(47)
  • Java LeetCode篇-二叉搜索树经典解法(实现:二叉搜索树的最近公共祖先、根据前序遍历建树等)

    🔥博客主页: 【 小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍    文章目录         1.0 判断合法         1.1 使用遍历方式实现验证二叉搜索树         1.2 使用递归方式实现验证二叉搜索树         2.0 求范围和         2.1 使用非递归实现二叉搜索树的范围和

    2024年02月03日
    浏览(49)
  • 算法刷题Day 22 二叉搜索树的最近公共祖先+二叉搜索树中的插入操作+删除二叉搜索树中的节点

    根据二叉搜索树的性质,相比普通二叉树可以极大程度的简化代码,作为公共祖先其值一定在两个给定节点值之间,从树根往下遍历,第一次出现两个给定节点值之间的值,那个节点即为最近公共祖先(为什么是最近不是最远?根节点一般为最远,第一次出现的值处于两个给

    2024年02月17日
    浏览(44)
  • 最近超火的AI生成坤坤图片教程

    前段时间不是来了一期SD AI绘画教程吗,相信不少小伙伴已经能熟练掌握技巧了。 什么?一点没看,那也没事≖‿≖✧ 本期教程和那个相差不大,可以在线食用免费的SD应用。不过为了省一下口袋里的几个硬币还是建议看看我之前的SD教程,毕竟装好了可以无限食用。 原SD教

    2024年02月12日
    浏览(65)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包