Java 类soot.jimple.infoflow.data.SootMethodAndClass 实例源码
项目:cheetah
文件:SetupApplicationJIT.java
private void collectClassEntryPoints(String className) {
AnalyzeJimpleClassJIT jimpleClass = new AnalyzeJimpleClassJIT(androidCallbacks);
jimpleClass.collectCallbackMethodsForClass(className);
// Run the soot-based operations
PackManager.v().getPack("wjpp").apply();
PackManager.v().getPack("cg").apply();
PackManager.v().getPack("wjtp").apply();
// Collect the results of the soot-based phases
for (Entry<String, Set<SootMethodAndClass>> entry : jimpleClass.getCallbackMethods().entrySet()) {
if (this.callbackMethods.containsKey(entry.getKey())) {
this.callbackMethods.get(entry.getKey()).addAll(entry.getValue());
} else {
this.callbackMethods.put(entry.getKey(), new HashSet<>(entry.getValue()));
}
}
entrypoints.addAll(jimpleClass.getDynamicManifestComponents());
Set<SootMethodAndClass> callbacks = new HashSet<>();
for (Set<SootMethodAndClass> methods : this.callbackMethods.values())
callbacks.addAll(methods);
sourceSinkManager.setCallbacks(callbacks);
}
项目:JAADAS
文件:AnalyzeJimpleClass.java
/**
* Incrementally collects the callback methods for all Android default
* handlers implemented in the source code. This just processes the contents
* of the worklist.
* Note that this operation runs inside Soot, so this method only registers
* a new phase that will be executed when Soot is next run
*/
public void collectCallbackMethodsIncremental() {
Transform transform = new Transform("wjtp.ajc", new SceneTransformer() {
protected void internalTransform(String phaseName, @SuppressWarnings("rawtypes") Map options) {
// Process the worklist from last time
System.out.println("Running incremental callback analysis for " + callbackWorklist.size()
+ " components...");
MultiMap<String, SootMethodAndClass> workListCopy =
new HashMultiMap<String, SootMethodAndClass>(callbackWorklist);
for (String className : workListCopy.keySet()) {
List<MethodOrMethodContext> entryClasses = new LinkedList<MethodOrMethodContext>();
for (SootMethodAndClass am : workListCopy.get(className))
entryClasses.add(Scene.v().getMethod(am.getSignature()));
analyzeRechableMethods(Scene.v().getSootClass(className), entryClasses);
callbackWorklist.remove(className);
}
System.out.println("Incremental callback analysis done.");
}
});
PackManager.v().getPack("wjtp").add(transform);
}
项目:cheetah
文件:SetupApplicationJIT.java
public SetupApplicationJIT(String apkFileLocation, String sootCP,
ISourceSinkDefinitionProvider sourceSinkProvider) {
this.apkFileLocation = apkFileLocation;
this.sootCP = sootCP;
try {
// Load Android callbacks
this.androidCallbacks = Activator.getDefault().getAndroidCallbacks();
// Process manifest
ProcessManifest processMan = new ProcessManifest(apkFileLocation);
this.appPackageName = processMan.getPackageName();
this.entrypoints = processMan.getEntryPointClasses();
// Parse the resource file
ARSCFileParser resParser = new ARSCFileParser();
resParser.parse(apkFileLocation);
this.resourcePackages = resParser.getPackages();
// LayoutFileParser
LayoutFileParser lfp = new LayoutFileParser(this.appPackageName, resParser);
lfp.parseLayoutFile(apkFileLocation, entrypoints);
// Create the SourceSinkManager
Set<SootMethodAndClass> callbacks = new HashSet<>();
for (Set<SootMethodAndClass> methods : this.callbackMethods.values())
callbacks.addAll(methods);
sourceSinkManager = new AccessPathBasedSourceSinkManager(sourceSinkProvider.getSources(),
sourceSinkProvider.getSinks(), callbacks, LayoutMatchingMode.MatchSensitiveOnly,
lfp == null ? null : lfp.getUserControlsByID());
sourceSinkManager.setAppPackageName(this.appPackageName);
sourceSinkManager.setResourcePackages(this.resourcePackages);
sourceSinkManager.setEnableCallbackSources(true);
} catch (IOException | XmlPullParserException e) {
LOGGER.error("Error initializing " + apkFileLocation);
}
}
项目:cheetah
文件:SetupApplicationJIT.java
/***** Entry points calculation *****/
private AndroidEntryPointCreatorJIT createEntryPointCreator() {
AndroidEntryPointCreatorJIT entryPointCreator = new AndroidEntryPointCreatorJIT(
new ArrayList<String>(this.entrypoints));
Map<String, List<String>> callbackMethodSigs = new HashMap<String, List<String>>();
for (String className : this.callbackMethods.keySet()) {
List<String> methodSigs = new ArrayList<String>();
callbackMethodSigs.put(className, methodSigs);
for (SootMethodAndClass am : this.callbackMethods.get(className))
methodSigs.add(am.getSignature());
}
entryPointCreator.setCallbackFunctions(callbackMethodSigs);
return entryPointCreator;
}
项目:JAADAS
文件:AndroidMethod.java
/***
* Static method to create AndroidMethod from Soot method signature
*
* @param signature The Soot method signature
* @return The new AndroidMethod object
*/
public static AndroidMethod createFromSignature(String signature) {
if (!signature.startsWith("<"))
signature = "<" + signature;
if (!signature.endsWith(">"))
signature = signature + ">";
SootMethodAndClass smac = SootMethodRepresentationParser.v()
.parseSootMethodString(signature);
return new AndroidMethod(smac.getMethodName(), smac.getParameters(),
smac.getReturnType(), smac.getClassName());
}
项目:JAADAS
文件:SourceSinkDefinition.java
/**
* Creates a new instance of the MethodSourceSinkDefinition class
* @param am The method for which this object defines sources and sinks
* @param baseObjects The source and sink definitions for the base object on
* which a method of this class is invoked
* @param parameters The source and sink definitions for parameters of
* the current method
* @param returnValues The source definitions for the return value of the
* current method
*/
public SourceSinkDefinition(SootMethodAndClass am,
Set<AccessPathTuple> baseObjects,
Set<AccessPathTuple>[] parameters,
Set<AccessPathTuple> returnValues) {
this.method = am;
this.baseObjects = baseObjects == null || baseObjects.isEmpty()
? null : baseObjects;
this.parameters = parameters;
this.returnValues = returnValues == null || returnValues.isEmpty()
? null : returnValues;
}
项目:JAADAS
文件:SetupApplication.java
/**
* Adds a method to the set of callback method
*
* @param layoutClass
* The layout class for which to register the callback
* @param callbackMethod
* The callback method to register
*/
private void addCallbackMethod(String layoutClass, AndroidMethod callbackMethod) {
Set<SootMethodAndClass> methods = this.callbackMethods.get(layoutClass);
if (methods == null) {
methods = new HashSet<SootMethodAndClass>();
this.callbackMethods.put(layoutClass, methods);
}
methods.add(new AndroidMethod(callbackMethod));
}
项目:JAADAS
文件:SetupApplication.java
private AndroidEntryPointCreator createEntryPointCreator() {
AndroidEntryPointCreator entryPointCreator = new AndroidEntryPointCreator(new ArrayList<String>(
this.entrypoints));
Map<String, List<String>> callbackMethodSigs = new HashMap<String, List<String>>();
for (String className : this.callbackMethods.keySet()) {
List<String> methodSigs = new ArrayList<String>();
callbackMethodSigs.put(className, methodSigs);
for (SootMethodAndClass am : this.callbackMethods.get(className))
methodSigs.add(am.getSignature());
}
entryPointCreator.setCallbackFunctions(callbackMethodSigs);
return entryPointCreator;
}
项目:JAADAS
文件:SootMethodRepresentationParser.java
/**
* parses a string in soot representation, for example:
* <soot.jimple.infoflow.test.TestNoMain: java.lang.String function1()>
* <soot.jimple.infoflow.test.TestNoMain: void functionCallOnObject()>
* <soot.jimple.infoflow.test.TestNoMain: java.lang.String function2(java.lang.String,java.lang.String)>
* @param parseString The method signature to parse
*/
public SootMethodAndClass parseSootMethodString(String parseString){
if(!parseString.startsWith("<") || !parseString.endsWith(">")){
throw new IllegalArgumentException("Illegal format of " +parseString +" (should use soot method representation)");
}
String name = "";
String className = "";
String returnType = "";
Pattern pattern = Pattern.compile("<(.*?):");
Matcher matcher = pattern.matcher(parseString);
if(matcher.find()){
className = matcher.group(1);
}
pattern = Pattern.compile(": (.*?) ");
matcher = pattern.matcher(parseString);
if(matcher.find()){
returnType = matcher.group(1);
//remove the string contents that are already found so easier regex is possible
parseString = parseString.substring(matcher.end(1));
}
pattern = Pattern.compile(" (.*?)\\(");
matcher = pattern.matcher(parseString);
if(matcher.find()){
name = matcher.group(1);
}
List<String> paramList = new ArrayList<String>();
pattern = Pattern.compile("\\((.*?)\\)");
matcher = pattern.matcher(parseString);
if(matcher.find()){
String params = matcher.group(1);
for (String param : params.split(","))
paramList.add(param.trim());
}
return new SootMethodAndClass(name, className, returnType, paramList);
}
项目:JAADAS
文件:MethodRepresentationTests.java
@Test(timeout=300000)
public void testParser(){
String s = "<soot.jimple.infoflow.test.TestNoMain: java.lang.String function1()>";
SootMethodRepresentationParser parser = SootMethodRepresentationParser.v();
SootMethodAndClass result = parser.parseSootMethodString(s);
assertEquals("soot.jimple.infoflow.test.TestNoMain", result.getClassName());
assertEquals("function1", result.getMethodName());
assertEquals("java.lang.String", result.getReturnType());
}
项目:ic3-dialdroid
文件:SetupApplication.java
/**
* Adds a method to the set of callback method
*
* @param layoutClass The layout class for which to register the callback
* @param callbackMethod The callback method to register
*/
private void addCallbackMethod(String layoutClass, AndroidMethod callbackMethod) {
Set<SootMethodAndClass> methods = this.callbackMethods.get(layoutClass);
if (methods == null) {
methods = new HashSet<SootMethodAndClass>();
this.callbackMethods.put(layoutClass, methods);
}
methods.add(new AndroidMethod(callbackMethod));
}
项目:ic3-dialdroid
文件:SetupApplication.java
public AndroidEntryPointCreator createEntryPointCreator() {
AndroidEntryPointCreator entryPointCreator =
new AndroidEntryPointCreator(new ArrayList<String>(this.entrypoints));
Map<String, List<String>> callbackMethodSigs = new HashMap<String, List<String>>();
for (String className : this.callbackMethods.keySet()) {
List<String> methodSigs = new ArrayList<String>();
callbackMethodSigs.put(className, methodSigs);
for (SootMethodAndClass am : this.callbackMethods.get(className)) {
methodSigs.add(am.getSignature());
}
}
entryPointCreator.setCallbackFunctions(callbackMethodSigs);
return entryPointCreator;
}
项目:ic3
文件:SetupApplication.java
/**
* Adds a method to the set of callback method
*
* @param layoutClass The layout class for which to register the callback
* @param callbackMethod The callback method to register
*/
private void addCallbackMethod(String layoutClass, AndroidMethod callbackMethod) {
Set<SootMethodAndClass> methods = this.callbackMethods.get(layoutClass);
if (methods == null) {
methods = new HashSet<SootMethodAndClass>();
this.callbackMethods.put(layoutClass, methods);
}
methods.add(new AndroidMethod(callbackMethod));
}
项目:ic3
文件:SetupApplication.java
public AndroidEntryPointCreator createEntryPointCreator() {
AndroidEntryPointCreator entryPointCreator =
new AndroidEntryPointCreator(new ArrayList<String>(this.entrypoints));
Map<String, List<String>> callbackMethodSigs = new HashMap<String, List<String>>();
for (String className : this.callbackMethods.keySet()) {
List<String> methodSigs = new ArrayList<String>();
callbackMethodSigs.put(className, methodSigs);
for (SootMethodAndClass am : this.callbackMethods.get(className)) {
methodSigs.add(am.getSignature());
}
}
entryPointCreator.setCallbackFunctions(callbackMethodSigs);
return entryPointCreator;
}
项目:soot-inflow
文件:SootMethodRepresentationParser.java
/**
* parses a string in soot representation, for example:
* <soot.jimple.infoflow.test.TestNoMain: java.lang.String function1()>
* <soot.jimple.infoflow.test.TestNoMain: void functionCallOnObject()>
* <soot.jimple.infoflow.test.TestNoMain: java.lang.String function2(java.lang.String,java.lang.String)>
* @param parseString The method signature to parse
*/
public SootMethodAndClass parseSootMethodString(String parseString){
if(!parseString.startsWith("<") || !parseString.endsWith(">")){
throw new IllegalArgumentException("Illegal format of " +parseString +" (should use soot method representation)");
}
String name = "";
String className = "";
String returnType = "";
Pattern pattern = Pattern.compile("<(.*?):");
Matcher matcher = pattern.matcher(parseString);
if(matcher.find()){
className = matcher.group(1);
}
pattern = Pattern.compile(": (.*?) ");
matcher = pattern.matcher(parseString);
if(matcher.find()){
returnType = matcher.group(1);
//remove the string contents that are already found so easier regex is possible
parseString = parseString.substring(matcher.end(1));
}
pattern = Pattern.compile(" (.*?)\\(");
matcher = pattern.matcher(parseString);
if(matcher.find()){
name = matcher.group(1);
}
List<String> paramList = new ArrayList<String>();
pattern = Pattern.compile("\\((.*?)\\)");
matcher = pattern.matcher(parseString);
if(matcher.find()){
String params = matcher.group(1);
for (String param : params.split(","))
paramList.add(param.trim());
}
return new SootMethodAndClass(name, className, returnType, paramList);
}
项目:soot-inflow
文件:MethodRepresentationTests.java
@Test(timeout=300000)
public void testParser(){
String s = "<soot.jimple.infoflow.test.TestNoMain: java.lang.String function1()>";
SootMethodRepresentationParser parser = SootMethodRepresentationParser.v();
SootMethodAndClass result = parser.parseSootMethodString(s);
assertEquals("soot.jimple.infoflow.test.TestNoMain", result.getClassName());
assertEquals("function1", result.getMethodName());
assertEquals("java.lang.String", result.getReturnType());
}
项目:cheetah
文件:AnalyzeJimpleClassJIT.java
public Map<String, Set<SootMethodAndClass>> getCallbackMethods() {
return this.callbackMethods;
}
项目:cheetah
文件:AndroidEntryPointCreatorJIT.java
private void addApplicationCallbackMethods(Body body) {
if (!this.callbackFunctions.containsKey(applicationClass.getName()))
return;
// Do not try to generate calls to methods in non-concrete classes
if (applicationClass.isAbstract())
return;
if (applicationClass.isPhantom()) {
System.err.println("Skipping possible application callbacks in " + "phantom class " + applicationClass);
return;
}
for (String methodSig : this.callbackFunctions.get(applicationClass.getName())) {
SootMethodAndClass methodAndClass = SootMethodRepresentationParser.v().parseSootMethodString(methodSig);
// We do not consider lifecycle methods which are directly inserted
// at their respective positions
if (AndroidEntryPointConstants.getApplicationLifecycleMethods().contains(methodAndClass.getSubSignature()))
continue;
SootMethod method = findMethod(Scene.v().getSootClass(methodAndClass.getClassName()),
methodAndClass.getSubSignature());
// If we found no implementation or if the implementation we found
// is in a system class, we skip it. Note that null methods may
// happen since all callback interfaces for application callbacks
// are registered under the name of the application class.
if (method == null)
continue;
if (method.getDeclaringClass().getName().startsWith("android.")
|| method.getDeclaringClass().getName().startsWith("java."))
continue;
// Get the local instance of the target class
Local local = this.localVarsForClasses.get(methodAndClass.getClassName());
if (local == null) {
System.err.println(
"Could not create call to application callback " + method.getSignature() + ". Local was null.");
continue;
}
// Add a conditional call to the method
JNopStmt thenStmt = new JNopStmt();
createIfStmt(thenStmt, body);
buildMethodCall(method, body, local, generator);
body.getUnits().add(thenStmt);
}
}
项目:JAADAS
文件:AndroidMethod.java
public AndroidMethod(SootMethodAndClass methodAndClass) {
super(methodAndClass);
this.permissions = Collections.emptySet();
}
项目:JAADAS
文件:SourceSinkDefinition.java
/**
* Creates a new instance of the MethodSourceSinkDefinition class
*/
public SourceSinkDefinition(SootMethodAndClass am) {
this(am, null, null, null);
}
项目:JAADAS
文件:AnalyzeJimpleClass.java
public Map<String, Set<SootMethodAndClass>> getCallbackMethods() {
return this.callbackMethods;
}
项目:JAADAS
文件:AndroidEntryPointCreator.java
/**
* Adds calls to the callback methods defined in the application class
* @param applicationClass The class in which the user-defined application
* is implemented
* @param applicationLocal The local containing the instance of the
* user-defined application
*/
private void addApplicationCallbackMethods() {
if (!this.callbackFunctions.containsKey(applicationClass.getName()))
return;
// Do not try to generate calls to methods in non-concrete classes
if (applicationClass.isAbstract())
return;
if (applicationClass.isPhantom()) {
System.err.println("Skipping possible application callbacks in "
+ "phantom class " + applicationClass);
return;
}
for (String methodSig : this.callbackFunctions.get(applicationClass.getName())) {
SootMethodAndClass methodAndClass = SootMethodRepresentationParser.v().parseSootMethodString(methodSig);
// We do not consider lifecycle methods which are directly inserted
// at their respective positions
if (AndroidEntryPointConstants.getApplicationLifecycleMethods().contains
(methodAndClass.getSubSignature()))
continue;
SootMethod method = findMethod(Scene.v().getSootClass(methodAndClass.getClassName()),
methodAndClass.getSubSignature());
// If we found no implementation or if the implementation we found
// is in a system class, we skip it. Note that null methods may
// happen since all callback interfaces for application callbacks
// are registered under the name of the application class.
if (method == null)
continue;
if (method.getDeclaringClass().getName().startsWith("android.")
|| method.getDeclaringClass().getName().startsWith("java."))
continue;
// Get the local instance of the target class
Local local = this.localVarsForClasses.get(methodAndClass.getClassName());
if (local == null) {
System.err.println("Could not create call to application callback "
+ method.getSignature() + ". Local was null.");
continue;
}
// Add a conditional call to the method
JNopStmt thenStmt = new JNopStmt();
createIfStmt(thenStmt);
buildMethodCall(method, body, local, generator);
body.getUnits().add(thenStmt);
}
}
项目:JAADAS
文件:DefaultEntryPointCreator.java
@Override
protected SootMethod createDummyMainInternal(SootMethod mainMethod) {
Map<String, Set<String>> classMap =
SootMethodRepresentationParser.v().parseClassNames(methodsToCall, false);
// create new class:
Body body = mainMethod.getActiveBody();
LocalGenerator generator = new LocalGenerator(body);
HashMap<String, Local> localVarsForClasses = new HashMap<String, Local>();
// create constructors:
for(String className : classMap.keySet()){
SootClass createdClass = Scene.v().forceResolve(className, SootClass.BODIES);
createdClass.setApplicationClass();
Local localVal = generateClassConstructor(createdClass, body);
if (localVal == null) {
logger.warn("Cannot generate constructor for class: {}", createdClass);
continue;
}
localVarsForClasses.put(className, localVal);
}
// add entrypoint calls
int conditionCounter = 0;
JNopStmt startStmt = new JNopStmt();
JNopStmt endStmt = new JNopStmt();
Value intCounter = generator.generateLocal(IntType.v());
body.getUnits().add(startStmt);
for (Entry<String, Set<String>> entry : classMap.entrySet()){
Local classLocal = localVarsForClasses.get(entry.getKey());
for (String method : entry.getValue()){
SootMethodAndClass methodAndClass =
SootMethodRepresentationParser.v().parseSootMethodString(method);
SootMethod currentMethod = findMethod(Scene.v().getSootClass(methodAndClass.getClassName()),
methodAndClass.getSubSignature());
if (currentMethod == null) {
logger.warn("Entry point not found: {}", method);
continue;
}
JEqExpr cond = new JEqExpr(intCounter, IntConstant.v(conditionCounter));
conditionCounter++;
JNopStmt thenStmt = new JNopStmt();
JIfStmt ifStmt = new JIfStmt(cond, thenStmt);
body.getUnits().add(ifStmt);
buildMethodCall(currentMethod, body, classLocal, generator);
body.getUnits().add(thenStmt);
}
}
body.getUnits().add(endStmt);
JGotoStmt gotoStart = new JGotoStmt(startStmt);
body.getUnits().add(gotoStart);
body.getUnits().add(Jimple.v().newReturnVoidStmt());
NopEliminator.v().transform(body);
eliminateSelfLoops(body);
return mainMethod;
}
项目:JAADAS
文件:SequentialEntryPointCreator.java
@Override
protected SootMethod createDummyMainInternal(SootMethod mainMethod) {
Map<String, Set<String>> classMap =
SootMethodRepresentationParser.v().parseClassNames(methodsToCall, false);
// create new class:
Body body = mainMethod.getActiveBody();
LocalGenerator generator = new LocalGenerator(body);
// Create the classes
for (String className : classMap.keySet()) {
SootClass createdClass = Scene.v().forceResolve(className, SootClass.BODIES);
createdClass.setApplicationClass();
Local localVal = generateClassConstructor(createdClass, body);
if (localVal == null) {
logger.warn("Cannot generate constructor for class: {}", createdClass);
continue;
}
// Create the method calls
for (String method : classMap.get(className)) {
SootMethodAndClass methodAndClass =
SootMethodRepresentationParser.v().parseSootMethodString(method);
SootMethod methodToInvoke = findMethod(Scene.v().getSootClass(
methodAndClass.getClassName()), methodAndClass.getSubSignature());
if (methodToInvoke == null)
System.err.println("Method " + methodAndClass + " not found, skipping");
else if (methodToInvoke.isConcrete()) {
// Load the method
methodToInvoke.retrieveActiveBody();
buildMethodCall(methodToInvoke, body, localVal, generator);
}
}
}
// Jimple needs an explicit return statement
body.getUnits().add(Jimple.v().newReturnVoidStmt());
return mainMethod;
}
项目:ic3-dialdroid
文件:SetupApplication.java
private void calculateCallbackMethods(ARSCFileParser resParser, LayoutFileParser lfp)
throws IOException {
AbstractCallbackAnalyzer jimpleClass = null;
boolean hasChanged = true;
while (hasChanged) {
hasChanged = false;
// Create the new iteration of the main method
soot.G.reset();
initializeSoot(true);
createMainMethod();
if (jimpleClass == null) {
// Collect the callback interfaces implemented in the app's
// source code
jimpleClass =
callbackClasses == null ? new DefaultCallbackAnalyzer(config, entrypoints, callbackFile)
: new DefaultCallbackAnalyzer(config, entrypoints, callbackClasses);
jimpleClass.collectCallbackMethods();
// Find the user-defined sources in the layout XML files. This
// only needs to be done once, but is a Soot phase.
lfp.parseLayoutFile(apkFileLocation);
} else {
jimpleClass.collectCallbackMethodsIncremental();
}
// Run the soot-based operations
PackManager.v().getPack("wjpp").apply();
PackManager.v().getPack("cg").apply();
PackManager.v().getPack("wjtp").apply();
// Collect the results of the soot-based phases
for (Entry<String, Set<SootMethodAndClass>> entry : jimpleClass.getCallbackMethods()
.entrySet()) {
Set<SootMethodAndClass> curCallbacks = this.callbackMethods.get(entry.getKey());
if (curCallbacks != null) {
if (curCallbacks.addAll(entry.getValue())) {
hasChanged = true;
}
} else {
this.callbackMethods.put(entry.getKey(), new HashSet<>(entry.getValue()));
hasChanged = true;
}
}
if (entrypoints.addAll(jimpleClass.getDynamicManifestComponents())) {
hasChanged = true;
}
}
// Collect the XML-based callback methods
collectXmlBasedCallbackMethods(resParser, lfp, jimpleClass);
}
项目:ic3-dialdroid
文件:SetupApplication.java
/**
* Collects the XML-based callback methods, e.g., Button.onClick() declared in layout XML files
*
* @param resParser The ARSC resource parser
* @param lfp The layout file parser
* @param jimpleClass The analysis class that gives us a mapping between layout IDs and components
*/
private void collectXmlBasedCallbackMethods(ARSCFileParser resParser, LayoutFileParser lfp,
AbstractCallbackAnalyzer jimpleClass) {
// Collect the XML-based callback methods
for (Entry<String, Set<Integer>> lcentry : jimpleClass.getLayoutClasses().entrySet()) {
final SootClass callbackClass = Scene.v().getSootClass(lcentry.getKey());
for (Integer classId : lcentry.getValue()) {
AbstractResource resource = resParser.findResource(classId);
if (resource instanceof StringResource) {
final String layoutFileName = ((StringResource) resource).getValue();
// Add the callback methods for the given class
Set<String> callbackMethods = lfp.getCallbackMethods().get(layoutFileName);
if (callbackMethods != null) {
for (String methodName : callbackMethods) {
final String subSig = "void " + methodName + "(android.view.View)";
// The callback may be declared directly in the
// class
// or in one of the superclasses
SootClass currentClass = callbackClass;
while (true) {
SootMethod callbackMethod = currentClass.getMethodUnsafe(subSig);
if (callbackMethod != null) {
addCallbackMethod(callbackClass.getName(), new AndroidMethod(callbackMethod));
break;
}
if (!currentClass.hasSuperclass()) {
System.err.println("Callback method " + methodName + " not found in class "
+ callbackClass.getName());
break;
}
currentClass = currentClass.getSuperclass();
}
}
}
// For user-defined views, we need to emulate their
// callbacks
Set<LayoutControl> controls = lfp.getUserControls().get(layoutFileName);
if (controls != null) {
for (LayoutControl lc : controls) {
registerCallbackMethodsForView(callbackClass, lc);
}
}
} else {
System.err.println("Unexpected resource type for layout class");
}
}
}
// Add the callback methods as sources and sinks
{
Set<SootMethodAndClass> callbacksPlain = new HashSet<SootMethodAndClass>();
for (Set<SootMethodAndClass> set : this.callbackMethods.values()) {
callbacksPlain.addAll(set);
}
System.out.println("Found " + callbacksPlain.size() + " callback methods for "
+ this.callbackMethods.size() + " components");
}
}
项目:soot-inflow
文件:AndroidEntryPointCreator.java
/**
* Adds calls to the callback methods defined in the application class
* @param applicationClass The class in which the user-defined application
* is implemented
* @param applicationLocal The local containing the instance of the
* user-defined application
*/
private void addApplicationCallbackMethods() {
if (!this.callbackFunctions.containsKey(applicationClass.getName()))
return;
// Do not try to generate calls to methods in non-concrete classes
if (applicationClass.isAbstract())
return;
if (applicationClass.isPhantom()) {
System.err.println("Skipping possible application callbacks in "
+ "phantom class " + applicationClass);
return;
}
for (String methodSig : this.callbackFunctions.get(applicationClass.getName())) {
SootMethodAndClass methodAndClass = SootMethodRepresentationParser.v().parseSootMethodString(methodSig);
// We do not consider lifecycle methods which are directly inserted
// at their respective positions
if (AndroidEntryPointConstants.getApplicationLifecycleMethods().contains
(methodAndClass.getSubSignature()))
continue;
SootMethod method = findMethod(Scene.v().getSootClass(methodAndClass.getClassName()),
methodAndClass.getSubSignature());
// If we found no implementation or if the implementation we found
// is in a system class, we skip it. Note that null methods may
// happen since all callback interfaces for application callbacks
// are registered under the name of the application class.
if (method == null)
continue;
if (method.getDeclaringClass().getName().startsWith("android.")
|| method.getDeclaringClass().getName().startsWith("java."))
continue;
// Get the local instance of the target class
Local local = this.localVarsForClasses.get(methodAndClass.getClassName());
if (local == null) {
System.err.println("Could not create call to application callback "
+ method.getSignature() + ". Local was null.");
continue;
}
// Add a conditional call to the method
JNopStmt thenStmt = new JNopStmt();
createIfStmt(thenStmt);
buildMethodCall(method, body, local, generator);
body.getUnits().add(thenStmt);
}
}
项目:soot-inflow
文件:DefaultEntryPointCreator.java
/**
* Soot requires a main method, so we create a dummy method which calls all entry functions.
*
* @param classMap
* the methods to call (signature as String)
* @param createdClass
* the class which contains the methods
* @return list of entryPoints
*/
@Override
protected SootMethod createDummyMainInternal(List<String> methods) {
Map<String, List<String>> classMap =
SootMethodRepresentationParser.v().parseClassNames(methods, false);
// create new class:
JimpleBody body = Jimple.v().newBody();
SootMethod mainMethod = createEmptyMainMethod(body);
LocalGenerator generator = new LocalGenerator(body);
HashMap<String, Local> localVarsForClasses = new HashMap<String, Local>();
// create constructors:
for(String className : classMap.keySet()){
SootClass createdClass = Scene.v().forceResolve(className, SootClass.BODIES);
createdClass.setApplicationClass();
Local localVal = generateClassConstructor(createdClass, body);
if (localVal == null) {
logger.warn("Cannot generate constructor for class: {}", createdClass);
continue;
}
localVarsForClasses.put(className, localVal);
}
// add entrypoint calls
int conditionCounter = 0;
JNopStmt startStmt = new JNopStmt();
JNopStmt endStmt = new JNopStmt();
Value intCounter = generator.generateLocal(IntType.v());
body.getUnits().add(startStmt);
for (Entry<String, List<String>> entry : classMap.entrySet()){
Local classLocal = localVarsForClasses.get(entry.getKey());
for (String method : entry.getValue()){
SootMethodAndClass methodAndClass =
SootMethodRepresentationParser.v().parseSootMethodString(method);
SootMethod currentMethod = findMethod(Scene.v().getSootClass(methodAndClass.getClassName()),
methodAndClass.getSubSignature());
if (currentMethod == null) {
logger.warn("Entry point not found: {}", method);
continue;
}
JEqExpr cond = new JEqExpr(intCounter, IntConstant.v(conditionCounter));
conditionCounter++;
JNopStmt thenStmt = new JNopStmt();
JIfStmt ifStmt = new JIfStmt(cond, thenStmt);
body.getUnits().add(ifStmt);
buildMethodCall(currentMethod, body, classLocal, generator);
body.getUnits().add(thenStmt);
}
}
body.getUnits().add(endStmt);
JGotoStmt gotoStart = new JGotoStmt(startStmt);
body.getUnits().add(gotoStart);
body.getUnits().add(Jimple.v().newReturnVoidStmt());
return mainMethod;
}
项目:JAADAS
文件:AccessPathBasedSourceSinkManager.java
/**
* Creates a new instance of the {@link AndroidSourceSinkManager} class with strong matching, i.e. the methods in
* the code must exactly match those in the list.
*
* @param sources
* The list of source methods
* @param sinks
* The list of sink methods
* @param callbackMethods
* The list of callback methods whose parameters are sources through which the application receives data
* from the operating system
* @param weakMatching
* True for weak matching: If an entry in the list has no return type, it matches arbitrary return types
* if the rest of the method signature is compatible. False for strong matching: The method signature in
* the code exactly match the one in the list.
* @param layoutMatching
* Specifies whether and how to use Android layout components as sources for the information flow
* analysis
* @param layoutControls
* A map from reference identifiers to the respective Android layout controls
*/
public AccessPathBasedSourceSinkManager(Set<SourceSinkDefinition> sources,
Set<SourceSinkDefinition> sinks,
Set<SootMethodAndClass> callbackMethods,
LayoutMatchingMode layoutMatching,
Map<Integer, LayoutControl> layoutControls) {
super(sources, sinks, callbackMethods, layoutMatching, layoutControls);
}
项目:JAADAS
文件:SourceSinkDefinition.java
/**
* Gets the method for which this object defines sources and sinks
* @return The method for which this object defines sources and sinks
*/
public SootMethodAndClass getMethod() {
return this.method;
}
项目:JAADAS
文件:AndroidSourceSinkManager.java
/**
* Creates a new instance of the {@link AndroidSourceSinkManager} class with
* either strong or weak matching.
*
* @param sources
* The list of source methods
* @param sinks
* The list of sink methods
*/
public AndroidSourceSinkManager(Set<SourceSinkDefinition> sources,
Set<SourceSinkDefinition> sinks) {
this(sources, sinks, Collections.<SootMethodAndClass>emptySet(),
LayoutMatchingMode.NoMatch, null);
}