前言
有一天,脚本小子想开发一个工具,但脚本小子又不想从头构思设计代码框架,就找找业界有没有好的工具能不能抄抄。终于在脚本小子快乐星球里,找到一个看起来还不错的工具。但存在一个问题,这个工具有代码保护壳。。。脚本小子本来只想当裁缝小子的,可没想到还得先是一个脱壳小子才行。
脱壳思路
正面硬刚解密算法是一种思路,但所需要花费的时间太长,性价比不是很高,并且由于笔者太菜了,浅尝了下,发现不太容易搞定。于是采用CSAgent的形式,通过注入目标程序,替换壳代码的解密加载过程,直接将解密后的代码写到文件当中。解密加载代码在JavaLauncherIdea$Decoder的loadJars方法当中。
其中类CipherInputStream的作用就是读取加密状态的文件,所以我们只需要在这里将CiperInputStream获取的文件流读取出来,然后写入到本地文件即可。
这里有个小坑,就是在壳代码当中有个判断启动java进程的命令行参数当中是否包含-XX:+DisableAttachMechanis,并且这个选项是否是生效的,代码位置在JavaLauncherIdea的main方法中。
if (jvmArgs.contains("-XX:+DisableAttachMechanism") && jvmArgs.lastIndexOf("-XX:-DisableAttachMechanism") < jvmArgs.lastIndexOf("-XX:+DisableAttachMechanism")) {
JavaLauncherIdea launcher = new JavaLauncherIdea();
try {
launcher.run(args);
} catch (Throwable var6) {
JOptionPane.showMessageDialog((Component)null, var6.getMessage(), "Error", 0);
System.exit(0);
}
}
要是启动参数当中没有加入这个选项或者没有生效,就会创建新JVM进程,并且在新进程启动参数中添加-XX:+DisableAttachMechanis。所以我们在使用javaagent时带上-XX:+DisableAttachMechanis这个启动选项。
java -javaagent:CSAgent-1.4-SNAPSHOT-jar-with-dependencies.jar -XX:+DisableAttachMechanism -jar xxx.jar
这里开发脱壳agent白嫖了Twi1ight师傅的CSAgent的模板代码,感谢大佬的代码,脚本小子表示白嫖真香。最后脱壳后的文件会保存在java运行的当前目录下,名字以xxx_unpacked.jar命名
开源地址