一、查看二进制字节码文件的方式: 1.通过cmd命令:javap -v ClassA 2.通过jclasslib工具
二、将Android的apk中的dex反编成smail文件,直接修改smail文件后再回编成dex;
三、修改二进制字节码文件的方式: 1.反编译后,修改java文件,然后在javac 编译成class,替换原来的class(但这个方法有人试验了不成功); 2.通过jclasslib、eclipse实现修改: 2.1 修改class中的变量值: 比如我想要修改 不能链接数据库的提示信息 为 "芝麻不开门!"
步骤如下: 1)用jd-gui打开该jar 怎么打开不用我说了吧? 打开之后找到 要修改提示信息 的class文件 这里找到的是GenEntity 找到对应需要修改的代码所在的方法名 我这里包含提示信息的这段代码在方法 getAllDataBase() 如下图: 2)用jd-gui或者winrar把GenEntity.class 解压出来到C盘 (目录无所谓) 3)双击桌面上安装好了的 jclasslib bytecode viewer ,点击软件的 File -- Open Class File 打开你刚解压出来的class文件 4)点击methods--getAllDataBase--Code methods是表示方法不用说吧 getAllDataBase是刚在jd-gui里面找到的方法名 Code包含了getAllDataBase方法里所有的信息 找到"不能打开数据库连接,请检查!" 这里这个工具没有提供搜索功能 如果这里很多内容 那么你可以点击 copy to clipboard把这里的内容复制到一个文本文件里面然后再搜索
这里找到的是第82行
5)点击第 82行后面的 #34 会跳转到Constant Pool常量池的第34个常量 6)再点右边的 cp info #362 会跳转到第362个常量 这里能看到String: 不能打开数据库连接,请检查! 也就是最后输出的信息 7)找到GenEntity.class的关键常量了现在就该修改它了 在eclipse里面新建一个Test来处理GenEntity.class [java]
view plaincopy
这里需要注意"C:\\GenEntity.class"是我存放class的目录
运行Test.java 会有如下提示信息 没有报错就证明正常的 如果报错那么就有问题 9)把C盘刚修改后的GenEntity.class替换掉原来的GenEntity.class 怎么替换不用我说了吧.. 用winrar打开.jar 然后把GenEntity.class拖进去覆盖就行了 10)运行效果.. 大功告成
2.2 修改class中的操作语句: 例如修改if 语句跳转
Jclasslib 观测到jvm op code 如下 现在想更改>= 为<,怎么办? 查询Opcode Mnemonics by Opcode
http://java./docs/books/jvms/second_edition/html/Mnemonics.doc.html 并查到 >= 的操作码为 0xA1 所以只要用Ultraedit 修改 0xA1 为 0xA2 就可以了。 再次用jclasslib加载 .class 可以看到仅仅变更了比较的操作码
|
|