StringFog icon indicating copy to clipboard operation
StringFog copied to clipboard

kotlin 编码中,拼接的字符串没法进行加密

Open liyeatgithub opened this issue 1 year ago • 2 comments

项目使用kotlin编码,反编译之后,发现一旦使用拼接的字符串,如"this is a $it" 或者 "abc"+"bcd",等。就没办法进行字符串加密。反编译apk之后。发现这些字符串仍然存在。编译之后,kotlin会将这些字符串转化为StringBuilder的形式。导致Stringfog没有生效。反编译之后还是原始字符串。大家有遇到这个问题么?怎么解决呢?

liyeatgithub avatar Feb 28 '24 08:02 liyeatgithub

我最近也碰到这个问题,排查半天发现是集成项目编译的JDK版本问题。新建项目默认为JavaVersion.VERSION_11,改为JavaVersion.VERSION_1_8就正常了,记得同时要改kotlinOptions中的jvmTarget。至于这是什么原因就不清楚了

rhettor avatar Dec 15 '24 06:12 rhettor

通过javap -c -v对比两个版本的字节码发现在JAVA8JAVA11(字符串还带有\u0001)中字符串存放在Constant pool,但是在获取的时候有所不同:

JAVA8 -> 通过ldc指令直接获取常量池中的字符串 JAVA11 -> 通过invokedynamic调用BootstrapMethods中的java/lang/invoke/StringConcatFactory.makeConcatWithConstants方法(此方法是在JAVA9中改善StringBuilder拼接问题)

造成ASM在visitMethodInsn()方法中无法找到java/lang/StringBuilder的调用,以及visitLdcInsn()方法中无法找到常量的获取。因此只能在visitInvokeDynamicInsn()方法中处理makeConcatWithConstants

rhettor avatar Dec 15 '24 07:12 rhettor