def __add_func_name(self, arg_expr): new_name = idc.get_strlit_contents(arg_expr.obj_ea) if not idaapi.is_valid_typename(new_name): logger.warn("Argument has a weird name `{}` at {}".format( new_name, helper.to_hex(helper.find_asm_address(arg_expr, self.parents)))) return self.__possible_names.add(new_name)
def visit_expr(self, expr): if expr.op == idaapi.cot_call and expr.x.op == idaapi.cot_obj and expr.x.obj_ea == self.__func_addr: arg_expr = expr.a[self.__arg_idx] if arg_expr.op != idaapi.cot_obj: cexpr_ea = helper.find_asm_address(expr, self.parents) logger.error("Argument is a not string at {}".format( helper.to_hex(cexpr_ea))) return 1 self.__add_func_name(arg_expr) return 0
def _manipulate(self, cexpr, obj): if obj.id == api.SO_LOCAL_VARIABLE: parent = self.parent_expr() if parent.op == idaapi.cot_asg: alloc_obj = api.MemoryAllocationObject.create( self._cfunc, self.parent_expr().y) if alloc_obj: self._data.append( [alloc_obj.ea, obj.name, self._get_line(), "HEAP"]) elif self.parent_expr().op == idaapi.cot_ref: self._data.append([ helper.find_asm_address(cexpr, self.parents), obj.name, self._get_line(), "STACK" ]) elif obj.id == api.SO_GLOBAL_OBJECT: self._data.append([ helper.find_asm_address(cexpr, self.parents), obj.name, self._get_line(), "GLOBAL" ])
def __add_func_name(self, arg_expr): new_name = idc.get_strlit_contents(arg_expr.obj_ea) if type(new_name) is not str: # convert bytes to str (python 3) new_name = new_name.decode('ascii') if not idaapi.is_valid_typename(new_name): logger.warn("Argument has a weird name `{}` at {}".format( new_name, helper.to_hex(helper.find_asm_address(arg_expr, self.parents)))) return self.__possible_names.add(new_name)