Skip to content

Commit 86d8018

Browse files
committed
Add ObjectWeb ASM Textifier 'decompiler'
1 parent f3a5fee commit 86d8018

File tree

6 files changed

+207
-0
lines changed

6 files changed

+207
-0
lines changed

libs/asm-util-7.1.jar

79.6 KB
Binary file not shown.

src/the/bytecode/club/bytecodeviewer/Settings.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,8 @@ else if (BytecodeViewer.viewer.panelGroup1.isSelected(BytecodeViewer.viewer.pane
134134
DiskWriter.writeNewLine(BytecodeViewer.settingsName, "8", false);
135135
else if (BytecodeViewer.viewer.panelGroup1.isSelected(BytecodeViewer.viewer.panel1JDGUI.getModel()))
136136
DiskWriter.writeNewLine(BytecodeViewer.settingsName, "9", false);
137+
else if (BytecodeViewer.viewer.panelGroup1.isSelected(BytecodeViewer.viewer.asmText1.getModel()))
138+
DiskWriter.writeNewLine(BytecodeViewer.settingsName, "11", false);
137139

138140
if (BytecodeViewer.viewer.panelGroup2.isSelected(BytecodeViewer.viewer.panel2None.getModel()))
139141
DiskWriter.writeNewLine(BytecodeViewer.settingsName, "0", false);
@@ -155,6 +157,8 @@ else if (BytecodeViewer.viewer.panelGroup2.isSelected(BytecodeViewer.viewer.pane
155157
DiskWriter.writeNewLine(BytecodeViewer.settingsName, "8", false);
156158
else if (BytecodeViewer.viewer.panelGroup2.isSelected(BytecodeViewer.viewer.panel2JDGUI.getModel()))
157159
DiskWriter.writeNewLine(BytecodeViewer.settingsName, "9", false);
160+
else if (BytecodeViewer.viewer.panelGroup2.isSelected(BytecodeViewer.viewer.asmText2.getModel()))
161+
DiskWriter.writeNewLine(BytecodeViewer.settingsName, "11", false);
158162

159163
if (BytecodeViewer.viewer.panelGroup3.isSelected(BytecodeViewer.viewer.panel3None.getModel()))
160164
DiskWriter.writeNewLine(BytecodeViewer.settingsName, "0", false);
@@ -176,6 +180,8 @@ else if (BytecodeViewer.viewer.panelGroup3.isSelected(BytecodeViewer.viewer.pane
176180
DiskWriter.writeNewLine(BytecodeViewer.settingsName, "8", false);
177181
else if (BytecodeViewer.viewer.panelGroup3.isSelected(BytecodeViewer.viewer.panel3JDGUI.getModel()))
178182
DiskWriter.writeNewLine(BytecodeViewer.settingsName, "9", false);
183+
else if (BytecodeViewer.viewer.panelGroup3.isSelected(BytecodeViewer.viewer.asmText3.getModel()))
184+
DiskWriter.writeNewLine(BytecodeViewer.settingsName, "11", false);
179185

180186
DiskWriter.writeNewLine(BytecodeViewer.settingsName, String.valueOf(BytecodeViewer.viewer.refreshOnChange.isSelected()), false);
181187
DiskWriter.writeNewLine(BytecodeViewer.settingsName, String.valueOf(BytecodeViewer.viewer.isMaximized), false);
@@ -331,6 +337,8 @@ else if (decompiler == 9)
331337
BytecodeViewer.viewer.panelGroup1.setSelected(BytecodeViewer.viewer.panel1JDGUI.getModel(), true);
332338
else if (decompiler == 10)
333339
BytecodeViewer.viewer.panelGroup1.setSelected(BytecodeViewer.viewer.jadxJ1.getModel(), true);
340+
else if (decompiler == 11)
341+
BytecodeViewer.viewer.panelGroup1.setSelected(BytecodeViewer.viewer.asmText1.getModel(), true);
334342

335343
decompiler = Integer.parseInt(DiskReader.loadString(BytecodeViewer.settingsName, 82, false));
336344
if (decompiler == 0)
@@ -355,6 +363,8 @@ else if (decompiler == 9)
355363
BytecodeViewer.viewer.panelGroup2.setSelected(BytecodeViewer.viewer.panel2JDGUI.getModel(), true);
356364
else if (decompiler == 10)
357365
BytecodeViewer.viewer.panelGroup1.setSelected(BytecodeViewer.viewer.jadxJ2.getModel(), true);
366+
else if (decompiler == 11)
367+
BytecodeViewer.viewer.panelGroup2.setSelected(BytecodeViewer.viewer.asmText2.getModel(), true);
358368

359369
decompiler = Integer.parseInt(DiskReader.loadString(BytecodeViewer.settingsName, 83, false));
360370
if (decompiler == 0)
@@ -379,6 +389,8 @@ else if (decompiler == 9)
379389
BytecodeViewer.viewer.panelGroup3.setSelected(BytecodeViewer.viewer.panel3JDGUI.getModel(), true);
380390
else if (decompiler == 10)
381391
BytecodeViewer.viewer.panelGroup1.setSelected(BytecodeViewer.viewer.jadxJ3.getModel(), true);
392+
else if (decompiler == 11)
393+
BytecodeViewer.viewer.panelGroup3.setSelected(BytecodeViewer.viewer.asmText3.getModel(), true);
382394

383395
BytecodeViewer.viewer.refreshOnChange.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 84, false)));
384396

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package the.bytecode.club.bytecodeviewer.decompilers;
2+
3+
import org.objectweb.asm.tree.ClassNode;
4+
import org.objectweb.asm.util.Textifier;
5+
import org.objectweb.asm.util.TraceClassVisitor;
6+
7+
import java.io.PrintWriter;
8+
import java.io.StringWriter;
9+
10+
/***************************************************************************
11+
* Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite *
12+
* Copyright (C) 2014 Kalen 'Konloch' Kinloch - http://bytecodeviewer.com *
13+
* *
14+
* This program is free software: you can redistribute it and/or modify *
15+
* it under the terms of the GNU General Public License as published by *
16+
* the Free Software Foundation, either version 3 of the License, or *
17+
* (at your option) any later version. *
18+
* *
19+
* This program is distributed in the hope that it will be useful, *
20+
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
21+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
22+
* GNU General Public License for more details. *
23+
* *
24+
* You should have received a copy of the GNU General Public License *
25+
* along with this program. If not, see <http://www.gnu.org/licenses/>. *
26+
***************************************************************************/
27+
28+
/**
29+
* Objectweb ASM Textifier output
30+
*
31+
* @author Thiakil
32+
*/
33+
public class ASMTextifierDecompiler extends Decompiler {
34+
@Override
35+
public String decompileClassNode(ClassNode cn, byte[] b) {
36+
StringWriter writer = new StringWriter();
37+
cn.accept(new TraceClassVisitor(null, new Textifier(), new PrintWriter(writer)));
38+
return writer.toString();
39+
}
40+
41+
@Override
42+
public void decompileToZip(String sourceJar, String zipName) {
43+
44+
}
45+
}

src/the/bytecode/club/bytecodeviewer/decompilers/Decompiler.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ public abstract class Decompiler {
3939
public final static SmaliDisassembler smali = new SmaliDisassembler();
4040
public final static Decompiler jdgui = new JDGUIDecompiler();
4141
public final static Decompiler jadx = new JADXDecompiler();
42+
public final static Decompiler textifier = new ASMTextifierDecompiler();
4243

4344
public abstract String decompileClassNode(ClassNode cn, byte[] b);
4445

src/the/bytecode/club/bytecodeviewer/gui/ClassViewer.java

Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -901,6 +901,50 @@ public void run()
901901

902902
java1 = panelArea;
903903
}
904+
905+
if (pane1 == 11) {// asm text
906+
panelArea = new RSyntaxTextArea();
907+
panelArea.setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_JAVA);
908+
panelArea.setAntiAliasingEnabled(true);
909+
scrollPane = new RTextScrollPane(panelArea);
910+
panelArea.setText(Decompiler.textifier.decompileClassNode(cn, b));
911+
panelArea.setCaretPosition(0);
912+
panelArea.setEditable(false);
913+
panelArea.addKeyListener(new KeyListener()
914+
{
915+
public void keyPressed(KeyEvent e)
916+
{
917+
if ((e.getKeyCode() == KeyEvent.VK_F) && ((e.getModifiers() & KeyEvent.CTRL_MASK) != 0))
918+
{
919+
field1.requestFocus();
920+
}
921+
922+
BytecodeViewer.checkHotKey(e);
923+
}
924+
925+
@Override
926+
public void keyReleased(KeyEvent arg0)
927+
{
928+
}
929+
930+
@Override
931+
public void keyTyped(KeyEvent arg0)
932+
{
933+
}
934+
});
935+
scrollPane.setColumnHeaderView(new JLabel("ASM Textified - Editable: " + panelArea.isEditable()));
936+
panelArea.setFont(new Font(Font.MONOSPACED, Font.PLAIN, (int) BytecodeViewer.viewer.fontSpinner.getValue()));
937+
938+
SwingUtilities.invokeLater(new Runnable()
939+
{
940+
public void run()
941+
{
942+
panel1.add(scrollPane);
943+
}
944+
});
945+
java1 = panelArea;
946+
}
947+
904948
} catch (java.lang.IndexOutOfBoundsException | java.lang.NullPointerException e) {
905949
//ignore
906950
} catch (Exception e) {
@@ -1284,6 +1328,49 @@ public void run()
12841328

12851329
java2 = panelArea;
12861330
}
1331+
1332+
if (pane2 == 11) {// asm text
1333+
panelArea = new RSyntaxTextArea();
1334+
panelArea.setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_JAVA);
1335+
panelArea.setAntiAliasingEnabled(true);
1336+
scrollPane = new RTextScrollPane(panelArea);
1337+
panelArea.setText(Decompiler.textifier.decompileClassNode(cn, b));
1338+
panelArea.setCaretPosition(0);
1339+
panelArea.setEditable(false);
1340+
panelArea.addKeyListener(new KeyListener()
1341+
{
1342+
public void keyPressed(KeyEvent e)
1343+
{
1344+
if ((e.getKeyCode() == KeyEvent.VK_F) && ((e.getModifiers() & KeyEvent.CTRL_MASK) != 0))
1345+
{
1346+
field2.requestFocus();
1347+
}
1348+
1349+
BytecodeViewer.checkHotKey(e);
1350+
}
1351+
1352+
@Override
1353+
public void keyReleased(KeyEvent arg0)
1354+
{
1355+
}
1356+
1357+
@Override
1358+
public void keyTyped(KeyEvent arg0)
1359+
{
1360+
}
1361+
});
1362+
scrollPane.setColumnHeaderView(new JLabel("ASM Textified - Editable: " + panelArea.isEditable()));
1363+
panelArea.setFont(new Font(Font.MONOSPACED, Font.PLAIN, (int) BytecodeViewer.viewer.fontSpinner.getValue()));
1364+
1365+
SwingUtilities.invokeLater(new Runnable()
1366+
{
1367+
public void run()
1368+
{
1369+
panel2.add(scrollPane);
1370+
}
1371+
});
1372+
java2 = panelArea;
1373+
}
12871374
} catch (java.lang.IndexOutOfBoundsException | java.lang.NullPointerException e) {
12881375
//ignore
12891376
} catch (Exception e) {
@@ -1667,6 +1754,49 @@ public void run()
16671754

16681755
java3 = panelArea;
16691756
}
1757+
1758+
if (pane3 == 11) {// asm text
1759+
panelArea = new RSyntaxTextArea();
1760+
panelArea.setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_JAVA);
1761+
panelArea.setAntiAliasingEnabled(true);
1762+
scrollPane = new RTextScrollPane(panelArea);
1763+
panelArea.setText(Decompiler.textifier.decompileClassNode(cn, b));
1764+
panelArea.setCaretPosition(0);
1765+
panelArea.setEditable(false);
1766+
panelArea.addKeyListener(new KeyListener()
1767+
{
1768+
public void keyPressed(KeyEvent e)
1769+
{
1770+
if ((e.getKeyCode() == KeyEvent.VK_F) && ((e.getModifiers() & KeyEvent.CTRL_MASK) != 0))
1771+
{
1772+
field3.requestFocus();
1773+
}
1774+
1775+
BytecodeViewer.checkHotKey(e);
1776+
}
1777+
1778+
@Override
1779+
public void keyReleased(KeyEvent arg0)
1780+
{
1781+
}
1782+
1783+
@Override
1784+
public void keyTyped(KeyEvent arg0)
1785+
{
1786+
}
1787+
});
1788+
scrollPane.setColumnHeaderView(new JLabel("ASM Textified - Editable: " + panelArea.isEditable()));
1789+
panelArea.setFont(new Font(Font.MONOSPACED, Font.PLAIN, (int) BytecodeViewer.viewer.fontSpinner.getValue()));
1790+
1791+
SwingUtilities.invokeLater(new Runnable()
1792+
{
1793+
public void run()
1794+
{
1795+
panel3.add(scrollPane);
1796+
}
1797+
});
1798+
java3 = panelArea;
1799+
}
16701800
} catch (java.lang.IndexOutOfBoundsException | java.lang.NullPointerException e) {
16711801
//ignore
16721802
} catch (Exception e) {
@@ -1857,6 +1987,8 @@ else if (BytecodeViewer.viewer.panelGroup1.isSelected(BytecodeViewer.viewer.pane
18571987
pane1 = 9;
18581988
else if (BytecodeViewer.viewer.panelGroup1.isSelected(BytecodeViewer.viewer.jadxJ1.getModel()))
18591989
pane1 = 10;
1990+
else if (BytecodeViewer.viewer.panelGroup1.isSelected(BytecodeViewer.viewer.asmText1.getModel()))
1991+
pane1 = 11;
18601992

18611993
if (BytecodeViewer.viewer.panelGroup2.isSelected(BytecodeViewer.viewer.panel2None.getModel()))
18621994
pane2 = 0;
@@ -1880,6 +2012,8 @@ else if (BytecodeViewer.viewer.panelGroup2.isSelected(BytecodeViewer.viewer.pane
18802012
pane2 = 9;
18812013
else if (BytecodeViewer.viewer.panelGroup2.isSelected(BytecodeViewer.viewer.jadxJ2.getModel()))
18822014
pane2 = 10;
2015+
else if (BytecodeViewer.viewer.panelGroup2.isSelected(BytecodeViewer.viewer.asmText2.getModel()))
2016+
pane2 = 11;
18832017

18842018
if (BytecodeViewer.viewer.panelGroup3.isSelected(BytecodeViewer.viewer.panel3None.getModel()))
18852019
pane3 = 0;
@@ -1903,6 +2037,8 @@ else if (BytecodeViewer.viewer.panelGroup3.isSelected(BytecodeViewer.viewer.pane
19032037
pane3 = 9;
19042038
else if (BytecodeViewer.viewer.panelGroup3.isSelected(BytecodeViewer.viewer.jadxJ3.getModel()))
19052039
pane3 = 10;
2040+
else if (BytecodeViewer.viewer.panelGroup3.isSelected(BytecodeViewer.viewer.asmText3.getModel()))
2041+
pane3 = 11;
19062042
}
19072043

19082044
public boolean isPanel1Editable()

src/the/bytecode/club/bytecodeviewer/gui/MainViewerGUI.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -426,6 +426,10 @@ public void run()
426426
public final JRadioButtonMenuItem jadxJ3 = new JRadioButtonMenuItem("Java");
427427
public final JCheckBoxMenuItem jadxE3 = new JCheckBoxMenuItem("Editable");
428428

429+
public final JRadioButtonMenuItem asmText1 = new JRadioButtonMenuItem("ASM Textify");
430+
public final JRadioButtonMenuItem asmText2 = new JRadioButtonMenuItem("ASM Textify");
431+
public final JRadioButtonMenuItem asmText3 = new JRadioButtonMenuItem("ASM Textify");
432+
429433
private final JMenu mnFontSize = new JMenu("Font Size");
430434
private final JMenu visualSettings = new JMenu("Visual Settings");
431435
public final JSpinner fontSpinner = new JSpinner();
@@ -1825,6 +1829,8 @@ public void actionPerformed(ActionEvent arg0)
18251829

18261830
mnNewMenu_7.add(panel1Hexcode);
18271831

1832+
mnNewMenu_7.add(asmText1);
1833+
18281834
mnNewMenu_6.add(mnPane);
18291835

18301836
mnPane.add(panel2None);
@@ -1891,6 +1897,8 @@ public void actionPerformed(ActionEvent arg0)
18911897

18921898
mnPane.add(panel2Hexcode);
18931899

1900+
mnPane.add(asmText2);
1901+
18941902
mnNewMenu_6.add(mnPane_1);
18951903

18961904
mnPane_1.add(panel3None);
@@ -1956,6 +1964,8 @@ public void actionPerformed(ActionEvent arg0)
19561964

19571965
mnPane_1.add(panel3Hexcode);
19581966

1967+
mnPane_1.add(asmText3);
1968+
19591969
compileOnSave.setSelected(false);
19601970

19611971
menuBar.add(mnSettings);
@@ -2535,6 +2545,7 @@ public void actionPerformed(ActionEvent e)
25352545
panelGroup1.add(panel1Smali);
25362546
panelGroup1.add(panel1Bytecode);
25372547
panelGroup1.add(panel1Hexcode);
2548+
panelGroup1.add(asmText1);
25382549

25392550
panelGroup2.add(panel2None);
25402551
panelGroup2.add(panel2Proc);
@@ -2547,6 +2558,7 @@ public void actionPerformed(ActionEvent e)
25472558
panelGroup2.add(panel2Smali);
25482559
panelGroup2.add(panel2Bytecode);
25492560
panelGroup2.add(panel2Hexcode);
2561+
panelGroup2.add(asmText2);
25502562

25512563
panelGroup3.add(panel3None);
25522564
panelGroup3.add(panel3Proc);
@@ -2559,6 +2571,7 @@ public void actionPerformed(ActionEvent e)
25592571
panelGroup3.add(panel3Smali);
25602572
panelGroup3.add(panel3Bytecode);
25612573
panelGroup3.add(panel3Hexcode);
2574+
panelGroup3.add(asmText3);
25622575

25632576
fontSpinner.setPreferredSize(new Dimension(42, 20));
25642577
fontSpinner.setSize(new Dimension(42, 20));

0 commit comments

Comments
 (0)