Mobile Systems and Smartphone Security�(MOBISEC 2020)
Prof: Yanick Fratantonio�EURECOM
1
Native Code
Native Code
2
Java source code�.java
Java bytecode�.class .jar
Dalvik bytecode�.dex
Java compiler�javac
DEX compiler�dx
Executable by the JVM
Executable by the DVM
C/C++ source code�.c .cpp .h
Kotlin source code�.kt .kts
Kotlin compiler�kotlinc
Machine code�.so
Why Native Code?
3
Native code makes security analysis tricky
4
Native code makes security analysis tricky
5
Native code makes security analysis tricky
6
Native code makes security analysis tricky
7
Java ⇔ C/C++ can communicate
8
Java bytecode�.class .jar
Machine code�.so
JNI��Java Native Interface
Developing a native code component
$ cat main/java/com/mobisec/nativecodetest/MainActivity.java
...
public native String stringFromJNI();
static {
System.loadLibrary("native-lib");
}
9
Developing a native code component
$ cat main/cpp/native-lib.cpp
#include <jni.h>
#include <string>
extern "C"
JNIEXPORT jstring JNICALL
Java_com_mobisec_nativecodetest_MainActivity_stringFromJNI(
JNIEnv* env,
jobject /* this */) {
std::string hello = "Hello from C++";
return env->NewStringUTF(hello.c_str());
}
10
JNI does some magic to invoke this C++ method when you invoke the Java associated method
Java ⇔ C/C++ code
11
Example of C/C++ ⇒ Java
package my.package;
class MainActivity extends Activity {
...
public String messageMe(String text) {
System.out.println(text);
return text;
}
public native String getJniString();
}
12
Example of C/C++ ⇒ Java
jstring Java_my_package_MainActivity_getJniString(JNIEnv* env, jobject obj) {
jstring jstr = env->NewStringUTF(env, "Created in JNI");
jclass clazz = env->FindClass(env, "my/package/MainActivity");
jmethodID messageMe = env->GetMethodID(� env, clazz, "messageMe", "(Ljava/lang/String;)Ljava/lang/String;");
jobject result = env->CallObjectMethod(env, obj, messageMe, jstr);
const char* str = env->GetStringUTFChars(env,(jstring) result, NULL);
printf("%s\n", str);
return (*env)->NewStringUTF(env, str);
}
13
Once compiled
14
More on Native Code
15
Android Studio setup
16
Reverse Engineering Native Code
17
Intro on Binary Reverse Engineering
18
Tools
19
Tools
20
End of quick intro
21