Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def _create_entries(self, target, jumpkind, current_function_addr, irsb, addr, cfg_node, ins_addr, stmt_idx):
if type(target) is pyvex.IRExpr.Const: # pylint: disable=unidiomatic-typecheck
target_addr = target.con.value
elif type(target) in (pyvex.IRConst.U32, pyvex.IRConst.U64): # pylint: disable=unidiomatic-typecheck
target_addr = target.value
elif type(target) in (int, long): # pylint: disable=unidiomatic-typecheck
target_addr = target
else:
target_addr = None
entries = [ ]
# pylint: disable=too-many-nested-blocks
if jumpkind == 'Ijk_Boring':
if target_addr is not None:
r = self._function_add_transition_edge(target_addr, cfg_node, current_function_addr)
if not r:
if cfg_node is not None:
continue
func_0 = functions[addr_0]
if len(func_0.block_addrs) == 1:
block = next(func_0.blocks)
if block.vex.jumpkind not in ('Ijk_Boring', 'Ijk_InvalICache'):
continue
# Skip alignment blocks
if self._is_noop_block(self.project.arch, block):
continue
target = block.vex.next
if isinstance(target, pyvex.IRExpr.Const): # pylint: disable=unidiomatic-typecheck
target_addr = target.con.value
elif type(target) in (pyvex.IRConst.U16, pyvex.IRConst.U32, pyvex.IRConst.U64): # pylint: disable=unidiomatic-typecheck
target_addr = target.value
elif type(target) is int: # pylint: disable=unidiomatic-typecheck
target_addr = target
else:
continue
if target_addr != addr_1:
continue
cfgnode_0 = self.model.get_any_node(addr_0)
cfgnode_1 = self.model.get_any_node(addr_1)
if cfgnode_0 is None or cfgnode_1 is None:
continue
# Are func_0 adjacent to func_1?
if irsb.stmts_used == 1: #JMP 명령어만 존재하는 경우
new_fb = self.new_fb(Function_block(int(str(irsb.next),16)))
self.xref_fb(bb.fb,new_fb)
self.fqueue_append(new_fb)
return
new_bb = self.new_bb(Branch_block(bb.fb,(bb.count + 1 ),int(str(irsb.next),16)))
self.xref_bb(bb,new_bb)
bb.fb.bqueue_append(new_bb) # 일반적인 JUMP일 경우
if isinstance(irsb.statements[len(irsb.statements)-1],pyvex.IRStmt.Exit): # 조건 점프일경우
insert_addr = irsb.statements[len(irsb.statements)-1].dst
if type(insert_addr) is pyvex.IRExpr.Const: # pylint: disable=unidiomatic-typecheck
target_addr = insert_addr.con.value
elif type(insert_addr) in (pyvex.IRConst.U32, pyvex.IRConst.U64): # pylint: disable=unidiomatic-typecheck
target_addr = insert_addr.value
elif type(insert_addr) in (int, long): # pylint: disable=unidiomatic-typecheck
target_addr = insert_addr
else:
target_addr = None
import pdb
pdb.set_trace()
new_bb = self.new_bb(Branch_block(bb.fb,(bb.count + 2),target_addr))
self.xref_bb(bb,new_bb)
bb.fb.bqueue_append(new_bb)
if irsb.stmts_used == 1: #JMP 명령어만 존재하는 경우
new_fb = self.new_fb(Function_block(int(str(irsb.next),16)))
self.xref_fb(bb.fb,new_fb)
self.fqueue_append(new_fb)
return
new_bb = self.new_bb(Branch_block(bb.fb,(bb.count + 1 ),int(str(irsb.next),16)))
self.xref_bb(bb,new_bb)
bb.fb.bqueue_append(new_bb) # 일반적인 JUMP일 경우
if isinstance(irsb.statements[len(irsb.statements)-1],pyvex.IRStmt.Exit): # 조건 점프일경우
insert_addr = irsb.statements[len(irsb.statements)-1].dst
if type(insert_addr) is pyvex.IRExpr.Const: # pylint: disable=unidiomatic-typecheck
target_addr = insert_addr.con.value
elif type(insert_addr) in (pyvex.IRConst.U32, pyvex.IRConst.U64): # pylint: disable=unidiomatic-typecheck
target_addr = insert_addr.value
elif type(insert_addr) in (int, long): # pylint: disable=unidiomatic-typecheck
target_addr = insert_addr
else:
target_addr = None
import pdb
pdb.set_trace()
new_bb = self.new_bb(Branch_block(bb.fb,(bb.count + 2),target_addr))
self.xref_bb(bb,new_bb)
bb.fb.bqueue_append(new_bb)
if irsb.direct_next is True:
if constant == int(str(irsb.next),16): #next 인경우
continue
if constant in jump_targets: #jump target 인경우
continue
if constant == (bb.addr + irsb.size): #next block
continue
if isinstance(irsb.statements[len(irsb.statements)-1],pyvex.IRStmt.Exit): # 조건 점프일경우
insert_addr = irsb.statements[len(irsb.statements)-1].dst
if type(insert_addr) is pyvex.IRExpr.Const: # pylint: disable=unidiomatic-typecheck
target_addr = insert_addr.con.value
elif type(insert_addr) in (pyvex.IRConst.U32, pyvex.IRConst.U64): # pylint: disable=unidiomatic-typecheck
target_addr = insert_addr.value
elif type(insert_addr) in (int, long): # pylint: disable=unidiomatic-typecheck
target_addr = insert_addr
else:
target_addr = None
import pdb
pdb.set_trace()
if constant == target_addr:
continue
try:
if self.main_section == self._manager._header.is_section(constant).Name: # 간접 Address Functio Block
new_fb = self.new_fb(Function_block(constant,const_jump=True))
self.xref_const(bb,new_fb)
self.fqueue_append(new_fb)
else: # String Valid Check