1、工具
A、jd-gui
反编译jar,查看class文件的对应的源码,通过命令 apktool d my.apk 反编译apk文件,解压之后,可以查看AndroidManisfast.xml文件等配置信息,res资源,asset资源等。
通过命令sh dex2jar.sh classes.dex将apk文件中解压出来的dex文件转换为jar文件。
然后通过jd-gui可以打开jar文件,就可以查看class文件对应的源码了。
B、jclasslib
查看class文件结构信息的工具,比如class文件的General Information 、Constant Pool 、Fields 、Methods 、Attributes 等。这样的话 就可以根据class文件结构,定位到对应的元素(比如修改常量内容),进而修改class内容。
2、修改jar包中class文件内容方法
A、借助于jclasslib方法定位到class文件中的特定位置。
B、新建工程,通过读取class文件流的方式,将class文件读取到内存,然后修改特定位置的元素内容。
C、将修改之后的内容,保存到新的class文件。
D、将新的class文件替换jar包中的对应的class文件。
修改class文件内容的代码参考:
- import java.io.*;
- import org.gjt.jclasslib.io.ClassFileWriter;
- import org.gjt.jclasslib.structures.CPInfo;
- import org.gjt.jclasslib.structures.ClassFile;
- import org.gjt.jclasslib.structures.constants.ConstantUtf8Info;
- public class Test {
- public static void main(String[] args) throws Exception {
- String filePath = "C:\\GenEntity.class";
- FileInputStream fis = new FileInputStream(filePath);
- DataInput di = new DataInputStream(fis);
- ClassFile cf = new ClassFile();
- cf.read(di);
- CPInfo[] infos = cf.getConstantPool();
- int count = infos.length;
- for (int i = 0; i < count; i++) {
- if (infos[i] != null) {
- System.out.print(i);
- System.out.print(" = ");
- System.out.print(infos[i].getVerbose());
- System.out.print(" = ");
- System.out.println(infos[i].getTagVerbose());
- if(i == 362){
- ConstantUtf8Info uInfo = (ConstantUtf8Info)infos[i];
- uInfo.setBytes("芝麻不开门!".getBytes());
- infos[i]=uInfo;
- }
- }
- }
- cf.setConstantPool(infos);
- fis.close();
- File f = new File(filePath);
- ClassFileWriter.writeToFile(f, cf);
- }
- }