Skip to content
This repository has been archived by the owner on Aug 22, 2024. It is now read-only.

[FEAT] 混淆类名、方法名、自动修改 META-INF和加密字符串的一点建议 #19

Open
aaaaaaahahqwsedwdw opened this issue Jul 13, 2024 · 6 comments
Assignees
Labels
enhancement New feature or request

Comments

@aaaaaaahahqwsedwdw
Copy link

aaaaaaahahqwsedwdw commented Jul 13, 2024

1.加密字符串时,如果遇到jar没有的类,则会直接报错,建议在config中添加依赖jar以修复。
2.混淆类名时,如果代码中有相应类名字符串不会修改至新类名,可能会导致报错,建议在config中添加相应的选项
或者是做一个白名单列表,不混淆其中类的类名(使用黑名单需要一个个去加,太麻烦了)。
3.还有混淆类名的时候,泛型不会一起改变。
4.混淆方法名时,如果该方法是覆盖的依赖jar的方法,则不混淆方法名。
5.自动修改 META-INF 时,应该把 META-INF中的旧类名全部改成新类名。
6.增加花哨指令时,可以往类里添加没有实力意义方法,然后在正常方法里调用,随机生成参数或者使用类里的参数,增加迷惑性。
7.花哨指令太过规范了,一用反编译器就能出代码,建议让花哨指令不是按编译器标准编译出来的字节码来注入方法,而是根据字节码能不能跑的问题,用不规范的花哨指令来注入方法。

@aaaaaaahahqwsedwdw aaaaaaahahqwsedwdw changed the title [FEAT] 混淆类名和加密字符串的一点建议 [FEAT] 混淆类名、方法名和加密字符串的一点建议 Jul 13, 2024
@aaaaaaahahqwsedwdw aaaaaaahahqwsedwdw changed the title [FEAT] 混淆类名、方法名和加密字符串的一点建议 [FEAT] 混淆类名、方法名、自动修改 META-INF和加密字符串的一点建议 Jul 13, 2024
@4ra1n
Copy link
Member

4ra1n commented Jul 16, 2024

  1. 这个遇到 jar 没有的类报错,不太理解,可以具体说下吗
  2. 这个你说的是类似反射 Class.forName("class") 把,之后可以尝试看一下
  3. 混淆白名单我之后考虑下
  4. 泛型的问题不太好做,可以结合黑白名单避免一下(优先度不高我先解决其他问题)
  5. 覆盖的依赖jar的方法,这个不太理解,可以具体说下吗
  6. 目前有修改一处,你的意思是可能出现多处,应该全部修改吗,出现多处的例子是怎样的
  7. 花指令的问题,我正在研究

感谢你提出的建议!

@aaaaaaahahqwsedwdw
Copy link
Author

aaaaaaahahqwsedwdw commented Jul 17, 2024

1.我的类继承了一个class,但这个class不存在于我的jar中,而是存在于我的依赖jar中,我的jar并不包含依赖jar,会导致报错
2.是的,但不仅仅是反射,又是类似于"com/MyFirst/FirstClass"这种内部类名也要覆盖(谁说jar里不能用asm了((((( )
3.嗯嗯
4.泛型是AnnotationNode之类的,就两个变量,一个desc,一个values,应该挺好修改的
5.也就是说,我有一个class,继承了一个依赖jar的class(像第一种那样),如果一个方法@OverRide了这个父方法存在于依赖jar的class,那就不要修改方法了,因为会导致@OverRide失效
6.你是说自动修改META-INF? 有个java原生的例子就是javaagent,premain和agentmain。还有其他的Java作者一些自定义的实现,都需要把旧类名换成新的
7.好的,快点更新,等着你的好消息

@4ra1n
Copy link
Member

4ra1n commented Jul 17, 2024

  1. 这个问题能否给出具体一些的例子,比如开启了哪个配置,报出了什么错误
  2. 这个问题我理解并修复了
  3. 这个问题我理解并尝试修复了,不确定可用性,可以发新版后测试
  4. OverRide 注解最大的问题是,编译后的字节码不会保留该注解,我无法根据这个注解做一些事情,但是目前有一个内置的黑名单:builtin.map.txt 包含了 父类/父接口 -> 方法名 的黑名单,如果父类是这个父类,那么遇到这个方法名不会进行混淆。我计划是多添加一些常用的,支持绝大多数的情况即可
  5. 这个问题我理解并修复了

@aaaaaaahahqwsedwdw
Copy link
Author

aaaaaaahahqwsedwdw commented Jul 17, 2024

不是老兄你在美国吗不睡觉的吗??
1.开启了加密字符串,getCommandSuperClass什么的找不到类,报错,要不我把patch的部分发你?
4.可以加入依赖jar选项

@4ra1n
Copy link
Member

4ra1n commented Jul 17, 2024

getCommonSuperClass 的报错我大概知道了,因为你开了花指令混淆,ASM 使用中增加新指令需要自定义 ClassWriter 并重写该方法,并且需要自定义类加载器,加载目标 CLASS 找不到会出问题。

简单来说只要不开花指令混淆 enableJunk 即可解决,彻底的解决办法可能是你提到的添加依赖 JAR

依赖 JAR 的情景是:输入多个 JAR / 输入一大堆 JAR 输出所有 JAR 的混淆

项目起初的设计是为了混淆单个的可以直接启动的 FAT JAR 类型的程序,没有考虑多个 JAR 文件的处理

可能会有一些挑战,我在工作之余有空的时候会看一下

感谢你提出的多个意见和建议!!

@aaaaaaahahqwsedwdw
Copy link
Author

aaaaaaahahqwsedwdw commented Jul 18, 2024

这patch 3 行代码可以解决罢,不过我是解压版的,我往你的CustomClassLoader的loadClassData中的catch加了点料:
catch (Exception ignored2) { path = Paths.get("jar-cp", new String[0]).resolve(classPath); try { return Files.readAllBytes(path); } catch (Exception ignored2) { return null; } }

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

2 participants