# Test block_merge data2 = "31c0eb0c31c9750c31d2eb0c31ffebf831dbebf031edebfc31f6ebf031e4c3".decode( "hex") cont2 = Container.from_string(data2) mdis = dis_x86_32(cont2.bin_stream) ## Elements to merge blocks = mdis.dis_multiblock(0) ## Block alone blocks.add_node(mdis.dis_block(0x1c)) ## Bad block blocks.add_node(mdis.dis_block(len(data2))) ## Dump the graph before merging open("graph3.dot", "w").write(blocks.dot()) ## Apply merging blocks = bbl_simplifier(blocks) ## Dump the graph after merging open("graph4.dot", "w").write(blocks.dot()) ## Check the final state assert len(blocks) == 5 assert len(list(blocks.get_bad_blocks())) == 1 ### Check "special" blocks entry_blocks = blocks.heads() bad_block = (block for block in entry_blocks if isinstance(block, AsmBlockBad)).next() entry_blocks.remove(bad_block) alone_block = (block for block in entry_blocks if len(blocks.successors(block)) == 0).next() entry_blocks.remove(alone_block) assert alone_block.lines[-1].name == "RET" assert len(alone_block.lines) == 2
# Test block_merge data2 = "31c0eb0c31c9750c31d2eb0c31ffebf831dbebf031edebfc31f6ebf031e4c3".decode( "hex") cont2 = Container.from_string(data2) mdis = machine.dis_engine(cont2.bin_stream, loc_db=cont2.loc_db) ## Elements to merge asmcfg = mdis.dis_multiblock(0) ## Block alone asmcfg.add_block(mdis.dis_block(0x1c)) ## Bad block asmcfg.add_block(mdis.dis_block(len(data2))) ## Dump the graph before merging open("graph3.dot", "w").write(asmcfg.dot()) ## Apply merging asmcfg = bbl_simplifier(asmcfg) ## Dump the graph after merging open("graph4.dot", "w").write(asmcfg.dot()) ## Check the final state assert len(asmcfg) == 5 assert len(list(asmcfg.get_bad_blocks())) == 1 ### Check "special" asmcfg entry_asmcfg = asmcfg.heads() bad_block_lbl = ( lbl for lbl in entry_asmcfg if isinstance(asmcfg.loc_key_to_block(lbl), AsmBlockBad)).next() entry_asmcfg.remove(bad_block_lbl) alone_block = (asmcfg.loc_key_to_block(lbl) for lbl in entry_asmcfg if len(asmcfg.successors(lbl)) == 0).next() entry_asmcfg.remove(alone_block.loc_key) assert alone_block.lines[-1].name == "RET"
blocks.sanity_check() # Test block_merge data2 = "31c0eb0c31c9750c31d2eb0c31ffebf831dbebf031edebfc31f6ebf031e4c3".decode("hex") cont2 = Container.from_string(data2) mdis = dis_x86_32(cont2.bin_stream) ## Elements to merge blocks = mdis.dis_multibloc(0) ## Block alone blocks.add_node(mdis.dis_bloc(0x1c)) ## Bad block blocks.add_node(mdis.dis_bloc(len(data2))) ## Dump the graph before merging open("graph3.dot", "w").write(blocks.dot()) ## Apply merging blocks = bbl_simplifier(blocks) ## Dump the graph after merging open("graph4.dot", "w").write(blocks.dot()) ## Check the final state assert len(blocks) == 5 assert len(list(blocks.get_bad_blocks())) == 1 ### Check "special" blocks entry_blocks = blocks.heads() bad_block = (block for block in entry_blocks if isinstance(block, AsmBlockBad)).next() entry_blocks.remove(bad_block) alone_block = (block for block in entry_blocks if len(blocks.successors(block)) == 0).next() entry_blocks.remove(alone_block) assert alone_block.lines[-1].name == "RET" assert len(alone_block.lines) == 2
asmcfg.sanity_check() # Test block_merge data2 = "31c0eb0c31c9750c31d2eb0c31ffebf831dbebf031edebfc31f6ebf031e4c3".decode("hex") cont2 = Container.from_string(data2) mdis = dis_x86_32(cont2.bin_stream) ## Elements to merge asmcfg = mdis.dis_multiblock(0) ## Block alone asmcfg.add_block(mdis.dis_block(0x1c)) ## Bad block asmcfg.add_block(mdis.dis_block(len(data2))) ## Dump the graph before merging open("graph3.dot", "w").write(asmcfg.dot()) ## Apply merging asmcfg = bbl_simplifier(asmcfg) ## Dump the graph after merging open("graph4.dot", "w").write(asmcfg.dot()) ## Check the final state assert len(asmcfg) == 5 assert len(list(asmcfg.get_bad_blocks())) == 1 ### Check "special" asmcfg entry_asmcfg = asmcfg.heads() bad_block_lbl = (lbl for lbl in entry_asmcfg if isinstance(asmcfg.loc_key_to_block(lbl), AsmBlockBad)).next() entry_asmcfg.remove(bad_block_lbl) alone_block = (asmcfg.loc_key_to_block(lbl) for lbl in entry_asmcfg if len(asmcfg.successors(lbl)) == 0).next() entry_asmcfg.remove(alone_block.loc_key) assert alone_block.lines[-1].name == "RET" assert len(alone_block.lines) == 2