From 22c56761f3d4b02e9a5c39cb17599bf6faa32a97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Fri, 6 Oct 2023 10:08:44 +0200 Subject: [PATCH] Fixed #2094 AS3 Getting register names from debug info - do not allow assigning `_locX_` name to other register than X --- CHANGELOG.md | 1 + .../decompiler/flash/abc/avm2/AVM2Code.java | 16 ++++++++++++++-- .../decompiler/flash/abc/types/MethodBody.java | 2 +- .../decompiler/flash/abc/types/MethodInfo.java | 2 +- 4 files changed, 17 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e85368551..a4472e3dd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ All notable changes to this project will be documented in this file. - [#2094] AS3 do not show body trait variables as FQN - [#2094] AS3 Missing use namespace - [#2094] AS3 missing star type on var and const +- [#2094] AS3 Getting register names from debug info - do not allow assigning `_locX_` name to other register than X ## [19.0.0] - 2023-10-01 ### Added diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/AVM2Code.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/AVM2Code.java index c3b24cf6c..8b491e6fc 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/AVM2Code.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/AVM2Code.java @@ -1434,15 +1434,27 @@ public class AVM2Code implements Cloneable { private int toSourceCount = 0; - public Map getLocalRegNamesFromDebug(ABC abc) { + public Map getLocalRegNamesFromDebug(ABC abc, int maxRegs) { Map regIndexToName = new HashMap<>(); Map regNameToIndex = new HashMap<>(); + + Set reservedRegNames = new HashSet<>(); + for (int i = 0; i < maxRegs; i++) { + reservedRegNames.add(String.format(Configuration.registerNameFormat.get(), i)); + } for (AVM2Instruction ins : code) { if (ins.definition instanceof DebugIns) { if (ins.operands[0] == 1) { String v = abc.constants.getString(ins.operands[1]); - int regIndex = ins.operands[2] + 1; + + if (reservedRegNames.contains(v)) { + //do not allow reassigning reserved _loc%d_ format to other local regs + continue; + } + + int regIndex = ins.operands[2] + 1; + // Same name already exists, it may be wrong names inserted by obfuscator if (regNameToIndex.containsKey(v)) { int existingIndex = regNameToIndex.get(v); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/MethodBody.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/MethodBody.java index 370bdfd1c..acb2af745 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/MethodBody.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/MethodBody.java @@ -277,7 +277,7 @@ public final class MethodBody implements Cloneable { } if (Configuration.getLocalNamesFromDebugInfo.get()) { - Map debugRegNames = getCode().getLocalRegNamesFromDebug(abc); + Map debugRegNames = getCode().getLocalRegNamesFromDebug(abc, max_regs); for (int k : debugRegNames.keySet()) { ret.put(k, debugRegNames.get(k)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/MethodInfo.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/MethodInfo.java index 4e848bc25..a1677b6bf 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/MethodInfo.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/MethodInfo.java @@ -310,7 +310,7 @@ public class MethodInfo { public GraphTextWriter getParamStr(GraphTextWriter writer, AVM2ConstantPool constants, MethodBody body, ABC abc, List fullyQualifiedNames) { Map localRegNames = new HashMap<>(); if (body != null && Configuration.getLocalNamesFromDebugInfo.get()) { - localRegNames = body.getCode().getLocalRegNamesFromDebug(abc); + localRegNames = body.getCode().getLocalRegNamesFromDebug(abc, body.max_regs); } for (int i = 0; i < param_types.length; i++) {