private static Set<BasicBlock> getAllBasicBlocks(Statement stat) { List<Statement> lst = new LinkedList<>(); lst.add(stat); int index = 0; do { Statement st = lst.get(index); if (st.type == Statement.TYPE_BASICBLOCK) { index++; } else { lst.addAll(st.getStats()); lst.remove(index); } } while (index < lst.size()); Set<BasicBlock> res = new HashSet<>(); for (Statement st : lst) { res.add(((BasicBlockStatement)st).getBlock()); } return res; }
private static void addDeletedGotoInstructionMapping(Statement stat, BytecodeMappingTracer tracer) { if (stat instanceof BasicBlockStatement) { BasicBlock block = ((BasicBlockStatement)stat).getBlock(); List<Integer> offsets = block.getInstrOldOffsets(); if (!offsets.isEmpty() && offsets.size() > block.getSeq().length()) { // some instructions have been deleted, but we still have offsets tracer.addMapping(offsets.get(offsets.size() - 1)); // add the last offset } } }
private static int getStatementSize(Statement statement) { int res; if (statement.type == Statement.TYPE_BASICBLOCK) { res = ((BasicBlockStatement)statement).getBlock().getSeq().length(); } else { res = statement.getStats().stream().mapToInt(IrreducibleCFGDeobfuscator::getStatementSize).sum(); } return res; }
int[] values = ((SwitchInstruction)bbstat.getBlock().getLastInstruction()).getValues();
private void mapMonitorExitInstr(BytecodeMappingTracer tracer) { BasicBlock block = body.getBasichead().getBlock(); if (!block.getSeq().isEmpty() && block.getLastInstruction().opcode == CodeConstants.opc_monitorexit) { Integer offset = block.getOldOffset(block.size() - 1); if (offset > -1) tracer.addMapping(offset); } }
BasicBlock firstBasicBlock = firstBlockStatement.getBlock(); Instruction instrFirst = firstBasicBlock.getInstruction(0); if (blockStatement != null && blockStatement.getBlock() != null) { Statement handler = fstat.getHandler(); for (StatEdge edge : blockStatement.getSuccessorEdges(Statement.STATEDGE_DIRECT_ALL)) { if (edge.getType() != StatEdge.TYPE_REGULAR && handler.containsStatement(blockStatement) && !handler.containsStatement(edge.getDestination())) { Boolean existingFlag = mapLast.get(blockStatement.getBlock()); mapLast.put(blockStatement.getBlock(), isTrueExit); break;
case TYPE_BASICBLOCK: BasicBlockStatement bblock = (BasicBlockStatement)this; InstructionSequence seq = bblock.getBlock().getSeq();
Statement stat = stats.get(i); BasicBlock block = stat.getBasichead().getBlock(); if (!block.getSeq().isEmpty() && block.getInstruction(0).opcode == CodeConstants.opc_astore) { Integer offset = block.getOldOffset(0);
StructBootstrapMethodsAttribute bootstrap = cl.getAttribute(StructGeneralAttribute.ATTRIBUTE_BOOTSTRAP_METHODS); BasicBlock block = stat.getBlock();
private static HashSet<BasicBlock> getAllBasicBlocks(Statement stat) { List<Statement> lst = new LinkedList<>(); lst.add(stat); int index = 0; do { Statement st = lst.get(index); if (st.type == Statement.TYPE_BASICBLOCK) { index++; } else { lst.addAll(st.getStats()); lst.remove(index); } } while (index < lst.size()); HashSet<BasicBlock> res = new HashSet<>(); for (Statement st : lst) { res.add(((BasicBlockStatement)st).getBlock()); } return res; }
private static void addDeletedGotoInstructionMapping(Statement stat, BytecodeMappingTracer tracer) { if (stat instanceof BasicBlockStatement) { BasicBlock block = ((BasicBlockStatement)stat).getBlock(); List<Integer> offsets = block.getInstrOldOffsets(); if (!offsets.isEmpty() && offsets.size() > block.getSeq().length()) { // some instructions have been deleted, but we still have offsets tracer.addMapping(offsets.get(offsets.size() - 1)); // add the last offset } } }
private static int getStatementSize(Statement statement) { int res; if (statement.type == Statement.TYPE_BASICBLOCK) { res = ((BasicBlockStatement)statement).getBlock().getSeq().length(); } else { res = statement.getStats().stream().mapToInt(IrreducibleCFGDeobfuscator::getStatementSize).sum(); } return res; }
private void mapMonitorExitInstr(BytecodeMappingTracer tracer) { BasicBlock block = body.getBasichead().getBlock(); if (!block.getSeq().isEmpty() && block.getLastInstruction().opcode == CodeConstants.opc_monitorexit) { Integer offset = block.getOldOffset(block.size() - 1); if (offset > -1) tracer.addMapping(offset); } }
BasicBlock firstBasicBlock = firstBlockStatement.getBlock(); Instruction instrFirst = firstBasicBlock.getInstruction(0); if (blockStatement != null && blockStatement.getBlock() != null) { Statement handler = fstat.getHandler(); for (StatEdge edge : blockStatement.getSuccessorEdges(Statement.STATEDGE_DIRECT_ALL)) { if (edge.getType() != StatEdge.TYPE_REGULAR && handler.containsStatement(blockStatement) && !handler.containsStatement(edge.getDestination())) { Boolean existingFlag = mapLast.get(blockStatement.getBlock()); mapLast.put(blockStatement.getBlock(), isTrueExit); break;
case TYPE_BASICBLOCK: BasicBlockStatement bblock = (BasicBlockStatement)this; InstructionSequence seq = bblock.getBlock().getSeq();
Statement stat = stats.get(i); BasicBlock block = stat.getBasichead().getBlock(); if (!block.getSeq().isEmpty() && block.getInstruction(0).opcode == CodeConstants.opc_astore) { Integer offset = block.getOldOffset(0);