Allow assing AS2 classes with obfuscated identifiiers

This commit is contained in:
Jindra Petřík
2021-02-24 19:55:59 +01:00
parent 62fd78fbcd
commit faa25369b9
4 changed files with 46 additions and 5 deletions
@@ -12,13 +12,16 @@
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library.␍ */
* License along with this library.
*/
package com.jpexs.decompiler.flash.action.model;
import com.jpexs.decompiler.flash.IdentifiersDeobfuscation;
import com.jpexs.decompiler.flash.SourceGeneratorLocalData;
import com.jpexs.decompiler.flash.action.swf5.ActionGetMember;
import com.jpexs.decompiler.flash.helpers.CodeFormatting;
import com.jpexs.decompiler.flash.helpers.GraphTextWriter;
import com.jpexs.decompiler.flash.helpers.StringBuilderTextWriter;
import com.jpexs.decompiler.graph.CompilationException;
import com.jpexs.decompiler.graph.GraphSourceItem;
import com.jpexs.decompiler.graph.GraphSourceItemPos;
@@ -39,6 +42,8 @@ public class GetMemberActionItem extends ActionItem {
public final GraphTargetItem memberName;
public boolean printObfuscatedMemberName = false;
@Override
public void visit(GraphTargetVisitorInterface visitor) {
visitor.visit(object);
@@ -54,7 +59,15 @@ public class GetMemberActionItem extends ActionItem {
@Override
public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) throws InterruptedException {
object.toString(writer, localData);
if ((!(memberName instanceof DirectValueActionItem)) || (!((DirectValueActionItem) memberName).isString()) || (!IdentifiersDeobfuscation.isValidName(false, ((DirectValueActionItem) memberName).toStringNoQuotes(localData)))) {
if ((memberName instanceof DirectValueActionItem) && printObfuscatedMemberName) {
writer.append(".");
StringBuilder sb = new StringBuilder();
StringBuilderTextWriter sbw = new StringBuilderTextWriter(new CodeFormatting(), sb);
stripQuotes(memberName, localData, sbw);
writer.append(IdentifiersDeobfuscation.printIdentifier(false, sb.toString()));
return writer;
}
if (((!(memberName instanceof DirectValueActionItem)) || (!((DirectValueActionItem) memberName).isString()) || (!printObfuscatedMemberName && !IdentifiersDeobfuscation.isValidName(false, ((DirectValueActionItem) memberName).toStringNoQuotes(localData))))) {
writer.append("[");
memberName.toString(writer, localData);
return writer.append("]");
@@ -12,13 +12,16 @@
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library.␍ */
* License along with this library.
*/
package com.jpexs.decompiler.flash.action.model;
import com.jpexs.decompiler.flash.IdentifiersDeobfuscation;
import com.jpexs.decompiler.flash.SourceGeneratorLocalData;
import com.jpexs.decompiler.flash.action.swf4.ActionGetVariable;
import com.jpexs.decompiler.flash.helpers.CodeFormatting;
import com.jpexs.decompiler.flash.helpers.GraphTextWriter;
import com.jpexs.decompiler.flash.helpers.StringBuilderTextWriter;
import com.jpexs.decompiler.flash.helpers.hilight.HighlightData;
import com.jpexs.decompiler.graph.CompilationException;
import com.jpexs.decompiler.graph.GraphSourceItem;
@@ -47,6 +50,8 @@ public class GetVariableActionItem extends ActionItem {
private boolean computedVariableComputed = false;
public boolean printObfuscatedName = false;
@Override
public String toString() {
return name.toString();
@@ -64,7 +69,17 @@ public class GetVariableActionItem extends ActionItem {
@Override
public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) throws InterruptedException {
if ((name instanceof DirectValueActionItem) && (((DirectValueActionItem) name).isString()) && (IdentifiersDeobfuscation.isValidNameWithDot(false, ((DirectValueActionItem) name).toStringNoQuotes(localData), "this", "super")
if (name instanceof DirectValueActionItem && printObfuscatedName) {
HighlightData srcData = getSrcData();
srcData.localName = name.toStringNoQuotes(localData);
StringBuilder sb = new StringBuilder();
StringBuilderTextWriter sbw = new StringBuilderTextWriter(new CodeFormatting(), sb);
stripQuotes(name, localData, sbw);
writer.append(IdentifiersDeobfuscation.printIdentifier(false, sb.toString()));
return writer;
}
if ((name instanceof DirectValueActionItem) && (((DirectValueActionItem) name).isString()) && (printObfuscatedName || IdentifiersDeobfuscation.isValidNameWithDot(false, ((DirectValueActionItem) name).toStringNoQuotes(localData), "this", "super")
|| IdentifiersDeobfuscation.isValidNameWithSlash(((DirectValueActionItem) name).toStringNoQuotes(localData), "this", "super"))) {
HighlightData srcData = getSrcData();
srcData.localName = name.toStringNoQuotes(localData);
@@ -21,6 +21,7 @@ import com.jpexs.decompiler.flash.action.Action;
import com.jpexs.decompiler.flash.action.model.ActionItem;
import com.jpexs.decompiler.flash.action.model.FunctionActionItem;
import com.jpexs.decompiler.flash.action.model.GetMemberActionItem;
import com.jpexs.decompiler.flash.action.model.GetVariableActionItem;
import com.jpexs.decompiler.flash.action.model.SetMemberActionItem;
import com.jpexs.decompiler.flash.action.parser.script.ActionSourceGenerator;
import com.jpexs.decompiler.flash.action.parser.script.VariableActionItem;
@@ -147,6 +148,14 @@ public class ClassActionItem extends ActionItem implements Block {
@Override
public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) throws InterruptedException {
GraphTargetItem clsName = className;
while (clsName instanceof GetMemberActionItem) {
((GetMemberActionItem) clsName).printObfuscatedMemberName = true;
clsName = ((GetMemberActionItem) clsName).object;
}
if (clsName instanceof GetVariableActionItem) {
((GetVariableActionItem) clsName).printObfuscatedName = true;
}
writer.startClass(className.toStringNoQuotes(localData));
writer.append("class ");
className.toStringNoQuotes(writer, localData);