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

一共就是实现了两个函数,一个用于搜索特征码 (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. Nginx 监听同一端口号配置多个域名

    同一台nginx服务器通过配置多个server块实现在同一端口号下监听多个域名. 需要注意的是:端口号(listen)+主机名(server_name) 需要在多个server中唯一,否则会报错. 实 ...

  2. layui.dtree的学习,自定义扩展toolbar按钮(toolbarExt)

    学习layui.dtree请前往 http://www.wisdomelon.com/DTreeHelper/ 记录一下dtree的自定义扩展toolbar按钮(toolbarExt) html代码: ...

  3. Hex格式和Mot格式简介

    Hex格式和Mot格式简介 一.Hex格式介绍    1.1 什么是 Intel HEX 文件格式?  Intel HEX文件 是由一行行符合 Intel HEX文件格式的文本所构成的ASCII文本文 ...

  4. Sublime Text3汉化好的绿色免安装版使用和破解教程+下载链接

    这个资源是我从官网上面下载好的Sublime Text3绿色版,然后通过网上的教程汉化之后再压缩的.理论上下载完之后,解压就可以用了,不过由于是绿色版,可能需要调一下默认打开方式.才好直接双击打开.绿 ...

  5. 解决和根源:Unsolicited response received on idle HTTP channel starting with xxx

    环境:golang,使用http client,服务器:iis +aspx.net动作:head请求或其他此问题见于各种请求情况.核心是,http在活动期间收到了非预期的信息.一开始我也很纳-闷,因为 ...

  6. C# 动态操作 控件位置绑定 [ Anchor ] 属性

    注: 1.此类属于非常用类,只因本人需要编写的...顺便刷贴一下 2.对于初学,其中的枚举使用可以为你加深一点印象 以下为操作类代码: public class AchCtrer { #region ...

  7. 2020/10/3笔记-网络概述、拓扑类型、OSI模型

    网络(network) 1.什么是网络 计算机网络(简称为网络)由若干节点(node)和连接的链路组成.网络中的节点可以是计算机.集线器.交换机或路由器等. 2.网络的作用是什么 网络最终为了解决的问 ...

  8. 2.面向对象基础-03Java数组

    一.数组的创建和初始化 (一)创建数组: import java.util.*; import java.io.*; public class Main { public static void ma ...

  9. Java Client 调 FastDFS在Docker容器中Storage ip映射的问题

    首先在写这篇文章之前,百度了不少资料基本上都是 1.iptables 2.用--net=host主机网络 3.替换java fast-client.jar自己做mapping映射. 方法一:iptab ...

  10. 修改/编辑jar包

    替换或者导入jar包时,jar包被自动压缩,springboot规定嵌套的jar包不能在被压缩的情况下存储. 解决(本文以升级ojdbc包为例): 使用jar命令解压jar包,在压缩包外重新替换jar ...