服务热线
15527777548/18696195380
发布时间:2021-10-08
简要描述:
0x01 起因今天上github搜索哥斯拉项目时,看到了有人发布了哥斯拉源码的项目。项目地址如下:https://github.com/808Mak1r/GodzillaSource最初以为是哥斯拉作者发布了项目源码,...
今天上github搜索哥斯拉项目时,看到了有人发布了哥斯拉源码的项目。
项目地址如下:
最初以为是哥斯拉作者发布了项目源码,点进这个项目一看,原来是反编译构建的哥斯拉源码。
于是心血来潮,决定也对该哥斯拉3.0.3版本,也就是哥斯拉作者发布的最新版本进行反编译生成可运行的项目。
0x02 构建pom.xml
此次使用的环境:
jdk1.8.0_301
jdk-11.0.12
IntelliJ IDEA 2021.2 (Ultimate Edition)
JD-Gui version 1.6.6
要对哥斯拉项目进行反编译,首先要下载哥斯拉项目的jar包。项目地址如下:
https://github.com/BeichenDream/Godzilla
下载最新版的v3.0.3-godzilla
将下载后的文件用jd-gui打开
一般来讲引入的第三方库在maven已经com下,因此如果建构pom.xml时首先需要把这两处地方的第三方库引入。
接下来打开IDEA,新建一个maven项目
因为maven要下载第三方库,最好先在pom文件中配置下载源,不然会下载很慢,个人常用的源如下:
repositories>
repository>
id>alimaven/id>
name>aliyun maven/name>
url>//maven.aliyun.com/nexus/content/groups/public//url>
/repository>
repository>
id>jcenter/id>
name>bintray/name>
url>http://jcenter.bintray.com/url>
/repository>
/repositories>
注意 这里构建的pom.xml文件在之后反编译过程中还会进行修改,并不是最终版本
先对jd-gui中的maven下的地方库进行配置,我们可以在jd-gui中的pom.properties文件查看到maven引入的第三方库的版本和名称,可以在 https://mvnrepository.com/ 网站找到对应的配置信息,构建后的pom.xml的以来如下:
dependencies>
dependency>
groupId>org.xerial/groupId>
artifactId>sqlite-jdbc/artifactId>
version>3.34.0/version>
/dependency>
dependency>
groupId>org.javassist/groupId>
artifactId>javassist/artifactId>
version>3.27.0-GA/version>
/dependency>
dependency>
groupId>com.miglayout/groupId>
artifactId>miglayout-swing/artifactId>
version>5.3/version>
/dependency>
dependency>
groupId>com.miglayout/groupId>
artifactId>miglayout-core/artifactId>
version>5.3/version>
/dependency>
!-- https://mvnrepository.com/artifact/com.formdev/svgSalamander -->
dependency>
groupId>com.formdev/groupId>
artifactId>svgSalamander/artifactId>
version>1.1.2.4/version>
scope>runtime/scope>
/dependency>
/dependencies>
jd-gui的maven文件夹下的相关依赖添加到pom.xml中后,继续添加com文件夹下的第三方依赖。(但对于com文件夹下的第三方依赖有两种加载方式,一种是在pom.xml中添加依赖配置选项,另一种则是直接在项目中引入第三方依赖,例如导入jar包或者源代码。这里我选择先使用在pom.xml中引入第三方的依赖库。)
由于个人能力有限,在com文件夹下找不到依赖包对应的版本信息。最开始就卡住了,只能凭经验选择对应的版本。
jd-gui的com文件夹下包依赖如下
但在 (https://mvnrepository.com/) 网站并未找到com.jgoodies.common 以及 com.kitfox.svg的包(此时选择在maven中添加第三方依赖的我还没意识到问题),暂时选用 com.jgoodies.jgoodies-common 和 com.kitfox.svg.svg-salamander 包进行代替。
构造的pom.xml中的依赖如下:
!-- com文件夹下的依赖 -->
dependency>
groupId>com.formdev/groupId>
artifactId>flatlaf/artifactId>
version>1.1.2/version>
scope>runtime/scope>
/dependency>
dependency>
groupId>com.kitfox.svg/groupId>
artifactId>svg-salamander/artifactId>
version>1.0/version>
/dependency>
dependency>
groupId>com.jgoodies/groupId>
artifactId>forms/artifactId>
version>1.2.1/version>
/dependency>
dependency>
groupId>com.jgoodies/groupId>
artifactId>jgoodies-common/artifactId>
version>1.7.0/version>
/dependency>
pom.xml文件构建好后,使用maven reload来加载第三方库。
到这里第三方依赖就加载完成(后续会对pom.xml文件进行更改)。
这里反编译源代码,我们用IDEA提供的java-decompiler.jar包,只要安装了IDEA,在IDEA安装目录下的plugins -> java-decompiler -> lib文件夹中都有该jar包。
首先我们在哥斯拉文件的同级目录下新建一个文件夹,我这里取名为demo
然后我们在哥斯拉文件所在的文件夹路径下调用如下命令,切记要用是jdk11的java.exe来调用该命令,IDEA的java-decompiler.jar的路径请根据实际情况修改。
"C:\Program Files\Java\jdk-11.0.12\bin\java" -cp "C:\Program Files\JetBrains\IntelliJ IDEA 2021.2\plugins\java-decompiler\lib\java-decompiler.jar" org.jetbrains.java.decompiler.main.decompiler.ConsoleDecompiler -dgs=true Godzilla.jar demo
命令调用完成后在demo文件夹下会生成一个jar包,Godzilla.jar
对该jar包进行解压
进入解压后的文件夹,该文件夹下就是IDEA的java-decompile.jar反编译后的源代码
因为第三方库已经加载完成,我们不需要第三方库的源代码,哥斯拉项目的源代码在如下几个文件夹中
├─core
│ ├─annotation
│ ├─imp
│ ├─shell
│ └─ui
│ ├─component
│ │ ├─dialog
│ │ ├─menu
│ │ └─model
│ ├─imp
│ └─model
├─images
├─net
│ └─miginfocom
│ ├─layout
│ └─swing
├─shells
│ ├─cryptions
│ │ ├─cshapAes
│ │ │ └─template
│ │ ├─JavaAes
│ │ │ └─template
│ │ └─phpXor
│ │ └─template
│ ├─payloads
│ │ ├─csharp
│ │ │ └─assets
│ │ ├─java
│ │ │ └─assets
│ │ └─php
│ │ └─assets
│ └─plugins
│ ├─cshap
│ │ └─assets
│ ├─java
│ │ └─assets
│ └─php
│ └─assets
└─util
└─http
分别是 core 、 images 、net 、 shells 、 util
我们只需要拷贝这几个文件夹,到IDEA的哥斯拉项目中即可。注意其中的net文件夹后续会删除。
哥斯拉的项目启动文件是 core.ui.MainActivity ,找到该文件后直接启动项目
当然是启动失败的呢
第一条错误信息为 java: 程序包com.formdev.flatlaf.demo.intellijthemes不存在
好的,现在开始对依赖文件进行调整。
上面错误信息的原因搭配上IDEA中爆红的部分,我们可以看出这是由于我们引入的com.formdev.flatlaf包缺乏com.formdev.flatlaf.demo这个子包,而哥斯拉项目需要引用这个子包中的文件。
这时候去github查看flatlaf项目的源代码,查看官方是否有提供有jar包,同时该jar包中有demo这个子包。
在github的搜索结果中,第一个项目 JFormDesigner/FlatLaf 是flatlaf的官方项目,我们先不看,因为有个更有意思的项目在下方,该项目写着 Godzilla 依赖的 flatlaf-demo-1.4.jar mvn 重新构建。
项目地址如下:
https://github.com/yhy0/flatlaf-demo-1.4
点击进入该项目,我们可以看到该项目中介绍了Gozilla依赖的是flatlaf-demo库,且版本为1.4的版本。该项目的作者发现官方没有提供flatlaf-demo的1.4版本的jar包,而且官方源代码的gradle生成的jar包存在问题,于是将官方1.4版本的源代码进行maven重新构建,生成了1.4版本的jar包,同时在该项目中提供了作者重新构建好的jar包。另外该项目的最下方提供了之前我们在github上面看到的哥斯拉源代码项目的地址。
那么官方是真的没有提供flatlaf.demo的1.4版本的jar包吗。我们首先进行官方的github项目。项目地址如下:
https://github.com/JFormDesigner/FlatLaf
在github项目中我们可以看到一个demo的位置,该位置提供了下载flatlaf-demo的jar包,我们点击下载。
可以看到下载的版本是1.6版本。复制下载链接,链接如下:
https://download.formdev.com/flatlaf/flatlaf-demo-latest.jar
该链接是下载最新版本的,那么如果我们修改下载的文件后缀呢,例如修改为
https://download.formdev.com/flatlaf/flatlaf-demo-1.4.jar
访问发现,可以成功下载1.4版本的jar包
那么既然1.4版本的jar包已经下载下来了,我们需要在IDEA中导入该依赖,导入步骤如下。
第一步、在IDEA中新建一个文件夹,名为lib
第二步、将下载下来的1.4版本的jar包放入该文件夹下
第三步、右键该文件夹,选择 Add as Library
至此,成功将该jar包加载为项目的依赖。添加依赖后,我们可以在项目中展开该jar包。
展开后我们发现该jar包中的com文件夹下的依赖和我们之前在pom.xml引入的com下的依赖一样,这时我们删除pom.xml中的com中的依赖。同时我们发现该jar包中net.miginfocom和我们之前引入到项目中的net文件夹内容一致,这时我们可以删除引入到项目中的net文件夹。
重构之后的项目目录如下。
重构之后的完整的pom.xml内容如下:
?xml version="1.0" encoding="UTF-8"?>
project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
modelVersion>4.0.0/modelVersion>
groupId>org.example/groupId>
artifactId>Gozilla/artifactId>
version>1.0-SNAPSHOT/version>
properties>
maven.compiler.source>8/maven.compiler.source>
maven.compiler.target>8/maven.compiler.target>
/properties>
dependencies>
dependency>
groupId>org.xerial/groupId>
artifactId>sqlite-jdbc/artifactId>
version>3.34.0/version>
/dependency>
dependency>
groupId>org.javassist/groupId>
artifactId>javassist/artifactId>
version>3.27.0-GA/version>
/dependency>
dependency>
groupId>com.miglayout/groupId>
artifactId>miglayout-swing/artifactId>
version>5.3/version>
/dependency>
dependency>
groupId>com.miglayout/groupId>
artifactId>miglayout-core/artifactId>
version>5.3/version>
/dependency>
!-- https://mvnrepository.com/artifact/com.formdev/svgSalamander -->
dependency>
groupId>com.formdev/groupId>
artifactId>svgSalamander/artifactId>
version>1.1.2.4/version>
scope>runtime/scope>
/dependency>
/dependencies>
repositories>
repository>
id>alimaven/id>
name>aliyun maven/name>
url>http://maven.aliyun.com/nexus/content/groups/public//url>
/repository>
repository>
id>jcenter/id>
name>bintray/name>
url>http://jcenter.bintray.com/url>
/repository>
/repositories>
/project>
此时我们再用maven reload一下依赖,然后重新运行项目。
仍然报错了,但是错误原因变了,这次是由于 com.formdev.flatlaf.demo.intellijthemes.IJThemeInfo 类不对外开放。
访问发现该类并不是public类。这时候可以从官方的源代码中修改该类为public类,然后重新打包成jar包,但是我决定偷懒,直接用之前看到的项目作者打包提供的1.4版本的jar包。或者可以用哥斯拉源代码项目中lib下的1.4版本的jar包。两个项目的地址如下:
https://github.com/yhy0/flatlaf-demo-1.4
https://github.com/808Mak1r/GodzillaSource
替换lib中的jar包后,重新运行项目。至此,依赖问题已经解决,剩下的就是反编译后的源代码存在的语法问题了。
因为反编译后的语法问题都大同小异,因此挑几个不重复的语法问题讲。
java: 不兼容的类型: boolean无法转换为int
当出现这种boolean无法转换为int类型的语法问题是,我们查看反编译后的源代码,可以看到在这里readOneNum是表示从inputStream中读取的字节个数,因此,将readOneNum只定义一次,值修改为0即可。
java: 无法为最终变量cmdString分配值
这里的语法问题是为已经用final关键字定义过的变量cmdString重复赋值,该变量在定义时已经赋值为null了,重复赋值会报错,要解决该语法问题,直接在该变量定义时不赋值即可。
修改完语法问题后运行项目,即可成功运行。
上面步骤已经能成功将哥斯拉作为项目运行了,但是运行后的项目依旧存在一些问题,如下。
因此还需要对报异常的位置进行查看,来做更进一步的修改。这里就由读者去进行后续的跟进了,修改源码也是学习的一环,当然也可以直接使用github上别人已经逆向出的源代码。
上一篇:Struts2必会知识点
下一篇:kerberos委派详解
如果您有任何问题,请跟我们联系!
联系我们