java如何反编译jar包并修改class文件重新打包

目录
  • 反编译jar包并修改class文件重新打包
    • 解决思路
  • jar包反编译后修改源码再编译
    • 1.场景
    • 2.详细步骤

反编译jar包并修改class文件重新打包

这两天碰到一个需求:需要修改一个jar包中的逻辑代码,并且重新打包

本来是很简单的问题,但是因为这个jar包不是可执行的jar包(没有main方法入口),jar反编译之后又是不能通过idea重新打包,因为jar是混乱的

所以费了点时间,在此记录下

解决思路

反编译jar包

首先用一些反编译工具类似 jad-gui 之类的 ,将项目反编译成java文件包

示例的jar包并不是业务真正使用,只是写博客demo,假设这个包就叫 demo.jar

这时候导出为java文件即可

用javac 编译成class文件

注意这里容易出问题,因为当前java文件可能有一些依赖其他jar包的代码,那就需要一个一个引入

# 最后必须以 : 结束
# 如果有编译问题可以尝试 -Xlint:unchecked 这个参数
javac -classpath demo.jar:依赖jar包路径1:依赖jar包路径2: Demo.java

此时会在当前运行目录下生成 Demo.class

此时目录结构如下(请忽略和上图jad-gui的不匹配)

- demo
  - META-INF
    MANIFEST.MF
  - com
    - demo
      demo.class

打jar包

# 在demo文件夹下运行
# 最后这个 . 代表当前目录所有文件
jar cvfm Demo.jar META-INF/MANIFEST.MF .

大功告成

jar包反编译后修改源码再编译

1. 场景

需要对当前的jar包功能进行修改,但是没有源码

两种方式:

  • 通过反编译软件如JD-GUI或其他Java开发常用的IDE如IDEA查看源代码,创建新工程,按照文件结构逐个将文件源码复制粘贴到工程中,再根据个人需求进行修改、编译等。
  • 通过反编译软件JD-GUI直接保存成源码格式的工程文件,再通过IDEA打开工程,进行必要的配置后,再根据需求进行修改编译。

很明显第一种方式比较费时,选用第二种方式。

2. 详细步骤

2.1 查看源码

如果仅仅是查看源代码的话,有两种方式:

方式一:

直接通过jd-gui打开jar文件即可。

方式二:

通过IDEA的External Libraries查看。在IDEA中通过Project Structure将需要查看的jar包添加到Libraries,之后就可以查看了。

第二种方式虽然稍微麻烦一点,但如果只是查看源码的话,个人更倾向第二种。

2.2 生成源文件

借助jd-gui可以直接生成**.java**源文件。通过菜单File -> Save All Sources就可以生成源文件压缩包。

注:查看生成的源码文件中有一些多余的注释,如行号及一些元数据信息,可以通过修改jd-gui的偏好设置重新生成。

2.3 构建项目

通过IDEA直接打开源文件;

创建src目录,将源文件方法到src下,根据报错信息,修改工程的外部引用;

2.4 编译成jar包

两种类型可以选择:Empty可以不设置主类,适用于编译没有主类的jar包;

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • IDEA中打jar包的两种方式

    在讲这两种方式之前,我们先来说明一下什么是java中的jar文件 jar (Java Archive File),翻译过来就是java的档案文件,它其实也类似于我们windows下的zip文件,唯一的区别就是在 JAR 文件的内容中,包含了一个 META-INF/MANIFEST.MF 文件,这个文件是在生成 JAR 文件的时候自动创建的,包含了JAR包的描述信息.主类的全类名等信息. 一:不使用Maven直接打Jar包. 1.File -->Project Structure -->Arti

  • 2020年支持java8的Java反编译工具汇总(推荐)

    大多商业软件,会对程序进行加密.加壳等安全措施以防范软件被破解,从而使得反编译越来越难.反编译是一个对目标可执行程序进行逆向分析,从而得到源代码的过程.尤其是像Java这样的运行在虚拟机上的编程语言,更容易进行反编译得到源代码. 我们知道,在代码支撑方面,JDK 1.7引入了字符串Switch.泛型接口改进等新功能,1.8增加了lambda表达式.方法传递.多重注解等新特性,这使得反编译工具的编写难度加大.今天我们盘点一下目前仍然可用的.相对功能很强大的Java反编译工具(Eclipse插件不做

  • 反编译jar实现的三种方式

    目录 工具准备 三种方式 1.使用fernflower反编译之后再编译 2.使用javassist动态修改class 3.通过引入原来的jar包,修改代码(推荐) 总结 工具准备 相同大版本的jdk idea fernflower.jar javassist.jar 或 本地下载地址 jd-gui 或 本地下载地址 三种方式 1.使用fernflower反编译之后再编译 把要反编译的.jar修改成.zip java -jar fernflower.jar classes.zip zzCode/

  • java如何反编译jar包并修改class文件重新打包

    目录 反编译jar包并修改class文件重新打包 解决思路 jar包反编译后修改源码再编译 1.场景 2.详细步骤 反编译jar包并修改class文件重新打包 这两天碰到一个需求:需要修改一个jar包中的逻辑代码,并且重新打包 本来是很简单的问题,但是因为这个jar包不是可执行的jar包(没有main方法入口),jar反编译之后又是不能通过idea重新打包,因为jar是混乱的 所以费了点时间,在此记录下 解决思路 反编译jar包 首先用一些反编译工具类似 jad-gui 之类的 ,将项目反编译成

  • 使用android-apktool来逆向(反编译)APK包方法介绍

    谷歌官方提供了apktool可以逆向已经发布出去的APK应用,即反编译已经打包成功的APK文件,使用它可以将其反编译成非常接近打包前的原始格式,对于APK来说,可以具体的逆向AndroidManifest.xml.资源文件resources.arsc以及将dex文件反编译成可以调试的smali文件. Warnning 但apktool并不等于是可以用来侵犯前作者的作品的工具,所以使用apktool工具的用户千万不用用其来进行不正当.非法的使用. It is NOT intended for pi

  • java动态添加外部jar包到classpath的实例详解

    java动态添加外部jar包到classpath的实例详解 前言: 在项目开发过程中我们有时候需要动态的添加外部jar包,但是具体的业务需求还没有遇到过,因为如果动态添加外部jar包后,我们就需要修改业务代码,而修改代码就需要重新启动服务,那样好像就没有必要动态添加外部jar包了,怎么样才能不重新启动服务器就可以使用最新的代码我没有找到方法,如果各位知道的话给我点建议,回归主题,实现动态添加外部jar包到classpath的方法如下: String beanClassName = "com.dy

  • Mybatis逆工程jar包的修改和打包

    上一篇文章Mybatis逆工程的使用主要是讲了mybatis-generator-core-1.3.2.jar的使用,这一篇我要介绍的是,修改jar包代码,实现生成自定义模板. 1.我们从这里可以下载mybatis-generator-core-1.3.2.jar项目源码 http://maven.outofmemory.cn/org.mybatis.generator/mybatis-generator-core/1.3.2/ 2.在eclipse下导入存在的maven项目,File->Imp

  • Java命令行下Jar包打包小结

    jar包打包实现 jar包打包可以使用jar指令实现打包,在命令行中输入jar可以查看jar指令的内容 从最后显示的两个示例看出存在两种打包的方法,两者的区别就是是否使用自己定义的MANIFEST清单文件.第一个示例没有使用MANIFEST文件进行打包,所以最终生成的jar包中MANIFEST文件为默认文件,这种方式适用于比较简单的jar包结构,不存在其他jar包依赖以及生成的jar包不需要可执行.这种方式生成的jar包不能使用java -jar XXX.jar命令执行,因为MANIFEST文件

  • android studio编译jar包或者aar包的方法教程详解

    1. 在原有工程目录右键-> new ->Module->: 2. 选择library: 3. 一路next,最后finish: 4. 在新生成的lib module下的build.gradle中添加如下代码: task makeJar(type: Copy) { //删除存在的 delete 'build/outputs/aar/plugin-release.aar' delete 'libs/' //设置拷贝的文件来源 from('build/outputs/aar/') ////新

  • java防反编译最简单的技巧分享

    前言 本文主要跟大家介绍了关于java防反编译的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 示例代码: 源码使用try-catch代码包装下,如下: public class CompileForbid { public static void main(String[] args) { try { System.out.println("-------"); //防止反编译的处理 if (654789 == new Random().nextInt()

  • Java实现从jar包中读取指定文件的方法

    本文实例讲述了Java实现从jar包中读取指定文件的方法.分享给大家供大家参考,具体如下: 以下的Java代码实现了从一个jar包中读取指定文件的功能: /** * This class implements the funcationality of reading and writing files in jar files. */ package com.leo.util; import java.io.InputStream; import java.io.FileOutputStrea

  • 使用IDEA将Java/Kotliin工程导出Jar包的正确姿势

    导出的 Jar 包无法运行? 导出的 Jar 包找不到 Main class? 大概是我对导出 Jar 包的理解不深吧,反正一直不太懂 IDEA 导出 Jar 包的界面和功能到底怎么用.但总算是自己摸索出了正确的方法. 第一步:添加构建 首先要介绍的是 Artifact 这个概念,可以理解为一种构建,比如说 Android Studio 构建出来的 Artifact 就是 Apk 文件.Java 程序当然是可以构建出 Jar 包的. 在一个 Java 或 Kotlin 工程中,在 IDEA 的顶

随机推荐