• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

Android NDK JNI二进制代码?

Android 来源:Daniele 3次浏览

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

的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应用

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 


===========解决方案如下:

如果您的字符串在C/C++等来定义:

char *mySecretString = "some secret"; 

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

函数名不会有.so可见,除非:

  • 他们是全球/ EXTERN(那么他们必须是可见的,因此加载共享库的应用程序可以通过搜索内存中的功能他们的名字 – 在装载图书馆期间)。
  • .so你的.so文件包括一些调试信息,使用发布模式,并根据需要strip(我相信NDK在发布模式剥离.so文件足够,但我从来没有亲自检查过,所以他们甚至可以留下一些调试信息发布?)。

所以,如果你想使用本机库混淆:

对于功能:使用晦涩的外部函数的名称,或添加的所谓槽外部(可见)函数名本地功能的另一个层,并确保所有调试信息被剥离,所以不包括本地符号。

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

请注意,任何人手动拆卸你的代码将仍然能够找到所有的东西,如果他投入足够的精力。


版权声明:本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。
喜欢 (0)