欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

伪装成比特币钱包的Java恶意软件分析

来源:本站整理 作者:翻译: 興趣使然的小胃 时间:2017-02-11 TAG: 我要投稿

四、代码分析

恶意软件经过了高强 度的混淆加密,共有三个jar文件彼此嵌套。两个内部jar文件采用强加密算法(RSA+AES)加密,最后一层(也就是第三层)是一个核心模块。

(一)第一阶段

借助JD-GUI等工具对恶意软件进行反编译,输出的结果仍是人工不可读的。通过对初步反编译得到的字符串进行分析,我们可知恶意软件使用了Allatori Obfuscator v6.0 DEMO进行混淆处理。

幸运的是,我们可以使用 免费的java去混淆工具 对恶意软件进行处理,所使用的命令为:

java -jar deobfuscator-1.0.0.jar -input wallet.aes.json.jar \
-output deobfuscated.jar \
-transformer general.SyntheticBridgeTransformer \
-path /usr/lib/jvm/java-8-openjdk-amd64/jre/lib/rt.jar

经过初步去混淆处理后,利用JD-GUI等其他反编译工具依然不能给出有效的输出代码。最后我们通过 CFR反编译器 设法得到了一个有效的输出代码。为了得到其他文件资源(如jar包里的文件资源),我们将jar包后缀名改为zip并将其解压。

从Manifest文件信息中可知,恶意代码从MANAGER类开始执行。

在主文件夹中,我们可以看到有其他几个使用混淆名称的类。主文件夹中包含了两个子文件夹,里面包含一些加密文件,以及两张相同的JPEG图片,图片如下图所示。

图片的内容十分有趣,看上去像是一张驾驶执照照片,我们猜测恶意软件添加这张图片的目的是作为无用信息以进一步加深混淆。

为了得到可读的代码片段,我们仍然需要对去混淆处理后的代码做大量的手动分析清除工作,包括类名以及其他所有的字符串信息都需要做去混淆处理。经过处理后可知,类i中存储了混淆所用的路径及键值。

public final class i {
    public static String b = c.a(f.a("\t'VdU:\t/\b;H,"));
    public static String a = c.a(f.a("J U{\u0015$C'B @\"T$Q'"));
}

经过手动去混淆后类i代码为:

public final class i {
    public static String key = "lks03oeldkfirowl";
    public static String path = "/lp/sq/d.png";
}

恶意软件使用了类c中封装的一个a方法进行解密。

byte []dec_content = c.a(input_data, key.getBytes());

对类c进行人工去混淆后,我们发现a方法的功能是进行AES加密。

public static byte[] a(byte[] a2, byte[] a3) {
    try {
        Key key = new SecretKeySpec((byte[])a3, "AES");
        Cipher cipher2 = Cipher.getInstance("AES/ECB/PKCS5Padding");
        cipher2.init(2, key);
        a2 = cipher2.doFinal(a2);
        return a2;
    }
    catch (Exception v1) {
        return null;
    }
}

文件解密后指向一个 xml文件 

这个xml文件有很多垃圾字段,字段的作用是让整个内容更加难以阅读,唯一有用的两个字段如下图所示。

SERVER字段指向了另一个加密文件,PASSWORD字段是一个AES密钥。

解密涉及到两个步骤,分别由两个类进行处理。首先是C类的AES算法,其次是B类的Gzip解压方法。

byte []dec_content = b.a(c.a(input_data, key.getBytes()));

经过上述操作后,我们得到了第二阶段所用的JAR文件。

完整的解密程序 在此 

(二)第二阶段

与第一阶段类似,我们采用相同的去混淆工具清理了jar文件,将其解压后得到封装的文件资源,如下图所示。

Jar的执行点是operational文件夹的JRat类,如下图所示。

经过自动化去混淆处理后,所得 代码 远远不能达到可读的程度。

经过人工对代码进行重构后,可知这段代码只是作为另一个加载器,用来解压并运行下一个阶段所用的jar包。

去混淆解密类代码如下:

package w;
import java.security.GeneralSecurityException;
import java.security.Key;
import java.security.interfaces.RSAPrivateKey;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
public class kyl {
    private byte[] encryptedAesKey;
    private byte[] encryptedBuffer;
    private static int mode = javax.crypto.Cipher.DECRYPT_MODE;
    public kyl() { }
    public void setEncryptedBuffer(byte[] value) {
        this.encryptedBuffer = value;
    }
    public void setEncryptedAesKey(byte[] value) {
        this.encryptedAesKey = value;
    }
    public byte[] decryptContent(Object object2) throws GeneralSecurityException {
        Cipher object = Cipher.getInstance("RSA");
        object.init(2, (RSAPrivateKey)object2);
        Cipher cipher2 = Cipher.getInstance("AES");
        byte []aesDecrypted = object.doFinal(this.encryptedAesKey);
        SecretKeySpec sKey = new SecretKeySpec(aesDecrypted, "AES");
        Cipher arrby = cipher2;
        arrby.init(mode, (Key)sKey);
        return arrby.doFinal(this.encryptedBuffer);
    }
}

上一页  [1] [2] [3] [4]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载