package complile.obfascator;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.HashMap;
import java.util.Random;
public class TrapPicker {
private boolean hasModify;
private int trapCount;
public static HashMap<String, Trap> trapMap;
private String apkTmpPath;
public void pickFieldFile(String apkTmpPath) {
trapCount = 10;
this.apkTmpPath = apkTmpPath;
trapMap = new HashMap<String, Trap>();
fileLooper(new File(apkTmpPath+"/smali"));
}
public void fileLooper(File file){
File[] files = file.listFiles();
for (File f : files) {
if(trapMap.size() >= trapCount) return;
if (f.isDirectory()) {
fileLooper(f);
} else if (f.isFile()) {
copyFieldFile(f);
}
}
}
public Trap initClassInfo(File smaliFile){
Trap mTrap = new Trap();
String absolutePath = smaliFile.getAbsolutePath();
StringBuilder split1 = new StringBuilder("smali");
StringBuilder split2 = new StringBuilder(".smali");
//like /Users/bigpie/RsApktool/brut.apktool/apktool-cli/muzhiwan.com_com.apesoup.spacegurufull/smali/com/apesoup/a/a/a.smali
//to com/apesoup/a/a/a
String mClassPathInSmali = absolutePath.split(split2.toString())[1];
String rawClassName = "L" + mClassPathInSmali.substring(1).replace("\\", "/");
String mClassName = rawClassName + "__";
int lastIndex = absolutePath.lastIndexOf(split2.toString());
String finalClassPath = absolutePath.substring(0, lastIndex) + "__.smali";
int largeNum = new Random().nextInt(500000);
mTrap.setChangeClassName(mClassName);
mTrap.setRawClassName(rawClassName);
mTrap.setFinalClassPath(finalClassPath);
mTrap.setObfascatorNum(largeNum);
return mTrap;
}
public void replaceClassName(StringBuilder sb){
}
public void copyFieldFile(File file) {
BufferedReader br = null;
FileWriter fileWriter = null;
if (file.getName().contains(".smali") && !file.getName().contains("$")) {
try {
String line;
boolean start_read_instance_fields = false;
String conciseIdentity = null;
StringBuilder sb = new StringBuilder();
Trap currentTrap = null;
br = new BufferedReader(new FileReader(file));
while ((line = br.readLine()) != null) {
if (line.startsWith(".class")) {
conciseIdentity = line.split("L")[1];
} else if (line.equals("# instance fields")) {
start_read_instance_fields = true;
} else if (line.equals("# direct methods")) {
start_read_instance_fields = false;
}else if (line.equals("# virtual methods")) {
start_read_instance_fields = false;
}
if (start_read_instance_fields
&& !line.equals("# instance fields")
&& !line.equals("")) {
currentTrap = initClassInfo(file);
int start = line.lastIndexOf(" ");
String fieldLine = line.substring(start).trim();
if (fieldLine.contains(";")) {
fieldLine = fieldLine.replace(";", "");
conciseIdentity = currentTrap.getChangeClassName() + ";->"
+ fieldLine + ";";
currentTrap.setConciseIdentity(conciseIdentity);
trapMap.put(conciseIdentity, currentTrap);
}
}
sb.append(line).append("\n");
}
if(currentTrap!=null){
String contentTemp = sb.toString().replace(currentTrap.getRawClassName(), currentTrap.getChangeClassName());
sb.delete(0, sb.length()).append(contentTemp);
fileWriter = new FileWriter(currentTrap.getFinalClassPath());
fileWriter.write(sb.toString());
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
if (fileWriter != null) {
fileWriter.flush();
fileWriter.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
if (br != null) {
br.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}