(资料图)
最近比较忙,就少写两句,直接附上源代码,其中的细节点就不再赘述,如有疑问,请留言。
一共就是实现了两个函数,一个用于搜索特征码 (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))
最近比较忙,就少写两句,直接附上源代码,其中的细节点就不再赘述,如有疑问,请留言。一共就是实现了两个函数,一个用于搜索特征码(SearchPa
【世界说】美国巴尔地摩总教区上百名牧师60多年来性虐待600多人教会却始终忽略和掩盖侵害行为中国日报网4月12日电据卡塔尔半岛电视台(AlJazeera)
1、橙子性凉、味酸橙子富含丰富的维生素c和维生素p,经常吃橙子,可以帮助大家增强抵抗力,并且与此同时,可以增强毛细血管的
创业板氮化镓股票一览表(附:代码),截至4月12日,创业板氮化镓股票有欧陆通、必创科技、光力科技、星徽股份、瑞丰光电、华灿光电、安克创新、捷
大风沙尘一波又一波,做好防护!
1、次导数(subderivative)、次微分(subdifferential)、次切线(subtangentl
信息时报讯(记者成小珍通讯员曹畅朱嘉明曾燕红邓彦章)4月10日中午,在海港拖轮簇拥之下,全球最大集装箱船“地中海伊琳娜”号缓缓靠泊广州港
曾经,华晨宇的风评还算可以,至少没有那么多黑粉,但如今,他几乎被网友黑化,不是讽刺就是嘲笑,就连金星也吐槽,毫不留情面。对于这一幕,
公司的纯利由2021年的人民币42 9百万元增至2022年的人民币64 9百万元,主要是由于(i)自2021年底开始的明星IP管理业务导致IP创造及营运业务收
虹口区刚刚公布的《2022年度物业行业社会公众满意度调查报告》中显示,作为该区老旧小区较多的四川北路街道,58个小区物业