原创干货 | 【恶意代码分析技巧】03-java

  • A+

1.java介绍

在上一篇文章里我们提到过,python是一门基于虚拟机的语言,在python执行的时候,python解释器将源代码转为字节码,然后再由python解释器来执行这些字节码。Java也是一门基于虚拟机的语言,java代码首先经过java编译器(javac.exe)来生成字节码(也就是.class文件),然后再用java解释器(JVM,java.exe/javaw.exe启动)来解释执行。java与python不同的是,java编译和解释过程是两个不同的进程执行的。

图片1.png

java和python在编译执行上有很多相似之处,在病毒分析时我们可以借鉴python病毒的分析技巧。java程序的分析大体上也是分为两个步骤,一是由病毒程序获取字节码(.class)文件,二是由字节码(.class)文件得到源码(.java)文件。

2.java to exe—exe4j

py to exe的方式是将python解释器和py脚本打包成一个可执行的文件,java也可以通过这种方式生成可执行程序。
将java应用程序变为可执行程序的方式很多,工作原理大同小异,这里以工具exe4j为例进行分析。

图片2.png
关于如何使用exe4j将java应用程序变为exe,笔者在这里不细说,可以参考此文(https://blog.csdn.net/zhutulang/article/details/6994348)。
exe4j是一个windows启动器生成器,其打包的exe运行时,将jar全部解压,随后exe4j通过命令行调用java运行库启动jar包:

图片3.png
解压部分核心代码:

图片4.png

3.jar

在实际应用中,很少遇到由java编写的exe,这是因为java为了实现“跨平台一致性”,很多功能都是java自身实现的,跟系统无关。把java变为exe,完全是画蛇添足。

最常见的还是jar程序,也就是常说的java应用程序。jar文件的全称是Java Archive File,意思就是java档案文件。jar文件是一种压缩文件,其二进制格式是标准的压缩格式。

图片5.png
将其解压,可以看到两个文件夹,META-INF和程序主类类名文件夹。META-INF文件夹下有一个MANIFEST.MF文件,该文件是系统自动创建的清单文件,记录jar属性信息。程序主类类名文件夹下有大量.class文件,java程序启动时,java虚拟机将从这里找到主类并装载。

图片6.png

4.Eclipse Class Decompiler

java应用程序的反编译,归根到底就是字节码文件(.class)文件的反编译,其反编译工具很多,这里以Eclipse Class Decompiler为例进行介绍。
Eclipse Class Decompiler是eclipse的插件,在eclipse Marketplace中搜索Eclipse Class Decompiler并安装,安装教程(https://www.cnblogs.com/godtrue/p/5499785.html):

图片7.png
安装之后,直接将.class文件拖拽进eclipse即可查看java代码:

图片8.png

5.代码混淆

从上文可以看出,想要得到java应用程序的源码非常简单,为了增加java应用程序逆向分析难度,java混淆器出现了。

java混淆器能够对java源代码进行混淆,使源代码变得难以阅读。但是java混淆器功能有限,难以阅读不代表无法阅读,github上已经有大佬写了反混淆工具:https://github.com/java-deobfuscator/deobfuscator-gui
该工具能支持Zelix Klassmaster 、Stringer、Allatori、DashO、DexGuard、ClassGuard、Smoke等混淆器。

下载deobfuscator-gui.jar和deobfuscator.jar,将其放到同一目录下,然后启动deobfuscator-gui.jar:

图片9.png
该工具使用非常简单,选择输入的jar,选择输出的jar,选择混淆器,然后点run就可以了。

如图,某样本解混淆前后反编译比较:

图片10.png
该工具提供了一些混淆器配置文件,在某些情况下我们需要自己写配置文件,可以参考https://www.52pojie.cn/thread-718568-1-1.html。

6.在内存中执行java

现在我们进一步增加分析的难度,我们将java的payload放进内存中,既增加了分析难度,又可以躲避AV查杀。

6.1.在内存中编译执行java

其基本思想和exe4j工具类似,都是通过启动器启动。一共有两层java程序,外层的java程序是能够被正常执行的java应用程序,内层的java程序只有源代码,他可以被存储在文件中,也可以被存储在远程站点中。

外层java程序启动后,首先获取内层的java源码,然后调用java编译器对内层的java源码进行编译,然后执行。

https://github.com/trung/InMemoryJavaCompiler就是使用了该方式。

6.2.利用java反射执行

JAVA反射机制是指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法。反射的概念意味着java在运行时具有检查,分析和修改其它代码的能力。

另一方面,在java中万物皆对象,java字节码数据也是一个对象。那么我们就不需要一个真实存在的class文件,只需要内存中含有这个class数据,就可以加载这个class,获取其属性方法,并调用。
某次分析实例:

图片11.png

参考资料:

https://blog.csdn.net/ning109314/article/details/10411495
https://www.ithome.com.tw/node/6088
https://blog.csdn.net/m0_38100471/article/details/72811145
https://www.anquanke.com/post/id/85461
https://cornerpirate.com/2018/08/06/java-stager-hide-from-av-in-memory/
https://www.52pojie.cn/thread-718568-1-1.html

相关推荐: 发卡网审计

发卡网代码审计 这是前段时间写的,今天发一下记录一下吧,怕以后找不到了 2020-3-10 0x00 前言 前端时间看moonsec的直播代码审计,今天下载来复现一波。下载地址:https://www.lanzous.com/i53acdi 0x01 代码审计…