private static List<SootClass> getVisibleApplicationClasses(SootMethod visibleBy) { final List<SootClass> result = new ArrayList<>(); final Iterator<SootClass> applicationClassesIterator = Scene.v().getApplicationClasses().snapshotIterator(); while (applicationClassesIterator.hasNext()) { final SootClass applicationClass = applicationClassesIterator.next(); if (applicationClass.isConcrete() && !applicationClass.isInterface() && applicationClass.isPublic() && Scene.v().getActiveHierarchy().isVisible(applicationClass, visibleBy)) { result.add(applicationClass); } } return result; }
public void loadDynamicClasses() { dynamicClasses = new ArrayList<SootClass>(); HashSet<String> dynClasses = new HashSet<String>(); dynClasses.addAll(Options.v().dynamic_class()); for (Iterator<String> pathIt = Options.v().dynamic_dir().iterator(); pathIt.hasNext();) { final String path = pathIt.next(); dynClasses.addAll(SourceLocator.v().getClassesUnder(path)); } for (Iterator<String> pkgIt = Options.v().dynamic_package().iterator(); pkgIt.hasNext();) { final String pkg = pkgIt.next(); dynClasses.addAll(SourceLocator.v().classesInDynamicPackage(pkg)); } for (String className : dynClasses) { dynamicClasses.add(loadClassAndSupport(className)); } // remove non-concrete classes that may accidentally have been loaded for (Iterator<SootClass> iterator = dynamicClasses.iterator(); iterator.hasNext();) { SootClass c = iterator.next(); if (!c.isConcrete()) { if (Options.v().verbose()) { logger.warn("dynamic class " + c.getName() + " is abstract or an interface, and it will not be considered."); } iterator.remove(); } } }
@Override public void validate(SootClass sc, List<ValidationException> exceptions) { if (sc.isConcrete()) { for (SootMethod sm : sc.getMethods()) { for (Type tp : sm.getParameterTypes()) { if (tp == null) { exceptions.add(new ValidationException(sm, "Null parameter types are invalid")); } if (tp instanceof VoidType) { exceptions.add(new ValidationException(sm, "Void parameter types are invalid")); } if (!tp.isAllowedInFinalCode()) { exceptions.add(new ValidationException(sm, "Parameter type not allowed in final code")); } } } } }
if (cl.isConcrete()) { resolve(cl.getType(), declaredType, sigType, subSig, container, targets, appOnly); newSubTypes.add(cl.getType());
} else if (!workset.add(cl)) { continue; } else if (cl.isConcrete() && canStoreClass(cl, parentClass)) { return true;
protected void handleClass(SootClass c) { boolean incedClasses = false; if (c.isConcrete()) { for (SootMethod m : c.getMethods()) { if (!m.isConcrete() && !m.isNative()) { continue; } totalMethods++; if (reachables.contains(m)) { MethodPAG mpag = MethodPAG.v(pag, m); mpag.build(); mpag.addToPAG(null); analyzedMethods++; if (!incedClasses) { incedClasses = true; classes++; } } } } }
if (clazz.isConcrete()) { allocs = class2allocs.get(clazz);
if (e.getTgt().method().getDeclaringClass().isConcrete()) { if (e.tgt().isConcrete() || e.tgt().isNative()) { MethodPAG.v(pag, e.tgt()).addToPAG(null);
public void loadDynamicClasses() { dynamicClasses = new ArrayList<SootClass>(); HashSet<String> dynClasses = new HashSet<String>(); dynClasses.addAll(Options.v().dynamic_class()); for( Iterator<String> pathIt = Options.v().dynamic_dir().iterator(); pathIt.hasNext(); ) { final String path = (String) pathIt.next(); dynClasses.addAll(SourceLocator.v().getClassesUnder(path)); } for( Iterator<String> pkgIt = Options.v().dynamic_package().iterator(); pkgIt.hasNext(); ) { final String pkg = (String) pkgIt.next(); dynClasses.addAll(SourceLocator.v().classesInDynamicPackage(pkg)); } for (String className : dynClasses) { dynamicClasses.add( loadClassAndSupport(className) ); } //remove non-concrete classes that may accidentally have been loaded for (Iterator<SootClass> iterator = dynamicClasses.iterator(); iterator.hasNext();) { SootClass c = iterator.next(); if(!c.isConcrete()) { if(Options.v().verbose()) { G.v().out.println("Warning: dynamic class "+c.getName()+" is abstract or an interface, and it will not be considered."); } iterator.remove(); } } }
public void loadDynamicClasses() { dynamicClasses = new ArrayList<SootClass>(); HashSet<String> dynClasses = new HashSet<String>(); dynClasses.addAll(Options.v().dynamic_class()); for( Iterator<String> pathIt = Options.v().dynamic_dir().iterator(); pathIt.hasNext(); ) { final String path = (String) pathIt.next(); dynClasses.addAll(SourceLocator.v().getClassesUnder(path)); } for( Iterator<String> pkgIt = Options.v().dynamic_package().iterator(); pkgIt.hasNext(); ) { final String pkg = (String) pkgIt.next(); dynClasses.addAll(SourceLocator.v().classesInDynamicPackage(pkg)); } for (String className : dynClasses) { dynamicClasses.add( loadClassAndSupport(className) ); } //remove non-concrete classes that may accidentally have been loaded for (Iterator<SootClass> iterator = dynamicClasses.iterator(); iterator.hasNext();) { SootClass c = iterator.next(); if(!c.isConcrete()) { if(Options.v().verbose()) { G.v().out.println("Warning: dynamic class "+c.getName()+" is abstract or an interface, and it will not be considered."); } iterator.remove(); } } }
/** * Gets all classes that are sub-classes of the given class / implementors of * the given interface * * @param sc The class or interface of which to get the implementors * @return The concrete implementors of the given interface / subclasses of the * given parent class */ private Collection<? extends String> getImplementorsOf(SootClass sc) { Set<String> classes = new HashSet<>(); Set<SootClass> doneSet = new HashSet<>(); List<SootClass> workList = new ArrayList<>(); workList.add(sc); while (!workList.isEmpty()) { SootClass curClass = workList.remove(0); if (!doneSet.add(curClass)) continue; if (curClass.isConcrete()) classes.add(curClass.getName()); if (sc.isInterface()) { workList.addAll(Scene.v().getActiveHierarchy().getImplementersOf(sc)); workList.addAll(Scene.v().getActiveHierarchy().getSubinterfacesOf(sc)); } else for (SootClass c : Scene.v().getActiveHierarchy().getSubclassesOf(sc)) classes.add(c.getName()); } return classes; }
if( cl.isConcrete() ) { resolve( cl.getType(), declaredType, sigType, subSig, container, targets ); subTypes.add(cl.getType());
if( cl.isConcrete() ) { resolve( cl.getType(), declaredType, sigType, subSig, container, targets ); subTypes.add(cl.getType());
SootClass cl = (SootClass) worklist.removeFirst(); if( !workset.add(cl) ) continue; if( cl.isConcrete() && canStoreClass(cl, parentClass) ) return true; worklist.addAll(getSubclassesOf(cl));
if (!clazz.isConcrete() || targetMethod == null || !targetMethod.isConcrete()) { Set<SootClass> childClasses = getAllChildClasses(clazz); if (childClasses.size() > MAX_HIERARCHY_DEPTH)
@Override public void collectCallbackMethods() { super.collectCallbackMethods(); logger.info("Collecting callbacks in FAST mode..."); // Find the mappings between classes and layouts findClassLayoutMappings(); for (SootClass sc : Scene.v().getApplicationClasses()) { if (sc.isConcrete()) { for (SootMethod sm : sc.getMethods()) { if (sm.isConcrete()) { analyzeMethodForCallbackRegistrations(null, sm); analyzeMethodForDynamicBroadcastReceiver(sm); analyzeMethodForServiceConnection(sm); } } // Check for method overrides analyzeMethodOverrideCallbacks(sc); } } }
protected void analyzeMethodOverrideCallbacks(SootClass sootClass) { if (!sootClass.isConcrete()) return; if (sootClass.isInterface())
private void analyzeClassInterfaceCallbacks(SootClass baseClass, SootClass sootClass, SootClass lifecycleElement) { if (!baseClass.isConcrete()) return;
/** * Finds the mappings between classes and their respective layout files */ private void findClassLayoutMappings() { for (SootClass sc : Scene.v().getApplicationClasses()) { if (sc.isConcrete()) { for (SootMethod sm : sc.getMethods()) { if (!sm.isConcrete()) continue; for (Unit u : sm.retrieveActiveBody().getUnits()) { if (u instanceof Stmt) { Stmt stmt = (Stmt) u; if (stmt.containsInvokeExpr()) { InvokeExpr inv = stmt.getInvokeExpr(); if (invokesSetContentView(inv)) { for (Value val : inv.getArgs()) { Integer intValue = valueProvider.getValue(sm, stmt, val, Integer.class); if (intValue != null) this.layoutClasses.put(sm.getDeclaringClass(), intValue); } } } } } } } } }
if (!clazz.isConcrete() || targetMethod == null || !targetMethod.isConcrete()) { for (SootClass parentClass : getAllParentClasses(clazz)) {