class文件直接修改_反编译修改class文件变量
今天笔者同事遇到一个问题,客户同事的数据库连接信息直接写在代码中,连接的密码改了,但是又没有源代码,所以只能直接修改Java class文件。
记录一下修改步骤:
1.下载JClassLib_windows(后面用到),下载jd-gui-1.4.0.jar,用来反编译class文件的,IDEA也可以反编译class文件;

找到需要修改文件的变量,我这里是Admin。
2.第二步把class文件,备份待用,把工程文件存一份,方法如下图所示:

3.安装JClassLib,安装完成之后用JClassLib打开需要修改的class文件,我这里是Client.class,找到需要修改的函数方法位置,我这里是main函数,然后点菜单的code,查看右侧的Bytecode,找到需要修改的变量Admin,然后点击#173,会跳到变量区,如下面二张图说明:
图1

图2
4.鼠标点击cp_info#174会跳转到174这行变量,如下图所示:

4.替换变量
写一个Java程序,替换指定变量的值,filePath变量存在需要替换的class文件路径,174是需要替换的位置,Admin123是希望替换的变量,如果替换成中文需要注意目标编码(不然会用JVM默认编码),如下图所示:

图1

图2 中文编码设置
4.上面的Java程序完整代码如下,特别需要注意的是:程序依赖JClasslib包下的jclasslib-library.jar包,所以可以进到JClasslib安装路径下拷贝一个jclasslib-library.jar包文件放到build path内,我的路径和jar包文件如下:

完整代码,你们替换三处,文件路径、变量位置、修改后目标变量
import java.io.DataInput;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException; import org.gjt.jclasslib.io.ClassFileWriter;
import org.gjt.jclasslib.structures.CPInfo;
import org.gjt.jclasslib.structures.ClassFile;
import org.gjt.jclasslib.structures.InvalidByteCodeException;
import org.gjt.jclasslib.structures.constants.ConstantUtf8Info; public class Client
{
@SuppressWarnings("deprecation")
public static void main(String[] args){
String filePath = "C:\\Users\\zw\\Desktop\\Client.class";
FileInputStream fis = null;
try {
fis = new FileInputStream(filePath);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} DataInput di = new DataInputStream(fis);
ClassFile cf = new ClassFile();
try {
cf.read(di);
} catch (InvalidByteCodeException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
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(" = ");
try {
System.out.print(infos[i].getVerbose());
} catch (InvalidByteCodeException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.print(" = ");
System.out.println(infos[i].getTagVerbose());
if(i == 174){
ConstantUtf8Info uInfo = (ConstantUtf8Info)infos[i];
uInfo.setBytes("Admin123".getBytes());
infos[i]=uInfo;
}
}
}
cf.setConstantPool(infos);
try {
fis.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
File f = new File(filePath);
try {
ClassFileWriter.writeToFile(f, cf);
} catch (InvalidByteCodeException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
另外我把工程
class文件直接修改_反编译修改class文件变量的更多相关文章
- 大富豪APK安卓客户端的反编译修改和重新打包
大富豪APK安卓客户端的反编译修改和重新打包 修改安装我们需要几个工具 DFH_3.4.X (用于修改客户端) dnsPy (用于修改.dll文件) 大富豪加解密.exe ( 用于加 ...
- 客户的一个紧急bug,我用了两种方式进行 C# 反编译修改源码
一:背景 1. 讲故事 周五下午运营反馈了一个紧急bug,说客户那边一个信息列表打不开,急需解决,附带的日志文件也发过来了,看了下日志大概是这样的: 日期:2020-11-13 12:25:45,92 ...
- dnSpy进行反编译修改并编译运行EXE或DLL
dnSpy对目标程序(EXE或DLL)进行反编译修改并编译运行 本文为原创文章.源代码为原创代码,如转载/复制,请在网页/代码处明显位置标明原文名称.作者及网址,谢谢! 本文使用的工具下载地址为: h ...
- Android反编译(二)之反编译XML资源文件
Android反编译(二) 之反编译XML资源文件 [目录] 1.工具 2.反编译步骤 3.重新编译APK 4.实例 5.装X技巧 6.学习总结 1.工具 1).反编译工具 apktool http ...
- 晓莲说-何不原创:如何通过jad把class批量反编译成java文件
背景:前几天在项目开发的时候遇到一个问题,那就是利用myeclipse编写好的一个项目打包成jar包后上传部署到服务器里,之后本地的项目被自己改来改去出现了一些问题,想着把上传到服务器里面的war包下 ...
- Android反编译获取资源文件-android学习之旅(69)
有时候你看到一些很好看的布局,会考虑别人怎么实现的,回想参考一下,那么这时候反编译一下是很必要的. 要用到的工具apktool.bat和aapt.exe和apktool.jar(要最新版本) 下载前两 ...
- Apktool反编译apk资源文件
Android开发过程中,如何查看已经打包的APK内部xml呢,google下找到了apktool这个工具, apktool项目现在已经迁移到了github:apktool 目前最新版本2.2.2,如 ...
- apktool 在mac下的使用 -反编译安卓apk文件
1.下载apktool 点击这里下载 ,里面有两个文件,一个是.jar,一个是自己写的脚本.sh 注:最新的apktool.jar 文件可以点击这里下载 .sh脚本是自写脚本可不用更新最新,下载的ja ...
- 『原』在Linux下反编译Android .apk文件 使用apktool dex2jar JD-eclipse
一.使用apktool 将 apk反编译生成程序的源代码和图片.XML配置.语言资源等文件 具体步骤: (1)下载反编译工具包:apktool 官方的打不开 http://apktool.shouji ...
随机推荐
- 一行代码让python的运行速度提高100倍
python一直被病垢运行速度太慢,但是实际上python的执行效率并不慢,慢的是python用的解释器Cpython运行效率太差. “一行代码让python的运行速度提高100倍”这绝不是哗众取宠的 ...
- 【MFC系列】MFC快速设置控件文本字体、大小、颜色、背景
以静态文本为例,分享一下怎么修改文本字体.大小.颜色.背景等参数.其他文本.控件等可参照修改. 1.修改字体.大小 这个很简单,首先在Dlg类中声明一个CFont类型的成员变量: 然后在类的初始化函数 ...
- 你没见过的python语法
目录: 1.不一样的列表 2.改变type中的规则,创建类:类属性大写 3.%s字串格式化,不用元组用字典 4.没有参数抛出异常 5.字符串签名加f 格式化字符串 6.attr库 1.不一样的列表 l ...
- Java compiler level does not match解决方法, java 修改编译用的jdk的方法
从别的地方导入一个项目的时候,经常会遇到eclipse/Myeclipse报Description Resource Path Location Type Java compiler level d ...
- python学习笔记(二十)初识面向对象
面向对象的编程的主要思想是把构成问题的各个事物分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描述一个事物在解决问题的过程中经历的步骤和行为.对象作为程序的基本单位,将程序和数据封装其中, ...
- 基于python3.6.6的scrapy环境部署+图像识别插件安装
一.Python3.6.6安装1.安装依赖的二进制软件包yum -y install zlib zlib-devel bzip2 bzip2-devel ncurses ncurses-devel r ...
- 模块讲解----json与pickle模块的区别
1.在生产中,dumps和loads只进行一次,而且要用w把原来的数据冲掉,从而保证每次都是最新的. 2.虚拟机的快照,是每个快照都有一个文件,而不是全都不放在一起. 3.如果想生产好几个序列化,就生 ...
- 使用DAO工厂创建实现类对象
首先分析DAO模式中的每一部分 VO(对象实体):这个类成员变量与数据库中每个字段一一对应,同时提供了相应是set和get方法来设置或取得数值.这个类一般是通过IDE自动生成的 DAO(数据访问接口) ...
- Xcode控制台命令
命令 解释 break NUM 在指定的行上设置断点 bt 显示所有的调用栈帧,该命令可用来显示函数的调用顺序 clear 删除设置在特定源文件.特定行上的断点,其用法为:clear FILENAME ...
- PL/SQL Developer 登录 Oracle 12c和Win10下安装Oracle 11g
安装了Oracle 12c 后使用PL/SQL Developer怎么也不能连接到Oracle 12c.网上找一下,按照fcflying所说的操作成功了,所以做个笔记: 1)安装Oracle 12c ...