通过对LyScript自动化插件进行二次封装,实现从内存中读入目标进程解码后的机器码,并通过Python代码在这些机器码中寻找特定的十六进制字符数组,或直接检索是否存在连续的反汇编指令片段等功能。
搜索内存中的机器码: 内存机器码需要配合LyScript32插件,从内存中寻找指令片段。
from LyScript32 import MyDebugdef ReadHexCode (code ): hex_code = [] for index in code: if index >= 0 and index <= 15 : hex_code.append("0" + str (hex (index).replace("0x" ,"" ))) else : hex_code.append(hex (index).replace("0x" ,"" )) return hex_code def GetCode (): try : ref_code = [] dbg = MyDebug() connect_flag = dbg.connect() if connect_flag != 1 : return None start_address = dbg.get_local_base() end_address = start_address + dbg.get_local_size() for index in range (start_address,end_address): read_bytes = dbg.read_memory_byte(index) ref_code.append(read_bytes) dbg.close() return ref_code except Exception: return False def SearchHexCode (Code,SearchCode,ReadByte ): SearchCount = len (SearchCode) for item in range (0 ,ReadByte): count = 0 OpCode = Code[ 0 +item :SearchCount+item ] try : for x in range (0 ,SearchCount): if OpCode[x] == SearchCode[x]: count = count + 1 if count == SearchCount: return True exit(0 ) except Exception: pass return False if __name__ == "__main__" : ref_code = GetCode() if ref_code != False : hex_code = ReadHexCode(ref_code) code_size = len (hex_code) search = ['c0' , '74' , '0d' , '66' , '3b' , 'c6' , '77' , '08' ] ret = SearchHexCode(hex_code, search, code_size) if ret == True : print ("特征码 {} 存在" .format (search)) else : print ("特征码 {} 不存在" .format (search)) else : print ("读入失败" )
输出效果:
搜索内存反汇编代码: 通过LyScript插件读入内存机器码,并在该机器码中寻找指令片段,找到后返回内存首地址。
from LyScript32 import MyDebugdef SearchOpCode (OpCodeList,SearchCode,ReadByte ): SearchCount = len (SearchCode) for item in range (0 ,ReadByte): count = 0 OpCode_Dic = OpCodeList[ 0 + item : SearchCount + item ] try : for x in range (0 ,SearchCount): if OpCode_Dic[x].get("opcode" ) == SearchCode[x]: count = count + 1 if count == SearchCount: return OpCode_Dic[0 ].get("addr" ) exit(0 ) except Exception: pass if __name__ == "__main__" : dbg = MyDebug() connect_flag = dbg.connect() print ("连接状态: {}" .format (connect_flag)) eip = dbg.get_register("eip" ) disasm_dict = dbg.get_disasm_code(eip,1000 ) SearchCode = [ ["push 0xC0000409" , "call 0x003F1B38" , "pop ecx" ], ["push ecx" , "push ebx" ] ] for item in range (0 ,len (SearchCode)): Search = SearchCode[item] ret = SearchOpCode(disasm_dict,Search,1000 ) if ret != None : print ("指令集: {} --> 首次出现地址: {}" .format (SearchCode[item],hex (ret))) dbg.close()
输出效果: