mirror of
https://github.com/cea-sec/miasm
synced 2026-08-17 10:26:03 -04:00
Asmblock: rename bloc
This commit is contained in:
parent
84d93930af
commit
4fcd0faa92
18 changed files with 57 additions and 40 deletions
|
|
@ -46,7 +46,7 @@ bin_stream = bin_stream_str(shellcode)
|
|||
mdis = dis_x86_32(bin_stream)
|
||||
|
||||
print "Without callback:\n"
|
||||
blocks = mdis.dis_multibloc(0)
|
||||
blocks = mdis.dis_multiblock(0)
|
||||
print "\n".join(str(block) for block in blocks)
|
||||
|
||||
# Enable callback
|
||||
|
|
@ -59,7 +59,7 @@ mdis.job_done.clear()
|
|||
|
||||
print "=" * 40
|
||||
print "With callback:\n"
|
||||
blocks_after = mdis.dis_multibloc(0)
|
||||
blocks_after = mdis.dis_multiblock(0)
|
||||
print "\n".join(str(block) for block in blocks_after)
|
||||
|
||||
# Ensure the callback has been called
|
||||
|
|
|
|||
|
|
@ -13,6 +13,6 @@ cont = Container.from_stream(open(sys.argv[1]))
|
|||
mdis = dis_x86_32(cont.bin_stream)
|
||||
# Inform the engine to avoid disassembling null instructions
|
||||
mdis.dont_dis_nulstart_bloc = True
|
||||
blocks = mdis.dis_multibloc(addr)
|
||||
blocks = mdis.dis_multiblock(addr)
|
||||
|
||||
open('graph.dot', 'w').write(blocks.dot())
|
||||
|
|
|
|||
|
|
@ -121,7 +121,7 @@ while not finish and todo:
|
|||
if ad in done:
|
||||
continue
|
||||
done.add(ad)
|
||||
allblocks = mdis.dis_multibloc(ad)
|
||||
allblocks = mdis.dis_multiblock(ad)
|
||||
|
||||
log.info('func ok %.16x (%d)' % (ad, len(all_funcs)))
|
||||
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ from miasm2.arch.x86.disasm import dis_x86_32
|
|||
# RET
|
||||
shellcode = '\xb8\xef\xbe7\x13\xb9\x04\x00\x00\x00\xc1\xc0\x08\xe2\xfb\xc3'
|
||||
mdis = dis_x86_32(shellcode)
|
||||
blocks = mdis.dis_multibloc(0)
|
||||
blocks = mdis.dis_multiblock(0)
|
||||
|
||||
for block in blocks:
|
||||
print block
|
||||
|
|
|
|||
|
|
@ -157,7 +157,7 @@ dis_engine, ira = machine.dis_engine, machine.ira
|
|||
|
||||
mdis = dis_engine(cont.bin_stream, symbol_pool=cont.symbol_pool)
|
||||
addr_head = 0
|
||||
blocks = mdis.dis_multibloc(addr_head)
|
||||
blocks = mdis.dis_multiblock(addr_head)
|
||||
lbl_head = mdis.symbol_pool.getby_offset(addr_head)
|
||||
|
||||
ir_arch_a = ira(mdis.symbol_pool)
|
||||
|
|
|
|||
|
|
@ -151,7 +151,7 @@ ad = int(args.addr, 16)
|
|||
print 'disasm...'
|
||||
mdis = dis_x86_32(data)
|
||||
mdis.follow_call = True
|
||||
ab = mdis.dis_multibloc(ad)
|
||||
ab = mdis.dis_multiblock(ad)
|
||||
print 'ok'
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -37,7 +37,7 @@ def get_block(ir_arch, mdis, ad):
|
|||
l = mdis.symbol_pool.getby_offset_create(ad)
|
||||
if not l in ir_arch.blocks:
|
||||
ad = l.offset
|
||||
b = mdis.dis_bloc(ad)
|
||||
b = mdis.dis_block(ad)
|
||||
ir_arch.add_block(b)
|
||||
b = ir_arch.get_block(l)
|
||||
if b is None:
|
||||
|
|
|
|||
|
|
@ -60,7 +60,7 @@ def get_block(ir_arch, mdis, addr):
|
|||
mdis.job_done.clear()
|
||||
lbl = ir_arch.get_label(addr)
|
||||
if not lbl in ir_arch.blocks:
|
||||
block = mdis.dis_bloc(lbl.offset)
|
||||
block = mdis.dis_block(lbl.offset)
|
||||
ir_arch.add_block(block)
|
||||
irblock = ir_arch.get_block(lbl)
|
||||
if irblock is None:
|
||||
|
|
@ -165,7 +165,7 @@ def analyse_function():
|
|||
# Get the current function
|
||||
func = ida_funcs.get_func(idc.ScreenEA())
|
||||
addr = func.startEA
|
||||
blocks = mdis.dis_multibloc(addr)
|
||||
blocks = mdis.dis_multiblock(addr)
|
||||
# Generate IR
|
||||
for block in blocks:
|
||||
ir_arch.add_block(block)
|
||||
|
|
|
|||
|
|
@ -214,7 +214,7 @@ def launch_depgraph():
|
|||
# Get the current function
|
||||
addr = idc.ScreenEA()
|
||||
func = ida_funcs.get_func(addr)
|
||||
blocks = mdis.dis_multibloc(func.startEA)
|
||||
blocks = mdis.dis_multiblock(func.startEA)
|
||||
|
||||
# Generate IR
|
||||
for block in blocks:
|
||||
|
|
|
|||
|
|
@ -138,7 +138,7 @@ def build_graph(verbose=False, simplify=False):
|
|||
if verbose:
|
||||
print hex(addr)
|
||||
|
||||
blocks = mdis.dis_multibloc(addr)
|
||||
blocks = mdis.dis_multiblock(addr)
|
||||
|
||||
if verbose:
|
||||
print "generating graph"
|
||||
|
|
|
|||
|
|
@ -87,7 +87,7 @@ def symbolic_exec():
|
|||
start, end = idc.SelStart(), idc.SelEnd()
|
||||
|
||||
mdis.dont_dis = [end]
|
||||
blocks = mdis.dis_multibloc(start)
|
||||
blocks = mdis.dis_multiblock(start)
|
||||
ira = machine.ira()
|
||||
for block in blocks:
|
||||
ira.add_block(block)
|
||||
|
|
|
|||
|
|
@ -53,7 +53,7 @@ if options.verbose is True:
|
|||
# Ensure there is one and only one leave (for OEP discovering)
|
||||
mdis = sb.machine.dis_engine(sb.jitter.bs)
|
||||
mdis.dont_dis_nulstart_bloc = True
|
||||
ab = mdis.dis_multibloc(sb.entry_point)
|
||||
ab = mdis.dis_multiblock(sb.entry_point)
|
||||
|
||||
leaves = list(ab.get_bad_blocks_predecessors())
|
||||
assert(len(leaves) == 1)
|
||||
|
|
|
|||
|
|
@ -59,7 +59,7 @@ if args.rename_args:
|
|||
init_ctx[e_mem] = ExprId("arg%d" % i)
|
||||
|
||||
# Disassemble the targeted function
|
||||
blocks = mdis.dis_multibloc(int(args.func_addr, 0))
|
||||
blocks = mdis.dis_multiblock(int(args.func_addr, 0))
|
||||
|
||||
# Generate IR
|
||||
for block in blocks:
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@ asm = machine.mn.asm(line)[0]
|
|||
# Get back block
|
||||
bin_stream = bin_stream_str(asm)
|
||||
mdis = machine.dis_engine(bin_stream)
|
||||
asm_block = mdis.dis_bloc(START_ADDR)
|
||||
asm_block = mdis.dis_block(START_ADDR)
|
||||
|
||||
# Translate ASM -> IR
|
||||
ira = machine.ira(mdis.symbol_pool)
|
||||
|
|
|
|||
|
|
@ -301,7 +301,7 @@ class DSEEngine(object):
|
|||
self.ir_arch.blocks.clear()# = {}
|
||||
|
||||
## Update current state
|
||||
asm_block = self.mdis.dis_bloc(cur_addr)
|
||||
asm_block = self.mdis.dis_block(cur_addr)
|
||||
self.ir_arch.add_block(asm_block)
|
||||
self.addr_to_cacheblocks[cur_addr] = dict(self.ir_arch.blocks)
|
||||
|
||||
|
|
|
|||
|
|
@ -1386,7 +1386,7 @@ class disasmEngine(object):
|
|||
# Override options if needed
|
||||
self.__dict__.update(kwargs)
|
||||
|
||||
def _dis_bloc(self, offset):
|
||||
def _dis_block(self, offset):
|
||||
"""Disassemble the block at offset @offset
|
||||
Return the created AsmBlock and future offsets to disassemble
|
||||
"""
|
||||
|
|
@ -1519,44 +1519,61 @@ class disasmEngine(object):
|
|||
symbol_pool=self.symbol_pool)
|
||||
return cur_block, offsets_to_dis
|
||||
|
||||
def dis_bloc(self, offset):
|
||||
def dis_block(self, offset):
|
||||
"""Disassemble the block at offset @offset and return the created
|
||||
AsmBlock
|
||||
@offset: targeted offset to disassemble
|
||||
"""
|
||||
current_block, _ = self._dis_bloc(offset)
|
||||
current_block, _ = self._dis_block(offset)
|
||||
return current_block
|
||||
|
||||
def dis_multibloc(self, offset, blocs=None):
|
||||
def dis_bloc(self, offset):
|
||||
"""
|
||||
DEPRECATED function
|
||||
Use dis_block instead of dis_bloc
|
||||
"""
|
||||
warnings.warn('DEPRECATION WARNING: use "dis_block" instead of "dis_bloc"')
|
||||
return self.dis_block(offset)
|
||||
|
||||
def dis_multiblock(self, offset, blocks=None):
|
||||
"""Disassemble every block reachable from @offset regarding
|
||||
specific disasmEngine conditions
|
||||
Return an AsmCFG instance containing disassembled blocks
|
||||
@offset: starting offset
|
||||
@blocs: (optional) AsmCFG instance of already disassembled blocks to
|
||||
@blocks: (optional) AsmCFG instance of already disassembled blocks to
|
||||
merge with
|
||||
"""
|
||||
log_asmblock.info("dis bloc all")
|
||||
if blocs is None:
|
||||
blocs = AsmCFG()
|
||||
if blocks is None:
|
||||
blocks = AsmCFG()
|
||||
todo = [offset]
|
||||
|
||||
bloc_cpt = 0
|
||||
while len(todo):
|
||||
bloc_cpt += 1
|
||||
if self.blocs_wd is not None and bloc_cpt > self.blocs_wd:
|
||||
log_asmblock.debug("blocs watchdog reached at %X", int(offset))
|
||||
log_asmblock.debug("blocks watchdog reached at %X", int(offset))
|
||||
break
|
||||
|
||||
target_offset = int(todo.pop(0))
|
||||
if (target_offset is None or
|
||||
target_offset in self.job_done):
|
||||
continue
|
||||
cur_block, nexts = self._dis_bloc(target_offset)
|
||||
cur_block, nexts = self._dis_block(target_offset)
|
||||
todo += nexts
|
||||
blocs.add_node(cur_block)
|
||||
blocks.add_node(cur_block)
|
||||
|
||||
blocks.apply_splitting(self.symbol_pool,
|
||||
dis_block_callback=self.dis_bloc_callback,
|
||||
mn=self.arch, attrib=self.attrib,
|
||||
pool_bin=self.bin_stream)
|
||||
return blocks
|
||||
|
||||
def dis_multibloc(self, offset, blocs=None):
|
||||
"""
|
||||
DEPRECATED function
|
||||
Use dis_multiblock instead of dis_multibloc
|
||||
"""
|
||||
warnings.warn('DEPRECATION WARNING: use "dis_multiblock" instead of "dis_multibloc"')
|
||||
return self.dis_multiblock(offset, blocs)
|
||||
|
||||
blocs.apply_splitting(self.symbol_pool,
|
||||
dis_block_callback=self.dis_bloc_callback,
|
||||
mn=self.arch, attrib=self.attrib,
|
||||
pool_bin=self.bin_stream)
|
||||
return blocs
|
||||
|
|
|
|||
|
|
@ -143,7 +143,7 @@ class JitCore(object):
|
|||
|
||||
# Disassemble it
|
||||
try:
|
||||
cur_block = self.mdis.dis_bloc(addr)
|
||||
cur_block = self.mdis.dis_block(addr)
|
||||
except IOError:
|
||||
# vm_exception_flag is set
|
||||
label = self.ir_arch.symbol_pool.getby_offset_create(addr)
|
||||
|
|
|
|||
|
|
@ -15,17 +15,17 @@ cont = Container.from_string(data)
|
|||
# Test Disasm engine
|
||||
mdis = dis_x86_32(cont.bin_stream)
|
||||
## Disassembly of one block
|
||||
first_block = mdis.dis_bloc(0)
|
||||
first_block = mdis.dis_block(0)
|
||||
assert len(first_block.lines) == 5
|
||||
print first_block
|
||||
|
||||
## Disassembly of several block, with cache
|
||||
blocks = mdis.dis_multibloc(0)
|
||||
blocks = mdis.dis_multiblock(0)
|
||||
assert len(blocks) == 0
|
||||
|
||||
## Test cache
|
||||
mdis.job_done.clear()
|
||||
blocks = mdis.dis_multibloc(0)
|
||||
blocks = mdis.dis_multiblock(0)
|
||||
assert len(blocks) == 17
|
||||
## Equality between assembly lines is not yet implemented
|
||||
assert len(blocks.heads()) == 1
|
||||
|
|
@ -202,11 +202,11 @@ data2 = "31c0eb0c31c9750c31d2eb0c31ffebf831dbebf031edebfc31f6ebf031e4c3".decode(
|
|||
cont2 = Container.from_string(data2)
|
||||
mdis = dis_x86_32(cont2.bin_stream)
|
||||
## Elements to merge
|
||||
blocks = mdis.dis_multibloc(0)
|
||||
blocks = mdis.dis_multiblock(0)
|
||||
## Block alone
|
||||
blocks.add_node(mdis.dis_bloc(0x1c))
|
||||
blocks.add_node(mdis.dis_block(0x1c))
|
||||
## Bad block
|
||||
blocks.add_node(mdis.dis_bloc(len(data2)))
|
||||
blocks.add_node(mdis.dis_block(len(data2)))
|
||||
## Dump the graph before merging
|
||||
open("graph3.dot", "w").write(blocks.dot())
|
||||
## Apply merging
|
||||
|
|
@ -285,7 +285,7 @@ assert blocks.edges2constraint[(tob, newb)] == AsmConstraint.c_to
|
|||
data = "74097405b8020000007405b803000000b804000000c3".decode('hex')
|
||||
cont = Container.from_string(data)
|
||||
mdis = dis_x86_32(cont.bin_stream)
|
||||
blocks = mdis.dis_multibloc(0)
|
||||
blocks = mdis.dis_multiblock(0)
|
||||
## Check resulting disasm
|
||||
assert len(blocks.nodes()) == 6
|
||||
blocks.sanity_check()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue