(资料图)
最近比较忙,就少写两句,直接附上源代码,其中的细节点就不再赘述,如有疑问,请留言。
一共就是实现了两个函数,一个用于搜索特征码 (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 break35 else:36 # 这里可以稍作修改,让返回值变为当前函数的首地址37 results.append(hex(ea))38 if num != 0 and len(results) >= num:39 break40 # print("find {} result".format(len(results)))41 42 return results43 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.size13 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 continue20 # 模糊位 ?? 的匹配条件:21 # and op.type != ida_ua.o_phrase and op.type != ida_ua.o_displ22 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 pass31 else:32 byteStr = format(ida_bytes.get_byte(instruction.ea + index), "02X")33 patternTemp[index] = byteStr34 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 signature42 else:43 # print("not unique signature")44 continue45 46 return None47 48 49 ## 测试50 print("pattern = ", GenerateFunctionSignature(0x320E21F))
X 关闭
- 1、IDA 特征码生成和搜索脚本-全球热点
- 2、【世界说】美国巴尔地摩总教区上百名牧师60多年来性虐待600多人 教会却始终忽略和掩盖侵害行为_世界快资讯
- 3、橙子是橘子和柚子杂交_橙子是凉性还是热性
- 4、创业板氮化镓股票一览表(附:代码)
- 5、天天视讯!大风沙尘一波又一波,做好防护!
- 6、次微分 焦点快播
- 7、全球最资讯丨全球最大集装箱船“地中海伊琳娜”号首航南沙港
- 8、全球要闻:这就是爱?华晨宇演唱会粉丝全程站泥地,为了偶像他们能有多疯狂
- 9、IPO | 巨星传奇集团再递表拟港股上市,2022年纯利6490万元 全球热点
- 10、从“破冰”到“蜕变” 虹口直管公房实施物业一体化管理解居民“三事”
-
简批“以丑为美 自我意淫 的 文化同化”...
总是“千万人的本土人口”被“一二十万人的少数民族”侵略征服统治奴役 之后因为侵略者人少,为了便于统治奴役多数人,而应用被征服国度的多
-
消息称字节在香港中环扩大办公面积,租下2万平方英尺楼面 速递
据香港经济日报消息,字节跳动已在香港中环国际金融中心一期租下2万平方英尺楼面,租金约为每平方英尺120港元(约合15 3美元)。该空间此前由
-
沙尘天气再度来袭 是否进入新活跃期?_观热点
记者付丽丽4月9日起,我国北方多地再次出现沙尘天气。内蒙古呼和浩特、北京等地出现沙尘暴,内蒙古锡林郭勒、包头、乌兰察布和河北张家口等局
-
次元之塔 快资讯
1、《次元之塔》是已完结的一部动漫穿越类网络小说,作者是蜕皮的蛇。2、。
-
全球连线|艺术展展示意大利艺术家中西融合艺术-每日观点
02:08中式老窗成为创作载体、传统的搓衣板妆点上涂鸦、旧式屏风被意式彩绘赋予新生命……数十件中意风格融合的艺术作品目前
-
世界观察:卧龙区:提升营商环境“软实力”,打造项目交易“强磁场”
全媒体记者陈向革通讯员张治国王欣昌近年来,卧龙区公共资源交易中心不断拓展深化“互联网+公共资源交易”的深度和广度,聚焦市场主体
-
关注:10对男女牵手成功!百位信阳单身青年在这场联谊会里寻觅“有缘人”
河南广播电视台乡村频道记者赵震江王京玲金宏辉(通讯员:肖风伟祝鹤)为弘扬时代新风,促进社会和谐发展,引导青年男女树立正确的婚恋价值观
-
两部门:到2025年我国旅游场所5G网络建设基本完善
据工信部网站消息,工信部和文旅部印发《关于加强5G+智慧旅游协同创新发展的通知》(简称《通知》)。截图来源:工信部网站通知明确了总体目标:
-
豫股2023年首份一季报出炉,仲景食品盈利大涨132.55%
【大河财立方消息】4月11日,河南A股上市公司首份一季报出炉。仲景食品披露,其一季度实现营收2 23亿元,同比增长12 26%;归母净利润3909万元
-
2023年4月11日河北省煤焦油价格最新行情预测-焦点讯息
据中国报告大厅对2023年4月11日河北省煤焦油价格最新走势监测显示:2023年4月11日河北省煤焦油(高温)报价483