Skip to content

Commit 23aec74

Browse files
committed
Improved conflict resolution and some minor fixes
1 parent 6e5ddf0 commit 23aec74

12 files changed

Lines changed: 333 additions & 656 deletions

File tree

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<modelVersion>4.0.0</modelVersion>
33
<groupId>de.upb.mike.amt</groupId>
44
<artifactId>AMT</artifactId>
5-
<version>0.0.3</version>
5+
<version>0.0.4</version>
66
<packaging>jar</packaging>
77

88
<name>AMT</name>

src/de/upb/mike/amt/AMT.java

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
import de.upb.mike.amt.soot.SootObject;
2121

2222
public class AMT {
23+
public static int steps;
24+
2325
private static boolean OPTION_CHECK = false;
2426
private static boolean OPTION_COMPARISON = false;
2527

@@ -115,11 +117,11 @@ public static void main(String[] args) {
115117
}
116118

117119
private void start() {
118-
int steps = 5;
120+
steps = 5;
119121
if (OPTION_COMPARISON) {
120-
steps = 7;
122+
steps += 2;
121123
} else if (OPTION_CHECK) {
122-
steps = 6;
124+
steps += 1;
123125
}
124126

125127
final Timer amtTimer = new Timer().start();
@@ -142,7 +144,7 @@ private void start() {
142144
if (SootObject.getInstance().getLauncherActivity() == null && parseManifest.containsLauncherActivity()) {
143145
SootObject.getInstance().setLauncherActivity(parseManifest.getLauncherActivity());
144146
this.launcherAppPath = file.getAbsolutePath();
145-
Log.log("Launcher-Activity found: " + SootObject.getInstance().getLauncherActivity() + " ("
147+
Log.log("Launcher-Activity selected: " + SootObject.getInstance().getLauncherActivity() + " ("
146148
+ this.launcherAppPath + ")", Log.LOG_LEVEL_DEBUG);
147149
}
148150
}
@@ -155,22 +157,19 @@ private void start() {
155157
SootObject.getInstance().parseApp(apkFile.getAbsolutePath(), SootObject.FLAG_READ_NON_LAUNCHER_APPS);
156158
}
157159
}
158-
// Data.getInstance().rebuildSootClass();
159160
Log.log("successful!\n\n", Log.LOG_LEVEL_NORMAL);
160161

161162
Log.log("*** Step 3/" + steps + ": Instrumenting Classes ***", Log.LOG_LEVEL_NORMAL);
162163
for (final File apkFile : Config.getInstance().getAppPathList()) {
163164
if (apkFile.getAbsolutePath().equals(this.launcherAppPath)) {
164-
SootObject.getInstance().parseApp(apkFile.getAbsolutePath(), SootObject.FLAG_MERGE1);
165+
SootObject.getInstance().parseApp(apkFile.getAbsolutePath(), SootObject.FLAG_MERGE);
165166
}
166167
}
167168
Log.log("successful!\n\n", Log.LOG_LEVEL_NORMAL);
168169

169-
Log.log("*** Step 4/" + steps + ": Build Merged App ***", Log.LOG_LEVEL_NORMAL);
170-
SootObject.getInstance().parseApp(null, SootObject.FLAG_MERGE2);
171-
Log.log("successful!\n\n", Log.LOG_LEVEL_NORMAL);
170+
// Step 4 is triggered in InstrumentationTransformer
172171

173-
Log.log("*** Step 5/" + steps + ": Run Apktool (Merge Manifests, Copy Dex) ***", Log.LOG_LEVEL_NORMAL);
172+
Log.log("*** Step 5/" + steps + ": Run Apktool (Merge Manifests) ***", Log.LOG_LEVEL_NORMAL);
174173
final MergeManifest mergeManifest = new MergeManifest();
175174
mergeManifest.mergeManifest();
176175
Log.log("successful!\n\n", Log.LOG_LEVEL_NORMAL);

src/de/upb/mike/amt/Data.java

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import java.io.File;
44
import java.util.HashMap;
55
import java.util.Map;
6+
import java.util.concurrent.ConcurrentHashMap;
67

78
import org.w3c.dom.Document;
89

@@ -14,11 +15,11 @@
1415
public class Data {
1516
private static Data instance = new Data();
1617

17-
private Map<SootClass, Hash> sootClassMap = new HashMap<>();
18+
private Map<SootClass, SootObjHashed> sootClassMap = new ConcurrentHashMap<>();
1819
private Map<Document, File> docMap = new HashMap<>();
19-
private Map<String, String> lifecycleMethodSignaturesChanged = new HashMap<>();
20-
private Map<SootObjHashed, String> classesChanged = new HashMap<>();
21-
private Map<File, Hash> hashMap = new HashMap<>();
20+
private Map<String, String> lifecycleMethodSignaturesChanged = new ConcurrentHashMap<>();
21+
private Map<SootObjHashed, String> classesChanged = new ConcurrentHashMap<>();
22+
private Map<File, Hash> hashMap = new ConcurrentHashMap<>();
2223
private Map<String, String> packageMap = new HashMap<>();
2324

2425
private Data() {
@@ -29,45 +30,45 @@ public static Data getInstance() {
2930
}
3031

3132
public void receiveClass(SootClass sc, File appFile) {
32-
if (!sootClassMap.containsKey(sc) && !sc.isPhantom()) {
33-
sootClassMap.put(sc, putOrGetMapEntry(appFile));
33+
if (!this.sootClassMap.containsKey(sc) && !sc.isPhantom()) {
34+
this.sootClassMap.put(sc, new SootObjHashed(sc.getName(), putOrGetMapEntry(appFile)));
3435
}
3536
}
3637

3738
public Hash putOrGetMapEntry(File appFile) {
3839
Hash appHash;
39-
if (hashMap.containsKey(appFile)) {
40-
appHash = hashMap.get(appFile);
40+
if (this.hashMap.containsKey(appFile)) {
41+
appHash = this.hashMap.get(appFile);
4142
} else {
4243
appHash = new Hash();
4344
appHash.setType(KeywordsAndConstants.HASH_TYPE_SHA1);
4445
appHash.setValue(HashHelper.sha1Hash(appFile));
45-
hashMap.put(appFile, appHash);
46+
this.hashMap.put(appFile, appHash);
4647
}
4748
return appHash;
4849
}
4950

50-
public Map<SootClass, Hash> getSootClassMap() {
51-
return sootClassMap;
51+
public Map<SootClass, SootObjHashed> getSootClassMap() {
52+
return this.sootClassMap;
5253
}
5354

5455
public Map<Document, File> getDocMap() {
55-
return docMap;
56+
return this.docMap;
5657
}
5758

5859
public Map<String, String> getLifecycleMethodSignaturesChanged() {
59-
return lifecycleMethodSignaturesChanged;
60+
return this.lifecycleMethodSignaturesChanged;
6061
}
6162

6263
public Map<SootObjHashed, String> getClassesChanged() {
63-
return classesChanged;
64+
return this.classesChanged;
6465
}
6566

6667
public Map<String, String> getPackageMap() {
67-
return packageMap;
68+
return this.packageMap;
6869
}
6970

7071
public Map<File, Hash> getHashMap() {
71-
return hashMap;
72+
return this.hashMap;
7273
}
7374
}

src/de/upb/mike/amt/aql/AQLRunner.java

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import de.foellix.aql.config.ConfigHandler;
99
import de.foellix.aql.datastructure.Answer;
1010
import de.foellix.aql.datastructure.Flow;
11+
import de.foellix.aql.datastructure.Flows;
1112
import de.foellix.aql.datastructure.KeywordsAndConstants;
1213
import de.foellix.aql.datastructure.Reference;
1314
import de.foellix.aql.datastructure.handler.AnswerHandler;
@@ -29,9 +30,9 @@ public AQLRunner(String query) {
2930
}
3031

3132
public Answer parseApp() {
32-
Log.log("Issuing AQL-Query: \"" + query + "\"", Log.LOG_LEVEL_DEBUG);
33+
Log.log("Issuing AQL-Query: \"" + this.query + "\"", Log.LOG_LEVEL_DEBUG);
3334
Log.silence(true);
34-
Collection<Answer> answerList = aqlSystem.queryAndWait(query);
35+
final Collection<Answer> answerList = this.aqlSystem.queryAndWait(this.query);
3536
Log.silence(false);
3637

3738
if (answerList != null && answerList.iterator().hasNext()) {
@@ -44,20 +45,23 @@ public Answer parseApp() {
4445
public static Answer mergeFlows(List<Answer> resultList, File outputFile, boolean overapproximate) {
4546
// Apply unify operator
4647
Answer mergedAnswer = new Answer();
47-
for (Answer answer : resultList) {
48+
for (final Answer answer : resultList) {
4849
mergedAnswer = DefaultOperator.unify(mergedAnswer, answer);
4950
}
51+
if (mergedAnswer.getFlows() == null) {
52+
mergedAnswer.setFlows(new Flows());
53+
}
5054

5155
// Over-approximate
5256
if (overapproximate) {
53-
Collection<Flow> flowsToAdd = new ArrayList<Flow>();
54-
for (Flow flow : mergedAnswer.getFlows().getFlow()) {
55-
Reference from = Helper.getFrom(flow.getReference());
56-
Reference toExists = Helper.getTo(flow.getReference());
57-
for (Reference to : Helper.getAllReferences(mergedAnswer)) {
57+
final Collection<Flow> flowsToAdd = new ArrayList<Flow>();
58+
for (final Flow flow : mergedAnswer.getFlows().getFlow()) {
59+
final Reference from = Helper.getFrom(flow.getReference());
60+
final Reference toExists = Helper.getTo(flow.getReference());
61+
for (final Reference to : Helper.getAllReferences(mergedAnswer)) {
5862
if (to.getType().equals(KeywordsAndConstants.REFERENCE_TYPE_TO)
5963
&& !EqualsHelper.equals(toExists, to)) {
60-
Flow flowToAdd = new Flow();
64+
final Flow flowToAdd = new Flow();
6165
flowToAdd.getReference().add(from);
6266
flowToAdd.getReference().add(to);
6367
flowsToAdd.add(flowToAdd);

src/de/upb/mike/amt/conflicresolution/ConflictResolution.java

Lines changed: 29 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,9 @@
11
package de.upb.mike.amt.conflicresolution;
22

3-
import java.util.HashMap;
4-
import java.util.Map;
3+
import java.util.Set;
54

6-
import de.foellix.aql.datastructure.Hash;
7-
import de.upb.mike.amt.SootObjHashed;
85
import de.upb.mike.amt.Data;
96
import de.upb.mike.amt.Log;
10-
import soot.RefType;
117
import soot.SootClass;
128
import soot.util.Chain;
139

@@ -16,45 +12,40 @@ public class ConflictResolution {
1612

1713
private Chain<SootClass> sootClasses;
1814

19-
private Map<SootObjHashed, String> outerClassMap;
20-
2115
public ConflictResolution(Chain<SootClass> initSootClasses) {
2216
this.sootClasses = initSootClasses;
23-
this.outerClassMap = new HashMap<>();
2417
}
2518

26-
public void resolveConflict(SootClass sootClass, Hash currentAppHash) {
27-
String originalName = sootClass.getName();
19+
public void resolveConflictOuter(SootClass sootClass, Set<SootClass> innerClasses) {
20+
// Resolve conflicts
21+
if (isConflicted(sootClass.getName())) {
22+
final String oldName = sootClass.getName();
23+
final String newName = makeUnique(sootClass.getName());
24+
resolveConflictInner(innerClasses, oldName, newName);
25+
rename(sootClass, oldName, newName, false);
26+
}
2827

29-
// Probably rename outer class
30-
String rename = null;
31-
if (sootClass.hasOuterClass()) {
32-
String outerClassOriginalName = outerClassMap
33-
.get(new SootObjHashed(sootClass.getOuterClass().getName(), currentAppHash));
34-
rename = Data.getInstance().getClassesChanged()
35-
.get(new SootObjHashed(outerClassOriginalName, currentAppHash));
36-
if (rename != null) {
37-
sootClass.setName(sootClass.getName().replace(outerClassOriginalName, rename));
38-
sootClass.setRefType(RefType.v(sootClass.getName()));
39-
}
28+
// Add classes
29+
this.sootClasses.add(sootClass);
30+
for (final SootClass innerClass : innerClasses) {
31+
this.sootClasses.add(innerClass);
4032
}
33+
}
4134

42-
// Resolve conflict (if existent)
43-
if (isConflicted(sootClass.getName())) {
44-
sootClass.setName(makeUnique(sootClass.getName()));
45-
sootClass.setRefType(RefType.v(sootClass.getName()));
46-
Data.getInstance().getClassesChanged().put(new SootObjHashed(originalName, currentAppHash),
47-
sootClass.getName());
48-
outerClassMap.put(new SootObjHashed(sootClass.getName(), currentAppHash), originalName);
49-
Log.log("Class " + originalName + " renamed to " + sootClass.getName() + " (Innerclass mode)",
50-
Log.LOG_LEVEL_DETAILED);
51-
} else if (rename != null) {
52-
Data.getInstance().getClassesChanged().put(new SootObjHashed(originalName, currentAppHash),
53-
sootClass.getName());
54-
Log.log("Class " + originalName + " renamed to " + sootClass.getName() + " (Outerclass mode)",
55-
Log.LOG_LEVEL_DETAILED);
35+
private void resolveConflictInner(Set<SootClass> innerClasses, String outestClassOldName,
36+
String outestClassNewName) {
37+
for (final SootClass sootClass : innerClasses) {
38+
final String oldName = new String(sootClass.getName());
39+
final String newName = sootClass.getName().replace(outestClassOldName, outestClassNewName);
40+
rename(sootClass, oldName, newName, true);
5641
}
57-
sootClasses.add(sootClass);
42+
}
43+
44+
private void rename(SootClass sootClass, String oldName, String newName, boolean innerClass) {
45+
sootClass.rename(newName);
46+
Data.getInstance().getClassesChanged().put(Data.getInstance().getSootClassMap().get(sootClass), newName);
47+
Log.log("Class \"" + oldName + "\" renamed to \"" + newName + "\" (" + (innerClass ? "inner" : "outer")
48+
+ " class)", Log.LOG_LEVEL_DETAILED);
5849
}
5950

6051
private String makeUnique(String name) {
@@ -67,8 +58,8 @@ private String makeUnique(String name) {
6758
}
6859

6960
private boolean isConflicted(String sootClassName) {
70-
for (SootClass conflictClass : sootClasses) {
71-
String conflictClassName = conflictClass.getName();
61+
for (final SootClass conflictClass : this.sootClasses) {
62+
final String conflictClassName = conflictClass.getName();
7263
if (sootClassName.equals(conflictClassName)) {
7364
return true;
7465
}

0 commit comments

Comments
 (0)