使用场景
Allatori是一款强大的Java代码混淆工具,属于第二代混淆器,它具有名称混淆、代码控制流混淆和字符串加密等功能,它可以将类名、方法名和变量名替换为无意义的字符串,增加代码的可读性难度。
Virbox Protector
工具是一种强大的代码保护工具,它具有代码虚拟化、字符串加密、调试器检测等功能,可以防止反编译工具直接还原出原始代码。
但Virbox Protector
工具的Java VME保护方式无法保护类名和方法名,而Allatori工具具有混淆类名和方法名的功能,所以可以将两者工具直接结合使用,既可以保证代码安全也可以混淆类名;
因此本文描述下Java vme方式使用sdk标签和Allatori混淆工具共同使用的操作流程。
使用流程
步骤描述
1.先对java代码添加虚拟化标签;
2.编译成jar包后,使用Allatori混淆工具(比如Allatori-8.5-Demo)对jar包进行混淆;
3.加壳工具解析混淆后的jar包,界面可以显示标记的标签;
4.对该jar包加壳保护,程序可正常运行;
步骤操作
添加虚拟化标签
1.创建一个VBVirtualize.java,调用Allatori-8.5-Demo\lib\allatori-annotations.jar包中DoNotRename类,

该jar包中有个DoNotRename的类,对指定类或方法标记后不会混淆名称,内容如下:

2.在java代码中调用VBVirtualize.java里的内容,比如:
import virbox.VBVirtualize;
@VBVirtualize //可添加到类上面,所有的方法都会默认保护
public class Main {
public static void main(String[] args) {
System.out.println("hello");
test_vir();
}
@VBVirtualize //可添加到方法上面,只保护该方法
public static void test_vir()
{
System.out.println("test_vir");
}
}
3.在所需要的java文件中的类或方法上面添加完虚拟化标签,然后打包成jar包;
4.将该jar包拖入到加壳工具中进行解析,界面上可显示标记的函数。

Allatori工具对jar包进行混淆
1.将添加标签后的jar包(比如Main.jar)放到Allatori-8.5-Demo\tutorial\step01\files目录下;

2.修改congfig.xml文件里的输入文件名称和输出文件名称;
3.在config.xml里keep-names节点中添加包名,让包名不被混淆;
<config>
<input>
<jar in="Main.jar" out="obf-Main.jar"/>
<jar in="mousegestures-1.2.jar" out="obf-mousegestures-1.2.jar"/>
</input>
<keep-names>
<class template="class com.aladdin.hasp.test.Test"/>
</keep-names>
<property name="log-file" value="log.xml"/>
</config>
4.执行RunAllatori.bat
脚本,生成混淆后的jar包(比如obf-Main.jar);
加壳工具解析混淆后的jar包
1.将混淆后的jar包拖入到加壳工具中解析,则可以看到标记的函数,而且显示的类和方法名都是混淆过的;

保护jar包
1.选中jar包,使用默认显示的标签,点击选中保护项目
,默认在protector目录下生成保护后jar包;
2.保护后的jar包可正常运行。
问题现象
问题1:为什么要调用Allatori-8.5-Demo\lib\allatori-annotations.jar包中DoNotRename类?比如以下写法会出现什么现象?

解答1:如果不调用DoNotRename类,则Allatori工具把Virbox和VBVirtualize也给混淆了,导致加壳工具界面无法解析出来,如图所示:

问题2:为什么在config.xml里keep-names节点中添加包名,让包名不被混淆?
解答2:如果包名也混淆,则程序运行会提示错误: 找不到或无法加载主类
。
问题3:可以对未标记的函数进行选择保护么?
解答3:目前不能对未标记的函数进行虚拟化保护,如果选择未标记的函数进行虚拟化保护,则保护后程序会运行失败,错误如下:
#
# A fatal error has been detected by the Java Runtime Environment:
#
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x0000000067b0a233, pid=29168, tid=0x0000000000006600
#
# JRE version: Java(TM) SE Runtime Environment (8.0_301-b09) (build 1.8.0_301-b09)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.301-b09 mixed mode windows-amd64 compressed oops)
# Problematic frame:
# V [jvm.dll+0x14a233]
#
# Failed to write core dump. Minidumps are not enabled by default on client versions of Windows
#
# An error report file with more information is saved as:
# D:\download\Allatori-8.5-Demo\tutorial\step01\files\hs_err_pid29168.log
#
# If you would like to submit a bug report, please visit:
# http://bugreport.java.com/bugreport/crash.jsp
#