2021-06-28 04:13:55 +00:00
|
|
|
package the.bytecode.club.bytecodeviewer.api;
|
|
|
|
|
|
|
|
import org.objectweb.asm.ClassReader;
|
2021-07-10 16:05:08 +00:00
|
|
|
import org.objectweb.asm.ClassWriter;
|
2021-06-28 04:13:55 +00:00
|
|
|
import org.objectweb.asm.tree.ClassNode;
|
|
|
|
import org.objectweb.asm.tree.MethodNode;
|
|
|
|
|
2021-07-24 02:25:51 +00:00
|
|
|
/***************************************************************************
|
|
|
|
* Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite *
|
|
|
|
* Copyright (C) 2014 Kalen 'Konloch' Kinloch - http://bytecodeviewer.com *
|
|
|
|
* *
|
|
|
|
* This program is free software: you can redistribute it and/or modify *
|
|
|
|
* it under the terms of the GNU General Public License as published by *
|
|
|
|
* the Free Software Foundation, either version 3 of the License, or *
|
|
|
|
* (at your option) any later version. *
|
|
|
|
* *
|
|
|
|
* This program is distributed in the hope that it will be useful, *
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
|
|
|
* GNU General Public License for more details. *
|
|
|
|
* *
|
|
|
|
* You should have received a copy of the GNU General Public License *
|
|
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>. *
|
|
|
|
***************************************************************************/
|
|
|
|
|
2021-06-28 04:13:55 +00:00
|
|
|
/**
|
|
|
|
* @author Konloch
|
|
|
|
* @since 6/27/2021
|
|
|
|
*/
|
|
|
|
public class ASMUtil
|
|
|
|
{
|
|
|
|
/**
|
|
|
|
* Creates a new ClassNode instances from the provided byte[]
|
|
|
|
*/
|
2021-07-10 16:05:08 +00:00
|
|
|
public static ClassNode bytesToNode(final byte[] b)
|
2021-06-28 04:13:55 +00:00
|
|
|
{
|
|
|
|
ClassReader cr = new ClassReader(b);
|
|
|
|
ClassNode cn = new ClassNode();
|
|
|
|
try {
|
|
|
|
cr.accept(cn, ClassReader.EXPAND_FRAMES);
|
|
|
|
} catch (Exception e) {
|
|
|
|
cr.accept(cn, ClassReader.SKIP_FRAMES);
|
|
|
|
}
|
|
|
|
return cn;
|
|
|
|
}
|
|
|
|
|
2021-07-10 16:05:08 +00:00
|
|
|
/**
|
|
|
|
* Writes a valid byte[] from the provided classnode
|
|
|
|
*/
|
|
|
|
public static byte[] nodeToBytes(ClassNode cn)
|
|
|
|
{
|
|
|
|
final ClassWriter cw = new ClassWriter(0);
|
|
|
|
|
|
|
|
try {
|
|
|
|
cn.accept(cw);
|
|
|
|
} catch (Exception e) {
|
|
|
|
e.printStackTrace();
|
|
|
|
try {
|
|
|
|
Thread.sleep(200);
|
|
|
|
cn.accept(cw);
|
|
|
|
} catch (InterruptedException ignored) { }
|
|
|
|
}
|
|
|
|
|
|
|
|
return cw.toByteArray();
|
|
|
|
}
|
|
|
|
|
2021-06-28 04:13:55 +00:00
|
|
|
public static MethodNode getMethodByName(ClassNode cn, String name)
|
|
|
|
{
|
|
|
|
for(MethodNode m : cn.methods)
|
|
|
|
{
|
|
|
|
if(m.name.equals(name))
|
|
|
|
return m;
|
|
|
|
}
|
|
|
|
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
}
|