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

一共就是实现了两个函数,一个用于搜索特征码 (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. aop的一些方注释介绍

    //定义切入点 @Pointcut("execution(void com.itheima.dao.BookDao.update())") private void pt2(){} ...

  2. 面向对象的练习总结(java)

    三次作业总结博客 l  前言 第一次题目集是我刚刚接触java所做的第一套习题,本次题目难度不大,题量较多,涉及的知识点主要是基础的语法知识,出题人的意图是让我们尽快熟悉java的语法,由于事先有c语 ...

  3. excel制作表格

    我们这个表格举例: 1. 序号列自动生成序号.选中数字"1"所在的单元格,将鼠标停留在图片中标红的区域向下拖动即可                                 ...

  4. Oracle11g 修改数据文件路径的方法

    Oracle 修改数据文件路径的方法   1. 关闭数据库,然后启动至mount状态 sqlplus / as sysdba shutdown immediate startup mount 2. 修 ...

  5. Docker安装(win10)

    Docker安装 windows 首先开启Hyper-V Hyper-V 是微软开发的虚拟机,类似于 VMWare 或 VirtualBox,仅适用于 Windows 10.这是 Docker Des ...

  6. java文本转语音

    下载jar包https://github.com/freemansoft/jacob-project/releases 解压,将jacob-1.18-xxx.dll相应放到项目使用的JAVA_HOME ...

  7. Docker安装一些软件

    1.Docker开始远程访问 vim /lib/systemd/system/docker.service 在ExecStart的值最最后面追加:空格+-H tcp://0.0.0.0:2375 sy ...

  8. Python subnet 操作物件

    subnetcalc.py class SubnetCalc(object): def __init__(self, network, mask): self.network = network.sp ...

  9. 004Java的一些基本概念

    004Java的一些基本概念 1.Java特性和优势 Java至少具有以下特性: 简单性(没有头文件.没有指针运算.也没有分配内存等操作) 面向对象(万物皆对象) 可移植性(一次编写,到处运行 Wri ...

  10. USB 驱动框架分析

    这里先说一些概念性的东西,了解一下USB 一.关于usb设备 都见过很多,用过很多了,每当我们插上一个usb设备到pc的时 右下角就会弹出一个提示信息,提示"发现xxx"设备,再接 ...