mirror of
https://git.huckle.dev/Huckles-Minecraft-Archive/jpexs-decompiler.git
synced 2026-09-24 23:10:46 +00:00
AS3: Better error messages with obfuscated code
AS3: Autorenaming obfuscated names
This commit is contained in:
@@ -35,6 +35,7 @@ import com.jpexs.asdec.helpers.Highlighting;
|
||||
import java.io.*;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import javax.swing.JOptionPane;
|
||||
|
||||
public class ABC {
|
||||
|
||||
@@ -52,6 +53,38 @@ public class ABC {
|
||||
|
||||
public static final int MINORwithDECIMAL = 17;
|
||||
|
||||
private int fixNamesStrategy=0;
|
||||
private final int STRATEGY_FIX_NAMES=1;
|
||||
private final int STRATEGY_IGNORE=2;
|
||||
|
||||
private void fixNameWithStrategy(int index){
|
||||
if(fixNamesStrategy==0){
|
||||
if(!isValidName(index,false)){
|
||||
int val=JOptionPane.showOptionDialog(null, "Decompiler found unusual name '"+constants.constant_string[index]+"' for a variable/class which can cause problems when decompiling.\r\nDo you want the decompiler to fix it?", "Decompilation", 0, JOptionPane.INFORMATION_MESSAGE, null, new String[]{"Yes","Yes to all","No","No to all"}, "Yes to all");
|
||||
if(val==JOptionPane.CLOSED_OPTION){
|
||||
val=2; //NO
|
||||
}
|
||||
if((val==0)||(val==1)) //YES,YES TO ALL
|
||||
{
|
||||
isValidName(index,true);
|
||||
}
|
||||
if(val==1) //YES TO ALL
|
||||
{
|
||||
fixNamesStrategy=STRATEGY_FIX_NAMES;
|
||||
}
|
||||
if(val==3){ //NO TO ALL
|
||||
fixNamesStrategy=STRATEGY_IGNORE;
|
||||
}
|
||||
}
|
||||
}else
|
||||
if(fixNamesStrategy==STRATEGY_FIX_NAMES)
|
||||
{
|
||||
isValidName(index,true);
|
||||
}else if(fixNamesStrategy==STRATEGY_IGNORE){
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
public ABC(InputStream is) throws IOException {
|
||||
ABCInputStream ais = new ABCInputStream(is);
|
||||
minor_version = ais.readU16();
|
||||
@@ -107,7 +140,7 @@ public class ABC {
|
||||
constants.constant_namespace = new Namespace[constant_namespace_pool_count];
|
||||
for (int i = 1; i < constant_namespace_pool_count; i++) { //index 0 not used. Values 1..n-1
|
||||
constants.constant_namespace[i] = ais.readNamespace();
|
||||
//cleanOneName(constants.constant_namespace[i].name_index);
|
||||
fixNameWithStrategy(constants.constant_namespace[i].name_index);
|
||||
}
|
||||
|
||||
//constant namespace set
|
||||
@@ -123,14 +156,16 @@ public class ABC {
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//constant multiname
|
||||
int constant_multiname_pool_count = ais.readU30();
|
||||
//System.out.println("Reading "+constant_multiname_pool_count+" multinames");
|
||||
constants.constant_multiname = new Multiname[constant_multiname_pool_count];
|
||||
for (int i = 1; i < constant_multiname_pool_count; i++) { //index 0 not used. Values 1..n-1
|
||||
constants.constant_multiname[i] = ais.readMultiname();
|
||||
//System.out.println("Multiname read:"+constants.constant_multiname[i]);
|
||||
//cleanNamespace(constants.constant_multiname[i].name_index);
|
||||
constants.constant_multiname[i] = ais.readMultiname();
|
||||
fixNameWithStrategy(constants.constant_multiname[i].name_index);
|
||||
}
|
||||
|
||||
|
||||
@@ -712,20 +747,17 @@ public class ABC {
|
||||
}
|
||||
}
|
||||
public static final String[] reservedWords = {
|
||||
"as", "break", "case", "catch", "class", "const", "continue", /*"default",*/ "delete", "do", "each", "else",
|
||||
"as", "break", "case", "catch", "class", "const", "continue", "default","delete", "do", "each", "else",
|
||||
"extends", "false", "finally", "for", "function", "if", "implements", "import", "in", "instanceof",
|
||||
"interface", "internal", "is", "native", "new", "null", "package", "private", "protected", "public",
|
||||
"return", "super", "switch", "this", "throw", "true", "try", "typeof", "use", "var", /*"void",*/ "while",
|
||||
"with","dynamic","default","final"};
|
||||
"with","dynamic","default","final","in"};
|
||||
public int unknownCount = 0;
|
||||
|
||||
public void cleanOneName(int index) {
|
||||
cleanNamespace(index);
|
||||
}
|
||||
|
||||
public void cleanNamespace(int index) {
|
||||
public boolean isValidName(int index,boolean autoFix) {
|
||||
if (index <= 0) {
|
||||
return;
|
||||
return true;
|
||||
}
|
||||
String s = constants.constant_string[index];
|
||||
boolean isValid = true;
|
||||
@@ -747,13 +779,17 @@ public class ABC {
|
||||
}
|
||||
|
||||
if (!isValid) {
|
||||
if (isReserved) {
|
||||
constants.constant_string[index] = "name_" + s.replace(" ", "_");
|
||||
} else {
|
||||
unknownCount++;
|
||||
constants.constant_string[index] = "_name" + unknownCount;
|
||||
if(autoFix)
|
||||
{
|
||||
if (isReserved) {
|
||||
constants.constant_string[index] = "name_" + s.replace(" ", "_");
|
||||
} else {
|
||||
unknownCount++;
|
||||
constants.constant_string[index] = "_name" + unknownCount;
|
||||
}
|
||||
}
|
||||
}
|
||||
return isValid;
|
||||
}
|
||||
|
||||
public List<Usage> findMultinameUsage(int multinameIndex) {
|
||||
|
||||
@@ -1401,7 +1401,7 @@ public HashMap<Integer,String> getLocalRegNamesFromDebug(ABC abc){
|
||||
if (ex instanceof UnknownJumpException) {
|
||||
throw (UnknownJumpException) ex;
|
||||
}
|
||||
throw new ConvertException(ex.toString(), ip);
|
||||
throw new ConvertException(ex.getClass().getSimpleName(), ip);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1453,12 +1453,6 @@ public HashMap<Integer,String> getLocalRegNamesFromDebug(ABC abc){
|
||||
}
|
||||
|
||||
public String toSource(boolean isStatic, int classIndex, ABC abc, ConstantPool constants, MethodInfo method_info[], MethodBody body, boolean hilighted) {
|
||||
/*for(int i=0;i<code.size();i++){
|
||||
if(code.get(i).definition instanceof DebugLineIns){
|
||||
removeInstruction(i, body);
|
||||
i--;
|
||||
}
|
||||
}*/
|
||||
toSourceCount = 0;
|
||||
loopList = new ArrayList<Loop>();
|
||||
unknownJumps = new ArrayList<Integer>();
|
||||
@@ -1470,9 +1464,8 @@ public HashMap<Integer,String> getLocalRegNamesFromDebug(ABC abc){
|
||||
try {
|
||||
list = toSource(isStatic, classIndex, localRegs, new Stack<TreeItem>(), new Stack<TreeItem>(), abc, constants, method_info, body, 0, code.size() - 1).output;
|
||||
s = listToString(list, constants);
|
||||
} catch (Exception ex) {
|
||||
ex.printStackTrace();
|
||||
s = "Convert error - " + ex.toString();
|
||||
} catch (Exception ex) {
|
||||
s = "/*\r\n * Decompilation error\r\n * Code may be obfuscated\r\n * Error Message: " + ex.getMessage()+"\r\n */";
|
||||
return s;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user