逆向 jar ( e.g dvt )

java jar 逆向环境搭建

安装 jd-gui

这个工具主要用来看 java 的字节码文件(.class)

  1. jd-gui/release 下载 jd-gui-windows-1.6.6.zip
  2. 解压 jd-gui-windows-1.6.6.zip
  3. 进入解压后的目录, 把jd-gui.exe 发送快捷方式到桌面

安装 jclasslib

这个工具主要用来改java 字节码文件 (.class)

  1. jclasslib/release 下载 jclasslib_win64_6_0_3.exe
  2. 双击 jclasslib_win64_6_0_3.exe 完成安装

安装 7-zip

这个工具是用来查看jar 并替换里面需要修改的class 文件
7-zip 下 载安装

安装 jdk

jdk download 下载 msi 安装包安装

配置环境变量

  • JAVA_HOME
  • CLASSPATH
  • 加入PATH
    在PATH 里新增一项

java jar逆向步骤

使用jd-gui 把 jar 里的class 全部还原成 java 原文件

打开 jd-gui

把jar 拖到 jd-gui

导出java 原文件

File => Save all Source
这会生成一个和jar 原文件目录结构一样的目录, 只不过里面的 .class 全部替换成了 .java

在导出的源文件目录下 使用rg 搜索关键字 定位到目标 .java 再去分析

1
rg "[\da-fA-F]{8,}"

使用 jclasslib 更改 .class

打开 jclasslib

把 .class 拖到 jclasslib

找到需要修改的地方

主要看方法里面的 [0]Code 如上图所示就已经定位到了需要更改的位置了, 在java 文件中可以看到 只需要把return bool 改成 return true 就可以了
这里是已经改过了的, 原来 395 字节处是 iload_0

如何修改

  • 查看jvm 手册掌握原理之后修改

    jvm-manual
    另外在jclasslib 里面对操作码点左键 => 查看 JVM 规范可以查看该操作码的手册

  • 编写目标java 文件, 编译后查看机器码

    如我需要知道 return true 的机器码

    • 编写test.java

      test.java

      1
      2
      3
      4
      5
      
      public class test {
          public boolean main(String[] args) {
              return true;
          }
      } 
      
      • 😠 注意: java文件名一定要和 class 名一致, 否则编译不过, 还没有有价值的错误信息
    • 编译test.java

      1
      
      javac test.java
      
    • 使用 jclasslib 查找 test.class

      可以看到 return true 其实就是先把常数1 压栈, 然后再 ireturn 就可以了

修改class

在需要修改的地方点击左键 => 替换操作码 => 选择 iconst_1 => 确定 => 保存

把改好的文件重新打包成 jar

备份原来的jar

用7zip 打开原来的jar 并进入需要替换的class 所在的目录上

把改好的class 拖进入覆盖掉原来的class

还可以用 beyond compare 去对比一下两个jar 包

😠 注意: 之所以不能把解压后的文件夹直接打包成.zip 再rename

是因为在Windows 下解压的时候, 由于文件名的大小字不敏感, 就有可能会出问题
用有问题的文件再打包就没有意义了

逆向 DVT eclipse

首先了解到DVT 是用的FLEXLM 架构做的验签, 浏览安装目录, 最终定位到 “dvt_eclipse\batch\libs\ro.amiq.dvt.flclient-2.11.jar”

参考jar 逆向步骤对jar 完成修改并打包

参考java jar逆向步骤

查找DVT 中可能包含 ro.amiq.dvt.flclient-2.11.jar 这个jar 的jar

因为jar 可以包含 jar 所以我们除了要替换掉原始的 ro.amiq.dvt.flclient-2.11.jar 这个jar之外, 还要替换包含它的jar

使用rg 搜索可能包含的包

1
rg --binary ro.amiq.dvt.flclient-2.11.jar

可以看到 eclipse\plugins\ro.amiq.dvt_22.1.22.jar 中包含了 ro.amiq.dvt.flclient-2.11.jar
之所以可以搜索到是因为 每一个 jar 里面会有 MANIFEST.MF 这个文件, 如果它有包含其他 jar 的话, 会在这个文件里面记录

使用 7zip 替换掉需要修改的jar

需要替换的有两个 一个是 batch/libs/ro.amiq.dvt.flclient-2.11.jar 下的, 另一个是 eclipse\plugins\ro.amiq.dvt_22.1.22.jar
参考 把改好的class 拖进入覆盖掉原来的class

清除缓存文件

使用 wsl 里面的 find 命令找到 ro.amiq.dvt.flclient-2.11.jar 缓存的地方

1
find -name ro.amiq.dvt.flclient-2.11.jar

把第二个结果的jar 删掉

设置LICENSE

license file

DVT.lic

 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
32
33
34
35
36
INCREMENT dvt_core dvtlmd 2.0 21-dec-2029 0 HOSTID=ANY user_info="DVT Eclipse" \
        START=1-jan-2020 SIGN="1111 2222 3333 4444 5555 6666 7777 8888\
        9999 1111 2222 3333 4444 5555 6666 7777 8888 9999 1111 2222 3333 \
        4444 5555 6666 7777 8888 9999 1111 2222 3333 4444"
INCREMENT dvt_sv dvtlmd 2.0 21-dec-2029 0 HOSTID=ANY user_info="DVT Eclipse" \
        START=1-jan-2020 SIGN="1111 2222 3333 4444 5555 6666 7777 8888\
        9999 1111 2222 3333 4444 5555 6666 7777 8888 9999 1111 2222 3333 \
        4444 5555 6666 7777 8888 9999 1111 2222 3333 4444"
INCREMENT dvt_sv_lint dvtlmd 2.0 21-dec-2029 0 HOSTID=ANY user_info="DVT Eclipse" \
        START=1-jan-2020 SIGN="1111 2222 3333 4444 5555 6666 7777 8888\
        9999 1111 2222 3333 4444 5555 6666 7777 8888 9999 1111 2222 3333 \
        4444 5555 6666 7777 8888 9999 1111 2222 3333 4444"
INCREMENT dvt_sv_debug dvtlmd 2.0 21-dec-2029 0 HOSTID=ANY user_info="DVT Eclipse" \
        START=1-jan-2020 SIGN="1111 2222 3333 4444 5555 6666 7777 8888\
        9999 1111 2222 3333 4444 5555 6666 7777 8888 9999 1111 2222 3333 \
        4444 5555 6666 7777 8888 9999 1111 2222 3333 4444"
INCREMENT dvt_vhdl dvtlmd 2.0 21-dec-2029 0 HOSTID=ANY user_info="DVT Eclipse" \
        START=1-jan-2020 SIGN="1111 2222 3333 4444 5555 6666 7777 8888\
        9999 1111 2222 3333 4444 5555 6666 7777 8888 9999 1111 2222 3333 \
        4444 5555 6666 7777 8888 9999 1111 2222 3333 4444"
INCREMENT dvt_vhdl_debug dvtlmd 2.0 21-dec-2029 0 HOSTID=ANY user_info="DVT Eclipse" \
        START=1-jan-2020 SIGN="1111 2222 3333 4444 5555 6666 7777 8888\
        9999 1111 2222 3333 4444 5555 6666 7777 8888 9999 1111 2222 3333 \
        4444 5555 6666 7777 8888 9999 1111 2222 3333 4444"
INCREMENT dvt_e dvtlmd 2.0 21-dec-2029 0 HOSTID=ANY user_info="DVT Eclipse" \
        START=1-jan-2020 SIGN="1111 2222 3333 4444 5555 6666 7777 8888\
        9999 1111 2222 3333 4444 5555 6666 7777 8888 9999 1111 2222 3333 \
        4444 5555 6666 7777 8888 9999 1111 2222 3333 4444"
INCREMENT dvt_e_debug dvtlmd 2.0 21-dec-2029 0 HOSTID=ANY user_info="DVT Eclipse" \
        START=1-jan-2020 SIGN="1111 2222 3333 4444 5555 6666 7777 8888\
        9999 1111 2222 3333 4444 5555 6666 7777 8888 9999 1111 2222 3333 \
        4444 5555 6666 7777 8888 9999 1111 2222 3333 4444"
INCREMENT dvt_pss dvtlmd 2.0 21-dec-2029 0 HOSTID=ANY user_info="DVT Eclipse" \
        START=1-jan-2020 SIGN="1111 2222 3333 4444 5555 6666 7777 8888\
        9999 1111 2222 3333 4444 5555 6666 7777 8888 9999 1111 2222 3333 \
        4444 5555 6666 7777 8888 9999 1111 2222 3333 4444"