maoabc / nmmp

dex-vm used to protect the android classes.dex file
736 stars 260 forks source link

想问一下作者碰到了什么apk commit取消了静态注册的支持 #39

Closed 20000s closed 2 years ago

20000s commented 2 years ago

最近在看项目源码,学习dex vmp原理,有点不理解作者的注释,是什么情况混淆会导致按标准的jni函数名可能会有命名冲突问题

20000s commented 2 years ago

按道理 只要参数的类不同 应该不会导致命名冲突啊

maoabc commented 2 years ago

标准的jni函数命名,只包含类名,方法名及参数, 但是一些混淆过的class这三个都可能一样, 就返回值不同. 标准的jni函数名就会冲突, 所以在生成jni函数时把返回值也加进去,然后就只能注册那些函数. 这问题最早是用es文件管理器测试出来的,你可以看看示例里那个,应该有这个问题

20000s commented 2 years ago

谢谢作者 去看了下es管理器 确实发现了这个问题,不过这就导致我十分好奇这app编译是怎么通过的,按道理java的重载不允许这个存在

maoabc commented 2 years ago

java语法层面是不允许,但是vm层面可以。而且jvm规范也是以方法名和方法签名(参数加上返回值, 比如(II)V)来区分方法的,所以操作字节码就不会受限制(混淆器就是直接处理字节码的)。 自己实验的话可以试试用asm/jasmin、dexlib2/smali生成包含这种命名的.class、.dex

20000s commented 2 years ago

我仔细去看了下 之所以es不行,因为里面的混淆将类名的一些字段改成了不可见字符,估计触发了jadx的bug,将它归并到一个类了,而且我自己apktool重打包 修改了一下smali一下(复制了一个函数的smali,修改它的返回值),结果成功了 感谢作者