接着之前的,我们今天学习如何找到被加密的字符串,打开混淆的类的字节码,我们发现被加密的字符串是这样的,LDC是加密的字符串,之后INVOKESTATIC是执行解密的方法调用

我们可以用asm获取到方法描述为(Ljava/lang/String;)Ljava/lang/String;的静态方法,然后结合之前判断是否是加密方法的程序就可以找到这个被加密的字符串,然后我们执行解密方法就可以获取到原始字符串了。
我们编写如下代码,获取加密的字符串。

执行一下,我们找到了加密的字符串,调用解密方法获得了原始字符串

我们把原始代码修改一下,多加几个字符试试

混淆之后

加密字符串增加了,我们再次运行解密程序


可以看到解密多个字符串没问题了,但是问题又来了,这么多字符串解密完,我怎么知道这是解密什么地方的字符串?下次我们讲如何把解密之后的字符串放到原始位置。
完整代码如下:
package org.example;
import org.apache.commons.io.IOUtils;
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.tree.*;
import org.objectweb.asm.tree.analysis.*;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.Enumeration;
import java.util.ListIterator;
import java.util.jar.JarFile;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import static org.objectweb.asm.Opcodes.*;
public class FindStringEncryption {
public static void main(String[] args) {
File jar = new File("D:\\work\\allatoriDecrypt\\obfuscator\\allatoriDecrypt.jar");
JarFile inputJar = null;
try {
inputJar = new JarFile(jar);
} catch (IOException e) {
throw new RuntimeException(e);
}
JarFile finalInputJar = inputJar;
inputJar.stream().forEach(entry -> {
if (entry.isDirectory() || !entry.getName().endsWith(".class")) {
return;
}
byte[] src = null;
try {
src = IOUtils.toByteArray(finalInputJar.getInputStream(entry));
} catch (IO

博客介绍在Java里查找并解密被加密字符串的方法。通过打开混淆类的字节码,利用asm获取特定静态方法,结合判断程序找到加密字符串,执行解密方法得到原始字符串。还测试了修改代码增加字符后的解密情况,后续将讲解如何把解密字符串放回原始位置。
最低0.47元/天 解锁文章
2113

被折叠的 条评论
为什么被折叠?



