maoabc / nmmp

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

nmmp加固之后只在 Android 6.0 上会crash,是否有方式debug? #27

Open XuNeal opened 2 years ago

XuNeal commented 2 years ago

感谢提供 nmmp 工具。目前测试之后加固效果良好。 不过实际使用中碰到一个问题。目前经过nmmp加固之后只在Android6.0上会crash。其他Android版本没问题。不加固前在Android 6.0也没问题。 现在会直接crash,但是看了crash日志没有什么线索。只能看到一些寄存器报错。是否有什么方式可以debug能直接定位到具体是哪些代码引起的?

感谢

12-16 14:57:34.266  9989  9989 I AEE/AED : Build fingerprint: 'vivo/PD1612/PD1612:6.0/MRA58K/1617884953:user/release-keys'
12-16 14:57:34.266  9989  9989 I AEE/AED : Revision: '0'
12-16 14:57:34.266  9989  9989 I AEE/AED : ABI: 'arm'
12-16 14:57:34.267  9989  9989 I AEE/AED : pid: 9914, tid: 9914, name: com.xxx.app  >>> com.xxx.app <<<
12-16 14:57:34.267  9989  9989 I AEE/AED : signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x80a20558
12-16 14:57:34.283  9989  9989 I AEE/AED :     r0 70c1fb0c  r1 0003c3e4  r2 03f80278  r3 70c1fb7c
12-16 14:57:34.284  9989  9989 I AEE/AED :     r4 13383d80  r5 03f80277  r6 ffd34f9c  r7 ffd34ec0
12-16 14:57:34.284  9989  9989 I AEE/AED :     r8 ffd34f94  r9 1355a7cc  sl ffd350e8  fp d7667d78
12-16 14:57:34.284  9989  9989 I AEE/AED :     ip 00000006  sp ffd34eb8  lr 70cee780  pc f3b0a184  cpsr 000d0030
12-16 14:57:34.287  9989  9989 I AEE/AED : 
12-16 14:57:34.287  9989  9989 I AEE/AED : backtrace:
12-16 14:57:34.287  9989  9989 I AEE/AED :     #00 pc 0031b184  /system/lib/libart.so (_ZN3art35InvokeVirtualOrInterfaceWithJValuesERKNS_33ScopedObjectAccessAlreadyRunnableEP8_jobjectP10_jmethodIDP6jvalue+119)
12-16 14:57:34.287  9989  9989 I AEE/AED :     #01 pc 00268cad  /system/lib/libart.so (_ZN3art3JNI17CallObjectMethodAEP7_JNIEnvP8_jobjectP10_jmethodIDP6jvalue+328)
12-16 14:57:34.288  9989  9989 I AEE/AED :     #02 pc 0001243b  /data/app/com.xxx.app-2/lib/arm/libnmmvm.so (vmInterpret+24130)
12-16 14:57:34.288  9989  9989 I AEE/AED :     #03 pc 000dfc23  /data/app/com.xxx.app-2/lib/arm/libnmmp.so
12-16 14:57:34.288  9989  9989 I AEE/AED :     #04 pc 03b6b77f  /data/app/com.xxx.app-2/oat/arm/base.odex (offset 0x3268000)
12-16 14:57:34.793  9989  9989 I AEE/AED : 
12-16 14:57:34.793  9989  9989 I AEE/AED : Tombstone written to: /data/tombstones/tombstone_01
12-16 15:01:24.088 10523 10523 F libc    : Fatal signal 11 (SIGSEGV), code 1, fault addr 0x80a20558 in tid 10523 (com.xxx.app)
12-16 15:01:24.096 10599 10599 I AEE/AED : *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
maoabc commented 2 years ago

CallObjectMethod这个应该只有两个地方调用过,转换程序里处理dex时改成debug版,这样编译后的so有日志

XuNeal commented 2 years ago

感谢回复。我感觉明白你的意思了。我去试试。

maoabc commented 2 years ago

开启日志同时减小转换范围,也可以把生成的c项目导入as通过它来调试,不过分析日志应该更好

XuNeal commented 2 years ago

看了一圈没有找到直接开启 日志的开关。倒是找到一个 dexDecodeDebugInfo 是要使用这个函数替换某个类似的函数吗? https://github.com/maoabc/nmmp/blob/7b97a9a7776db8309a0961964700dad2f875f120/nmmvm/nmmvm/src/main/cpp/libdex/DexDebugInfo.h#L46

还是说在 CallObjectMethod 前后加相应的打印语句?

maoabc commented 2 years ago

在ApkProtect.java里, 直接把BuildType类型改为DEBUG final BuildNativeLib.CMakeOptions cmakeOptions = new BuildNativeLib.CMakeOptions(cmakePath, sdkHome, ndkHome, 21, outRootDir.getAbsolutePath(), BuildNativeLib.CMakeOptions.BuildType.RELEASE, abi);

maoabc commented 2 years ago

如果可以的话, 把样本直接发来, 我有时间调试下看看具体怎么回事

XuNeal commented 2 years ago

在ApkProtect.java里, 直接把BuildType类型改为DEBUG final BuildNativeLib.CMakeOptions cmakeOptions = new BuildNativeLib.CMakeOptions(cmakePath, sdkHome, ndkHome, 21, outRootDir.getAbsolutePath(), BuildNativeLib.CMakeOptions.BuildType.RELEASE, abi);

我开始看到这里确实有个debug和release的配置。不过当时以为应该是在处理 Dex的过程中加入log。所以就排除了,没想到还真是。

XuNeal commented 2 years ago

如果可以的话, 把样本直接发来, 我有时间调试下看看具体怎么回事

需要什么样的样本呢?公司的项目还没开源。要不我先改一下试试。实在不行看看能不能搞一个示例代码出来。

maoabc commented 2 years ago

嗯, 你先调试下, 能弄个简单可以复现的示例最好, 这样也不会泄漏什么

XuNeal commented 2 years ago

我试了试加入debug模式,好像有变化又好像没变化,现在报错信息变成其他位置,但是报错信息也没有多多少。 目前线上有个紧急问题要处理一下。等我处理完我再继续回来处理看看并尝试搞个示例。

12-16 17:37:06.369 16404 16404 I AEE/AED : *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
12-16 17:37:06.369 16404 16404 I AEE/AED : Build fingerprint: 'vivo/PD1612/PD1612:6.0/MRA58K/1617884953:user/release-keys'
12-16 17:37:06.369 16404 16404 I AEE/AED : Revision: '0'
12-16 17:37:06.369 16404 16404 I AEE/AED : ABI: 'arm'
12-16 17:37:06.369 16404 16404 I AEE/AED : pid: 16371, tid: 16371, name: com.xxx.app  >>> com.xxx.app <<<
12-16 17:37:06.369 16404 16404 I AEE/AED : signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x43007c
12-16 17:37:06.383 16404 16404 I AEE/AED :     r0 70742a20  r1 00430000  r2 00000000  r3 00020000
12-16 17:37:06.384 16404 16404 I AEE/AED :     r4 12e741b0  r5 f3cf6f00  r6 00000000  r7 f3c3c8f4
12-16 17:37:06.384 16404 16404 I AEE/AED :     r8 0000003d  r9 00000000  sl f3a70151  fp 00200035
12-16 17:37:06.384 16404 16404 I AEE/AED :     ip f37c70d0  sp ffd34ae0  lr f3a7029f  pc f3a70482  cpsr 600b0030
12-16 17:37:06.389 16404 16404 I AEE/AED : 
12-16 17:37:06.389 16404 16404 I AEE/AED : backtrace:
12-16 17:37:06.389 16404 16404 I AEE/AED :     #00 pc 00281482  /system/lib/libart.so (_ZN3art3JNI21SetObjectArrayElementEP7_JNIEnvP13_jobjectArrayiP8_jobject+817)
12-16 17:37:06.389 16404 16404 I AEE/AED :     #01 pc 00388cff  /system/lib/libart.so (_ZN3art28InvokeProxyInvocationHandlerERNS_33ScopedObjectAccessAlreadyRunnableEPKcP8_jobjectS5_RNSt3__16vectorI6jvalueNS6_9allocatorIS8_EEEE+710)
12-16 17:37:06.389 16404 16404 I AEE/AED :     #02 pc 003e949d  /system/lib/libart.so (artQuickProxyInvokeHandler+844)
12-16 17:37:06.389 16404 16404 I AEE/AED :     #03 pc 000ea9c5  /system/lib/libart.so (art_quick_proxy_invoke_handler+20)
12-16 17:37:06.389 16404 16404 I AEE/AED :     #04 pc 000e63d1  /system/lib/libart.so (art_quick_invoke_stub_internal+64)
12-16 17:37:06.389 16404 16404 I AEE/AED :     #05 pc 003eaedf  /system/lib/libart.so (art_quick_invoke_stub+170)
12-16 17:37:06.389 16404 16404 I AEE/AED :     #06 pc 007fce54  [stack]
12-16 17:37:06.707 16404 16404 I AEE/AED : 
12-16 17:37:06.707 16404 16404 I AEE/AED : Tombstone written to: /data/tombstones/tombstone_08
12-16 17:37:09.191 16442 16442 F libc    : Fatal signal 11 (SIGSEGV), code 1, fault addr 0x43007c in tid 16442 (com.xxx.app)
maoabc commented 2 years ago

这日志收集的有问题吧,开启了vm日志,都没指令执行日志。还有加日志后,需要缩小加固范围(缩小到某个类或者方法),不然日志输出太多都可能导致崩溃

maoabc commented 2 years ago

开启了vm的日志,你需要观察每条指令的日志,看它执行到哪个位置崩溃的。

XuNeal commented 2 years ago

我原先也是这么想的。但是貌似现在确实没看到更多的日志。想确认一下

image

maoabc commented 2 years ago

没在CmakeLists.txt里设置过的话, 默认在Common.h里

ifndef LOG_TAG

define LOG_TAG "dalvikvm"

endif