-
Notifications
You must be signed in to change notification settings - Fork 263
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
加固每个类都报cliinit错误 #82
Comments
你也加备注了 //因为方法不会有参数,所以直接改寄存器数不会出问题, 但我未解除到这个疑问,麻烦帮解答下。谢谢 |
跟改寄存器那无关。正常情况,对应到java的static{},这个方法只有存在与不存在,而methodImplemention为空正常情况都为抽象方法,不会出现在static{} |
不是很清楚,通过字节码修改增加抽象的方法是否可以跟static生成的区分开,最好能提供出错的classes.dex。不方便提供这个,你可以修改 Line 104 in 8de0d73
严格判断方法名,方法签名以及访问标识 |
如果你原本dex没错的话,应该有用过其他字节码修改工具或者混淆工具。我改了方法判断,你可以试试,按理应该正常了,之前只判断方法名没考虑参数跟返回值。 |
你这是加固错误的.dex,没看到这个问题。倒是发现没native化的类也被注入static{},正常情况不需要初始化。 |
报错的原因是你加固的类里存在多个<clinit>同名方法,static{}产生的为static <clinit>()V,而你那个报错的是个抽象方法,导致没法继续处理。所以我改了了<clinit>方法的判断,不但判断方法名还把参数跟返回值也一起考虑。 |
好的,我尝试一下你的修改,再运行 |
尝试使用,但还是报一样的错误 |
那就是<clinit>()V实现为空了。不过为什么会加固这种没native化任何方法的类,正常逻辑根本不处理这种类,第一步分离class就会被忽略掉。 |
好的,那我先做忽略处理 |
不是,这种压根不要处理,正常逻辑它没有需要native化的方法,根本不会走到这一步 |
如果没做过其他修改,可能原文件,中间生成的两个classes.dex才能分析出原因。 |
构造方法,静态构造方法不能直接native化,需要分离部分指令额外生成一个方法才能处理(这个实际也没多大用所以不处理),最基本的过滤规则就是忽略这些方法,还有嵌套加固没什么意义,如果要改,自行处理这些。 |
感谢,已开启基本过小组规则后解决。但还有个问题想问下,运行完加固规则后,原来的dex还存在,和生成的lib so一齐,是什么原因呢。已配置了rules.txt下是按readMe里的 我的包名.* {*;} 这样的全包含规则。 按照正常则否是,原来需要处理的规则包名会在so里,其他的在dex才是正确的 |
有个最基本的规则,就是不转换<clinit> <init>,还有一些特殊访问标识的类,class*{*;}会忽略前面那些方法 |
我看你给我的文件,已经是转换后的dex,而且那个文件很奇怪,明明没有任何native化的方法,却注入了static{classInit(N);}这样的代码,正常情况没被处理过的class不会注入这个。我不清楚你改了什么规则,如果完全自定义自己规则记得一定要把BasicConfig这个传入 |
已经过滤。谢谢 |
而且我也不清楚你那个文件是加固前还是加固后的。如果加固后再加固是没效果的,<clinit>按目前的理解只会存在跟不存在,不可能出现有方法定义却没有代码,它不能为抽象方法或者native方法,不知道你怎么弄出来的。 |
cmake的日志看不到处理哪些的类,你可以在修改过滤规则那打印处理的类跟方法 |
static block methodsImpl method ==
Exception in thread "main" java.lang.RuntimeException: static block methodImpl == null
at com.nmmedit.apkprotect.dex2c.converter.structs.RegisterNativesCallerClassDef$RegisterNativesStaticBlock.getImplementation(RegisterNativesCallerClassDef.java:210)
at org.jf.dexlib2.writer.pool.PoolMethod.getImplementation(PoolMethod.java:96)
at org.jf.dexlib2.writer.pool.ClassPool.internCode(ClassPool.java:131)
at org.jf.dexlib2.writer.pool.ClassPool.intern(ClassPool.java:115)
at org.jf.dexlib2.writer.pool.DexPool.internClass(DexPool.java:106)
at com.nmmedit.apkprotect.dex2c.Dex2c.internClass(Dex2c.java:252)
at com.nmmedit.apkprotect.dex2c.Dex2c.injectCallRegisterNativeInsns(Dex2c.java:231)
at com.nmmedit.apkprotect.ApkProtect.injectInstructionAndWriteToFile(ApkProtect.java:329)
at com.nmmedit.apkprotect.aab.AabProtect.run(AabProtect.java:99)
at com.nmmedit.protect.AabMain.main(AabMain.java:57)
NDK环境为 C:\Users\Administrator\AppData\Local\Android\Sdk\ndk\23.1.7779620 使用的规则文件内容: class mypack我的包名.* {*;} ,还有什么原因排查呢
The text was updated successfully, but these errors were encountered: