Skip to content
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

Closed
johnnyliaozq opened this issue Aug 4, 2023 · 22 comments
Closed

加固每个类都报cliinit错误 #82

johnnyliaozq opened this issue Aug 4, 2023 · 22 comments

Comments

@johnnyliaozq
Copy link

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我的包名.* {*;} ,还有什么原因排查呢

@johnnyliaozq
Copy link
Author

你也加备注了 //因为方法不会有参数,所以直接改寄存器数不会出问题, 但我未解除到这个疑问,麻烦帮解答下。谢谢

@maoabc
Copy link
Owner

maoabc commented Aug 4, 2023

跟改寄存器那无关。正常情况,对应到java的static{},这个方法只有存在与不存在,而methodImplemention为空正常情况都为抽象方法,不会出现在static{}

@maoabc
Copy link
Owner

maoabc commented Aug 4, 2023

不是很清楚,通过字节码修改增加抽象的方法是否可以跟static生成的区分开,最好能提供出错的classes.dex。不方便提供这个,你可以修改


严格判断方法名,方法签名以及访问标识

@johnnyliaozq
Copy link
Author

微信图片_20230804170819

@maoabc
Copy link
Owner

maoabc commented Aug 4, 2023

如果你原本dex没错的话,应该有用过其他字节码修改工具或者混淆工具。我改了方法判断,你可以试试,按理应该正常了,之前只判断方法名没考虑参数跟返回值。

@maoabc
Copy link
Owner

maoabc commented Aug 4, 2023

你这是加固错误的.dex,没看到这个问题。倒是发现没native化的类也被注入static{},正常情况不需要初始化。

@maoabc
Copy link
Owner

maoabc commented Aug 4, 2023

报错的原因是你加固的类里存在多个<clinit>同名方法,static{}产生的为static <clinit>()V,而你那个报错的是个抽象方法,导致没法继续处理。所以我改了了<clinit>方法的判断,不但判断方法名还把参数跟返回值也一起考虑。

@johnnyliaozq
Copy link
Author

好的,我尝试一下你的修改,再运行

@johnnyliaozq
Copy link
Author

报错的原因是你加固的类里存在多个同名方法,static{}产生的为static ()V,而你那个报错的是个抽象方法,导致没法继续处理。所以我改了了方法的判断,不但判断方法名还把参数跟返回值也一起考虑。

尝试使用,但还是报一样的错误

@johnnyliaozq
Copy link
Author

image
debug刚好是符合 static()V 的入口

maoabc added a commit that referenced this issue Aug 4, 2023
@maoabc
Copy link
Owner

maoabc commented Aug 4, 2023

那就是<clinit>()V实现为空了。不过为什么会加固这种没native化任何方法的类,正常逻辑根本不处理这种类,第一步分离class就会被忽略掉。

@johnnyliaozq
Copy link
Author

好的,那我先做忽略处理

@maoabc
Copy link
Owner

maoabc commented Aug 4, 2023

不是,这种压根不要处理,正常逻辑它没有需要native化的方法,根本不会走到这一步

@maoabc
Copy link
Owner

maoabc commented Aug 4, 2023

如果没做过其他修改,可能原文件,中间生成的两个classes.dex才能分析出原因。

@maoabc
Copy link
Owner

maoabc commented Aug 4, 2023

构造方法,静态构造方法不能直接native化,需要分离部分指令额外生成一个方法才能处理(这个实际也没多大用所以不处理),最基本的过滤规则就是忽略这些方法,还有嵌套加固没什么意义,如果要改,自行处理这些。

@maoabc maoabc closed this as completed Aug 4, 2023
@johnnyliaozq
Copy link
Author

感谢,已开启基本过小组规则后解决。但还有个问题想问下,运行完加固规则后,原来的dex还存在,和生成的lib so一齐,是什么原因呢。已配置了rules.txt下是按readMe里的 我的包名.* {*;} 这样的全包含规则。 按照正常则否是,原来需要处理的规则包名会在so里,其他的在dex才是正确的

@johnnyliaozq
Copy link
Author

image
观察 log,好像是有对应 dex classes的处理

@maoabc
Copy link
Owner

maoabc commented Aug 7, 2023

有个最基本的规则,就是不转换<clinit> <init>,还有一些特殊访问标识的类,class*{*;}会忽略前面那些方法

@maoabc
Copy link
Owner

maoabc commented Aug 7, 2023

我看你给我的文件,已经是转换后的dex,而且那个文件很奇怪,明明没有任何native化的方法,却注入了static{classInit(N);}这样的代码,正常情况没被处理过的class不会注入这个。我不清楚你改了什么规则,如果完全自定义自己规则记得一定要把BasicConfig这个传入

@johnnyliaozq
Copy link
Author

已经过滤。谢谢

@maoabc
Copy link
Owner

maoabc commented Aug 7, 2023

而且我也不清楚你那个文件是加固前还是加固后的。如果加固后再加固是没效果的,<clinit>按目前的理解只会存在跟不存在,不可能出现有方法定义却没有代码,它不能为抽象方法或者native方法,不知道你怎么弄出来的。

@maoabc
Copy link
Owner

maoabc commented Aug 7, 2023

cmake的日志看不到处理哪些的类,你可以在修改过滤规则那打印处理的类跟方法

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants