nmmp icon indicating copy to clipboard operation
nmmp copied to clipboard

NativeUtil重复了.

Open GordonHuangYong opened this issue 6 months ago • 5 comments

我们编译了一个aar, 然后使用本方案进行了加固. 发布给甲方使用. 刚好甲方的app也使用了这个方案对apk进行加固. 于是就导致了这个错误

[11/11] Linking C shared library /Users/huangyong/Documents/huangyong/tools/aar加固/build/obj/sym/arm64-v8a/libnmmp.so
[/Users/huangyong/Library/Android/sdk/ndk/26.3.11579264/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-strip, --strip-unneeded, -o, /Users/huangyong/Documents/huangyong/tools/aar加固/build/obj/strip/arm64-v8a/libnmmp.so, /Users/huangyong/Documents/huangyong/tools/aar加固/build/obj/sym/arm64-v8a/libnmmp.so]
[/Users/huangyong/Library/Android/sdk/ndk/26.3.11579264/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-strip, --strip-unneeded, -o, /Users/huangyong/Documents/huangyong/tools/aar加固/build/obj/strip/arm64-v8a/libnmmvm.so, /Users/huangyong/Documents/huangyong/tools/aar加固/build/obj/sym/arm64-v8a/libnmmvm.so]
Exception in thread "main" com.android.tools.smali.util.ExceptionWithContext: Class Lcom/nmmedit/protect/NativeUtil; has already been interned
	at com.android.tools.smali.dexlib2.writer.pool.ClassPool.intern(ClassPool.java:103)
	at com.android.tools.smali.dexlib2.writer.pool.DexPool.internClass(DexPool.java:129)
	at com.nmmedit.apkprotect.ApkProtect.internNativeUtilClassDef(ApkProtect.java:391)
	at com.nmmedit.apkprotect.ApkProtect.run(ApkProtect.java:124)
	at com.nmmedit.protect.ApkMain.main(ApkMain.java:51)
	at com.nmmedit.protect.Main.main(Main.java:24)

这种情况如何解决?

GordonHuangYong avatar Jun 26 '25 01:06 GordonHuangYong

改名 ,相关方法在nmm-protect/apkprotect/src/main/java/com/nmmedit/apkprotect/dex2c/DexConfig.java中。编译后so命名在BuildNativeLib.java中,缩减成一个so需要改CMake以及一些打包逻辑,这些在源码中都有注释。

maoabc avatar Jun 26 '25 03:06 maoabc

我做了修改, 还是不成功.

报错下如下

java -jar vm-protect-2025-06-26-1454.jar aar libRecnote-release.aar convertRules.txt 
Warning in /Users/huangyong/Documents/huangyong/tools/aar加固/build/.dx_temp/classes.jar:com/waytronic/recnotsdk/o.class:
Type `androidx.lifecycle.ViewModel` was not found, it is required for default or static interface methods desugaring of `com.waytronic.recnotsdk.o`
[/Users/huangyong/Library/Android/sdk/cmake/3.22.1/bin/cmake, -H/Users/huangyong/Documents/huangyong/tools/aar加固/build/dex2c, -DCMAKE_TOOLCHAIN_FILE=/Users/huangyong/Library/Android/sdk/ndk/26.3.11579264/build/cmake/android.toolchain.cmake, -DCMAKE_BUILD_TYPE=Release, -DANDROID_ABI=armeabi-v7a, -DANDROID_NDK=/Users/huangyong/Library/Android/sdk/ndk/26.3.11579264, -DANDROID_PLATFORM=android-21, -DCMAKE_ANDROID_ARCH_ABI=armeabi-v7a, -DCMAKE_ANDROID_NDK=/Users/huangyong/Library/Android/sdk/ndk/26.3.11579264, -DCMAKE_EXPORT_COMPILE_COMMANDS=ON, -DCMAKE_LIBRARY_OUTPUT_DIRECTORY=/Users/huangyong/Documents/huangyong/tools/aar加固/build/obj/sym/armeabi-v7a, -DCMAKE_MAKE_PROGRAM=/Users/huangyong/Library/Android/sdk/cmake/3.22.1/bin/ninja, -DCMAKE_SYSTEM_NAME=Android, -DCMAKE_SYSTEM_VERSION=21, -B/Users/huangyong/Documents/huangyong/tools/aar加固/build/.cxx/cmake/Release/armeabi-v7a, -GNinja]
-- The C compiler identification is Clang 17.0.2
-- The CXX compiler identification is Clang 17.0.2
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /Users/huangyong/Library/Android/sdk/ndk/26.3.11579264/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /Users/huangyong/Library/Android/sdk/ndk/26.3.11579264/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /Users/huangyong/Documents/huangyong/tools/aar加固/build/.cxx/cmake/Release/armeabi-v7a
[/Users/huangyong/Library/Android/sdk/cmake/3.22.1/bin/cmake, --build, /Users/huangyong/Documents/huangyong/tools/aar加固/build/.cxx/cmake/Release/armeabi-v7a]
[1/10] Building C object CMakeFiles/nmmp.dir/generated/jni_init.c.o
[2/10] Building C object CMakeFiles/nmmp.dir/ConstantPool.c.o
[3/10] Building CXX object vm/CMakeFiles/nmmvm.dir/GlobalCache.cpp.o
[4/10] Building CXX object vm/CMakeFiles/nmmvm.dir/DexCatch.cpp.o
[5/10] Building CXX object vm/CMakeFiles/nmmvm.dir/Exception.cpp.o
[6/10] Building CXX object vm/CMakeFiles/nmmvm.dir/Interp.cpp.o
[7/10] Building C object CMakeFiles/nmmp.dir/generated/classes_native_functions.c.o
[8/10] Building CXX object vm/CMakeFiles/nmmvm.dir/InterpC-portable.cpp.o
[9/10] Linking CXX shared library /Users/huangyong/Documents/huangyong/tools/aar加固/build/obj/sym/armeabi-v7a/libnmmvm.so
[10/10] Linking C shared library /Users/huangyong/Documents/huangyong/tools/aar加固/build/obj/sym/armeabi-v7a/libnmmp.so
Exception in thread "main" java.lang.RuntimeException: Not Found so: /Users/huangyong/Documents/huangyong/tools/aar加固/build/.cxx/cmake/Release/armeabi-v7a/vm/libwtjvm.so
	at com.nmmedit.apkprotect.BuildNativeLib$CMakeOptions.getSharedObjectFileMap(BuildNativeLib.java:249)
	at com.nmmedit.apkprotect.BuildNativeLib.build(BuildNativeLib.java:79)
	at com.nmmedit.apkprotect.BuildNativeLib.generateNativeLibs(BuildNativeLib.java:54)
	at com.nmmedit.apkprotect.aar.AarProtect.run(AarProtect.java:74)
	at com.nmmedit.protect.AarMain.main(AarMain.java:51)
	at com.nmmedit.protect.Main.main(Main.java:30)

修改的内容如下:

  1. CMakeUtils.java
    public static void writeCmakeFile(File cmakeTemp, String libName) throws IOException {
        final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(
                new FileInputStream(cmakeTemp), StandardCharsets.UTF_8));

        String lines = bufferedReader.lines().collect(Collectors.joining("\n"));
        //定位cmake里的语句,防止替换错误
        String libNameFormat = "set\\(LIBNAME_PLACEHOLDER \"%s\"\\)";

        //替换原本libname
        lines = lines.replaceAll(String.format(libNameFormat, "wtjp"), String.format(libNameFormat, libName));

        try (FileWriter fileWriter = new FileWriter(cmakeTemp)) {
            fileWriter.write(lines);
        }
    }
  1. CMakeLists.txt
cmake_minimum_required(VERSION 3.6)
project(wtjp)


add_subdirectory(vm)


include_directories(.)
include_directories(generated/)


file(GLOB GEN_SOURCES generated/*_functions.c generated/jni_init.c)


set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -fvisibility=hidden ")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -fvisibility=hidden ")

#外部程序处理时替换 LIBNAME_PLACEHOLDER
set(LIBNAME_PLACEHOLDER "wtjp")


add_library(${LIBNAME_PLACEHOLDER} SHARED ConstantPool.c ${GEN_SOURCES} )

target_link_libraries(${LIBNAME_PLACEHOLDER} ${LIBNMMVM_NAME} log)

  1. vm/CMakeLists.txt
cmake_minimum_required(VERSION 3.6)
project(libvm)


include_directories(..)
include_directories(./include)


set(VM_SRC_FILES
        DexCatch.cpp
        Exception.cpp
        Interp.cpp
        InterpC-portable.cpp
        GlobalCache.cpp
        JNIWrapper.c

        )


set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DLOG_INSTR ")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -fvisibility=hidden -DNDEBUG")

#设置vm库名称
set(LIBNMMVM_NAME "wtjvm" CACHE INTERNAL "lib wtjvm name")


add_library(${LIBNMMVM_NAME} SHARED ${VM_SRC_FILES})

target_link_libraries(${LIBNMMVM_NAME} log)

target_include_directories(${LIBNMMVM_NAME} PUBLIC include)

  1. BuildNativeLib.java
public class BuildNativeLib {
    //库名称
    public static final String NMMP_NAME = "wtjp";

    //
    //虚拟机库名称,如果cmake里配置为静态库,这个可以忽略
    public static final String VM_NAME = "wtjvm";

}

GordonHuangYong avatar Jun 26 '25 07:06 GordonHuangYong

你找一下打包获得so文件相关逻辑,以及查看ndk编译后是否正确生成文件。打包这部分逻辑简单,没有细致处理java代码跟cmake文件之间匹配问题,实际看报错改。

maoabc avatar Jun 26 '25 19:06 maoabc

我仔细看了你日志,你没使用修改后的代码。需要更新vmsrc.zip,在mksrc目录下有独立的cmake文件跟vmsrc.zip生成脚本,这里修改后运行脚本就能更新vmsrc.zip。

maoabc avatar Jun 26 '25 20:06 maoabc

我仔细看了你日志,你没使用修改后的代码。需要更新vmsrc.zip,在mksrc目录下有独立的cmake文件跟vmsrc.zip生成脚本,这里修改后运行脚本就能更新vmsrc.zip。

yes! 修改好了.目前正常.

GordonHuangYong avatar Jun 27 '25 01:06 GordonHuangYong