我刚刚创建了第一个使用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
如果您的字符串是在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构建)。 当我说添