diff --git a/CHANGELOG.md b/CHANGELOG.md index c03fd29be..90209810d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,9 @@ All notable changes to this project will be documented in this file. ## [Unreleased] +### Added +- Warning panel on scripts containing §§ instructions (Tip for Settings/Automatic deobfuscation) + ### Changed - AS1/2 Better unresolved constant handling - §§constant(xx) func instead of §§constantxx diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/deobfuscation/BrokenScriptDetector.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/deobfuscation/BrokenScriptDetector.java new file mode 100644 index 000000000..558dcaf83 --- /dev/null +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/deobfuscation/BrokenScriptDetector.java @@ -0,0 +1,12 @@ +package com.jpexs.decompiler.flash.action.deobfuscation; + +/** + * + * @author JPEXS + */ +public class BrokenScriptDetector { + + public boolean codeIsBroken(String code) { + return code.contains("\u00A7\u00A7"); + } +} diff --git a/src/com/jpexs/decompiler/flash/gui/abc/ABCPanel.java b/src/com/jpexs/decompiler/flash/gui/abc/ABCPanel.java index 36f463c38..59905ab14 100644 --- a/src/com/jpexs/decompiler/flash/gui/abc/ABCPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/abc/ABCPanel.java @@ -40,6 +40,7 @@ import com.jpexs.decompiler.flash.abc.types.traits.TraitSlotConst; import com.jpexs.decompiler.flash.abc.types.traits.Traits; import com.jpexs.decompiler.flash.abc.usages.MultinameUsage; import com.jpexs.decompiler.flash.abc.usages.TraitMultinameUsage; +import com.jpexs.decompiler.flash.action.deobfuscation.BrokenScriptDetector; import com.jpexs.decompiler.flash.action.parser.ActionParseException; import com.jpexs.decompiler.flash.action.parser.script.ActionScriptLexer; import com.jpexs.decompiler.flash.action.parser.script.ParsedSymbol; @@ -83,7 +84,9 @@ import com.jpexs.helpers.Helper; import de.hameister.treetable.MyTreeTable; import de.hameister.treetable.MyTreeTableModel; import java.awt.BorderLayout; +import java.awt.Color; import java.awt.Cursor; +import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Insets; import java.awt.event.ActionEvent; @@ -106,6 +109,8 @@ import java.util.Objects; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.AbstractAction; +import javax.swing.BorderFactory; +import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JComboBox; @@ -121,6 +126,7 @@ import javax.swing.SwingConstants; import javax.swing.SwingWorker; import javax.swing.ToolTipManager; import javax.swing.border.BevelBorder; +import javax.swing.border.EmptyBorder; import javax.swing.event.EventListenerList; import javax.swing.event.TableModelListener; import javax.swing.event.TreeModelEvent; @@ -166,6 +172,8 @@ public class ABCPanel extends JPanel implements ItemListener, SearchListener searchPanel; @@ -821,25 +829,26 @@ public class ABCPanel extends JPanel implements ItemListener, SearchListener" + text + ""; + } } private void FindVarAndAppendDataToString(VariableNode node, String lowerVarName, StringBuilder builder) { if (node.var != null && node.var.name.toLowerCase().contains(lowerVarName)) { builder.append(node.var.name + ": " + node.var.getValueAsStr() + "
"); } - + if (node.childs != null) { for (int i = 0; i < node.childs.size(); i++) { FindVarAndAppendDataToString(node.childs.get(i), lowerVarName, builder); @@ -877,8 +886,7 @@ public class ABCPanel extends JPanel implements ItemListener, SearchListener(new FlowLayout(), this); + brokenHintPanel = new JPanel(new BorderLayout(10, 10)); + brokenHintPanel.add(new JLabel("" + AppStrings.translate("script.seemsBroken") + ""), BorderLayout.CENTER); + brokenHintPanel.setBackground(new Color(253, 205, 137)); + brokenHintPanel.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED), new EmptyBorder(5, 5, 5, 5))); + decompiledScrollPane = new JScrollPane(decompiledTextArea); JPanel iconDecPanel = new JPanel(); @@ -916,8 +929,13 @@ public class ABCPanel extends JPanel implements ItemListener, SearchListener 0) { @@ -792,21 +800,21 @@ public class DecompiledEditorPane extends DebuggableEditorPane implements CaretL } @Override - public String getToolTipText(MouseEvent e) { + public String getToolTipText(MouseEvent e) { // not debugging: so return existing text - if (abcPanel.getDebugPanel().localsTable == null) - return super.getToolTipText(); - - final Point point = new Point(e.getX(), e.getY()); - final int pos = abcPanel.decompiledTextArea.viewToModel(point); + if (abcPanel.getDebugPanel().localsTable == null) { + return super.getToolTipText(); + } + + final Point point = new Point(e.getX(), e.getY()); + final int pos = abcPanel.decompiledTextArea.viewToModel(point); final String identifier = abcPanel.getMainPanel().getActionPanel().getStringUnderPosition(pos, abcPanel.decompiledTextArea); - if (identifier != null && !identifier.isEmpty()) - { + if (identifier != null && !identifier.isEmpty()) { String tooltipText = abcPanel.getDebugPanel().localsTable.TryGetDebugHoverToolTipText(identifier); return (tooltipText == null ? super.getToolTipText() : tooltipText); } - + // not found: so return existing text return super.getToolTipText(); } diff --git a/src/com/jpexs/decompiler/flash/gui/action/ActionPanel.java b/src/com/jpexs/decompiler/flash/gui/action/ActionPanel.java index f9acb01be..83a2a2b94 100644 --- a/src/com/jpexs/decompiler/flash/gui/action/ActionPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/action/ActionPanel.java @@ -22,6 +22,7 @@ import com.jpexs.decompiler.flash.action.Action; import com.jpexs.decompiler.flash.action.ActionGraph; import com.jpexs.decompiler.flash.action.ActionList; import com.jpexs.decompiler.flash.action.ConstantPoolTooBigException; +import com.jpexs.decompiler.flash.action.deobfuscation.BrokenScriptDetector; import com.jpexs.decompiler.flash.action.parser.ActionParseException; import com.jpexs.decompiler.flash.action.parser.pcode.ASMParser; import com.jpexs.decompiler.flash.action.parser.script.ActionScript2Parser; @@ -61,6 +62,7 @@ import com.jpexs.decompiler.graph.CompilationException; import com.jpexs.helpers.CancellableWorker; import com.jpexs.helpers.Helper; import java.awt.BorderLayout; +import java.awt.Color; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Insets; @@ -72,6 +74,8 @@ import java.util.List; import java.util.concurrent.CancellationException; import java.util.logging.Level; import java.util.logging.Logger; +import java.util.regex.Pattern; +import javax.swing.BorderFactory; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.JButton; @@ -82,6 +86,8 @@ import javax.swing.JScrollPane; import javax.swing.JSplitPane; import javax.swing.JToggleButton; import javax.swing.SwingConstants; +import javax.swing.border.BevelBorder; +import javax.swing.border.EmptyBorder; import javax.swing.event.CaretEvent; import javax.swing.event.CaretListener; import javax.swing.text.Highlighter; @@ -100,6 +106,7 @@ public class ActionPanel extends JPanel implements SearchListener" + AppStrings.translate("script.seemsBroken") + ""), BorderLayout.CENTER); + brokenHintPanel.setBackground(new Color(253, 205, 137)); + brokenHintPanel.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED), new EmptyBorder(5, 5, 5, 5))); + + panelWithHint.add(brokenHintPanel, BorderLayout.NORTH); + panelWithHint.add(new JScrollPane(decompiledEditor), BorderLayout.CENTER); + + panA.add(new JPersistentSplitPane(JSplitPane.VERTICAL_SPLIT, panelWithHint, debugPanel, Configuration.guiActionVarsSplitPaneDividerLocationPercent), BorderLayout.CENTER); panA.add(decButtonsPan, BorderLayout.SOUTH); //decPanel.add(searchPanel, BorderLayout.NORTH); diff --git a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame.properties b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame.properties index fcfeee3fa..c1e28abef 100644 --- a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame.properties +++ b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame.properties @@ -772,3 +772,8 @@ message.font.setadvancevalues = This operation will set advance of ALL character menu.tools.deobfuscation.renameColliding = Rename colliding traits/classes filter.iggy = Iggy files (*.iggy) + +#after 11.1.0 +script.seemsBroken = WARNING: The code decompilation contains \u00a7\u00a7 instructions. \ + This is usually caused by an obfuscation (See Settings/Automatic deobfuscation) \ + or a nonstandard compiler used (Haxe, etc.). diff --git a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_cs.properties b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_cs.properties index 26748160c..12acf6c58 100644 --- a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_cs.properties +++ b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_cs.properties @@ -749,4 +749,9 @@ button.edit.script.disassembled = Upravit P-k\u00f3d message.font.setadvancevalues = Tato operace nastav\u00ed advance V\u0160ECH znak\u016f v tomto tagu na advance hodnoty zdrojov\u00e9ho p\u00edsma. -filter.iggy = Iggy soubory (*.iggy) \ No newline at end of file +filter.iggy = Iggy soubory (*.iggy) + +#after 11.1.0 +script.seemsBroken = VAROV\u00c1N\u00cd: K\u00f3d dekompilace obsahuje \u00a7\u00a7 instrukce. \ + To je obvykle zp\u016fsobeno n\u011bjakou obfuskac\u00ed (viz Nastaven\u00ed/Automatick\u00e1 deobfuskace) \ + nebo pou\u017eit\u00edm nestandardn\u00edho kompil\u00e1toru (Haxe, etc.).