反编译jar包

概述

  • unzip解压jar包
  • jad反编译class文件
  • 自定义反编译工具-编写shell文件

jar包的解压

有两种方式,使用jar命令或者unzip命令
由于jar命令不能将输出重定向到指定的文件夹,故选择unzip命令
使用jar来解压的命令只能将解压后的数据解压到当前文件夹

1
2
3
4
5
jar -xvf dcm-stats-service-impl.jar

# 1. -x 解压
# 2. -v 打印解压过程
# 3. -f jar包名

1
2
3
4
5
unzip -qo dcm-stats-service-impl.jar -d classes

# 1. -q 安静执行,不打印输出
# 2. -o 覆盖文件
# 3. -d 指定输出文件目录

jad反编译

对多个java字节码文件进行反编译

1
2
3
4
5
6
7
jad -o -r -sjava -dsrc 'classes/com/**/*.class' > /dev/null 2>&1

# 1. -o 覆盖文件
# 2. -r 保存包目录的结构
# 3. -s 指定输出文件的后缀名
# 4. -d 指定输出文件目录
# 5. > /dev/null 2>&1 将输出信息(标准输出,标准错误)都输出到/dev/null(空设备文件),即不显示输出信息

自定义反编译工具-编写shell文件

文件名为decompile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#! /bin/bash
# 获取需要反编译的jar包名
JAR_NAME=${1}
# 判断输入的jar包名是否为空
if [ -n "$JAR_NAME" ]; then
BASE_PATH=`pwd`

JAR=${BASE_PATH}/${JAR_NAME}

CLASSES=${BASE_PATH}/classes

SRC=${BASE_PATH}/src
else
# 如果jar包名为空,则打印提示错误,并退出
echo "ERROR: input the file.jar"
exit 2
fi

echo "1. unzip "${JAR_NAME}" to classes"
# 解压
`unzip -qo ${JAR} -d ${CLASSES}`

echo '2. jad all classes'
# 反编译
`jad -o -r -sjava -d${SRC} 'classes/com/**/*.class' > /dev/null 2>&1`

echo '3. delete all classes'
# 删除解压生成的临时文件夹
rm -rf ${CLASSES}

echo 'decompile successful'

为decompile添加执行权限chmod u+x decompile
将decompile复制到系统环境变量能访问的地方eg:/usr/local/bin/, cp decompile /usr/local/bin/

使用

使用type命令查看decomile

1
2
➜  jar type decompile
decompile is /usr/local/bin/decompile

使用decompile命令将jar包反编译到当前目录下的src文件夹中

1
2
3
4
5
6
7
8
➜  too decompile ../dcm-stats-service-impl.jar
1. unzip ../dcm-stats-service-impl.jar to classes
2. jad all classes
3. delete all classes
decompile successful
➜ too ll
total 0
drwxr-xr-x 3 tuyu staff 102 Sep 14 11:47 src

参考链接

Linux Shell 1>/dev/null 2>&1 含义
JAD参数
bash shell 获取当前正在执行脚本的绝对路径
我使用过的Linux命令之exit - 退出当前shell
Java - 解压和打包Jar
将.jar文件解压到指定目录?
使用jad反编译整个jar包