当前位置: 首页 > 知识库问答 >
问题:

AndroidNDK JNI二进制代码?

伯晨
2023-03-14

我刚刚创建了第一个使用JNI和NDK的Android应用程序,简单的Hello JNI。具有返回字符串的唯一函数。我签署了APK解包,如果我看到的.so文件似乎不是本地编译的。我想要一个二进制代码。我读取函数和字符串的名称。我的目标是使用SDK编写本机代码来隐藏未被proguard遮挡的字符串。我用的是Android Studio 2.1.2

建筑格拉德尔项目

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

本地属性

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

共有1个答案

湛钊
2023-03-14

如果您的字符串是在C/C中定义的,如:

char *mySecretString = "some secret";

当然,它在< code >中是可读的。所以,虽然它是本机编译的。编译不是混淆,而是将代码翻译成目标平台的机器码。字符串不是代码,而是数据,二进制形式的ASCII字符串数据是完全相同的ASCII字符串。

函数名称不必在 .so 中可见,除非:

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

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

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

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

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

 类似资料:
  • 问题内容: 我知道用和 将小数转换为二进制(在这里我取32位结果的低16位)。 我想做的是另一种方法,并采用16位二进制补码二进制字符串并将其转换为十进制。 即 而不是 我该怎么做? 问题答案: 您需要将结果读取到中。 此打印。

  • 问题内容: 在Java中,“二进制代码”与“ Java字节码”的含义相同吗? 这是Java中的流程吗? Java文件(.java)-> [javac]-> ByteCode文件(.class)-> [JVM / Java解释器]->运行它(首先将其转换为特定于机器的二进制代码) 谢谢! 问题答案: 答案取决于您的意思 。 是一种二进制数据格式,包括Java虚拟机的加载信息和执行指令。从这个意义上讲

  • 我可以运行这个程序,但由于某些原因,它会显示/放置随机字符,而不是二进制的初始值,而且我似乎无法将程序从十进制运行回二进制。我该如何改进这些代码。要明确说明它不会将二进制转换为十进制,我将如何将其转换回十进制转换为二进制,如果有一些代码可以帮助我,将不胜感激。

  • 主要内容:二进制,八进制,十六进制我们平时使用的数字都是由 0~9 共十个数字组成的,例如 1、9、10、297、952 等,一个数字最多能表示九,如果要表示十、十一、二十九、一百等,就需要多个数字组合起来。 例如表示 5+8 的结果,一个数字不够,只能”进位“,用 13 来表示;这时”进一位“相当于十,”进两位“相当于二十。 因为逢十进一(满十进一),也因为只有 0~9 共十个数字,所以叫做 十进制(Decimalism)。十进

  • 问题内容: 我的一些同事相信,将构建工件提交到Subversion存储库是一个好主意。争论在于通过这种方式,在测试机器上的安装和更新很容易-只需“向上”! 我敢肯定,有人反对这种不良做法,但我能想到的只是la脚的,例如“占用更多空间”。什么是最好的杀手级理由不这样做?而我们应该采取哪些其他方法呢? 如果这有所不同,则用于Java代码。一切都是从Eclipse编译的(没有自动PDE构建)。 当我说添