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

一共就是实现了两个函数,一个用于搜索特征码 (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))

IDA 特征码生成和搜索脚本的更多相关文章

  1. 「懒惰的美德」我用 python 写了个自动生成给文档生成索引的脚本

    我用 python 写了一个自动生成索引的脚本 简介:为了刷算法题,建了一个 GitHub仓库:PiperLiu / ACMOI_Journey,记录自己的刷题轨迹,并总结一下方法.心得.想到一个需求 ...

  2. SQL SERVER 生成建表脚本

    /****** Object: StoredProcedure [dbo].[GET_TableScript_MSSQL] Script Date: 06/15/2012 11:59:00 ***** ...

  3. PowerDesigner 如何生成数据库更新脚本

    最近在学习使用PowerDesigner 这个数据库设计工具,发现真的很强大,可以做很多事情,其中就涉及到如果数据库要进行更新了怎么办,主要是增加表,最麻烦的是修改字段名称,增加字段等操作,遇到主要的 ...

  4. PowerDesigner中在生成的数据库脚本中用name列替换comment列作为字段描述的方法

    1 PowerDesigner中在生成的数据库脚本中用name列替换comment列作为字段描述的方法如下, 依次打开Tools -- Execute Commands -- Run Script,运 ...

  5. 生成建表脚本up_CreateTable

    已经很久没用使用这个脚本了,今天用到,并做修改,增加了生成扩展属性功能. Go if object_ID('[up_CreateTable]') is not null Drop Procedure ...

  6. (转)SQL SERVER 生成建表脚本

    https://www.cnblogs.com/champaign/p/3492510.html /****** Object: StoredProcedure [dbo].[GET_TableScr ...

  7. steam Depot 生成与应用脚本

    Depot 生成脚本 首先为您上传的每个 Depot 创建一个 Depot 生成脚本.从复制 depot_build_1001.vdf 脚本开始,并按将上传的 Depot ID 命名. Depot 生 ...

  8. atitit.自动生成数据库结构脚本,或者更换数据库,基于hibernate4

    atitit.自动生成数据库结构脚本,或者更换数据库,基于hibernate4 目前近况:: 更换数据库,但是是使用spring集成的. <!-- hibernate配置文件路径 --> ...

  9. [shell]管理 Sphinx 启动|停止|重新生成索引的脚本

    对于启动sphinx的服务,可以直接输入如下命令 /usr/bin/searchd -c /etc/sphinx/sphinx.conf <!-- /usr/local/bin/searchd  ...

  10. 使用jQuery和CSS3生成的搜索框变形全屏搜索效果

    在线演示 本地下载 使用jQuery和CSS3过渡变形效果生成的一个搜索框变形效果实现,可以帮助你更好利用页面格式和内容.实验性质的代码,请大家在产品环境里自己修改使用!

随机推荐

  1. ubuntu14搭建内网gitlab服务器

    平台 宿主机系统版本:Ubuntu 14.04.5 LTS gitlab软件版本:11.10.8-ee 验证web浏览器版本:Mozilla Firefox 68.3.0esr 安装firefox浏览 ...

  2. linux中安装启动postgresql教程

    安装: 官网地址:https://www.postgresql.org 选择下载版本: https://www.postgresql.org/ftp/source 下载方式: wget https:/ ...

  3. openstack:OpenStack架构详解,

    OpenStack既是一个社区,也是一个项目和一个开源软件,提供开放源码软件,建立公共和私有云,它提供了一个部署云的操作平台或工具集,其宗旨在于:帮助组织运行为虚拟计算或存储服务的云,为公有云.私有云 ...

  4. java15配置环境后java_version无反应(不显示“不是内部或外部命令”)

    重新装了jdk15来使用eclipse 配置完环境变量之后打开cmd输入 java -version 好家伙,居然一点反映都没有, 然后傻乎乎的跑回去重新配置JAVA_HOME和path 还是没用,细 ...

  5. JS刷题自制参考知识

    (建议复制到本地,需要看的时候打开Typora,大纲点击要查的内容即可,我一般记不清某个方法的时候就查一下.) 基础 Typescript TypeScript是一个开源的.渐进式包含类型的JavaS ...

  6. IDEA创建Spring Boot项目无法连接http://start.spring.io 解决方法

    1.修改代理 2. 搭建自己的SpringBoot initializer构建服务器 https://blog.csdn.net/KingBoyWorld/article/details/773732 ...

  7. 关于SSD硬盘

    2月份,看到Netac的SSD硬盘便宜,入手一个720G的,把原来的三星250G换掉,有时感觉机器会卡,一直没注意,最近更新一个英睿达的MX系列500G放电脑里用,毕竟杂牌做主硬盘不放心.就把Neta ...

  8. pycharm激活教程

    激活地址:https://shimo.im/docs/YW9Gc3vHhJkWtRyQ/read 细节注意:下载版本,在官网下载,选择左下角更多版本,下载2019,3月份版本

  9. 10.14 2020 实验 7:OpenDaylight 实验——Python 中的 REST API 调用

    一.实验目的  对 Python 调用 OpenDaylight 的 REST API 方法有初步了解.   二.实验任务  本实验需要用另一种方法完成上一个实验相同的功能,即通过 Python 程序 ...

  10. Vue 使用插件nprogress页面加载进度条

    下载 npm i nprogress 在main.js中引入: import App from './App' import VueRouter from 'vue-router' import ro ...