nmmp icon indicating copy to clipboard operation
nmmp copied to clipboard

加固后性能问题

Open mythoi opened this issue 1 year ago • 9 comments

作者你好,我用你这个工具加固apk,只加固了包名下的所有类,apk运行时很卡顿,时不时应用停止运行,请问怎么分析问题出在哪呢?

mythoi avatar Sep 20 '24 06:09 mythoi

指令虚拟化就是局部加固重要逻辑的,不适合用于全局,demo全加固只不过为了验证兼容性。第三方开源库,大量数组相关操作这些别转换。加固第三方开源库纯粹给逆向分析的人提供指令映射关系,数组相关操作效率极低。

maoabc avatar Sep 20 '24 14:09 maoabc

指令虚拟化就是局部加固重要逻辑的,不适合用于全局,demo全加固只不过为了验证兼容性。第三方开源库,大量数组相关操作这些别转换。加固第三方开源库纯粹给逆向分析的人提供指令映射关系,数组相关操作效率极低。

感谢大佬回复,我把包含数组操作相关的函数过滤掉就可以了,除了数组操作比较耗时还有其他的耗时操作吗? if (instruction.getOpcode()== Opcode.AGET ||instruction.getOpcode()== Opcode.AGET_BOOLEAN||instruction.getOpcode()== Opcode.AGET_BYTE||instruction.getOpcode()== Opcode.AGET_CHAR ||instruction.getOpcode()== Opcode.AGET_OBJECT||instruction.getOpcode()== Opcode.AGET_WIDE||instruction.getOpcode()== Opcode.AGET_SHORT ||instruction.getOpcode()== Opcode.APUT||instruction.getOpcode()== Opcode.APUT_BOOLEAN||instruction.getOpcode()== Opcode.APUT_BYTE||instruction.getOpcode()== Opcode.APUT_CHAR ||instruction.getOpcode()== Opcode.APUT_OBJECT||instruction.getOpcode()== Opcode.APUT_WIDE||instruction.getOpcode()== Opcode.APUT_SHORT)

mythoi avatar Sep 23 '24 06:09 mythoi

其他没那么明显,还有就是循环中反复创建,删除引用,这个基本没法自动处理。实际使用时尽量缩小加固范围。

maoabc avatar Sep 23 '24 15:09 maoabc

instruction

兄弟,你这个过滤条件是在哪块逻辑加的?是在InstructionRewriter这个抽象类的具体实现类里吗?

JhinSir avatar Apr 15 '25 03:04 JhinSir

实现ClassAndMethodFilter接口,两个过滤方法参数是dexlib2的ClassDef和Method,可以依据它们获得方法信息以及遍历指令之类。

maoabc avatar Apr 15 '25 09:04 maoabc

实现ClassAndMethodFilter接口,两个过滤方法参数是dexlib2的ClassDef和Method,可以依据它们获得方法信息以及遍历指令之类。

我在MyMethodUtil里应该也可以做吧?遍历方法的指令,涉及数组相关操作方法的就加到白名单,这样效果一样吗?

JhinSir avatar Apr 15 '25 09:04 JhinSir

实现ClassAndMethodFilter接口,两个过滤方法参数是dexlib2的ClassDef和Method,可以依据它们获得方法信息以及遍历指令之类。

佬,目前哪些指令操作会对性能损耗比较大呢?

JhinSir avatar Apr 15 '25 13:04 JhinSir

最明显就是数组操作,每次访问vm中要做额外的边界检查,以及可能出现的复制整个数组。其他的很难有简单的方法解决性能问题,这别用于处理整个应用,性能下降很明显,只适用于部分重要逻辑进行虚拟化。而且如果处理开源库几乎会导致opcode随机化效果失效。

maoabc avatar Apr 16 '25 11:04 maoabc

我现在就是整个应用都进行了处理,但是只处理应用包名,不会去处理开源的或者三方SDK ,确实发现很多相关的ANR 问题。把oncreate 和数组相关以及线程同步相关的指令过滤掉后,低端机提升很明显,没有那种肉眼可见的卡顿了

---- 回复的原邮件 ---- | 发件人 | @.> | | 发送日期 | 2025年04月16日 19:24 | | 收件人 | maoabc/nmmp @.> | | 抄送人 | JhinSir @.>, Comment @.> | | 主题 | Re: [maoabc/nmmp] 加固后性能问题 (Issue #119) |

最明显就是数组操作,每次访问vm中要做额外的边界检查,以及可能出现的复制整个数组。其他的很难有简单的方法解决性能问题,这别用于处理整个应用,性能下降很明显,只适用于部分重要逻辑进行虚拟化。而且如果处理开源库几乎会导致opcode随机化效果失效。

— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you commented.Message ID: @.***>

maoabc left a comment (maoabc/nmmp#119)

最明显就是数组操作,每次访问vm中要做额外的边界检查,以及可能出现的复制整个数组。其他的很难有简单的方法解决性能问题,这别用于处理整个应用,性能下降很明显,只适用于部分重要逻辑进行虚拟化。而且如果处理开源库几乎会导致opcode随机化效果失效。

— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you commented.Message ID: @.***>

JhinSir avatar Apr 17 '25 04:04 JhinSir