1. Android Studio -> Create New Project -> Native C++
2. app/build.gradle을 열어보면 아래와 같이 되어있다.
android {
compileSdkVersion 29
buildToolsVersion "30.0.3"
defaultConfig {
applicationId "com.codetronik.myapplication"
minSdkVersion 24
targetSdkVersion 29
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
externalNativeBuild {
cmake {
cppFlags ""
}
}
}
arm64만 빌드하기 위해 externalNativeBuild { } 밑줄에 ndk { }를 추가한다. (수정하지 않으면 x86, x86_64, armeabi까지 모두 빌드됨)
ndk {
abiFilters 'arm64-v8a'
}
만약 armeabi-v7a도 추가한다면 nox에서 64비트 모듈을 무시하고 32비트 모듈을 호출하게 되니 주의
3. nox 64비트 다운로드 (32비트를 받으면 arm64-v8a 에뮬레이션이 불가능)
4. 옵션에서 ROOT권한 주고, 개발자 옵션에서 USB 디버깅 허용 (구글에서 "nox 안드로이드 분석 환경" 로 검색해보면 가이드 많이 나옴)
5. 안드로이드 스튜디오에서 nox 기기를 apk 실행용으로 설정한다.
6. 아래와 같이 arm64-v8a 환경에서 잘 동작하는지 확인한다.
1) 아래는 arm64-v8a 전용 어셈블리어이므로, 타 cpu환경에서는 동작하지 않는다.
extern "C" JNIEXPORT jstring JNICALL
Java_com_codetronik_myapplication5_MainActivity_stringFromJNI(
JNIEnv* env,
jobject /* this */) {
std::string hello = "Hello from C++";
__asm__ (".byte 0x03\n"\
".byte 0x00\n"\
".byte 0x00\n"\
".byte 0x14\n"\
".byte 0xde\n"\
".byte 0xad\n"\
".byte 0xbe\n"\
".byte 0xef\n"\
".byte 0xde\n"\
".byte 0xad\n"\
".byte 0xbe\n"\
".byte 0xef\n");
return env->NewStringUTF(hello.c_str());
}
2) nox-adb을 root로 실행 후 빌드한 jni가 arm64로 동작 중인지 확인한다.
'Android Linux' 카테고리의 다른 글
[arm] 정적 분석 방해 테스트 (0) | 2023.05.22 |
---|---|
[Android App] fork & ptrace (0) | 2022.08.29 |
gdb 7.11 (arm 32bit) (0) | 2020.10.15 |
안드로이드 후킹, 메모리 변조 : 코드 후킹과 재배치(relocation) (0) | 2018.07.23 |
classes.dex memory dump (0) | 2018.07.19 |