Android NDK JNI二进制代码?

时间:2016-07-13 16:04:51

标签: android android-ndk java-native-interface

我刚创建了我的第一个使用JNI和NDK的Android应用程序,简单的Hello-JNI。使用返回字符串的唯一函数。 我签署了APK解压缩,如果我看到.so文件似乎本身没有编译。我期待二进制代码。我读了函数和字符串的名称。 我的目标是使用SDK编写本机代码来隐藏未被proguard蒙蔽的字符串。 我使用的是Android Studio 2.1.2

Build.gradle项目

buildscript {
repositories {
    jcenter()
}
dependencies {
    //classpath 'com.android.tools.build:gradle:2.1.2'
    classpath 'com.android.tools.build:gradle-experimental:0.7.2'
    // NOTE: Do not place your application dependencies here; they belong
    // in the individual module build.gradle files
}
}

allprojects {
   repositories {
      jcenter()
}
}

task clean(type: Delete) {
   delete rootProject.buildDir
}

Build.Gradle app

apply plugin: 'com.android.model.application'

model {
android {
    compileSdkVersion 23
    buildToolsVersion "23.0.3"

    defaultConfig {
        applicationId "com.danielezampieri.jniapp"
        minSdkVersion.apiLevel 18
        targetSdkVersion.apiLevel 23
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles.add(file('proguard-android.txt'))
        }
    }
    ndk {
        moduleName "jniapp"
    }
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.0.0'
compile 'com.android.support:design:23.0.0'
}

gradle-wrapper.properties

#Mon Dec 28 10:00:20 PST 2015
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip

local.properties

ndk.dir=P\:\\Android\\sdk\\ndk-bundle
sdk.dir=P\:\\Android\\sdk

1 个答案:

答案 0 :(得分:1)

如果你的字符串是用C / C ++定义的:

char *mySecretString = "some secret";

当然, .so中可读,而 本机编译。 编译不是混淆,而是将代码转换为目标平台的机器代码。字符串不是代码,但数据和ASCII字符串数据的二进制形式是完全相同的ASCII字符串。

功能名称不必在.so中显示,除非:

  • 它们是全局/外部的(然后它们必须是可见的,因此加载共享库的应用程序可以在加载库期间按名称搜索内存中的函数。)
  • 您的.so文件包含一些调试信息,使用发布模式和strip根据需要(我相信NDK在发布模式下剥离.so文件足够了,但我从未亲自检查过,所以也许他们在发布时会留下一些调试信息?)。

因此,如果您想使用本机库进行混淆:

对于函数:使用神秘的外部函数名称,或添加另一层称为通过外部(可见)函数名称的本地函数,并确保剥离所有调试信息,因此不包括本地符号。

对于字符串:通过某种加密对数据进行加密,将加密数据包含在.so文件中,然后在解密程序使用之前将字符串解密到内存中。

请注意,如果他投入足够的精力,任何人手动拆解代码的人仍然可以找到所有这些内容。