2.2.0
12/09/2014 - Added a text search function to the plugin console. 12/09/2014 - When you press enter in the text search bar, it will now search. 12/13/2014 - The Bytecode Decompiler now shows the method's description in a comment. 12/13/2014 - Fixed an issue with the text search function. 12/13/2014 - Search results are now clickable.
This commit is contained in:
parent
6b4a119582
commit
0a81d6964d
13 changed files with 262 additions and 35 deletions
Binary file not shown.
|
@ -170,3 +170,9 @@ Changelog:
|
||||||
11/21/2014 - Decided to release it with the obfuscator/reflection kit unfinished, they're currently disabled for future use.
|
11/21/2014 - Decided to release it with the obfuscator/reflection kit unfinished, they're currently disabled for future use.
|
||||||
--- 2.1.1 ---:
|
--- 2.1.1 ---:
|
||||||
12/09/2014 - Upated CFR to cfr_0_91.
|
12/09/2014 - Upated CFR to cfr_0_91.
|
||||||
|
--- 2.2.0 ---:
|
||||||
|
12/09/2014 - Added a text search function to the plugin console.
|
||||||
|
12/09/2014 - When you press enter in the text search bar, it will now search.
|
||||||
|
12/13/2014 - The Bytecode Decompiler now shows the method's description in a comment.
|
||||||
|
12/13/2014 - Fixed an issue with the text search function.
|
||||||
|
12/13/2014 - Search results are now clickable.
|
2
VERSION
2
VERSION
|
@ -1 +1 @@
|
||||||
2.1.1
|
2.2.0
|
|
@ -6,8 +6,7 @@ import java.io.FileWriter;
|
||||||
import java.io.PrintWriter;
|
import java.io.PrintWriter;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This method will save to disk, if it failed it will keep trying until
|
* This method will save to disk
|
||||||
* it's saved to disk
|
|
||||||
*
|
*
|
||||||
* @author Konloch
|
* @author Konloch
|
||||||
*
|
*
|
||||||
|
|
|
@ -59,18 +59,16 @@ import the.bytecode.club.bytecodeviewer.plugins.PluginManager;
|
||||||
*
|
*
|
||||||
* TODO:
|
* TODO:
|
||||||
* The import jar method eats up a lot of memory, look into some how reducing this.
|
* The import jar method eats up a lot of memory, look into some how reducing this.
|
||||||
* Make the search results clickable
|
|
||||||
* Add a tool to build a flowchart of all the classes, and what methods execute what classes, and those method, read chatlog
|
* Add a tool to build a flowchart of all the classes, and what methods execute what classes, and those method, read chatlog
|
||||||
* 2.1:
|
|
||||||
* Add obfuscation
|
* Add obfuscation
|
||||||
* Add progress bars on saving all zips/java decompile jar
|
* Add progress bars on saving all zips/java decompile jar
|
||||||
* Add the jump/save mark system Ida Pro has.
|
* Add the jump/save mark system Ida Pro has.
|
||||||
* Add a search function to the plugin console?
|
* Add a search function to the plugin console?
|
||||||
* Add integer boxing and other obfuscation methods contra thought of
|
* Add integer boxing and other obfuscation methods contra implemented
|
||||||
* Insert unadded/debug opcodes to try to fuck up decompilers
|
* Insert unadded/debug opcodes to try to fuck up decompilers
|
||||||
* ClassAnylyzterAdapter
|
* ClassAnylyzterAdapter
|
||||||
*
|
*
|
||||||
* ----Beta 1.0-----:
|
* ----Beta 1.0.0-----:
|
||||||
* 10/4/2014 - Designed a POC GUI, still needs a lot of work.
|
* 10/4/2014 - Designed a POC GUI, still needs a lot of work.
|
||||||
* 10/4/2014 - Started importing J-RET's backend.
|
* 10/4/2014 - Started importing J-RET's backend.
|
||||||
* 10/5/2014 - Finished importing J-RET's backend.
|
* 10/5/2014 - Finished importing J-RET's backend.
|
||||||
|
@ -129,12 +127,12 @@ import the.bytecode.club.bytecodeviewer.plugins.PluginManager;
|
||||||
* 10/16/2014 - Now if you try search with an empty string, it won't search.
|
* 10/16/2014 - Now if you try search with an empty string, it won't search.
|
||||||
* 10/16/2014 - Added Replace Strings plugin.
|
* 10/16/2014 - Added Replace Strings plugin.
|
||||||
* 10/16/2014 - Added a loading icon that displays whenever a background task is being executed.
|
* 10/16/2014 - Added a loading icon that displays whenever a background task is being executed.
|
||||||
* ----Beta 1.1-----:
|
* ----Beta 1.1.0-----:
|
||||||
* 10/19/2014 - Fixed harcoded \\.
|
* 10/19/2014 - Fixed harcoded \\.
|
||||||
* ----Beta 1.2-----:
|
* ----Beta 1.2.0-----:
|
||||||
* 10/19/2014 - Started importing Procyon and CFR decompilers.
|
* 10/19/2014 - Started importing Procyon and CFR decompilers.
|
||||||
* 10/19/2014 - Partially finished importing Procyon and CFR, just need to finish export java files as zip.
|
* 10/19/2014 - Partially finished importing Procyon and CFR, just need to finish export java files as zip.
|
||||||
* ----Beta 1.3-----:
|
* ----Beta 1.3.0-----:
|
||||||
* 10/22/2014 - Imported Bibl's Bytecode Decompiler from CFIDE.
|
* 10/22/2014 - Imported Bibl's Bytecode Decompiler from CFIDE.
|
||||||
* 10/22/2014 - Did some changes to the Bytecode Decompiler.
|
* 10/22/2014 - Did some changes to the Bytecode Decompiler.
|
||||||
* 10/23/2014 - Added CFR settings.
|
* 10/23/2014 - Added CFR settings.
|
||||||
|
@ -150,13 +148,13 @@ import the.bytecode.club.bytecodeviewer.plugins.PluginManager;
|
||||||
* 10/29/2014 - Replaced JSyntaxPane with RSyntaxArea, this sadly removes the search feature inside of source/bytecode files, I'll implement a search function soon. (This also fixes the JRE 1.8 issue)
|
* 10/29/2014 - Replaced JSyntaxPane with RSyntaxArea, this sadly removes the search feature inside of source/bytecode files, I'll implement a search function soon. (This also fixes the JRE 1.8 issue)
|
||||||
* 10/29/2014 - Added a new decompiler option to append brackets to labels.
|
* 10/29/2014 - Added a new decompiler option to append brackets to labels.
|
||||||
* 10/31/2014 - Fixed an issue with the decompiler still running when the source code pane isn't toggled.
|
* 10/31/2014 - Fixed an issue with the decompiler still running when the source code pane isn't toggled.
|
||||||
* ----Beta 1.4-----:
|
* ----Beta 1.4.0-----:
|
||||||
* 11/1/2014 - Fixed FernFlower save Java files on Unix.
|
* 11/1/2014 - Fixed FernFlower save Java files on Unix.
|
||||||
* 11/1/2014 - FernFlower now uses the settings for save Java files.
|
* 11/1/2014 - FernFlower now uses the settings for save Java files.
|
||||||
* 11/1/2014 - Added Procyon save Java files (It uses the settings).
|
* 11/1/2014 - Added Procyon save Java files (It uses the settings).
|
||||||
* 11/1/2014 - Updated CFR to cfr_0_89.
|
* 11/1/2014 - Updated CFR to cfr_0_89.
|
||||||
* 11/1/2014 - Added CFR save Java files (It uses the settings), however it relies on the file system, because of this if there is heavy name obfuscation, it could mess up for windows.
|
* 11/1/2014 - Added CFR save Java files (It uses the settings), however it relies on the file system, because of this if there is heavy name obfuscation, it could mess up for windows.
|
||||||
* -----Beta 1.5-----:
|
* -----Beta 1.5.0-----:
|
||||||
* 11/1/2014 - Updated and improved the search function, it now prints out more useful information.
|
* 11/1/2014 - Updated and improved the search function, it now prints out more useful information.
|
||||||
* 11/1/2014 - Fixed a UI issue with the Replace All Strings plugin.
|
* 11/1/2014 - Fixed a UI issue with the Replace All Strings plugin.
|
||||||
* 11/2/2014 - Added search function to the Class Viewer.
|
* 11/2/2014 - Added search function to the Class Viewer.
|
||||||
|
@ -171,7 +169,7 @@ import the.bytecode.club.bytecodeviewer.plugins.PluginManager;
|
||||||
* 11/3/2014 - Removed the option to disable syntax highlighting (since it's lightweight now).
|
* 11/3/2014 - Removed the option to disable syntax highlighting (since it's lightweight now).
|
||||||
* 11/3/2014 - About window now contains the version number and the BCV directory.
|
* 11/3/2014 - About window now contains the version number and the BCV directory.
|
||||||
* 11/3/2014 - Added an option to toggle to outdated status.
|
* 11/3/2014 - Added an option to toggle to outdated status.
|
||||||
* -----2.0-----:
|
* -----2.0.0-----:
|
||||||
* 11/4/2014 - Officially been 1 month of development.
|
* 11/4/2014 - Officially been 1 month of development.
|
||||||
* 11/4/2014 - Replaced ""+ with String.valueOf (cheers bibl).
|
* 11/4/2014 - Replaced ""+ with String.valueOf (cheers bibl).
|
||||||
* 11/4/2014 - Changed how the temp directory was created.
|
* 11/4/2014 - Changed how the temp directory was created.
|
||||||
|
@ -185,9 +183,9 @@ import the.bytecode.club.bytecodeviewer.plugins.PluginManager;
|
||||||
* 11/5/2014 - Improved the Malicious Code Scanner, also made it instant.
|
* 11/5/2014 - Improved the Malicious Code Scanner, also made it instant.
|
||||||
* 11/5/2014 - Added icons to the program (cheers Fluke).
|
* 11/5/2014 - Added icons to the program (cheers Fluke).
|
||||||
* -----2.0.1-----:
|
* -----2.0.1-----:
|
||||||
* 11/7/2014 - Fixed the search function.
|
* 11/7/2014 - Fixed the text search function.
|
||||||
* 11/7/2014 - Removed an unused package containing some unused classes.
|
* 11/7/2014 - Removed an unused package containing some unused classes.
|
||||||
* -----2.1-----:
|
* -----2.1.0-----:
|
||||||
* 11/5/2014 - Started working on the EZ-Inject plugin.
|
* 11/5/2014 - Started working on the EZ-Inject plugin.
|
||||||
* 11/6/2014 - Fixed the ClassNodeDecompiler creating unnessessary objects. (thanks bibl).
|
* 11/6/2014 - Fixed the ClassNodeDecompiler creating unnessessary objects. (thanks bibl).
|
||||||
* 11/6/2014 - Finished an alpha version of EZ-Inject.
|
* 11/6/2014 - Finished an alpha version of EZ-Inject.
|
||||||
|
@ -202,8 +200,14 @@ import the.bytecode.club.bytecodeviewer.plugins.PluginManager;
|
||||||
* 11/17/2014 - Fixed an issue with the out of date checking UI still activating when not selected.
|
* 11/17/2014 - Fixed an issue with the out of date checking UI still activating when not selected.
|
||||||
* 11/19/2014 - Added annotatitons/local variables to the methodnode decompiler (Thanks Bibl).
|
* 11/19/2014 - Added annotatitons/local variables to the methodnode decompiler (Thanks Bibl).
|
||||||
* 11/21/2014 - Decided to release it with the obfuscator/reflection kit unfinished, they're currently disabled for future use.
|
* 11/21/2014 - Decided to release it with the obfuscator/reflection kit unfinished, they're currently disabled for future use.
|
||||||
* -----2.1-----:
|
* -----2.1.1-----:
|
||||||
* Updated CFR to cfr_0_91.
|
* 12/09/2014 - Updated CFR to cfr_0_91.
|
||||||
|
* -----2.2.0-----:
|
||||||
|
* 12/09/2014 - Added a text search function to the plugin console.
|
||||||
|
* 12/09/2014 - When you press enter in the text search bar, it will now search.
|
||||||
|
* 12/13/2014 - The Bytecode Decompiler now shows the method's description in a comment.
|
||||||
|
* 12/13/2014 - Fixed an issue with the text search function.
|
||||||
|
* 12/13/2014 - Search results are now clickable.
|
||||||
*
|
*
|
||||||
* @author Konloch
|
* @author Konloch
|
||||||
*
|
*
|
||||||
|
@ -225,7 +229,7 @@ public class BytecodeViewer {
|
||||||
private static ArrayList<String> recentPlugins = DiskReader.loadArrayList(pluginsName, false);
|
private static ArrayList<String> recentPlugins = DiskReader.loadArrayList(pluginsName, false);
|
||||||
public static boolean runningObfuscation = false;
|
public static boolean runningObfuscation = false;
|
||||||
|
|
||||||
public static String version = "2.1.1";
|
public static String version = "2.2.0";
|
||||||
|
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
iconList = new ArrayList<BufferedImage>();
|
iconList = new ArrayList<BufferedImage>();
|
||||||
|
|
|
@ -1,17 +1,31 @@
|
||||||
package the.bytecode.club.bytecodeviewer.api;
|
package the.bytecode.club.bytecodeviewer.api;
|
||||||
|
|
||||||
|
import javax.swing.ImageIcon;
|
||||||
|
import javax.swing.JButton;
|
||||||
|
import javax.swing.JCheckBox;
|
||||||
import javax.swing.JFrame;
|
import javax.swing.JFrame;
|
||||||
|
import javax.swing.JTextField;
|
||||||
|
|
||||||
|
import java.awt.Color;
|
||||||
import java.awt.Dimension;
|
import java.awt.Dimension;
|
||||||
|
|
||||||
import javax.swing.JScrollPane;
|
import javax.swing.JScrollPane;
|
||||||
|
|
||||||
import java.awt.BorderLayout;
|
import java.awt.BorderLayout;
|
||||||
|
import java.awt.event.ActionEvent;
|
||||||
|
import java.awt.event.ActionListener;
|
||||||
|
import java.awt.event.KeyEvent;
|
||||||
|
import java.awt.event.KeyListener;
|
||||||
|
|
||||||
import javax.swing.JTextArea;
|
import javax.swing.JTextArea;
|
||||||
|
|
||||||
import the.bytecode.club.bytecodeviewer.BytecodeViewer;
|
import the.bytecode.club.bytecodeviewer.BytecodeViewer;
|
||||||
|
|
||||||
|
import javax.swing.JPanel;
|
||||||
|
import javax.swing.text.DefaultHighlighter;
|
||||||
|
import javax.swing.text.Highlighter;
|
||||||
|
import javax.swing.text.JTextComponent;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A simple console GUI.
|
* A simple console GUI.
|
||||||
*
|
*
|
||||||
|
@ -22,18 +36,183 @@ import the.bytecode.club.bytecodeviewer.BytecodeViewer;
|
||||||
public class PluginConsole extends JFrame {
|
public class PluginConsole extends JFrame {
|
||||||
|
|
||||||
JTextArea textArea = new JTextArea();
|
JTextArea textArea = new JTextArea();
|
||||||
|
JPanel panel = new JPanel(new BorderLayout());
|
||||||
|
JScrollPane scrollPane = new JScrollPane();
|
||||||
|
public JCheckBox check = new JCheckBox("Exact");
|
||||||
public PluginConsole(String pluginName) {
|
public PluginConsole(String pluginName) {
|
||||||
this.setIconImages(BytecodeViewer.iconList);
|
this.setIconImages(BytecodeViewer.iconList);
|
||||||
setTitle("Bytecode Viewer - Plugin Console - " + pluginName);
|
setTitle("Bytecode Viewer - Plugin Console - " + pluginName);
|
||||||
setSize(new Dimension(542, 316));
|
setSize(new Dimension(542, 316));
|
||||||
|
|
||||||
JScrollPane scrollPane = new JScrollPane();
|
|
||||||
getContentPane().add(scrollPane, BorderLayout.CENTER);
|
getContentPane().add(scrollPane, BorderLayout.CENTER);
|
||||||
|
|
||||||
scrollPane.setViewportView(textArea);
|
scrollPane.setViewportView(textArea);
|
||||||
|
|
||||||
|
|
||||||
|
JButton searchNext = new JButton();
|
||||||
|
JButton searchPrev = new JButton();
|
||||||
|
JPanel buttonPane = new JPanel(new BorderLayout());
|
||||||
|
buttonPane.add(searchNext, BorderLayout.WEST);
|
||||||
|
buttonPane.add(searchPrev, BorderLayout.EAST);
|
||||||
|
searchNext.setIcon(new ImageIcon(BytecodeViewer.b642IMG("iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAABnRSTlMANzlYqPBJSG/ZAAAASUlEQVR42mNgwAbS0oAEE4yHyWBmYAzjYDC694OJ4f9+BoY3H0BSbz6A2MxA6VciFyDqGAWQTWVkYEkCUrcOsDD8OwtkvMViMwAb8xEUHlHcFAAAAABJRU5ErkJggg==")));
|
||||||
|
searchPrev.setIcon(new ImageIcon(BytecodeViewer.b642IMG("iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAABnRSTlMANzlYgKhxpRi1AAAATElEQVR42mNgwAZYHIAEExA7qUAYLApMDmCGEwODCojByM/A8FEAyPi/moFh9QewYjCAM1iA+D2KqYwMrIlA6tUGFoa/Z4GMt1hsBgCe1wuKber+SwAAAABJRU5ErkJggg==")));
|
||||||
|
panel.add(buttonPane, BorderLayout.WEST);
|
||||||
|
final JTextField field = new JTextField();
|
||||||
|
panel.add(field, BorderLayout.CENTER);
|
||||||
|
panel.add(check, BorderLayout.EAST);
|
||||||
|
searchNext.addActionListener(new ActionListener() {
|
||||||
|
@Override
|
||||||
|
public void actionPerformed(final ActionEvent arg0) {
|
||||||
|
search(field.getText(), true);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
searchPrev.addActionListener(new ActionListener() {
|
||||||
|
@Override
|
||||||
|
public void actionPerformed(final ActionEvent arg0) {
|
||||||
|
search(field.getText(), false);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
field.addKeyListener(new KeyListener() {
|
||||||
|
@Override
|
||||||
|
public void keyReleased(KeyEvent arg0) {
|
||||||
|
if(arg0.getKeyCode() == KeyEvent.VK_ENTER)
|
||||||
|
search(field.getText(), true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void keyPressed(KeyEvent arg0) {}
|
||||||
|
@Override
|
||||||
|
public void keyTyped(KeyEvent arg0) {}
|
||||||
|
});
|
||||||
|
|
||||||
|
scrollPane.setColumnHeaderView(panel);
|
||||||
this.setLocationRelativeTo(null);
|
this.setLocationRelativeTo(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This was really interesting to write.
|
||||||
|
*
|
||||||
|
* @author Konloch
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void search(String search, boolean next) {
|
||||||
|
try {
|
||||||
|
JTextArea area = textArea;
|
||||||
|
if(search.isEmpty()) {
|
||||||
|
highlight(area, "");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int startLine = area.getDocument().getDefaultRootElement().getElementIndex(area.getCaretPosition())+1;
|
||||||
|
int currentLine = 1;
|
||||||
|
boolean canSearch = false;
|
||||||
|
String[] test = null;
|
||||||
|
if(area.getText().split("\n").length >= 2)
|
||||||
|
test = area.getText().split("\n");
|
||||||
|
else
|
||||||
|
test = area.getText().split("\r");
|
||||||
|
int lastGoodLine = -1;
|
||||||
|
int firstPos = -1;
|
||||||
|
boolean found = false;
|
||||||
|
|
||||||
|
if(next) {
|
||||||
|
for(String s : test) {
|
||||||
|
if(!check.isSelected())
|
||||||
|
{
|
||||||
|
s = s.toLowerCase();
|
||||||
|
search = search.toLowerCase();
|
||||||
|
}
|
||||||
|
|
||||||
|
if(currentLine == startLine) {
|
||||||
|
canSearch = true;
|
||||||
|
} else if(s.contains(search)) {
|
||||||
|
if(canSearch) {
|
||||||
|
area.setCaretPosition(area.getDocument()
|
||||||
|
.getDefaultRootElement().getElement(currentLine-1)
|
||||||
|
.getStartOffset());
|
||||||
|
canSearch = false;
|
||||||
|
found = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(firstPos == -1)
|
||||||
|
firstPos = currentLine;
|
||||||
|
}
|
||||||
|
|
||||||
|
currentLine++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!found && firstPos != -1) {
|
||||||
|
area.setCaretPosition(area.getDocument()
|
||||||
|
.getDefaultRootElement().getElement(firstPos-1)
|
||||||
|
.getStartOffset());
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
canSearch = true;
|
||||||
|
for(String s : test) {
|
||||||
|
if(!check.isSelected())
|
||||||
|
{
|
||||||
|
s = s.toLowerCase();
|
||||||
|
search = search.toLowerCase();
|
||||||
|
}
|
||||||
|
|
||||||
|
if(s.contains(search)) {
|
||||||
|
if(lastGoodLine != -1 && canSearch)
|
||||||
|
area.setCaretPosition(area.getDocument()
|
||||||
|
.getDefaultRootElement().getElement(lastGoodLine-1)
|
||||||
|
.getStartOffset());
|
||||||
|
|
||||||
|
lastGoodLine = currentLine;
|
||||||
|
|
||||||
|
if(currentLine >= startLine)
|
||||||
|
canSearch = false;
|
||||||
|
}
|
||||||
|
currentLine++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(lastGoodLine != -1 && area.getDocument().getDefaultRootElement().getElementIndex(area.getCaretPosition())+1 == startLine) {
|
||||||
|
area.setCaretPosition(area.getDocument()
|
||||||
|
.getDefaultRootElement().getElement(lastGoodLine-1)
|
||||||
|
.getStartOffset());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
highlight(area, search);
|
||||||
|
} catch(Exception e) {
|
||||||
|
new the.bytecode.club.bytecodeviewer.api.ExceptionUI(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private DefaultHighlighter.DefaultHighlightPainter painter = new DefaultHighlighter.DefaultHighlightPainter(new Color(255,62,150));
|
||||||
|
|
||||||
|
public void highlight(JTextComponent textComp, String pattern) {
|
||||||
|
if(pattern.isEmpty()) {
|
||||||
|
textComp.getHighlighter().removeAllHighlights();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
Highlighter hilite = textComp.getHighlighter();
|
||||||
|
hilite.removeAllHighlights();
|
||||||
|
javax.swing.text.Document doc = textComp.getDocument();
|
||||||
|
String text = doc.getText(0, doc.getLength());
|
||||||
|
int pos = 0;
|
||||||
|
|
||||||
|
if(!check.isSelected()) {
|
||||||
|
pattern = pattern.toLowerCase();
|
||||||
|
text = text.toLowerCase();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Search for pattern
|
||||||
|
while ((pos = text.indexOf(pattern, pos)) >= 0) {
|
||||||
|
// Create highlighter using private painter and apply around pattern
|
||||||
|
hilite.addHighlight(pos, pos + pattern.length(), painter);
|
||||||
|
pos += pattern.length();
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
new the.bytecode.club.bytecodeviewer.api.ExceptionUI(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Appends \r\n to the end of your string, then it puts it on the top.
|
* Appends \r\n to the end of your string, then it puts it on the top.
|
||||||
* @param t the string you want to append
|
* @param t the string you want to append
|
||||||
|
|
|
@ -85,7 +85,10 @@ public class MethodNodeDecompiler {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (s.contains("abstract")) {
|
if (s.contains("abstract")) {
|
||||||
sb.append(" {}"+BytecodeViewer.nl);
|
sb.append(" {}");
|
||||||
|
sb.append(" //");
|
||||||
|
sb.append(m.desc);
|
||||||
|
sb.append(BytecodeViewer.nl);
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
sb.append(" {");
|
sb.append(" {");
|
||||||
|
@ -97,6 +100,9 @@ public class MethodNodeDecompiler {
|
||||||
sb.append(" // <init>");
|
sb.append(" // <init>");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sb.append(" //");
|
||||||
|
sb.append(m.desc);
|
||||||
|
|
||||||
sb.append(BytecodeViewer.nl);
|
sb.append(BytecodeViewer.nl);
|
||||||
|
|
||||||
if (m.signature != null) {
|
if (m.signature != null) {
|
||||||
|
@ -114,7 +120,6 @@ public class MethodNodeDecompiler {
|
||||||
addAttrList(m.visibleLocalVariableAnnotations, "visLocalVarAnno", sb, insnPrinter);
|
addAttrList(m.visibleLocalVariableAnnotations, "visLocalVarAnno", sb, insnPrinter);
|
||||||
addAttrList(m.visibleTypeAnnotations, "visTypeAnno", sb, insnPrinter);
|
addAttrList(m.visibleTypeAnnotations, "visTypeAnno", sb, insnPrinter);
|
||||||
|
|
||||||
|
|
||||||
for (Object o : m.tryCatchBlocks) {
|
for (Object o : m.tryCatchBlocks) {
|
||||||
TryCatchBlockNode tcbn = (TryCatchBlockNode) o;
|
TryCatchBlockNode tcbn = (TryCatchBlockNode) o;
|
||||||
sb.append(" ");
|
sb.append(" ");
|
||||||
|
|
|
@ -10,6 +10,8 @@ import java.awt.event.ComponentAdapter;
|
||||||
import java.awt.event.ComponentEvent;
|
import java.awt.event.ComponentEvent;
|
||||||
import java.awt.event.HierarchyEvent;
|
import java.awt.event.HierarchyEvent;
|
||||||
import java.awt.event.HierarchyListener;
|
import java.awt.event.HierarchyListener;
|
||||||
|
import java.awt.event.KeyEvent;
|
||||||
|
import java.awt.event.KeyListener;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
||||||
import static javax.swing.ScrollPaneConstants.*;
|
import static javax.swing.ScrollPaneConstants.*;
|
||||||
|
@ -187,6 +189,13 @@ public class ClassViewer extends JPanel {
|
||||||
} else {
|
} else {
|
||||||
canSearch = true;
|
canSearch = true;
|
||||||
for(String s : test) {
|
for(String s : test) {
|
||||||
|
if(pane == 0 && !byteCheck.isSelected() ||
|
||||||
|
pane == 1 && !decompCheck.isSelected())
|
||||||
|
{
|
||||||
|
s = s.toLowerCase();
|
||||||
|
search = search.toLowerCase();
|
||||||
|
}
|
||||||
|
|
||||||
if(s.contains(search)) {
|
if(s.contains(search)) {
|
||||||
if(lastGoodLine != -1 && canSearch)
|
if(lastGoodLine != -1 && canSearch)
|
||||||
area.setCaretPosition(area.getDocument()
|
area.setCaretPosition(area.getDocument()
|
||||||
|
@ -270,6 +279,18 @@ public class ClassViewer extends JPanel {
|
||||||
search(0,byteField.getText(), false);
|
search(0,byteField.getText(), false);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
byteField.addKeyListener(new KeyListener() {
|
||||||
|
@Override
|
||||||
|
public void keyReleased(KeyEvent arg0) {
|
||||||
|
if(arg0.getKeyCode() == KeyEvent.VK_ENTER)
|
||||||
|
search(0,byteField.getText(), true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void keyPressed(KeyEvent arg0) {}
|
||||||
|
@Override
|
||||||
|
public void keyTyped(KeyEvent arg0) {}
|
||||||
|
});
|
||||||
|
|
||||||
JButton decompSearchNext = new JButton();
|
JButton decompSearchNext = new JButton();
|
||||||
JButton decompSearchPrev = new JButton();
|
JButton decompSearchPrev = new JButton();
|
||||||
|
@ -294,6 +315,18 @@ public class ClassViewer extends JPanel {
|
||||||
search(1,decompField.getText(), false);
|
search(1,decompField.getText(), false);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
decompField.addKeyListener(new KeyListener() {
|
||||||
|
@Override
|
||||||
|
public void keyReleased(KeyEvent arg0) {
|
||||||
|
if(arg0.getKeyCode() == KeyEvent.VK_ENTER)
|
||||||
|
search(1,decompField.getText(), true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void keyPressed(KeyEvent arg0) {}
|
||||||
|
@Override
|
||||||
|
public void keyTyped(KeyEvent arg0) {}
|
||||||
|
});
|
||||||
|
|
||||||
sourcePane = BytecodeViewer.viewer.sourcePane.isSelected();
|
sourcePane = BytecodeViewer.viewer.sourcePane.isSelected();
|
||||||
bytecodePane = BytecodeViewer.viewer.bytecodePane.isSelected();
|
bytecodePane = BytecodeViewer.viewer.bytecodePane.isSelected();
|
||||||
|
|
|
@ -18,7 +18,6 @@ import javax.swing.JTree;
|
||||||
import javax.swing.event.TreeSelectionEvent;
|
import javax.swing.event.TreeSelectionEvent;
|
||||||
import javax.swing.event.TreeSelectionListener;
|
import javax.swing.event.TreeSelectionListener;
|
||||||
import javax.swing.tree.DefaultMutableTreeNode;
|
import javax.swing.tree.DefaultMutableTreeNode;
|
||||||
import javax.swing.tree.TreeNode;
|
|
||||||
import javax.swing.tree.TreePath;
|
import javax.swing.tree.TreePath;
|
||||||
|
|
||||||
import org.objectweb.asm.tree.ClassNode;
|
import org.objectweb.asm.tree.ClassNode;
|
||||||
|
@ -173,14 +172,15 @@ public class SearchingPane extends VisibleComponent {
|
||||||
this.tree.addTreeSelectionListener(new TreeSelectionListener() {
|
this.tree.addTreeSelectionListener(new TreeSelectionListener() {
|
||||||
@Override
|
@Override
|
||||||
public void valueChanged(final TreeSelectionEvent arg0) {
|
public void valueChanged(final TreeSelectionEvent arg0) {
|
||||||
final TreePath path = arg0.getPath();
|
String path = arg0.getPath().toString();
|
||||||
if ( ((TreeNode)path.getLastPathComponent()).getChildCount() > 0)
|
|
||||||
return;
|
String className = path.split(", ")[1].split("\\.")[0];
|
||||||
final String clazzName = path.getLastPathComponent().toString();
|
final ClassNode fN = BytecodeViewer.getClassNode(className);
|
||||||
final ClassNode fN = BytecodeViewer.getClassNode(clazzName);
|
|
||||||
if (fN != null) {
|
if (fN != null) {
|
||||||
MainViewerGUI.getComponent(FileNavigationPane.class).openClassFileToWorkSpace(clazzName, fN);
|
MainViewerGUI.getComponent(FileNavigationPane.class).openClassFileToWorkSpace(className, fN);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
System.out.println(className);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -11,14 +11,14 @@ public class RenameClasses extends JavaObfuscator {
|
||||||
public void obfuscate() {
|
public void obfuscate() {
|
||||||
int stringLength = getStringLength();
|
int stringLength = getStringLength();
|
||||||
|
|
||||||
System.out.println("Obfuscating");
|
System.out.println("Obfuscating class names...");
|
||||||
for(ClassNode c : BytecodeViewer.getLoadedClasses()) {
|
for(ClassNode c : BytecodeViewer.getLoadedClasses()) {
|
||||||
String newName = generateUniqueName(stringLength);
|
String newName = generateUniqueName(stringLength);
|
||||||
ASMUtil_OLD.renameClassNode(c.name, newName);
|
ASMUtil_OLD.renameClassNode(c.name, newName);
|
||||||
c.name = newName;
|
c.name = newName;
|
||||||
}
|
}
|
||||||
|
|
||||||
System.out.println("Obfuscated");
|
System.out.println("Obfuscated class names.");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,7 +12,7 @@ public class RenameFields extends JavaObfuscator {
|
||||||
public void obfuscate() {
|
public void obfuscate() {
|
||||||
int stringLength = getStringLength();
|
int stringLength = getStringLength();
|
||||||
|
|
||||||
System.out.println("Obfuscating");
|
System.out.println("Obfuscating fields names...");
|
||||||
for(ClassNode c : BytecodeViewer.getLoadedClasses()) {
|
for(ClassNode c : BytecodeViewer.getLoadedClasses()) {
|
||||||
for(Object o : c.fields.toArray()) {
|
for(Object o : c.fields.toArray()) {
|
||||||
FieldNode f = (FieldNode)o;
|
FieldNode f = (FieldNode)o;
|
||||||
|
@ -22,7 +22,7 @@ public class RenameFields extends JavaObfuscator {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
System.out.println("Obfuscated");
|
System.out.println("Obfuscated field names.");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,7 +13,7 @@ public class RenameMethods extends JavaObfuscator {
|
||||||
public void obfuscate() {
|
public void obfuscate() {
|
||||||
int stringLength = getStringLength();
|
int stringLength = getStringLength();
|
||||||
|
|
||||||
System.out.println("Obfuscating");
|
System.out.println("Obfuscating method names...");
|
||||||
for(ClassNode c : BytecodeViewer.getLoadedClasses()) {
|
for(ClassNode c : BytecodeViewer.getLoadedClasses()) {
|
||||||
for(Object o : c.methods.toArray()) {
|
for(Object o : c.methods.toArray()) {
|
||||||
MethodNode m = (MethodNode)o;
|
MethodNode m = (MethodNode)o;
|
||||||
|
@ -37,7 +37,7 @@ public class RenameMethods extends JavaObfuscator {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
System.out.println("Obfuscated");
|
System.out.println("Obfuscated method names.");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -44,6 +44,7 @@ public class MethodCallSearch implements SearchTypeDetails {
|
||||||
|
|
||||||
return myPanel;
|
return myPanel;
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
@Override
|
@Override
|
||||||
public void search(final ClassNode node, final SearchResultNotifier srn, boolean exact) {
|
public void search(final ClassNode node, final SearchResultNotifier srn, boolean exact) {
|
||||||
|
|
Loading…
Reference in a new issue